Upload 4487 files
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitattributes +11 -0
- Lib/site-packages/.DS_Store +0 -0
- Lib/site-packages/Babel-2.14.0.dist-info/INSTALLER +1 -0
- Lib/site-packages/Babel-2.14.0.dist-info/LICENSE +27 -0
- Lib/site-packages/Babel-2.14.0.dist-info/METADATA +37 -0
- Lib/site-packages/Babel-2.14.0.dist-info/RECORD +1075 -0
- Lib/site-packages/Babel-2.14.0.dist-info/WHEEL +5 -0
- Lib/site-packages/Babel-2.14.0.dist-info/entry_points.txt +20 -0
- Lib/site-packages/Babel-2.14.0.dist-info/top_level.txt +1 -0
- Lib/site-packages/Cython-3.0.10.dist-info/COPYING.txt +19 -0
- Lib/site-packages/Cython-3.0.10.dist-info/INSTALLER +1 -0
- Lib/site-packages/Cython-3.0.10.dist-info/LICENSE.txt +176 -0
- Lib/site-packages/Cython-3.0.10.dist-info/METADATA +63 -0
- Lib/site-packages/Cython-3.0.10.dist-info/RECORD +447 -0
- Lib/site-packages/Cython-3.0.10.dist-info/WHEEL +5 -0
- Lib/site-packages/Cython-3.0.10.dist-info/entry_points.txt +4 -0
- Lib/site-packages/Cython-3.0.10.dist-info/top_level.txt +3 -0
- Lib/site-packages/Cython/Build/BuildExecutable.py +170 -0
- Lib/site-packages/Cython/Build/Cythonize.py +255 -0
- Lib/site-packages/Cython/Build/Dependencies.py +1380 -0
- Lib/site-packages/Cython/Build/Distutils.py +1 -0
- Lib/site-packages/Cython/Build/Inline.py +367 -0
- Lib/site-packages/Cython/Build/IpythonMagic.py +572 -0
- Lib/site-packages/Cython/Build/Tests/TestCyCache.py +119 -0
- Lib/site-packages/Cython/Build/Tests/TestCythonizeArgsParser.py +482 -0
- Lib/site-packages/Cython/Build/Tests/TestDependencies.py +142 -0
- Lib/site-packages/Cython/Build/Tests/TestInline.py +112 -0
- Lib/site-packages/Cython/Build/Tests/TestIpythonMagic.py +295 -0
- Lib/site-packages/Cython/Build/Tests/TestRecythonize.py +212 -0
- Lib/site-packages/Cython/Build/Tests/TestStripLiterals.py +56 -0
- Lib/site-packages/Cython/Build/Tests/__init__.py +1 -0
- Lib/site-packages/Cython/Build/Tests/__pycache__/TestCyCache.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/Build/Tests/__pycache__/TestCythonizeArgsParser.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/Build/Tests/__pycache__/TestDependencies.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/Build/Tests/__pycache__/TestInline.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/Build/Tests/__pycache__/TestIpythonMagic.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/Build/Tests/__pycache__/TestRecythonize.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/Build/Tests/__pycache__/TestStripLiterals.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/Build/Tests/__pycache__/__init__.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/Build/__init__.py +14 -0
- Lib/site-packages/Cython/Build/__pycache__/BuildExecutable.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/Build/__pycache__/Cythonize.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/Build/__pycache__/Dependencies.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/Build/__pycache__/Distutils.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/Build/__pycache__/Inline.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/Build/__pycache__/IpythonMagic.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/Build/__pycache__/__init__.cpython-38.pyc +0 -0
- Lib/site-packages/Cython/CodeWriter.py +820 -0
- Lib/site-packages/Cython/Compiler/AnalysedTreeTransforms.py +99 -0
- Lib/site-packages/Cython/Compiler/Annotate.py +341 -0
.gitattributes
CHANGED
@@ -65,3 +65,14 @@ models/research/lfads/synth_data/trained_itb/model-65000.meta filter=lfs diff=lf
|
|
65 |
models/research/object_detection/dataset_tools/densepose/UV_symmetry_transforms.mat filter=lfs diff=lfs merge=lfs -text
|
66 |
models/research/object_detection/g3doc/img/kites_with_segment_overlay.png filter=lfs diff=lfs merge=lfs -text
|
67 |
models/research/object_detection/test_images/image2.jpg filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
models/research/object_detection/dataset_tools/densepose/UV_symmetry_transforms.mat filter=lfs diff=lfs merge=lfs -text
|
66 |
models/research/object_detection/g3doc/img/kites_with_segment_overlay.png filter=lfs diff=lfs merge=lfs -text
|
67 |
models/research/object_detection/test_images/image2.jpg filter=lfs diff=lfs merge=lfs -text
|
68 |
+
Lib/site-packages/altair/vegalite/v5/schema/__pycache__/channels.cpython-38.pyc filter=lfs diff=lfs merge=lfs -text
|
69 |
+
Lib/site-packages/altair/vegalite/v5/schema/__pycache__/core.cpython-38.pyc filter=lfs diff=lfs merge=lfs -text
|
70 |
+
Lib/site-packages/array_record/python/array_record_module.so filter=lfs diff=lfs merge=lfs -text
|
71 |
+
Lib/site-packages/clang/native/libclang.dll filter=lfs diff=lfs merge=lfs -text
|
72 |
+
Lib/site-packages/cv2/cv2.pyd filter=lfs diff=lfs merge=lfs -text
|
73 |
+
Lib/site-packages/cv2/opencv_videoio_ffmpeg490_64.dll filter=lfs diff=lfs merge=lfs -text
|
74 |
+
Lib/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_x86.pdb filter=lfs diff=lfs merge=lfs -text
|
75 |
+
Lib/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/inject_dll_amd64.pdb filter=lfs diff=lfs merge=lfs -text
|
76 |
+
Lib/site-packages/debugpy/_vendored/pydevd/pydevd_attach_to_process/inject_dll_x86.pdb filter=lfs diff=lfs merge=lfs -text
|
77 |
+
Lib/site-packages/google/protobuf/pyext/_message.cp38-win_amd64.pyd filter=lfs diff=lfs merge=lfs -text
|
78 |
+
share/jupyter/nbextensions/pydeck/index.js.map filter=lfs diff=lfs merge=lfs -text
|
Lib/site-packages/.DS_Store
ADDED
Binary file (6.15 kB). View file
|
|
Lib/site-packages/Babel-2.14.0.dist-info/INSTALLER
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
pip
|
Lib/site-packages/Babel-2.14.0.dist-info/LICENSE
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Copyright (c) 2013-2023 by the Babel Team, see AUTHORS for more information.
|
2 |
+
|
3 |
+
Redistribution and use in source and binary forms, with or without
|
4 |
+
modification, are permitted provided that the following conditions
|
5 |
+
are met:
|
6 |
+
|
7 |
+
1. Redistributions of source code must retain the above copyright
|
8 |
+
notice, this list of conditions and the following disclaimer.
|
9 |
+
2. Redistributions in binary form must reproduce the above copyright
|
10 |
+
notice, this list of conditions and the following disclaimer in
|
11 |
+
the documentation and/or other materials provided with the
|
12 |
+
distribution.
|
13 |
+
3. Neither the name of the copyright holder nor the names of its
|
14 |
+
contributors may be used to endorse or promote products derived
|
15 |
+
from this software without specific prior written permission.
|
16 |
+
|
17 |
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
18 |
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
19 |
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
20 |
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
21 |
+
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
22 |
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
23 |
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
24 |
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
25 |
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
26 |
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
27 |
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
Lib/site-packages/Babel-2.14.0.dist-info/METADATA
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Metadata-Version: 2.1
|
2 |
+
Name: Babel
|
3 |
+
Version: 2.14.0
|
4 |
+
Summary: Internationalization utilities
|
5 |
+
Home-page: https://babel.pocoo.org/
|
6 |
+
Author: Armin Ronacher
|
7 |
+
Author-email: armin.ronacher@active-4.com
|
8 |
+
Maintainer: Aarni Koskela
|
9 |
+
Maintainer-email: akx@iki.fi
|
10 |
+
License: BSD-3-Clause
|
11 |
+
Project-URL: Source, https://github.com/python-babel/babel
|
12 |
+
Classifier: Development Status :: 5 - Production/Stable
|
13 |
+
Classifier: Environment :: Web Environment
|
14 |
+
Classifier: Intended Audience :: Developers
|
15 |
+
Classifier: License :: OSI Approved :: BSD License
|
16 |
+
Classifier: Operating System :: OS Independent
|
17 |
+
Classifier: Programming Language :: Python
|
18 |
+
Classifier: Programming Language :: Python :: 3
|
19 |
+
Classifier: Programming Language :: Python :: 3 :: Only
|
20 |
+
Classifier: Programming Language :: Python :: 3.7
|
21 |
+
Classifier: Programming Language :: Python :: 3.8
|
22 |
+
Classifier: Programming Language :: Python :: 3.9
|
23 |
+
Classifier: Programming Language :: Python :: 3.10
|
24 |
+
Classifier: Programming Language :: Python :: 3.11
|
25 |
+
Classifier: Programming Language :: Python :: 3.12
|
26 |
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
27 |
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
28 |
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
29 |
+
Requires-Python: >=3.7
|
30 |
+
License-File: LICENSE
|
31 |
+
Requires-Dist: pytz >=2015.7 ; python_version < "3.9"
|
32 |
+
Provides-Extra: dev
|
33 |
+
Requires-Dist: pytest >=6.0 ; extra == 'dev'
|
34 |
+
Requires-Dist: pytest-cov ; extra == 'dev'
|
35 |
+
Requires-Dist: freezegun ~=1.0 ; extra == 'dev'
|
36 |
+
|
37 |
+
A collection of tools for internationalizing Python applications.
|
Lib/site-packages/Babel-2.14.0.dist-info/RECORD
ADDED
@@ -0,0 +1,1075 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
../../Scripts/pybabel.exe,sha256=CkcN46NI_9HXO2c0UwaootxNdZLVa7j562d0qNDWK3M,108454
|
2 |
+
Babel-2.14.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
3 |
+
Babel-2.14.0.dist-info/LICENSE,sha256=kI4K1yBTrifB0X4zQL0Uz_m_k1mS7VZSbRfJg6tuevc,1531
|
4 |
+
Babel-2.14.0.dist-info/METADATA,sha256=m-cHPqie3eq-LWf0Gq-T6iCSsLY_nP1vG3mG8mIw3Fw,1554
|
5 |
+
Babel-2.14.0.dist-info/RECORD,,
|
6 |
+
Babel-2.14.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
7 |
+
Babel-2.14.0.dist-info/entry_points.txt,sha256=Y2Cr1P3E8Yt7kqzvVz4wnTvD1H3-BVD4FOkVqHIGBfc,750
|
8 |
+
Babel-2.14.0.dist-info/top_level.txt,sha256=mQO3vNkqlcYs_xRaL5EpRIy1IRjMp4N9_vdwmiemPXo,6
|
9 |
+
babel/__init__.py,sha256=vTAkGRCz3lOycJZLSi0eJsvLeEjbFdGmJhQhD4Xbz3M,863
|
10 |
+
babel/__pycache__/__init__.cpython-38.pyc,,
|
11 |
+
babel/__pycache__/core.cpython-38.pyc,,
|
12 |
+
babel/__pycache__/dates.cpython-38.pyc,,
|
13 |
+
babel/__pycache__/languages.cpython-38.pyc,,
|
14 |
+
babel/__pycache__/lists.cpython-38.pyc,,
|
15 |
+
babel/__pycache__/localedata.cpython-38.pyc,,
|
16 |
+
babel/__pycache__/numbers.cpython-38.pyc,,
|
17 |
+
babel/__pycache__/plural.cpython-38.pyc,,
|
18 |
+
babel/__pycache__/support.cpython-38.pyc,,
|
19 |
+
babel/__pycache__/units.cpython-38.pyc,,
|
20 |
+
babel/__pycache__/util.cpython-38.pyc,,
|
21 |
+
babel/core.py,sha256=7TlC6iSaRXrJ-77svYbeD1pvA2RpWeHQDxRuETjxrrc,44006
|
22 |
+
babel/dates.py,sha256=AW9mkeuQ6gF-tlc-VjwZvuZpczqtcRqcVf_0GRRlLDQ,72721
|
23 |
+
babel/global.dat,sha256=X27frk-HBruc0b2Xd5AmxrnjoDqbVazONtaRehqJl7Y,471487
|
24 |
+
babel/languages.py,sha256=2LDTV9WizAuZVam0vfw-Q-QKYCQpF5DxLbmVoat7TKI,2844
|
25 |
+
babel/lists.py,sha256=YWUu2YU7AyIwAfTyHBd2bGYKEaImKzRpdmahMeDXuEY,3016
|
26 |
+
babel/locale-data/aa.dat,sha256=t4qij3sHObXpx5s1-y_J3gLmDCjn9XZxjGhFSDVtViA,2854
|
27 |
+
babel/locale-data/aa_DJ.dat,sha256=VKjSgKVsftG91nj0-AQMYFuF_p4YAGfRkgAvycB2EYU,1112
|
28 |
+
babel/locale-data/aa_ER.dat,sha256=6b6qROwoeOq0-batM1Z7Ji2gvGDogl3ODcftt1Jkm9g,637
|
29 |
+
babel/locale-data/aa_ET.dat,sha256=piwFu94H7e-jPwd4ZaWiDc-j2nAH_GiC5UZ2IxMx7bs,635
|
30 |
+
babel/locale-data/ab.dat,sha256=plWe5eNsmJvVplgNAo5xusXgAJvI025o5i0u73HS7wY,100416
|
31 |
+
babel/locale-data/ab_GE.dat,sha256=b5be2Uv1YtP-bkMasJMzoQPxJPNLFqifXnCiK8rCyLE,635
|
32 |
+
babel/locale-data/af.dat,sha256=VHwHPH3IrJj39r-Fx8gbUJPGjFUulN-wLx8mN_zQBjA,203730
|
33 |
+
babel/locale-data/af_NA.dat,sha256=zif__TyNY44mSCYOCrrglsyr_H31JhBNPwSJftg8200,1450
|
34 |
+
babel/locale-data/af_ZA.dat,sha256=6lT-mLg7LRtyAEhWhiF2xVtiPyzEa28U6hsFw_BMrZE,635
|
35 |
+
babel/locale-data/agq.dat,sha256=ntz-h-vOsJcVCBrEBQpC-ow4zsUTShPhvDgrlv79wvQ,17302
|
36 |
+
babel/locale-data/agq_CM.dat,sha256=hYtg7pRw7J6TsYHvhlEEv7DqpyXoK3KS9DAqtYtgBX0,636
|
37 |
+
babel/locale-data/ak.dat,sha256=bgWHrtHvkP_LumU5T6eGbVEkvah06-7JDrk4uO3eQN8,15782
|
38 |
+
babel/locale-data/ak_GH.dat,sha256=tM-OSpXWyBwZFfKPVStWBbFv3dwNj_7AqcBz4ONrOQs,616
|
39 |
+
babel/locale-data/am.dat,sha256=BiOJmrhvFpI9897xPOO-ZUjci_f8keIj4buqlOCFsEY,239348
|
40 |
+
babel/locale-data/am_ET.dat,sha256=2VZDSh5bY9vLLuTqcKYG66p5OYlvPRPX58rpNTFWPok,635
|
41 |
+
babel/locale-data/an.dat,sha256=y3xHxp7sm5uD3tAqKreiYFTxFvqbUS-rDVoX9Yd0xyE,34079
|
42 |
+
babel/locale-data/an_ES.dat,sha256=rQuq-zKj7-fCjY-5fGGoGJT1x60pAyCEAVEswXPnHrI,653
|
43 |
+
babel/locale-data/ann.dat,sha256=fUenvOdPjqayLEiVDRNncK8SOBi9gAGAdxMuOATlsI0,737
|
44 |
+
babel/locale-data/ann_NG.dat,sha256=0i2K6cv6eCurgFgwtiCr09hYwZCA1kHkQaKnDyCD86M,617
|
45 |
+
babel/locale-data/apc.dat,sha256=G96W-ebLqQlTuPN3-VqSfAY-GF0K99c6uXHza5f4e2g,1564
|
46 |
+
babel/locale-data/apc_SY.dat,sha256=tagFeQz8BA9Pc7RMqkce1ZalfKIBjqg0SR4NlpGQaaM,679
|
47 |
+
babel/locale-data/ar.dat,sha256=V0ewHhDy2-X75q5nmmtXbQ60lrw6SgXMPDjV8qYhGCI,423869
|
48 |
+
babel/locale-data/ar_001.dat,sha256=hRKDI3wzxO5T191MfSdCn_MZ6ckM2Rz_r__0JZqS00s,1707
|
49 |
+
babel/locale-data/ar_AE.dat,sha256=cr2KVgBOkQEtxEbJZpZhx3bwfkwr4dc8_PgBPH1bWhw,1106
|
50 |
+
babel/locale-data/ar_BH.dat,sha256=FoQ2c3E3TDqKcioarWBvLi_MllJmSd_56r0U45_gHWw,720
|
51 |
+
babel/locale-data/ar_DJ.dat,sha256=qbNam_QAmhobsIUfJLCL9pe146SvcmNIE_L3cWpmkBs,698
|
52 |
+
babel/locale-data/ar_DZ.dat,sha256=lZQf-qemJ0lxA2VcP8aAke11fvcTXzRCglJGu9gtO_g,1797
|
53 |
+
babel/locale-data/ar_EG.dat,sha256=1zcHJKoldryovzBak9GDH2EcPxniQfg-5dlQzPYO2qc,757
|
54 |
+
babel/locale-data/ar_EH.dat,sha256=a0xJdGJYzGFzfvwxZVDP7yURlTm93FQSTQ5qp3XDMYo,658
|
55 |
+
babel/locale-data/ar_ER.dat,sha256=l-WjJfxm7kP05-Hnr5PingHaKWJ46ScfW4KEBcwD5HM,679
|
56 |
+
babel/locale-data/ar_IL.dat,sha256=O3UYAjf4BB3NdcSQTn-RzNjyj4kzTBhX3q7E8-9Aihw,1264
|
57 |
+
babel/locale-data/ar_IQ.dat,sha256=2I8H20sPMZSnnFFW5AbesphnQndm_HvHXSk3mccQDag,2405
|
58 |
+
babel/locale-data/ar_JO.dat,sha256=0CfGCDngdKxbK8jkD58lAqFRKtqUsstSx1Wep-C1RRU,2404
|
59 |
+
babel/locale-data/ar_KM.dat,sha256=Zx5XtfTuRPiW6iViOjeal_Fq-18EA7GuERViMP1_mc4,1230
|
60 |
+
babel/locale-data/ar_KW.dat,sha256=1wSXHTcgFKwhNciVS8IvGKvkzzqOIMBFykEJEQXdhEE,720
|
61 |
+
babel/locale-data/ar_LB.dat,sha256=1wcUmhH0b3PZc4UvaDy-t6MliQI8kFXMMe_slqEK-u8,2420
|
62 |
+
babel/locale-data/ar_LY.dat,sha256=5vCCedkZ19UrYoHmN-rgcUSOMSPXog16mdKX6oAsiAI,1732
|
63 |
+
babel/locale-data/ar_MA.dat,sha256=cQr24gcr-GMC40H5uzIavP2lZjPg8_hJJ1RCPC43ZRY,2091
|
64 |
+
babel/locale-data/ar_MR.dat,sha256=MUFqWwU1G9xUQxDNlpatch_XyqMYRWVsyHusSjdc-P4,2257
|
65 |
+
babel/locale-data/ar_OM.dat,sha256=HVOqTfoH3JVTHJL-yDBiIafNfckU7CIcO_sIzXBffKw,720
|
66 |
+
babel/locale-data/ar_PS.dat,sha256=xrrCSXKv7kJ-U8bKc0rRn-s81iLned6i4c8HjvU4RVU,2342
|
67 |
+
babel/locale-data/ar_QA.dat,sha256=UKfLpyX856fNgeifdr22wXpDncirWJi9NxqfSnS-7fw,720
|
68 |
+
babel/locale-data/ar_SA.dat,sha256=5QID1Wsy7BxL8SdexAyuRd9YAkHOQBTzSzpzH83_sr0,32727
|
69 |
+
babel/locale-data/ar_SD.dat,sha256=f7aUKlrKmmC7ijTjVwn5r9m3mfZfEob1a7GHVCj4Qxk,720
|
70 |
+
babel/locale-data/ar_SO.dat,sha256=4LD_gds2VsvxdFHpFo56CxTFenzNdvEkMofc4oTGBTU,677
|
71 |
+
babel/locale-data/ar_SS.dat,sha256=T6eeWPeFejmBC7InKqg-6qmWoer1vjl6srHe_5ybkDU,700
|
72 |
+
babel/locale-data/ar_SY.dat,sha256=09SrzmsmYwn_ODe3jtwmhDCIo1l6cFkoaiGuvNs9yjo,2404
|
73 |
+
babel/locale-data/ar_TD.dat,sha256=OG7NYtRrJiDeRt7HP-B4ta5ri-6fdSnYomppfy2A4ec,658
|
74 |
+
babel/locale-data/ar_TN.dat,sha256=WkxFT-thyffXMwpqEBYAofwPZcYTUxRXWU6tB5X-fGc,1735
|
75 |
+
babel/locale-data/ar_YE.dat,sha256=vu8wYJgzcJ1douKfKLx3-hAg1sjndD5_PTHWG_bzRL0,720
|
76 |
+
babel/locale-data/arn.dat,sha256=JcfndkQuEeAnP6aN1ZEJOfljh8DaddCgLjBUXgK_u8I,763
|
77 |
+
babel/locale-data/arn_CL.dat,sha256=cf_JrdIAxFwbltVwtloNC9527Du7zaoBDM-_KmctSvE,636
|
78 |
+
babel/locale-data/as.dat,sha256=V2PqkKyvcTkkXvFlVUqsE5WxC3kITqkyyBGLvN2cXRY,278346
|
79 |
+
babel/locale-data/as_IN.dat,sha256=bE-OZ0Y3d2-QtD23ztjluSsFk1_RFNYMFzKgBC3waw4,658
|
80 |
+
babel/locale-data/asa.dat,sha256=dWIi65F3gH0ylkp9-wESGLu5NHMg1qd9cjPvN_YF-Nw,16079
|
81 |
+
babel/locale-data/asa_TZ.dat,sha256=U0GU10aP58LxCeqyjl69RQCZi_6tTQxm2vni6XVkoqY,617
|
82 |
+
babel/locale-data/ast.dat,sha256=GrbugTFqjqJJXkZDlpaEVhg8Hxr11egrpXbmUC27ZNo,215973
|
83 |
+
babel/locale-data/ast_ES.dat,sha256=51kFxigV5COuiPiNisp-OBFYMith5rUgBmU48rGk7Hc,654
|
84 |
+
babel/locale-data/az.dat,sha256=prQmgF-qUjo3vVNzaV8g9xobBoV48Xqoy76Wdc4TZ7E,227598
|
85 |
+
babel/locale-data/az_Arab.dat,sha256=IGBla73oKavlLHhtIW37idHxTkmQWZ-S8NE54b65d4k,7499
|
86 |
+
babel/locale-data/az_Arab_IQ.dat,sha256=VsM0-KQPCP4MUw-2wMsBv-F467cr2Bup3jfxx8Fc3ZE,678
|
87 |
+
babel/locale-data/az_Arab_IR.dat,sha256=ROb0gFTPwK5CcjpQMB7CJ662eld9sZj7IA6QMrvxgto,678
|
88 |
+
babel/locale-data/az_Arab_TR.dat,sha256=EV6cNf3keBNREHkfF98GGZGOZz4L5dxf8pFbujInaQY,635
|
89 |
+
babel/locale-data/az_Cyrl.dat,sha256=d_IEARmo3OXqnEw0PCEZxreYCDj8fyQgHWs-MlsxhmA,38832
|
90 |
+
babel/locale-data/az_Cyrl_AZ.dat,sha256=GRZjR-gp6JYeLNxoiAKNdv9bkTmS1bpYnRJ0c9YIGws,635
|
91 |
+
babel/locale-data/az_Latn.dat,sha256=aK2ziytg5Ig6GYk9tVCq4BEyV6UYy9Ip7F1_i4Pq1jw,2258
|
92 |
+
babel/locale-data/az_Latn_AZ.dat,sha256=GRZjR-gp6JYeLNxoiAKNdv9bkTmS1bpYnRJ0c9YIGws,635
|
93 |
+
babel/locale-data/ba.dat,sha256=mXaN5z_Oq1e82Uod4YQ5_EvYHlNKVzF2xb_b0w9Y1VQ,774
|
94 |
+
babel/locale-data/ba_RU.dat,sha256=8YcwUOx3h4BcSfUIumKJ4wcFyiSgBM74SqenVIQUKi8,653
|
95 |
+
babel/locale-data/bal.dat,sha256=Py4zYyjzbtRaLWKR6kNhivhdDvQPbqb4VcMk4KWLXAo,14015
|
96 |
+
babel/locale-data/bal_Arab.dat,sha256=25CVl5rF7FqKEeHzAmt0BccVI_ODqmMP86KqQ4i6PL8,934
|
97 |
+
babel/locale-data/bal_Arab_PK.dat,sha256=sy4tpUtN1St5yFoTp8C6-vi2bFGPjSaG_zDbY16Q988,636
|
98 |
+
babel/locale-data/bal_Latn.dat,sha256=e0iERNCLdOkEPNe7n9gWIuKKKo_t-3B4SsD8N1afWQA,11564
|
99 |
+
babel/locale-data/bal_Latn_PK.dat,sha256=sy4tpUtN1St5yFoTp8C6-vi2bFGPjSaG_zDbY16Q988,636
|
100 |
+
babel/locale-data/bas.dat,sha256=JtHPHmGZUAt6-_MSR_0mDeGCp1dOMTkJf9J4BavofG8,17091
|
101 |
+
babel/locale-data/bas_CM.dat,sha256=WBq-_rOvkBnT5pBaCyq844LLSRReQzg2HM0u7GmhKKM,636
|
102 |
+
babel/locale-data/be.dat,sha256=EYc84d14iU5I3Hdd3QrwDwwJCLCy00nT4Ws1YH3smxY,330917
|
103 |
+
babel/locale-data/be_BY.dat,sha256=yN4Rf2-HqinMscTfe4jKEYpsCEaddHce6K25ol595Ag,635
|
104 |
+
babel/locale-data/be_TARASK.dat,sha256=c2vboxToOLCMwzVmELk-QMj39GRY5UDJM2C2AYC8q2o,102753
|
105 |
+
babel/locale-data/bem.dat,sha256=Tk0RU_oM4nwvV6eHUaxsefqYyz1NNeNiV86JV01ekfo,6463
|
106 |
+
babel/locale-data/bem_ZM.dat,sha256=nQvsLK0FOSlgf6wspQdbj00IveO62c2Mvxjzn4eHGSs,617
|
107 |
+
babel/locale-data/bez.dat,sha256=2McG-mSD2Xg7WLHHkdx3TSSQ85tmG7ReHgSrTBLYX-M,16873
|
108 |
+
babel/locale-data/bez_TZ.dat,sha256=OwcKelhUxQWu-8Jm9nf2vCay6-8LQvg-ueZSN_mrGz0,617
|
109 |
+
babel/locale-data/bg.dat,sha256=8DGk_DqF3YU9Tc4s9vbjf-h0BLCN-nmQeDrbqOnvcHw,267293
|
110 |
+
babel/locale-data/bg_BG.dat,sha256=CERFyuC4Dw9BfAZapqaq69iKAp7rBXWNCkLWAL5tAhQ,653
|
111 |
+
babel/locale-data/bgc.dat,sha256=yWm7s3ZFP3IQb8o1G_mOEaghtRqXXE-MSDQ3eEknlXw,2873
|
112 |
+
babel/locale-data/bgc_IN.dat,sha256=hO39nPiyUx1kfCdagpCQ8lzPLycjdfk59jFQgsd3Qec,659
|
113 |
+
babel/locale-data/bgn.dat,sha256=Oyx3Ry1G_Naq1C_L4LAcZavSt6vclQT39hszXYgfzjE,31595
|
114 |
+
babel/locale-data/bgn_AE.dat,sha256=CXSv6o2WHpjlucCiCXv7vEAY6mF5Dc-ibNwQM8Jnywg,636
|
115 |
+
babel/locale-data/bgn_AF.dat,sha256=UXCb78n57adZBdKHEGnhbmeVYppzlSscVOWnQNxfJOQ,679
|
116 |
+
babel/locale-data/bgn_IR.dat,sha256=iXxyPD5Z-ouDWFpOE2atoi6-HHGoD6PNaT9c-TH6x7o,679
|
117 |
+
babel/locale-data/bgn_OM.dat,sha256=3O0CzFrjWxOQFdN6-lDhCxRngoXfadd_dwYoVyjK9jA,679
|
118 |
+
babel/locale-data/bgn_PK.dat,sha256=gdVUcc-isHd9lf0S-AmFoPIMwDZ8ay6NY4o1udWI6Yo,636
|
119 |
+
babel/locale-data/bho.dat,sha256=Pt4CtmGkzDTPGO1culdbjJqgwZhiTLOTzrxSMKJxzog,3551
|
120 |
+
babel/locale-data/bho_IN.dat,sha256=UcL_aZq35dOHME0Fux9zyt9B6BOTxyR5UvaGWKLs1jE,659
|
121 |
+
babel/locale-data/blt.dat,sha256=6G2E9osBy9OrG1iUKLD9cwcRk3IV7fT11iI8zFkLaeo,723
|
122 |
+
babel/locale-data/blt_VN.dat,sha256=vpTQEJYssmuBUn_pYqx7ZtYONNNz02_oBYlDMdWqKAc,636
|
123 |
+
babel/locale-data/bm.dat,sha256=VhInWEo8x3U5asJ4iTZMMg5i6p4JbtvS-gLHDpmhizU,15802
|
124 |
+
babel/locale-data/bm_ML.dat,sha256=PAGrUwc1S6q32DDHTu5LkePFXe_M_i_WxIY4oLuUnzw,616
|
125 |
+
babel/locale-data/bm_Nkoo.dat,sha256=jf8Gv-tmQixgSrs_JpNqwpyqH_Otrzx0fFhiemvUMe0,2885
|
126 |
+
babel/locale-data/bm_Nkoo_ML.dat,sha256=PAGrUwc1S6q32DDHTu5LkePFXe_M_i_WxIY4oLuUnzw,616
|
127 |
+
babel/locale-data/bn.dat,sha256=hx6jxrr9f2nItfwGo27uj9Tw4abkaTuHxSSwGjr4vRo,296914
|
128 |
+
babel/locale-data/bn_BD.dat,sha256=mVW90kQmhDcwzKmkmgNAt5iMq1pLWmNndNID9fspVjY,635
|
129 |
+
babel/locale-data/bn_IN.dat,sha256=YFSk2NHHq3VtaS9p2B12Kzst8rv4B8-JO99A_KI4ucs,5662
|
130 |
+
babel/locale-data/bo.dat,sha256=R6a5-THNIu1o1eKV4S4N26poBCJmVjoAy-TNUwMndAc,22353
|
131 |
+
babel/locale-data/bo_CN.dat,sha256=xOnyre81Z1IHnWV5mJH0x313h-ZWu84hIXcMuB50IT0,635
|
132 |
+
babel/locale-data/bo_IN.dat,sha256=GvYCgtrOD5zYYsfMtVmkCv8-y6His8Lg7iuytEGjnMI,1307
|
133 |
+
babel/locale-data/br.dat,sha256=7CrF-_Rud8dcFRltHX9YGPD3u16wLm_67SwZ73lBOyM,328164
|
134 |
+
babel/locale-data/br_FR.dat,sha256=3oVDdZd7Xf4Q-hwmYraF42SM_3NtvSoiZlmlh6gSNOs,653
|
135 |
+
babel/locale-data/brx.dat,sha256=eHRkmtgQoeaYzHuudYrFBJszIEMBhW1Qwx6cozlruKQ,195439
|
136 |
+
babel/locale-data/brx_IN.dat,sha256=NKuJh0cEhRQasy6JAGUi5HbqdnhhEFTQ_7osgtdG5Iw,659
|
137 |
+
babel/locale-data/bs.dat,sha256=RAAcbqRG8DkEs7vQk5xIp7bmsqbgaRjLqWrPwVvD5wM,290130
|
138 |
+
babel/locale-data/bs_Cyrl.dat,sha256=i2aa9r1CLt05nRbb2w1fIsP_XCYTUmCI9t6kieq4kgY,249581
|
139 |
+
babel/locale-data/bs_Cyrl_BA.dat,sha256=oA7rsQckE_IxCpXXB3F3KWQwM3WZTR7WAdYxJN98oeM,635
|
140 |
+
babel/locale-data/bs_Latn.dat,sha256=6L9SY85hONRHO4Jz389C2Ziy7llKcDoyVNiE96ozCJ8,1990
|
141 |
+
babel/locale-data/bs_Latn_BA.dat,sha256=oA7rsQckE_IxCpXXB3F3KWQwM3WZTR7WAdYxJN98oeM,635
|
142 |
+
babel/locale-data/bss.dat,sha256=7nu6tpedFRw3kGRtrwt8M0CResWl2ZAyD-KKHgfpr40,1828
|
143 |
+
babel/locale-data/bss_CM.dat,sha256=TD7ixCHREfOLDsDJn8FY5YqGYH9czdEzdULCIl_0GhM,636
|
144 |
+
babel/locale-data/byn.dat,sha256=_Ql6YRd-UhR78KBm8mQFNH8q-H0A-pqcLOEI7RF3Auw,13482
|
145 |
+
babel/locale-data/byn_ER.dat,sha256=oAaZEqMJuTbMITO-ZO6gg8qjwROukzh5VgjtLp6rqD4,617
|
146 |
+
babel/locale-data/ca.dat,sha256=EHEK_ZUtXWq_ruKn4OUy7ki9vhfn9knoFyvO1d0eQ6o,241287
|
147 |
+
babel/locale-data/ca_AD.dat,sha256=tsLumbhbbeXw627WKi-sQdSTFwNpcSRvJIEYcrOMqOM,653
|
148 |
+
babel/locale-data/ca_ES.dat,sha256=T-zv3FfnCJA2WUQTeBADKV82ghY-r60wk8mXtD9wbnI,653
|
149 |
+
babel/locale-data/ca_ES_VALENCIA.dat,sha256=VDfhBCSYDowm-bMKYOFkd2o5ha3OApQ4ntHb5KPaWIg,3703
|
150 |
+
babel/locale-data/ca_FR.dat,sha256=5HUFYUl5QRaUMwJxGLIqUhDO4_wF_crrr346wJmEOZo,672
|
151 |
+
babel/locale-data/ca_IT.dat,sha256=Zh2rtOq8MIDC2CQXWnhp5HOvPfXNxhRGnnZViOgc1Mg,653
|
152 |
+
babel/locale-data/cad.dat,sha256=_g8YTnbYWFt4gYUVhgk6jrzcagE8qRXOPaG2rNPb2bk,2495
|
153 |
+
babel/locale-data/cad_US.dat,sha256=FWV1sofgr9no5P9yBxNDLeKWoQd80XEYEilmLwamkSc,654
|
154 |
+
babel/locale-data/cch.dat,sha256=J4S73psT7C_cXs1VNNYow47plBodQ4PKINC59kzvfAw,2430
|
155 |
+
babel/locale-data/cch_NG.dat,sha256=0adhw9xNMlVEqDVKvHe4HCPtbjcw5NSo4ny_pOjl0-4,617
|
156 |
+
babel/locale-data/ccp.dat,sha256=7AxDu2KPudgZ1BbZTDvRjZvKh7jXhFHs8zs24m8Y4Y8,276511
|
157 |
+
babel/locale-data/ccp_BD.dat,sha256=f00776fnI484B-mzW0rY22KNkzV6wtmk7uxrSK_x9bU,636
|
158 |
+
babel/locale-data/ccp_IN.dat,sha256=jMJimrQrx-b96hBSLi8sOyHtYRwNZryt-he0rhwEZ2s,659
|
159 |
+
babel/locale-data/ce.dat,sha256=XcDsH5WZg0yl-T9upBG7NRaVPBKZbECgVRnvHqVQFTI,144929
|
160 |
+
babel/locale-data/ce_RU.dat,sha256=NgNmp1uFnm2MT-s_yx_V8KuW1dSR6_SEWf4NcqrAL9o,653
|
161 |
+
babel/locale-data/ceb.dat,sha256=i4uLNz1eciW-yumBFWwca4SYlYt_kdHzO_haWWYRn40,118889
|
162 |
+
babel/locale-data/ceb_PH.dat,sha256=Z2zXPyNI3Yu3QcGL6lT1nIsl04vDDLFvyd9GeucDtqA,636
|
163 |
+
babel/locale-data/cgg.dat,sha256=Z1baC5RbMwiJLSh0YyQhlspOOiaqEaxNe5MuQQ-jZcs,16124
|
164 |
+
babel/locale-data/cgg_UG.dat,sha256=HZBma4MFuX2Q7sk-SOYk5OUkbMXWWr_tEInOqPboNYs,640
|
165 |
+
babel/locale-data/cho.dat,sha256=xWGBvUZv6DGSS_tUPXOrwtkOxxB-bF6ciK49Kqo7uf0,771
|
166 |
+
babel/locale-data/cho_US.dat,sha256=T3CacgkE-uKPi0CV7fbcCLTNfdjEco_A50vYciuXGGI,654
|
167 |
+
babel/locale-data/chr.dat,sha256=JB8MIrwz5u2lw0e7Y9Bel5wDgQVB_pi0MtywjedprGA,233233
|
168 |
+
babel/locale-data/chr_US.dat,sha256=wZE2RrJ-5jjUQa1RCJgL7hkXdsU3t91orD-ULDYMXSM,654
|
169 |
+
babel/locale-data/cic.dat,sha256=eaHu3naKHQZXra4cPkLtNTA9ifzBGG2RwOq_SIq9OaU,2751
|
170 |
+
babel/locale-data/cic_US.dat,sha256=DvW1XJS1hEp_W_5ol0pIECeUb3RqXsyieKVS8J6caJ4,654
|
171 |
+
babel/locale-data/ckb.dat,sha256=AZVeUEXTNP24sqYx-yTWm6HurKdGLGgIVRNGBazKaeY,42245
|
172 |
+
babel/locale-data/ckb_IQ.dat,sha256=Osgu1RAUf2yQpZ-nNBKMxTFJnH32ItLg0kVVzjNfmeo,679
|
173 |
+
babel/locale-data/ckb_IR.dat,sha256=6wWzlZWn7oDmGIdnF7UtCfIcUgQ1zvMxtAcEw4bbM-g,1231
|
174 |
+
babel/locale-data/co.dat,sha256=gaYPBHZWXANvwbLrSS2-XPh_BT-a94XTzdlFCCFhK2g,15725
|
175 |
+
babel/locale-data/co_FR.dat,sha256=DAmwXn4n1mRSsT17-DcU0vdVSI_JfVR8oGOnj7hTFHk,653
|
176 |
+
babel/locale-data/cs.dat,sha256=nADdcIBj8sszhkqnC4gfTSQqB2zjKND1rHLOmNwTs4o,334644
|
177 |
+
babel/locale-data/cs_CZ.dat,sha256=keaiqSsGtB_axj8FvdYDOCDmlg2PbQMI6qnW-2mFUTY,653
|
178 |
+
babel/locale-data/cu.dat,sha256=AVajYXlHvt5g1cMq-eC69rr-xSko12J8JD-6Ywej59U,20277
|
179 |
+
babel/locale-data/cu_RU.dat,sha256=GcbqgE8Mlglk5EGGSVcCR-Zb8AmCqHGE8cbmAUSbpdY,653
|
180 |
+
babel/locale-data/cv.dat,sha256=kHbrL_nzQrIKdGXBGrCqYg4Qh1pBILVsH7nMocJ9UZ4,97815
|
181 |
+
babel/locale-data/cv_RU.dat,sha256=oVPRtcHzmRmkAy26Bv1jLiWmm0P18ruvHlCQ5F3IFY4,653
|
182 |
+
babel/locale-data/cy.dat,sha256=_3et0sgz0QFi8FlAKvN-Od02OjL7-_RW-_GNdDI1h3k,373601
|
183 |
+
babel/locale-data/cy_GB.dat,sha256=dyPULIteKk9gP7lGQiDtsiH5QDqNdlxMdK__2dq90dg,653
|
184 |
+
babel/locale-data/da.dat,sha256=K1BXQdwR-ahbFdDAlUfvjyx3u-VK0uU0Q3GVapWfSh0,230205
|
185 |
+
babel/locale-data/da_DK.dat,sha256=qNTw1H8WXsV8qGBHxu6noCUOV3BcoR63ERJF8Xc86Ls,653
|
186 |
+
babel/locale-data/da_GL.dat,sha256=9BNeKX1-U4NDr3pBU1ZnCGAasdYZjBMsvpdS5uTf9qs,616
|
187 |
+
babel/locale-data/dav.dat,sha256=6nbRBkxNimZwwDoVsofPh0disJDKsu3eQL3k7O3F3u8,16193
|
188 |
+
babel/locale-data/dav_KE.dat,sha256=MfFFEDT6fib5be-EmziiEF0NAnEV6lXD7svYtHUtmn0,636
|
189 |
+
babel/locale-data/de.dat,sha256=gHAv7h6C3WGZ-h7TvnUaakK49fKUJLKaIL6ufFW12ws,237243
|
190 |
+
babel/locale-data/de_AT.dat,sha256=BUbZOt5qYE0tKfJeqmPlxFgAF3xp9wGFLNtB6C35Ctw,2641
|
191 |
+
babel/locale-data/de_BE.dat,sha256=wvdWykhix9Slofcjm2tx2aEhMjffmMLsNrd8709NIR0,653
|
192 |
+
babel/locale-data/de_CH.dat,sha256=795GEXg--aobz28qnS_CYO7_TlcSM6gVymZomESGr7U,4311
|
193 |
+
babel/locale-data/de_DE.dat,sha256=SM44YjGlqgh7bKlXvUdt53t9hnCX5o46ujI4IrGPpeI,653
|
194 |
+
babel/locale-data/de_IT.dat,sha256=_ccaB__UQEMDjx88_tQ4svpXNQhhfypilclNnna1UgQ,1646
|
195 |
+
babel/locale-data/de_LI.dat,sha256=FnGRiippDTTFRFswU_4PblQruAuWuPEpa8cGbXPJpbE,1413
|
196 |
+
babel/locale-data/de_LU.dat,sha256=QAkvLfyKmZdQVfkk2BbE2AMisK1i7yhRetcApqn4dxA,1067
|
197 |
+
babel/locale-data/dje.dat,sha256=qKWXMFDxJ6i4Gaiox33mTyi9gHEUJI3P5DwZ-PaoiAg,16157
|
198 |
+
babel/locale-data/dje_NE.dat,sha256=lU1vag_HJ4OrbYNYWFXuSdtqLwSlwBbvD6Tg-hl36e4,617
|
199 |
+
babel/locale-data/doi.dat,sha256=Z5-0N1pcReHx1QP8V_XO4QnwwYUowUoW0X3IoyjLHVM,24727
|
200 |
+
babel/locale-data/doi_IN.dat,sha256=-q_oAqvdTizFG1DB_1p8sZVyjbaFFQ_FFPtNCyVn9ZA,659
|
201 |
+
babel/locale-data/dsb.dat,sha256=WZ4WRm5rxxTbxN44QFfr7tlCn2GKIa1RiqSDw965slE,258955
|
202 |
+
babel/locale-data/dsb_DE.dat,sha256=Z2Dzjx7eXscEBEAb-ymvb1GKP4GVNCt5L4i-BYC_vrE,654
|
203 |
+
babel/locale-data/dua.dat,sha256=yVkm_JzYn9zK1ct4ORyc00IhvhNXHS_TBcbM5J2zDuU,5317
|
204 |
+
babel/locale-data/dua_CM.dat,sha256=Z3vD8WEr2Wlqqt39anvKXVhz4_yBSm4t5BoAaEz9PgE,636
|
205 |
+
babel/locale-data/dv.dat,sha256=-1zCv4GXiRHdWjQk0qXWNPSf4FX4Zp-Ij2jwgz5BsGk,2225
|
206 |
+
babel/locale-data/dv_MV.dat,sha256=lvuU5gj3vDykU2ftU1_4Lza-130DB6_ZwylDrdb_GlY,635
|
207 |
+
babel/locale-data/dyo.dat,sha256=9vdi_yL7p7skDqWnbG29rKYMm9DauMzy9aXEi3wreO8,10500
|
208 |
+
babel/locale-data/dyo_SN.dat,sha256=Z6N-NIVcKkx6sFUm8LfN74usyZfgeI6swJL_A_XbBcc,617
|
209 |
+
babel/locale-data/dz.dat,sha256=ff_TDWsCb2rKPMJP6XOAHRxXoRRsEYoOcvDiWoB18TY,90284
|
210 |
+
babel/locale-data/dz_BT.dat,sha256=KWd6cypWse4XfXbY4BmTlxGjlnRksYNcQYi_iyXluKw,635
|
211 |
+
babel/locale-data/ebu.dat,sha256=ZK20F26CyLC-axvixTbESEfn1V2Cye3WrQinYulap_I,16157
|
212 |
+
babel/locale-data/ebu_KE.dat,sha256=GEcGqVmH0WwgP1BCsd9vnSGxGXl8ON4UPTRbyeaNDfw,636
|
213 |
+
babel/locale-data/ee.dat,sha256=u1vtOZMmRs8yxGQM1gbllFk_0fQHOorqSXRyJ0m2uR8,148049
|
214 |
+
babel/locale-data/ee_GH.dat,sha256=SkQi-aVmtqi3S99DUTLQzZqUE4LrAIWuy25QuZqYAfI,616
|
215 |
+
babel/locale-data/ee_TG.dat,sha256=7y8-rDvag7_EQtEObq3fpHaRedVmuEREnQwjktmLwgk,1168
|
216 |
+
babel/locale-data/el.dat,sha256=f7m9ojEW_s1vGPAsd94D6rpNQgGRh3BYHUZ4JQyD2tE,279619
|
217 |
+
babel/locale-data/el_CY.dat,sha256=POPjzTYMuP7Ijf1S88cAFR0ge9Id_sSRNembKdhk2aE,635
|
218 |
+
babel/locale-data/el_GR.dat,sha256=S32Cm-1ENgLL_lDecCDI4qDfyd3wlQ1JbUwOnW1whm8,653
|
219 |
+
babel/locale-data/el_POLYTON.dat,sha256=lkcs2uXW6mWXztmsAXnapnSuQ6gkns1WwsVgrg-24Uo,14964
|
220 |
+
babel/locale-data/en.dat,sha256=Wlq59NM-KcRgvw-FwnUU0K7jW2KNW-kr19V3YY9Mieo,209482
|
221 |
+
babel/locale-data/en_001.dat,sha256=OkPYuVpqowcVX0Z64u-6wxw8my-e5JZbj4KWrCVsULc,32030
|
222 |
+
babel/locale-data/en_150.dat,sha256=cjKCV1ZLhNY4TvqJF8BXvQR1jVUBFrdjL1RKSnBa0vc,1851
|
223 |
+
babel/locale-data/en_AE.dat,sha256=wqlLhrbYmQxkJFUGjLTHRlydDCYhsotTUFWmVDLYj14,4191
|
224 |
+
babel/locale-data/en_AG.dat,sha256=POWSM98pRq9k7lqCsxr-MS9PA-zLoOVUKUcI9iXtKq4,654
|
225 |
+
babel/locale-data/en_AI.dat,sha256=7iwWKftqPdOdWJ7v94jsre2ZIq2cDpbVGAs_ScBztbs,1206
|
226 |
+
babel/locale-data/en_AS.dat,sha256=M-N7v6BuP47wkTFmv5by1w42IQCUiSqKbaVTXtnwF8Q,635
|
227 |
+
babel/locale-data/en_AT.dat,sha256=05-bVy1aMFWZlHMBC86A7OVy1zlhJw7hsjyvIOjxE70,1309
|
228 |
+
babel/locale-data/en_AU.dat,sha256=a1xjc5DjzNe-LEYVjlvtmEuiwpYhpeJN1-r9Gel3s1g,27440
|
229 |
+
babel/locale-data/en_BB.dat,sha256=J8vppKlBp03jJvVuVp6Z4GMc_N0BukeQ8f8q14y8fwU,635
|
230 |
+
babel/locale-data/en_BE.dat,sha256=0JXHgqUIWZYe88FYC97spm2TqyIaNOwDJBt3LBmUF7A,1547
|
231 |
+
babel/locale-data/en_BI.dat,sha256=AbdI5FjEqQLOMbBtD3wLW_7AccuOwY9MZUFpMF1uEco,1189
|
232 |
+
babel/locale-data/en_BM.dat,sha256=cZE8sxf44ETY6nCxOgbvJN2RhABZrRaP8SjwsbSepuE,654
|
233 |
+
babel/locale-data/en_BS.dat,sha256=r-oQxdqP68-0nui6I4vSSfLkPXUKS6PMKAWdxxZBSjc,838
|
234 |
+
babel/locale-data/en_BW.dat,sha256=k5bc9gYBdl_8ZyCelrlS9ZenMzs8cdfl2MxeCnOAr88,2850
|
235 |
+
babel/locale-data/en_BZ.dat,sha256=ea8sr4wyGm4oIuNmp9ZF0_Vk6kKblTAlu60Sl4GMucQ,3065
|
236 |
+
babel/locale-data/en_CA.dat,sha256=Ux60R-ZESNBNm9G8t6kv6r6rqA1jP4floCz6neF65Iw,43388
|
237 |
+
babel/locale-data/en_CC.dat,sha256=34a3Vb57hT2reRvwn0Ud1nXkoYQJoPmaqh1n5qflFdI,1187
|
238 |
+
babel/locale-data/en_CH.dat,sha256=Nfkwk2HNOccSH8Co5SWYnFdHWEDEpKNPQ2o9a67vt_k,1866
|
239 |
+
babel/locale-data/en_CK.dat,sha256=gvU21BSAugpjE7CT3xnpHML6oRgHPaBoq7W11YbG-1U,1187
|
240 |
+
babel/locale-data/en_CM.dat,sha256=r_7Yzep6S0ZOFvk_TORm5Qhi55yjehVQAotaLnn7igQ,1437
|
241 |
+
babel/locale-data/en_CX.dat,sha256=lKYbIRS6r-WMUd1ewX7Q4TpX0PBVcsYN7Cs263_xosM,1187
|
242 |
+
babel/locale-data/en_CY.dat,sha256=kQZfhQdPfdBeePOngn-4CpA3ZJ7Th-lmZ-jOrBe115o,635
|
243 |
+
babel/locale-data/en_DE.dat,sha256=oI3TmMDoQZsGddvDb0fbbwd_LdTeFbFPdFkZhst2q7Y,1027
|
244 |
+
babel/locale-data/en_DG.dat,sha256=xtjjxkuFB7I4p3n0f4Evz631RtMQhIzpoYwUzOzICqA,1168
|
245 |
+
babel/locale-data/en_DK.dat,sha256=ygI8iTEmh7BSSNxP5al7Lc-WUAXc4jSM0E3H8rWW338,2449
|
246 |
+
babel/locale-data/en_DM.dat,sha256=gbriVhXcdXi5GWmpgWdGB1LUwI2yquuLk1khkzpo1UU,654
|
247 |
+
babel/locale-data/en_Dsrt.dat,sha256=HBK4MuF_tSCruRXJ5Bo6pkyQd5IXaDVSLWqR2is-xdc,39791
|
248 |
+
babel/locale-data/en_Dsrt_US.dat,sha256=p8c_L5tEvzYmacz0tmq58Wsbfp9wMV_PBgz5R_v7I-k,653
|
249 |
+
babel/locale-data/en_ER.dat,sha256=U1vYaQVwnVgfmO9l2_GjBnAhHrShbiHU_E-hAclDvck,887
|
250 |
+
babel/locale-data/en_FI.dat,sha256=ZcMBUya_z9GKHdqfeLBpe3kH-3XuKP05mbagahXitYw,2381
|
251 |
+
babel/locale-data/en_FJ.dat,sha256=k-hXekogcQzt00qXdcWODsHbg7Vh9U8Vx84bERd8CHM,672
|
252 |
+
babel/locale-data/en_FK.dat,sha256=r6OGl7mX4ep5aeFMlhog6Xr--kDKFEVhDcepSJBYZWw,1210
|
253 |
+
babel/locale-data/en_FM.dat,sha256=88mCYM5_VDSYpJ_mV4AStjiDpKAo_1W7GbmKcI9f_sk,616
|
254 |
+
babel/locale-data/en_GB.dat,sha256=oy9983B04MskGy18XJaeUCxXdh9LnV-X73rjCn-AwTA,23749
|
255 |
+
babel/locale-data/en_GD.dat,sha256=c2ap41e5x-OY5dEYZ5wD4ByRbEzlx0845R1lPBLnJus,635
|
256 |
+
babel/locale-data/en_GG.dat,sha256=qhfvbRdldEA4467X0_8N09HwT1ZRPJJtb7Evpvbbarg,1273
|
257 |
+
babel/locale-data/en_GH.dat,sha256=bBpzsHl9QhNAQ7hrUtKb6TwGvZYibXQwXfuJVgLMlZ0,889
|
258 |
+
babel/locale-data/en_GI.dat,sha256=veSOVDagnkTwyqxP4u5mOkRG8_W4MCZ5ptMBoGOg9SE,1228
|
259 |
+
babel/locale-data/en_GM.dat,sha256=jfHQeiMTDNgnIpx3WZ9hOpCR_LXCYLLrVN4SUakudi8,885
|
260 |
+
babel/locale-data/en_GU.dat,sha256=WDR_uybAkUii6RHT2x62pzCLvX4bMstibEztBvLSuxI,715
|
261 |
+
babel/locale-data/en_GY.dat,sha256=TDiVa4YSapsK9rjQN3ATnrj3m267l35pqRLI7r5bLFc,694
|
262 |
+
babel/locale-data/en_HK.dat,sha256=vI1hLxrvwa6TaBp2BrDjGTdNANjSLN_1KqkFMOSWv4s,2091
|
263 |
+
babel/locale-data/en_IE.dat,sha256=ZNe5XFbdM4UnYu6KaGYHggQqzIVCWwWof5C5ktTsHn4,2094
|
264 |
+
babel/locale-data/en_IL.dat,sha256=O4-JPTBiiLezF-iUSDu73id-0VWlSiE0ie8z9qRaxq8,1424
|
265 |
+
babel/locale-data/en_IM.dat,sha256=u3JX9jrrsW_G5RQXHsQIGl6ikVduckeldeS_FjKG5Y0,1273
|
266 |
+
babel/locale-data/en_IN.dat,sha256=G0LRfr9_xs5siqLd8sWFpC_lUTKtQfGr0dOnTVicM7c,11600
|
267 |
+
babel/locale-data/en_IO.dat,sha256=TOM0TxdcWcu1wyBXJxsrE-uCIZsbYTCmUkTdfCaOO-E,1168
|
268 |
+
babel/locale-data/en_JE.dat,sha256=IxL3Ry70pMOXDbCwU6LZllHXZmg8XHbjocavEWvb9jY,1273
|
269 |
+
babel/locale-data/en_JM.dat,sha256=Z9GFZ6aFGEvIEzlbOlA5bBBvxgcxXx6s_7AxPMp2Yg4,1666
|
270 |
+
babel/locale-data/en_KE.dat,sha256=oJa3lUdjavkdhkMK_bcnJ08waK9lfIRs8mFkG0JYf-4,1458
|
271 |
+
babel/locale-data/en_KI.dat,sha256=3yfkrwv7Yd9yxDNnXz9Sv8ghbDvqczZTAELr3uGNYn0,635
|
272 |
+
babel/locale-data/en_KN.dat,sha256=cFebccXOrQo2X1zmHoHYB2vzXynoroYImJTMnK9j3h0,635
|
273 |
+
babel/locale-data/en_KY.dat,sha256=uQV4Jf38XQ3ycqYb2HhyOYdNMIbuHyxyy9HNsb26Q2Y,819
|
274 |
+
babel/locale-data/en_LC.dat,sha256=jUYdKd248Jkj5XVxXXbvXnfxu4BH_3s4Ld-O67qbPkE,635
|
275 |
+
babel/locale-data/en_LR.dat,sha256=ribT8_azFjDC8uzIsOwkGTjfgEiFlSG_wAb_wG1Fmnw,885
|
276 |
+
babel/locale-data/en_LS.dat,sha256=2HtV3gUrynDl2mVvqywMfff8VnVjz2ryoNS7D2n5T9c,885
|
277 |
+
babel/locale-data/en_MG.dat,sha256=dtMrsBqOpwQExs7dVukbUzWojz_6swx5Ng6OXdKxsSs,1438
|
278 |
+
babel/locale-data/en_MH.dat,sha256=NZjQknLyokLgJRNPicAZ55_VoRCATz_WvAxMo_I-HOg,1368
|
279 |
+
babel/locale-data/en_MO.dat,sha256=UJVR7td-vlRY_a36ZWbxr_PcK6egIUQSKoky3DeAmEA,830
|
280 |
+
babel/locale-data/en_MP.dat,sha256=Sd2vA3CdR_GBw1vQQQBfKIY0asJGsVUwZ6gD-h7Or8o,1349
|
281 |
+
babel/locale-data/en_MS.dat,sha256=BXrA3odGnWSeR6404L85ErqMKxTnRCZ16UWL2RpD7TY,1187
|
282 |
+
babel/locale-data/en_MT.dat,sha256=sODJaESHndxdT9SYZcnESDA6G6oln6n9NCojeHhKvJg,1990
|
283 |
+
babel/locale-data/en_MU.dat,sha256=SefoZho0XzSzzU_Y_-udWPCuRgz8ujdUVkL7hhzZO8Q,1438
|
284 |
+
babel/locale-data/en_MV.dat,sha256=Spp5zsOCHzCeZOyUdYqXoqmSoIJ0pxRR3b3nI27jvTs,2034
|
285 |
+
babel/locale-data/en_MW.dat,sha256=5d20Ih8j6iwBY545I4nObBWdv9FL37nE-ggfpGeXSVs,886
|
286 |
+
babel/locale-data/en_MY.dat,sha256=nUwwM17W9W78nnbXGmrx2zComZQ9Fg_pu3va9wPZzvY,716
|
287 |
+
babel/locale-data/en_NA.dat,sha256=-yNAAmx38RoVJt3YRH7Tp1xO9o3GsSVDU6uF_GKhGb0,885
|
288 |
+
babel/locale-data/en_NF.dat,sha256=6LqhwHyOnkQA4TNvseuiE1a5Ov7DV3y46CZ0ENcibXE,1187
|
289 |
+
babel/locale-data/en_NG.dat,sha256=dvbDZYdlkmhF-IU8M6s2p_kHswy8HhdmR3LLc4EhePI,1439
|
290 |
+
babel/locale-data/en_NL.dat,sha256=dDCtXReh9uMfUOVqGWaWjfV1-dLe5_yj-o_HrKZGMeM,1192
|
291 |
+
babel/locale-data/en_NR.dat,sha256=ZiUNBY0c1T3LQP-qGmtuxLW2Jfc-lcVTuWpB2jxfAGI,1187
|
292 |
+
babel/locale-data/en_NU.dat,sha256=jU4HXz_3l5k-luPPsjZmZBsdOVB5ZfkN1Xuk5i2pduc,1187
|
293 |
+
babel/locale-data/en_NZ.dat,sha256=Hs8XKn1k7mben0jCQQnWTKcK0SMwXeD6zjRgBErPTK4,2286
|
294 |
+
babel/locale-data/en_PG.dat,sha256=WV6D2yT-4GX6ftbnUkK-ihfNg8Y-ImX1Af56okx8LTA,635
|
295 |
+
babel/locale-data/en_PH.dat,sha256=CJtGtvEQRqL4MDHUuywaCcuhYp3bVv7KUYMK3OH5OeU,656
|
296 |
+
babel/locale-data/en_PK.dat,sha256=KS_KXItkhkUULbKd9mHdWD9ok4WjZbVSXhU8e5u8blo,2074
|
297 |
+
babel/locale-data/en_PN.dat,sha256=qpEWWX0fvhzV6gcX_SHNbJW7E-5FikKwXrQAP9BWmXc,1187
|
298 |
+
babel/locale-data/en_PR.dat,sha256=bpAu9yoeKxzQTF5Be7AfXtyE3wax0eP0m-Eu-Cr0jKE,635
|
299 |
+
babel/locale-data/en_PW.dat,sha256=tpiNQH7vUuPfoLqFZ3_R8qBhExAhjG3nlp7zTydqE1k,800
|
300 |
+
babel/locale-data/en_RW.dat,sha256=Et3hOZwaSDECrCzypgYq1QxKxxnB3XYziIeEe_WiY7c,1438
|
301 |
+
babel/locale-data/en_SB.dat,sha256=h9TJ69YThzzLGTh49BBEmRBxSiZhZpQrVJif0QglLVs,635
|
302 |
+
babel/locale-data/en_SC.dat,sha256=omYtCZBrLl8fHuT6XInezdetV7WqWZVYriJRnlWKbTg,1188
|
303 |
+
babel/locale-data/en_SD.dat,sha256=ozd3rV_icr8p2H9V6StOSMkoHBPNBsXsay1GMRWZ1zs,928
|
304 |
+
babel/locale-data/en_SE.dat,sha256=96guhEOzGr2Lcbd3xZ4j7HTj-0H0oaGMQIbI9a_5g48,1502
|
305 |
+
babel/locale-data/en_SG.dat,sha256=u9U5CLnqs0iJmSnMsPBHF71HQLpFM3siADzZeC7iaJ0,2096
|
306 |
+
babel/locale-data/en_SH.dat,sha256=rBm_0zxjHnEVzs_CPCyuz5LpI9isA2S6copUuNbxCcM,1210
|
307 |
+
babel/locale-data/en_SI.dat,sha256=kkeEkPnW48iNoiwNZb0KV29DPU0oVNuENTi_Wmp2ALc,1046
|
308 |
+
babel/locale-data/en_SL.dat,sha256=4hJLAAnyuEVVQZ13NC7wZ0JYJQ3rvX0SsOAp0OoW7_U,886
|
309 |
+
babel/locale-data/en_SS.dat,sha256=C4kpyEFjyKT9-6wt2pGl4125aN0Bp0wpcYBrr62nPOc,908
|
310 |
+
babel/locale-data/en_SX.dat,sha256=7vESruRIiaBqWxuSRpIE2U6PgWwJ9mxgbjjH_XAraa0,1190
|
311 |
+
babel/locale-data/en_SZ.dat,sha256=A9wkzZ5cFffcEf1FobYRPxR1EAFwqQvqELsqRpNleOg,885
|
312 |
+
babel/locale-data/en_Shaw.dat,sha256=2a2Nq7ax60C_ojL8QeWNCWF9d8Vb5e6LTUPHwUySfMY,4857
|
313 |
+
babel/locale-data/en_Shaw_GB.dat,sha256=uAIWlJ5gr_NR6lncmMaBrjXUPhZ33rGsXoHz8hrd_E0,653
|
314 |
+
babel/locale-data/en_TC.dat,sha256=UWqEc9zpN3NdS1dymbUv2iGKhLkH65Kk9uNFxdXGnOw,616
|
315 |
+
babel/locale-data/en_TK.dat,sha256=qz4RHtHQ6cNjB8xW8_BIHdzW1cEcQuyJfdqFIybXAs0,1187
|
316 |
+
babel/locale-data/en_TO.dat,sha256=OehJQf8kvWi7A-Rwo2hPjs1Z9pTdg7_Hyx_ewWxbLQ8,636
|
317 |
+
babel/locale-data/en_TT.dat,sha256=L23iDn_zvh16iPE5uBlLCRvECSozqyzU9W2OcSjYogE,654
|
318 |
+
babel/locale-data/en_TV.dat,sha256=3sj3NCjQg-9UOdTz7wDJRpjx57bI0bntpmx0T50OK9E,1187
|
319 |
+
babel/locale-data/en_TZ.dat,sha256=5Q87mjSEaCMmWeWwtesb9lJw2tIWOsvyScG1CqSpWvs,1439
|
320 |
+
babel/locale-data/en_UG.dat,sha256=aQLfdbfozsYhK3EG9JXVxsmT4B7UvfSzNBo7kO2WSsc,1462
|
321 |
+
babel/locale-data/en_UM.dat,sha256=qd26Sl5bJTEgHU25hvskp4LMxvRJByLOSvUikqz0J4I,653
|
322 |
+
babel/locale-data/en_US.dat,sha256=p8c_L5tEvzYmacz0tmq58Wsbfp9wMV_PBgz5R_v7I-k,653
|
323 |
+
babel/locale-data/en_US_POSIX.dat,sha256=U8r77o6qQID3Sd5FiZqukSpQnq4LV1BDwHUeuNZjW10,1321
|
324 |
+
babel/locale-data/en_VC.dat,sha256=ES4c4Xt6OvJDhxoAZpWR2HFbtyENOl9CrV7XFCBs-MY,635
|
325 |
+
babel/locale-data/en_VG.dat,sha256=sqiVUOEtDV2pAc5DzGl76qV1mL5K-UWhMRzG-Ff6r30,616
|
326 |
+
babel/locale-data/en_VI.dat,sha256=AGffygfBAafQMxKAAoxt6kwmbES4R_ybbXRV2tHpy04,653
|
327 |
+
babel/locale-data/en_VU.dat,sha256=ji2cRB8B-c8uJR7L56HzbkiTR8eJZziVTMcEzuiK2g0,636
|
328 |
+
babel/locale-data/en_WS.dat,sha256=gowKsveED3UIWyLgnSWxyE6qq87lH2dMgOVLDGCEcBk,656
|
329 |
+
babel/locale-data/en_ZA.dat,sha256=uoSLsVWiMu6x-DYwISGhEwveg0kVsDwgnIhq2Jn0hXo,3411
|
330 |
+
babel/locale-data/en_ZM.dat,sha256=8y814a5GtYcC5gvh3YBlcYf5Imr0yNEIV_v8jH3SXqk,885
|
331 |
+
babel/locale-data/en_ZW.dat,sha256=GUDDEesQRkUuLyyDlnJ3MGlGzG-kDPxt8OTIqVRKDyw,3320
|
332 |
+
babel/locale-data/eo.dat,sha256=i6qYU1TiS0gJlaDujDhrni1-lGWa8FqGq8zKuxU4a9w,83033
|
333 |
+
babel/locale-data/eo_001.dat,sha256=3-tP9zaTDfbBBjpd2qKVIhS7WWbmtVKGGW_BmGIhrHQ,850
|
334 |
+
babel/locale-data/es.dat,sha256=gi1EY1ecGIrSicmPdPBYBLm2eepI8KfdZrWZYAeLeHU,229309
|
335 |
+
babel/locale-data/es_419.dat,sha256=7THYHrZzytkn8bemPNyqFg-8D12E7qSRVjRRIWhYLDo,29689
|
336 |
+
babel/locale-data/es_AR.dat,sha256=1GMeTw_tadnNXiSu2Fet6K0J-lSFdMLd5qwzQPMzAEs,7888
|
337 |
+
babel/locale-data/es_BO.dat,sha256=YWIOkvEMiIKnCUdDcoQT3xkQKOnYCEN3Da1DmIFOIjQ,1633
|
338 |
+
babel/locale-data/es_BR.dat,sha256=Wl-H9uBjeuKESxR7bD9c1IGRgvdXWt0u7OkDCOYyg-g,655
|
339 |
+
babel/locale-data/es_BZ.dat,sha256=gDSknig_8SiqrzIfM1se8YFXs1VNxLhKEXjIbLU1Bmk,654
|
340 |
+
babel/locale-data/es_CL.dat,sha256=7O3xjsrQxIR6HZDJcYfHBT00ClnvKYr3X4YdElO6N80,5131
|
341 |
+
babel/locale-data/es_CO.dat,sha256=500xh1FisUJ384tSqiB_Wf3v3GVLX3cdgryRS1s-MMg,8081
|
342 |
+
babel/locale-data/es_CR.dat,sha256=U_XwxsksgJWZ8wMdjKdnRAHyp9DvNwwKCBLbVWpIlIc,1257
|
343 |
+
babel/locale-data/es_CU.dat,sha256=N-TqpCs34sjlEMeJgvrfOSpmnnlGxuuGtSBSaUKDbvg,656
|
344 |
+
babel/locale-data/es_DO.dat,sha256=Tn2WgAGuAxE1rj7C4c4fLRVm-pQxxWMGrlq283zw5-Y,3442
|
345 |
+
babel/locale-data/es_EA.dat,sha256=V4UU6BM3pjbuEleLA_MaJtWl8IejNcHzUM660pfKa80,616
|
346 |
+
babel/locale-data/es_EC.dat,sha256=xlX1tLT2EBNtogfv2baOygf_dWY2j6K4pcAENeIoXtY,3097
|
347 |
+
babel/locale-data/es_ES.dat,sha256=fd1TSjdlf2lSMxwi0NhYGR2eyiABBaSJvhLlwLO46j0,653
|
348 |
+
babel/locale-data/es_GQ.dat,sha256=a7A-hqM9wNt51_CdpjzU8aT9KEeMz165-MyhkWyqJOM,638
|
349 |
+
babel/locale-data/es_GT.dat,sha256=htP3hiMywjg6OTsHzwxe8qHtYxIgmZiRkrtWvoNqgiM,4466
|
350 |
+
babel/locale-data/es_HN.dat,sha256=zi8_eSDk9_RiKomcF9dCdEeROmQVyfauwRWaf1OYmYk,3207
|
351 |
+
babel/locale-data/es_IC.dat,sha256=hwey8h4GM8i25i-YZR_K-jvCij95wZqr0zdTIKauP58,616
|
352 |
+
babel/locale-data/es_MX.dat,sha256=iVZEE8v-9i-3r-GB-tZ2lFqeoT-UjDgGQ1j0oD1Wy60,27854
|
353 |
+
babel/locale-data/es_NI.dat,sha256=v-bflaBIB2T6RUdrf7eZLswfXx20xcCxgXGsbxIf7Mg,1176
|
354 |
+
babel/locale-data/es_PA.dat,sha256=8b00L8M61k2vgOOR4tw747goZhjpIavnyu2S1vRM3kk,3485
|
355 |
+
babel/locale-data/es_PE.dat,sha256=fWsvGn-qH_jUM14BnijdgZYoS53D8qESgRnAR14coUQ,7406
|
356 |
+
babel/locale-data/es_PH.dat,sha256=fEMZmVPQb97bBjEtCVMLn9JUtosTePmRuQqhpfNYkZQ,1248
|
357 |
+
babel/locale-data/es_PR.dat,sha256=giHS4bzl9lLM7QW-AVsdouyZliusBvEFGJ5dZOJ-oSc,3518
|
358 |
+
babel/locale-data/es_PY.dat,sha256=O44WVQyiDEUz6UhoXdgc6hz8AJJGOTKiEsQoXk3ewkY,5289
|
359 |
+
babel/locale-data/es_SV.dat,sha256=phKpy149vgFM_Mt89rIt6zfE1_F5dJBbeIhvOlWfUuM,925
|
360 |
+
babel/locale-data/es_US.dat,sha256=B9TmgQ3afX11PA3Pb_C3xhzTNamup1l34VtPJQ4L11I,23055
|
361 |
+
babel/locale-data/es_UY.dat,sha256=UfxeB0PVAg0DWV64Goe_8X2aKYuFtc1EpkrSZ_ZJXS0,2338
|
362 |
+
babel/locale-data/es_VE.dat,sha256=bMPt02AOJTEUwGkUEJ7LqggAVg9gTB5SHOeaGfYMvTE,3428
|
363 |
+
babel/locale-data/et.dat,sha256=50hnZJthmv8dAZc8xvJi4AMP7p_0sUVAnX7aJJnlCTs,231692
|
364 |
+
babel/locale-data/et_EE.dat,sha256=JpcyzIDpGwHlLSiInuYO3HfxkMEFsDPBeMc-B8Rj3MM,653
|
365 |
+
babel/locale-data/eu.dat,sha256=xXEtbvTYQYVgz7kP4Fqb-cQyX4fyHLOHwuUZhHSbU60,246276
|
366 |
+
babel/locale-data/eu_ES.dat,sha256=ABS9lrwjRkWenVB4fNrwKpr0mOuMF_eOlOrSrobcDl4,653
|
367 |
+
babel/locale-data/ewo.dat,sha256=RF4j1h65LFuyYvrmmd9ND7ha8wtR4S2Toe7XcdI2k1Y,17554
|
368 |
+
babel/locale-data/ewo_CM.dat,sha256=likxlZJqzYOVxcG4oSUQLTiH5DjGjdAFsJPIjnnj2Iw,636
|
369 |
+
babel/locale-data/fa.dat,sha256=vFoCBC8KOyce2lEHamZ8wWxULqh89IVYABQX2T5OmfU,249371
|
370 |
+
babel/locale-data/fa_AF.dat,sha256=l8reEqmsxV2Y-jGu1NT4gp26VOcGb9L6xRlX6WUfImQ,10703
|
371 |
+
babel/locale-data/fa_IR.dat,sha256=nPuexwzRHDb9TFMjILK_V43sVIzbcn_fgp0msY3eFQ8,678
|
372 |
+
babel/locale-data/ff.dat,sha256=LXkMNz3LdS4PN5ZiaMev8W58-ce0tgacyhEKvvDKU8Y,15993
|
373 |
+
babel/locale-data/ff_Adlm.dat,sha256=cD4vur6RTqnV5rVgMqgDH2SHG0mQXmzb-ZC27WllJBI,350107
|
374 |
+
babel/locale-data/ff_Adlm_BF.dat,sha256=eYQLbHvxtEqcJCMbXSkqN2dRSuYHVc6Tg9kOUKayJQs,637
|
375 |
+
babel/locale-data/ff_Adlm_CM.dat,sha256=b3VqkcWqXc7s1hCxN60dd-yBRXkcXfMMQ0uAJKmSsg8,656
|
376 |
+
babel/locale-data/ff_Adlm_GH.dat,sha256=r1CRe9Z8kZ3B3PDxmZQbvgpsEcY3OjJek9Z_S8FBb5Y,1236
|
377 |
+
babel/locale-data/ff_Adlm_GM.dat,sha256=ZM17aBc8xznEjoP4f7HRCHaKn-DIxCSDGkL6GvDYvDw,1232
|
378 |
+
babel/locale-data/ff_Adlm_GN.dat,sha256=HWkLsTj8Sd0fWYuYysHhShl08hg0iAvSXhPjy-rUjB0,616
|
379 |
+
babel/locale-data/ff_Adlm_GW.dat,sha256=vIUl_C4PZSWmypeEmnsAUbGN2dSquM3nEOdBs22_qNE,637
|
380 |
+
babel/locale-data/ff_Adlm_LR.dat,sha256=277rY6zAWlxetFe0D0JpVEY9MNcQiJU9kt1jRoiXE7g,1232
|
381 |
+
babel/locale-data/ff_Adlm_MR.dat,sha256=qz618w1XY_zwZ27nB6LBgbzsjsh4UinfnuOVx2bqLgk,1233
|
382 |
+
babel/locale-data/ff_Adlm_NE.dat,sha256=waY1EIQKuOkVzrtJ-t-5VY7cK2uKL0SIBO0PQbx4x9Y,637
|
383 |
+
babel/locale-data/ff_Adlm_NG.dat,sha256=9UdHELj5G90YopBKktxDyWVQyLxl5f7P3ToBElwlvCo,658
|
384 |
+
babel/locale-data/ff_Adlm_SL.dat,sha256=7jLKofwQBRggP61keprrbfFGXvrcJPIOvwEVmUNjcTI,1233
|
385 |
+
babel/locale-data/ff_Adlm_SN.dat,sha256=nGazz6Tun3D-XsO6SljxQeeBuzvAb1sBQw21IbkDQKo,637
|
386 |
+
babel/locale-data/ff_Latn.dat,sha256=APyNmlFYRwCQOlboY58qsqiF57rrI3F4fHu-uQTdt4g,866
|
387 |
+
babel/locale-data/ff_Latn_BF.dat,sha256=Nym5keR3dDPMJBFr7ZyW2cuuY-qTMkdHzXnIHSmfD4Y,616
|
388 |
+
babel/locale-data/ff_Latn_CM.dat,sha256=rWaVAF6D5gv_hDhNmSGbcWGpPV7X4gp53FBMXyMjT-8,635
|
389 |
+
babel/locale-data/ff_Latn_GH.dat,sha256=-kMvFNIQyikTD2dFakV81ghSR2H584AigLgtmrzlhN8,1231
|
390 |
+
babel/locale-data/ff_Latn_GM.dat,sha256=1Air8sk0wb0McqLZXDWIYQeiKgPusBaVjr4zk54IaoU,1227
|
391 |
+
babel/locale-data/ff_Latn_GN.dat,sha256=7R-6dXYMBdveo2-9Vc7CjIA2H6y_hGJVbfVGIaJUgbI,636
|
392 |
+
babel/locale-data/ff_Latn_GW.dat,sha256=2kbqhzcDeSPQxefHxynmrv2tmFVnWdRNjO7I3AZ6lxk,616
|
393 |
+
babel/locale-data/ff_Latn_LR.dat,sha256=MQxcDQnMZC5hN52abzqCjVIL9Z5mA9wOyTqGPP4Oj0g,1227
|
394 |
+
babel/locale-data/ff_Latn_MR.dat,sha256=CDUb5owq0Ntsd2lIZJejvYxOjl-NOUPP-v3tgVj1_qU,1228
|
395 |
+
babel/locale-data/ff_Latn_NE.dat,sha256=R8C0fI8ql5XpnT29CrwBG8rgdHB1AASDBSdvqIqIQ1o,616
|
396 |
+
babel/locale-data/ff_Latn_NG.dat,sha256=00rtiYbJD_ci8-0M4ye95rzGpbyX8qQ-dmFFIajAtRQ,637
|
397 |
+
babel/locale-data/ff_Latn_SL.dat,sha256=UaWOeokdbSoxG0JUyyGWkDyz70sXy-cZbc3lXZxmQK0,1228
|
398 |
+
babel/locale-data/ff_Latn_SN.dat,sha256=mPVac9iCnwNay8c7Ko3uUvg48lfyfEZrvhpyEFFGmFk,616
|
399 |
+
babel/locale-data/fi.dat,sha256=FQfukeFXlRpAwrH5FJEMfkVEXfOP7SqWMyqxyUDlMME,250592
|
400 |
+
babel/locale-data/fi_FI.dat,sha256=cpbJU4KKG8OWbmLnc9TKTdzmpoi2AJh_Pu1cHhDwVSM,653
|
401 |
+
babel/locale-data/fil.dat,sha256=97-wJKIhPS4_hQxYNIa0uxqxUKznBUzyisdBO9GODgQ,208827
|
402 |
+
babel/locale-data/fil_PH.dat,sha256=JjoZt3zNxy1X6RnHoxUKOMzT-xMh3tGZBRq8cvrBwqA,636
|
403 |
+
babel/locale-data/fo.dat,sha256=c_xYyN2YpWzYkR2S9Vx7aayZXaUstjJifEc_Pa11AGs,182408
|
404 |
+
babel/locale-data/fo_DK.dat,sha256=HUuarLNFSsV_gN2fg-OqrPr-6Ry6KFgitCp173jxAOM,674
|
405 |
+
babel/locale-data/fo_FO.dat,sha256=SLeNQ33QTZ92kXCzQcFfo-OgwZVFPJKIeRivuvz0zo8,653
|
406 |
+
babel/locale-data/fr.dat,sha256=yxGnVtY_x6Jzd7QafStfUH_OLwXADmGZx04vVGNIuzE,246019
|
407 |
+
babel/locale-data/fr_BE.dat,sha256=Rm-b3ihAcJ_ujF2UgsHruHaEuDOLiaVvWl4Zsuh9uxA,1258
|
408 |
+
babel/locale-data/fr_BF.dat,sha256=7piWVeMMrZ-YbO9MNqJAu7ZeIdueVnhg07eeMwJHy94,616
|
409 |
+
babel/locale-data/fr_BI.dat,sha256=R4kaU1OtMcNIcibkw8OFGP6FaYMxt2uKMRyidkEqbiA,637
|
410 |
+
babel/locale-data/fr_BJ.dat,sha256=sel3fdwegY5W4NRg32t4MuXoqpGqTAGO_ffCF2NPggE,616
|
411 |
+
babel/locale-data/fr_BL.dat,sha256=n-MRZjeHNkRMwCtGgPZq52Lj0ijntBsxfskC324i2k4,616
|
412 |
+
babel/locale-data/fr_CA.dat,sha256=zHXbGxyyPwIsc07LMe0A2Two44tniWEb1ULgorySKig,73908
|
413 |
+
babel/locale-data/fr_CD.dat,sha256=W_SAIFUt4o1YDKLq98x6eBUA8ThPko4A37YtyOpwo0E,1137
|
414 |
+
babel/locale-data/fr_CF.dat,sha256=wxzk0Nf6_pKO2VDivQprUY9WvaxRSkrfQBoUE1UVrAA,616
|
415 |
+
babel/locale-data/fr_CG.dat,sha256=zP3HTP-nqZjG-OD_DLrDEPPbB3t9g4T2kHVzI-HxhaU,616
|
416 |
+
babel/locale-data/fr_CH.dat,sha256=jXw4xX_rw5bg1UFxrkzz6KHq6bXmJyV_DlWt1YdYvGY,3093
|
417 |
+
babel/locale-data/fr_CI.dat,sha256=TrHL8hQRuJI3Auxe3aTHYa_rljyUvT_s0q-jdSJflJM,616
|
418 |
+
babel/locale-data/fr_CM.dat,sha256=2uuuxIhXy1qUg6JrzvxdmDCwRxTi4LVL75vwIJ1GCt4,2150
|
419 |
+
babel/locale-data/fr_DJ.dat,sha256=Jqu2FOJQD41B6fLSBEc_Wf-dIQ-B6MWlT0m1buQnmxo,1248
|
420 |
+
babel/locale-data/fr_DZ.dat,sha256=uOe9lbjO51q30G0UMs5nKrMLta5CtLW2Fg4dvsfRX3M,1290
|
421 |
+
babel/locale-data/fr_FR.dat,sha256=bwtjtv0NG-lxlXO7fJd6r--l38WKaQmqlmn7PpXJdJs,653
|
422 |
+
babel/locale-data/fr_GA.dat,sha256=rMwS-msXjMO5T5k1BP2B2S9B_dYvDHlP8HMS-Lq8XU0,616
|
423 |
+
babel/locale-data/fr_GF.dat,sha256=x97-H7H0h4_MUTpjMdrkYB790vBvPKKxmnUTu-FOwLg,719
|
424 |
+
babel/locale-data/fr_GN.dat,sha256=6KVlBWrF76ZhgyYg47F1TcR8_fbE5Ii2pJzPhmbr3Pk,636
|
425 |
+
babel/locale-data/fr_GP.dat,sha256=W99xHjqPQj_NJ1X34ismj8A4xeZcHu_vyqH8tIwXgeI,653
|
426 |
+
babel/locale-data/fr_GQ.dat,sha256=Ogf5NI4zMvbVROeIb8F6h1NxJNKOqY4fKU6G2SPJXDk,616
|
427 |
+
babel/locale-data/fr_HT.dat,sha256=IVtsK0pIelVfK4eLEgUzfxBPV448daJSGdDLKVtPDhc,1900
|
428 |
+
babel/locale-data/fr_KM.dat,sha256=ChLpzCyulxYg8Qmm5HK8YkK203GRSUEBNPSl8war7lA,636
|
429 |
+
babel/locale-data/fr_LU.dat,sha256=0sYBhn8-9lvfOrU-ZEIbnO5v03qQOQq4wXCKp70b2sw,729
|
430 |
+
babel/locale-data/fr_MA.dat,sha256=CAuI2aOkC9TrnUNmMNd9CRApt5Gc8lGnnP9OMmrfseA,1304
|
431 |
+
babel/locale-data/fr_MC.dat,sha256=IfTCZ89rqHzUxdKyIz86Zs_VUH2zc5JAvntdhyKsNR0,653
|
432 |
+
babel/locale-data/fr_MF.dat,sha256=xU0grNJKWgpfArwpLt7vuOpSTSkyPx3o6gFkmZLCxd4,616
|
433 |
+
babel/locale-data/fr_MG.dat,sha256=A9zYBbE6gIWuGDPxv92ReIcR49gtIEYaEkCj9ZONHHI,636
|
434 |
+
babel/locale-data/fr_ML.dat,sha256=-PoWsHBtnaZisIOqZyaEFmwooRXb2R2xEMe6DYad_sk,1153
|
435 |
+
babel/locale-data/fr_MQ.dat,sha256=45qWAev4p2ZaFVky1Qlrw5q907PDfbRJq9q2UACahm8,653
|
436 |
+
babel/locale-data/fr_MR.dat,sha256=mVSOABz3cRa1-HEeUKW13sLw1ZR6PmB9h_DPfZsK4Uc,1228
|
437 |
+
babel/locale-data/fr_MU.dat,sha256=c4ERuS1GI8h7waxcW6BRtloW7BThLlgqdYTf31Ioh_U,636
|
438 |
+
babel/locale-data/fr_NC.dat,sha256=Su2DaGZPnLCaONmgosMYke9kH6dP8xJ8wJF6P5xrJq4,616
|
439 |
+
babel/locale-data/fr_NE.dat,sha256=D6ghYGdDXlhaVQ5gAr8wWHxEHYR7mBs0QaiNL5nfxWM,616
|
440 |
+
babel/locale-data/fr_PF.dat,sha256=oPN2EBo1hpLjlpDYPB51qEAx_4HNMWG5-Bh9JN6Kal0,616
|
441 |
+
babel/locale-data/fr_PM.dat,sha256=gEP6Ay7r-p7uIjOGXP8eCa62yujlTBntENdeNd9KKes,616
|
442 |
+
babel/locale-data/fr_RE.dat,sha256=ClPJyEDdRdqIJOtHIkeb-r3WyCoIDS476Q5olb7hVxE,1169
|
443 |
+
babel/locale-data/fr_RW.dat,sha256=gP8mpM7gx_X_9NKDm8B9PuTg83jwT5Nn3NOKPpVhi3w,636
|
444 |
+
babel/locale-data/fr_SC.dat,sha256=qvz0N08LKCsPCPDZK1NmAhhzmaszBQ8mSlDbAsEwAoI,636
|
445 |
+
babel/locale-data/fr_SN.dat,sha256=bxJU4g_LmR-JDMhaP4OVB2KXsu03lD4TVqYIRQnnNro,1304
|
446 |
+
babel/locale-data/fr_SY.dat,sha256=tpDovgZ3aK7OumRwbntHTknV-tRL_HjcPK1aQINC-x8,1290
|
447 |
+
babel/locale-data/fr_TD.dat,sha256=1H47veWKRj_iV9CxHMz7x7tfrL8IYdQaRWhTV455efw,1208
|
448 |
+
babel/locale-data/fr_TG.dat,sha256=r_E5Vnj0Kb5CG16ApHFls4UreDeO7-o3uzpQdJjpbRM,616
|
449 |
+
babel/locale-data/fr_TN.dat,sha256=hcGRJ2UjuFEFJqb1BDglGsXY8jCEIdM8--OrU3OqRhc,1228
|
450 |
+
babel/locale-data/fr_VU.dat,sha256=FYYsiaoM8QZeClMnQzLiLZNXW9hULz-rCgRTYWvrIvs,1228
|
451 |
+
babel/locale-data/fr_WF.dat,sha256=jn6VFRw_qpJFxpO-I6C9nhz_wRZ8cV2b2XRBgSzi710,616
|
452 |
+
babel/locale-data/fr_YT.dat,sha256=x0WpQCLoqrLY3_nCF7JlcuekkoUtcpE4llC8kRmeRmY,616
|
453 |
+
babel/locale-data/frr.dat,sha256=Qg0cT2ii-2mm9Y63crSbI2t08vdqFUm3sbW-07CC6FM,55262
|
454 |
+
babel/locale-data/frr_DE.dat,sha256=2ohnodzECbJBUTEta36Ts4amZKl2_LDhuD0-Hu5JBo0,654
|
455 |
+
babel/locale-data/fur.dat,sha256=j24ABSy8omhILPSWjZZSN1wTGfKGBbKnnWALmPVb5s8,34894
|
456 |
+
babel/locale-data/fur_IT.dat,sha256=PpDH1opUDjndOtvpPadiOtITGyGxKZY0ziEhb-4HKbE,654
|
457 |
+
babel/locale-data/fy.dat,sha256=FQXAFW8El4S7hvKngwn6VKyPBmFRIKaZ1T89OMD08cU,111417
|
458 |
+
babel/locale-data/fy_NL.dat,sha256=I_M2hFVCAaVAL90yVMloW2eYmzO5C3NZztfEDAes3_I,653
|
459 |
+
babel/locale-data/ga.dat,sha256=o3ZlOPQdnLC_m2iPs-vAYuDUgfU5im9jPPGPwEpQoRU,356553
|
460 |
+
babel/locale-data/ga_GB.dat,sha256=NKphVJhmH8egga1dgfO-hSRVFhbxms2JvGMU3ybgj_Q,653
|
461 |
+
babel/locale-data/ga_IE.dat,sha256=P948T1Tl4B7kL1T-uxii27q4IWO3yQQ5emTLv7iHvW8,653
|
462 |
+
babel/locale-data/gaa.dat,sha256=On4fYcu6Xq9AcqCtmb4tOW0om1dRlnskyUgfIrPzrgE,36861
|
463 |
+
babel/locale-data/gaa_GH.dat,sha256=FF7vo24vzA2ru3t8py246uanyOqyoSkpD65F7KFTXlA,617
|
464 |
+
babel/locale-data/gd.dat,sha256=BivX9BNOgOxhSi6NR7iIRtpldaD-9gAPRzZs_xp3QiA,338371
|
465 |
+
babel/locale-data/gd_GB.dat,sha256=weaRul21diYZoqLk7SXacBy8GD1bH30cQO6AHejilPM,653
|
466 |
+
babel/locale-data/gez.dat,sha256=An75Oy1DC5mOgIhlZ7smaHuEd3f9HSCqAvGtAIXe_Jk,12828
|
467 |
+
babel/locale-data/gez_ER.dat,sha256=MKpSW7Upkpe42Q2mbJStbjtnrW6Kyo8Tg0zXAxnHWqM,638
|
468 |
+
babel/locale-data/gez_ET.dat,sha256=93QTSMihpcfFyRhttFplgAcsAhzrPjlbrz5HI4feRSc,636
|
469 |
+
babel/locale-data/gl.dat,sha256=flLy2D9LdcwAjmy4B2-YVTuvtgkFkXuBYDedCXc5a9M,210091
|
470 |
+
babel/locale-data/gl_ES.dat,sha256=us8xWRQnNTO_KC42-FOU2cnLCNl96591qnxZ4exq5Fc,653
|
471 |
+
babel/locale-data/gn.dat,sha256=xGWKm7rf-ZNIM3gTs1BmDh07tJxFYi11QGjioull6TY,2539
|
472 |
+
babel/locale-data/gn_PY.dat,sha256=tArgCo85T_BUNmPc4sXVRz8X5wcHJmBS6XP0r8dPgA0,635
|
473 |
+
babel/locale-data/gsw.dat,sha256=Uq082ggeRAuwQoLpQfiPsmn723X-tRB6LXlPZGJqu1o,114282
|
474 |
+
babel/locale-data/gsw_CH.dat,sha256=fQlRCd1MJ_gI6rcnkrU-lUE7ZM4syRLh-suMRT0DCOk,654
|
475 |
+
babel/locale-data/gsw_FR.dat,sha256=vHNQ1q9Zyf6xLfsJpmqpaX1iHerMRt1dsJSPQdQDoTE,654
|
476 |
+
babel/locale-data/gsw_LI.dat,sha256=dsg7TA7MECMrbTXC7i7zXIjrEoqrF2jZ_ckGiTMholo,654
|
477 |
+
babel/locale-data/gu.dat,sha256=dmuygLhOARE2AQzqC8A6zMYMHSjQIAkLOIxqnCD48Oo,284035
|
478 |
+
babel/locale-data/gu_IN.dat,sha256=shXUMyk4ogB8uJPazALoReGyLqRXSYOeVBVMn313_Y4,658
|
479 |
+
babel/locale-data/guz.dat,sha256=D0umWg1J7fgM8kq625vdEHk6ZkwYXzm8cI1MZnEYxLU,15930
|
480 |
+
babel/locale-data/guz_KE.dat,sha256=Uz_x0_YFKJHDkSd46SvuIfO7W0c-uqYnasmmLNib3WU,636
|
481 |
+
babel/locale-data/gv.dat,sha256=-9c_0ZzoIitROCjXzyRHMVIXefwpaMN_MWMqwhcxOO0,4035
|
482 |
+
babel/locale-data/gv_IM.dat,sha256=bXOsSoV303kSUECHz2xd5HhASRI-XCjqjxnxpk0Bt10,634
|
483 |
+
babel/locale-data/ha.dat,sha256=2XcUNBC18NQuWrPYb8qmilVBa_YFdJuP-SflIl7eV5E,170161
|
484 |
+
babel/locale-data/ha_Arab.dat,sha256=pI5aVwTmf5n7laKX4KR_Yh_U2PY_HGa2aZieS9hZw7M,2330
|
485 |
+
babel/locale-data/ha_Arab_NG.dat,sha256=oYJYqTkaDX2p4IJ9j3sEJT49dcVn_f9JyjO0rUJTmAc,616
|
486 |
+
babel/locale-data/ha_Arab_SD.dat,sha256=7DD6pzCmpEdjwbTMAbAb_vJey6Qh0tIeSs8LjEpJxBo,678
|
487 |
+
babel/locale-data/ha_GH.dat,sha256=Cwfuh0nEMJu4LGZmdOXJHp_5fZRdpTIODJ_Tpd83uPM,1231
|
488 |
+
babel/locale-data/ha_NE.dat,sha256=udCyUBXGb43G6FYfwxQQKecmQVZxLfcssIa6OR1Dlgg,677
|
489 |
+
babel/locale-data/ha_NG.dat,sha256=oYJYqTkaDX2p4IJ9j3sEJT49dcVn_f9JyjO0rUJTmAc,616
|
490 |
+
babel/locale-data/haw.dat,sha256=HFKk9XZ8syPFA1BXRsNuZ2Qjtx_QHy3u-bANj-G8jcw,16286
|
491 |
+
babel/locale-data/haw_US.dat,sha256=W2qJBTNdETpoN-Ue0UYbqyblj-gIbQNOUMr01RwJ2fw,654
|
492 |
+
babel/locale-data/he.dat,sha256=Pr4OdWj7Bzl1hZXHsE-T1lZdN6LVHiQ96ngnObL9kTc,326835
|
493 |
+
babel/locale-data/he_IL.dat,sha256=KpQ8sod_QOZ94Tr0tfhlATzVVsrqXck6eq7txoQgCbc,678
|
494 |
+
babel/locale-data/hi.dat,sha256=cZoY0NkPdO0T4RUfvVoMPOFzmQoRh3TpaFTnXuC3fSc,285510
|
495 |
+
babel/locale-data/hi_IN.dat,sha256=UMkxSHgYSdX-hPgYa7rOOzft7xtJwcM0m5nTphUe9xM,658
|
496 |
+
babel/locale-data/hi_Latn.dat,sha256=kaFxV3l4dSvCSrFZnjDFGkE4LrtGivPwEaI2RJ_FNoI,51640
|
497 |
+
babel/locale-data/hi_Latn_IN.dat,sha256=UMkxSHgYSdX-hPgYa7rOOzft7xtJwcM0m5nTphUe9xM,658
|
498 |
+
babel/locale-data/hnj.dat,sha256=gRR-f4HZS4ZZ5-ocjXis10q7ojD6DDYJzVyKCckhrk8,3658
|
499 |
+
babel/locale-data/hnj_Hmnp.dat,sha256=6GekZXtZVXtGcI_zk6NqXq3WxMnOx83IpRlJOyUws6s,746
|
500 |
+
babel/locale-data/hnj_Hmnp_US.dat,sha256=OydEowg2bNVks5nd5ij7ZJqqQT0ztYv4HL1ZZ4gNajw,654
|
501 |
+
babel/locale-data/hr.dat,sha256=rAEOu8FXEh4hjatKgyrq6Y-iIfghNtlRNkMaho5vD8c,280042
|
502 |
+
babel/locale-data/hr_BA.dat,sha256=E_S8FRdn0yszTWFg9RlqTV5zEwCc7-qtod45Ud8LHyI,1188
|
503 |
+
babel/locale-data/hr_HR.dat,sha256=PqaNYKNdTFgfgmeiINdYp2d3q8qpfkCUs1y4ZHmsphA,635
|
504 |
+
babel/locale-data/hsb.dat,sha256=WF1CY7Aj5UzGGJq6rF0rLsfpVs8djCWlbzcfhx_sf5c,258390
|
505 |
+
babel/locale-data/hsb_DE.dat,sha256=_ELT9KBswSqeyiwbcsP9nFY793FE8PQzEu_2w78Amro,654
|
506 |
+
babel/locale-data/hu.dat,sha256=ttkx4LP7bttS07ejxX-sDXMEBmpo8XWy3wp9FOyrYQs,224668
|
507 |
+
babel/locale-data/hu_HU.dat,sha256=r3RZskHfUdk1Ba226wqBHAoRMXorlh-IkWLlnY_mBTs,653
|
508 |
+
babel/locale-data/hy.dat,sha256=FPjMAeHw-1BjlQcr9gYrh0MOtm6CJgINuGHGo6ubpHQ,250022
|
509 |
+
babel/locale-data/hy_AM.dat,sha256=r1Bb6WWX2QxVlLP5vRVgox0HgoDOosA-h3oYKLeZMIY,635
|
510 |
+
babel/locale-data/ia.dat,sha256=eiarwn6xgBCoGh1tMxduBVzWzCkTf0sIwSZyuoCg5gs,150666
|
511 |
+
babel/locale-data/ia_001.dat,sha256=fzAkHPu7PNj2TOl-kQcJLIdlEK6z-KfVFUVcy-YF5Zg,941
|
512 |
+
babel/locale-data/id.dat,sha256=q4CIHLhOmaXdrOHtKhMne13fo1VJLPOhzY97H-qE2MM,188243
|
513 |
+
babel/locale-data/id_ID.dat,sha256=GvwO35RP_Y8vswE60ItYMQa7XUOBXGLk8tvL8kSJkY4,635
|
514 |
+
babel/locale-data/ig.dat,sha256=jcP65j1rPBE6AEPFI0kKEFbOVjt97dcQA_KmkXBVuec,118121
|
515 |
+
babel/locale-data/ig_NG.dat,sha256=2MR603ed1L8Y_aZhXPk7K7J8bgQPE4xvvpn8R9Jodiw,616
|
516 |
+
babel/locale-data/ii.dat,sha256=Xj_vdySwq9TkfM23teBtVgLYy1hMhyJngE0suii_pmU,12414
|
517 |
+
babel/locale-data/ii_CN.dat,sha256=Vr_Oe23kFnz-EDfl7XeDv6GeTY0LSK-VV6UJpzU8yJE,635
|
518 |
+
babel/locale-data/io.dat,sha256=laqBHV7QB933VjLibEOmRezXV9StwhKVzKvWp8e62YA,932
|
519 |
+
babel/locale-data/io_001.dat,sha256=T6zZvvSVOcdpy3fhXbdPAWmHCvDTluick2U8_hUDu2E,912
|
520 |
+
babel/locale-data/is.dat,sha256=TZ7NYQ-Q29gaLQlg2H9Lk_vsOKTdXLdiw4GJRWR5Ks0,217697
|
521 |
+
babel/locale-data/is_IS.dat,sha256=f3tUj_oYhQ6_tGnn8yda4PZfqChiHmcZXo_nMDCtzSQ,653
|
522 |
+
babel/locale-data/it.dat,sha256=LOEVop9C-GT5fmqr5xaJDzJTPWQt2rdPnIEw_yev4Vo,220387
|
523 |
+
babel/locale-data/it_CH.dat,sha256=Tvtge1s4BcbCeKJmPBiSbtbf_qv8wrw3Eb4Dc1sF3dE,2942
|
524 |
+
babel/locale-data/it_IT.dat,sha256=-e6EK0A6gEd_G4_BHlmd8_caQ-k_JrEemNgdA0czhsQ,653
|
525 |
+
babel/locale-data/it_SM.dat,sha256=xjE63TohE8bjkNiOh-BhOkuB9YWpQ0n2rrBMJoAql5E,653
|
526 |
+
babel/locale-data/it_VA.dat,sha256=wwsl_eAmNu9m2JPZnpBwFVh4gsk5AM9lSx8UAXhrMlE,653
|
527 |
+
babel/locale-data/iu.dat,sha256=53RtGr8AweFKBrGjz7UdyAcz38J2XsojcKxIeQg1NOk,3873
|
528 |
+
babel/locale-data/iu_CA.dat,sha256=C449KxuskTW8w7z56Vv602QRYsQ90O0WbazR7VqlDa8,635
|
529 |
+
babel/locale-data/iu_Latn.dat,sha256=3YkIAxkY1-gh5mpslT_pfhBfy7O-hlJB0R9G1usaRDM,946
|
530 |
+
babel/locale-data/iu_Latn_CA.dat,sha256=C449KxuskTW8w7z56Vv602QRYsQ90O0WbazR7VqlDa8,635
|
531 |
+
babel/locale-data/ja.dat,sha256=RuGLGmPiXVohZ_BjwfnXSa5xqZHaDQX198Lne6R0V-Q,222257
|
532 |
+
babel/locale-data/ja_JP.dat,sha256=o2pbFmlkEZjV7CHE9cYENYVv2kQA8texhNDhEecgQ9w,635
|
533 |
+
babel/locale-data/jbo.dat,sha256=2eB9ymOoFb8abB-v7ISAGcAg4HEEMmpuseHIXFgtqkU,1008
|
534 |
+
babel/locale-data/jbo_001.dat,sha256=wwLKEXJOwULYD-q92kQdvpiwW2fgis5YcsP2mT4tnT0,746
|
535 |
+
babel/locale-data/jgo.dat,sha256=_761luGFV86HXtwm9XpenLgaehrfIfhzKW7HwodRuG4,12680
|
536 |
+
babel/locale-data/jgo_CM.dat,sha256=1lDyjZLpK6fS6oSpfnVLdYd2IUgGlUQfF53BDdK7TLY,636
|
537 |
+
babel/locale-data/jmc.dat,sha256=RNnPpcHNebyd2M1occ5GM2zSdGgZ6sDNx1cTK8hh82k,15958
|
538 |
+
babel/locale-data/jmc_TZ.dat,sha256=fODp_OsVygbH0UoRsx4HHcXrde02bRKc-hy80sDkcK4,617
|
539 |
+
babel/locale-data/jv.dat,sha256=XI-l4qwfKfza5yuz5n60I0qjbhMXMLK_Z6ZI3aHjNs0,158607
|
540 |
+
babel/locale-data/jv_ID.dat,sha256=G3zTSeqWMngemp5lAcghudTcv-i8egZS12P0-T1DNXw,635
|
541 |
+
babel/locale-data/ka.dat,sha256=XwQR8_em-AVhIKbPVDozHYSPLxYc-P8N7jagfgBkKS4,285735
|
542 |
+
babel/locale-data/ka_GE.dat,sha256=zzw4NZBk8dsHIBeEzB3Vtf2_1nC4DhqblLoBUXfNHN8,635
|
543 |
+
babel/locale-data/kab.dat,sha256=lTVrc1W7MDoXagvUCYTVqS5ZzBR2Ln9SbXKNnAW3Whw,151483
|
544 |
+
babel/locale-data/kab_DZ.dat,sha256=v6fd0kyletm1kfN2ibSUh6oddckpLHjPd_qrq6FQpd8,679
|
545 |
+
babel/locale-data/kaj.dat,sha256=5Bmv7LPJ6mRkZShPRasiiUs5vvQUprGcz_4dRU6XLDw,2753
|
546 |
+
babel/locale-data/kaj_NG.dat,sha256=1RODrBAPxCrrlTgfhpdz-VxQkTdjJEJYHaJEsOgQsNk,617
|
547 |
+
babel/locale-data/kam.dat,sha256=Hpnb35vRgAxfiKnuLXDSC9PzJcShTiOVPCA8_jmi-D0,16095
|
548 |
+
babel/locale-data/kam_KE.dat,sha256=8AQQhHQdaI4rBKXfTivg884XIDfZlbDEQM28KwvB2Og,636
|
549 |
+
babel/locale-data/kcg.dat,sha256=dOZR1bP8sPbhD2Mk496Twz8MOivgGQoliuDMAWSO9fY,2549
|
550 |
+
babel/locale-data/kcg_NG.dat,sha256=jCObRZa-t9Khgx_M8ps0PLbeit7rPCFtHeCOhtfCnOY,617
|
551 |
+
babel/locale-data/kde.dat,sha256=GxEqL4RE573LuQAtVcwgk27YBRd9MqMHyyddSetrScY,16389
|
552 |
+
babel/locale-data/kde_TZ.dat,sha256=2sfb3gejYM15YtZeRrc0AJgdaJhqgbVJ9c9yF9SlJmg,617
|
553 |
+
babel/locale-data/kea.dat,sha256=8xapxF7U_7OqKJT6xNU6CMiPEvKPM38WQ8Y2fEL323w,95879
|
554 |
+
babel/locale-data/kea_CV.dat,sha256=LyzxPE6yP0f9hdD4uvu8CvEp8nmcmRDVuRI8YxBQ5wM,617
|
555 |
+
babel/locale-data/ken.dat,sha256=PMrEuqYRQIhbpP2dPowHOL_NKKFpEBd8qNUV_NpZnDw,719
|
556 |
+
babel/locale-data/ken_CM.dat,sha256=jNEojAAtQqJMkEq84kxHU5hGOVQCOW_hnGQScxycYMo,636
|
557 |
+
babel/locale-data/kgp.dat,sha256=vMgCopXVOUrUUVn5Nvjj8ynCdJitmX7vkkx24wXGW_w,210828
|
558 |
+
babel/locale-data/kgp_BR.dat,sha256=FNSYAqPhkzoZzholxTydgasgkuw7jgxCfyKDbeRiLt4,636
|
559 |
+
babel/locale-data/khq.dat,sha256=27tQDio-rRfhyBJj9uoL__hYEuWLDg3j19mDND2UohU,15852
|
560 |
+
babel/locale-data/khq_ML.dat,sha256=ViqThOcZTHZBtebV8LJY-DXdWVX5jAR5pdlBrTKws2Q,617
|
561 |
+
babel/locale-data/ki.dat,sha256=RQuBrvBn59856mBdBQOQyV_VwQH6VdQyQtIElMIuyaw,16037
|
562 |
+
babel/locale-data/ki_KE.dat,sha256=PNoxhP-WLxW2vH3fS8N9Nuy0tVimMP-ZAaCfLfnfDN0,635
|
563 |
+
babel/locale-data/kk.dat,sha256=XwwTZQPh7uFOewYlGBYVKctOeECt7RiWsinsY165BPE,256332
|
564 |
+
babel/locale-data/kk_KZ.dat,sha256=eaQW7Va1z2L34hs-D9QgrmyvOo4Lpy2uxxvxms6kL4s,635
|
565 |
+
babel/locale-data/kkj.dat,sha256=crvX9EE44zPX_yiSgE0cMUccp9jiag8asdIzDAnd8SE,4695
|
566 |
+
babel/locale-data/kkj_CM.dat,sha256=gqHwzVPG_Lo3svaIVe0Kfhj4DaKtstOxJJhUGvvpSbI,636
|
567 |
+
babel/locale-data/kl.dat,sha256=qh2frWDdC8LhcNBCV0Yds7nyQKZtcpp0V3C-_2Sjla8,59424
|
568 |
+
babel/locale-data/kl_GL.dat,sha256=c49k11GtBG8-vExsQNo_d1pFaQm0LYmXl7QcMSTEApA,616
|
569 |
+
babel/locale-data/kln.dat,sha256=MUyFLtLrWaxHjqxvhp-9QeuBn2ny5DEI4_hhFzx2uog,17923
|
570 |
+
babel/locale-data/kln_KE.dat,sha256=ZhkKgZ2lTdWAvWVOJEFlp4ASvjk2hcyTc2_P9s3mykQ,636
|
571 |
+
babel/locale-data/km.dat,sha256=Zr4gWySMRpRbjtFYPxjgWsz30Za-PuW1gVFCuTvlqpI,231560
|
572 |
+
babel/locale-data/km_KH.dat,sha256=bnykdq-RYJ0ZwajV5dFBVtM4anVkLjXutFdUxKByQ2o,635
|
573 |
+
babel/locale-data/kn.dat,sha256=iLwAlelmus4bDc8gYWq-77ykBMfnD4lSBbpslNh6emk,301406
|
574 |
+
babel/locale-data/kn_IN.dat,sha256=rx1LJYeAP8xU6MIU3yhHLuije5OQWL_wzz5glztIdi0,658
|
575 |
+
babel/locale-data/ko.dat,sha256=2GkYKzQAnSMlCu2FrR8FXIeREGaeBopeOnfaJkD7K-E,195920
|
576 |
+
babel/locale-data/ko_KP.dat,sha256=BCMOKQSzXNnjAUWfZZ8pbFoSDBed9tnnatyqIePNWio,816
|
577 |
+
babel/locale-data/ko_KR.dat,sha256=CJqKij0oULIeCIG8McohdnhEsfJxUwmJHOpJY1bLrNY,635
|
578 |
+
babel/locale-data/kok.dat,sha256=6nwMKp53pdA_w4rLynowHcK1zzFQUL5E_hmGWx9430o,213540
|
579 |
+
babel/locale-data/kok_IN.dat,sha256=GiRy8Q6VCULzgIxNPFEZzABKOg13Un-DblBwXnBSeEk,659
|
580 |
+
babel/locale-data/kpe.dat,sha256=AHR_ZG1p518D4yulM_cs5E58iMsVXKk4Hi6k0V0IDhQ,1331
|
581 |
+
babel/locale-data/kpe_GN.dat,sha256=7eabSFmszupn0IlzP6TRg1-7FZS9AB3JdBkDgJtIs64,1210
|
582 |
+
babel/locale-data/kpe_LR.dat,sha256=4O2gzHn_orogC0qOiIyIox-JjyA73hEAe_fZ3Fj5tYc,617
|
583 |
+
babel/locale-data/ks.dat,sha256=j26yE-FMnGmu7lhY-71ZEm-xvtTfIdUrgO4x0swzK2k,116505
|
584 |
+
babel/locale-data/ks_Arab.dat,sha256=fzDL_rCiC-BqymPhF6GBX-d5uVkvZCE4e8JS2L8cjRU,850
|
585 |
+
babel/locale-data/ks_Arab_IN.dat,sha256=-OE8PBigMDH8zQrxiaffmabm91Mi8-OVdDR2JEK8xPA,658
|
586 |
+
babel/locale-data/ks_Deva.dat,sha256=qco94Hg-V3CSx4efEtFGlFW1sz5W8WZ1a82WeGkREhk,15457
|
587 |
+
babel/locale-data/ks_Deva_IN.dat,sha256=-OE8PBigMDH8zQrxiaffmabm91Mi8-OVdDR2JEK8xPA,658
|
588 |
+
babel/locale-data/ksb.dat,sha256=GtwdEsb7QiUhqfSh2cx3c1OQzjsp849VFl421oLMU3A,15939
|
589 |
+
babel/locale-data/ksb_TZ.dat,sha256=PvWBMUhpMhV27zE9BCEJW8oMqRXWK-6VwmSsXZDMTPY,617
|
590 |
+
babel/locale-data/ksf.dat,sha256=q6dMPvU7sPvvrz1vCZnxWBm45B8SIZgJwtuR6ZIhvM4,16448
|
591 |
+
babel/locale-data/ksf_CM.dat,sha256=0OOsuUS0S_AUxUPySFQOZVbPcB3F2I4yzHZm63YypDU,636
|
592 |
+
babel/locale-data/ksh.dat,sha256=bmwVCtsEvkCDKD-Y65v1ke2YPdDl2ovpvX3cubOY_jI,90334
|
593 |
+
babel/locale-data/ksh_DE.dat,sha256=EhgYIJQaC3LGiWrcE2sdfUC8LOWJnciWORi_yoRkOvw,654
|
594 |
+
babel/locale-data/ku.dat,sha256=wsHL6HO7NlbjcwMMZm8qhGu-a7mnQTWp43MKuv6Vx-k,30803
|
595 |
+
babel/locale-data/ku_TR.dat,sha256=LoNyoL-poYXgqejDzB9-zI_0TIJF3amwyzcs6UnHUII,635
|
596 |
+
babel/locale-data/kw.dat,sha256=cn4YhRhAi8s6-1gaSo-f6vJ7IOuDlBh8yYdMPDU3kXM,7317
|
597 |
+
babel/locale-data/kw_GB.dat,sha256=ol7LWhJJFNoNkFEjtk4x1PpLkML9UbuVmZAuG47LokY,653
|
598 |
+
babel/locale-data/ky.dat,sha256=Nf8DN9KcYuzzBDmExRTACbN5YCZi4faL550H2m-duuI,236385
|
599 |
+
babel/locale-data/ky_KG.dat,sha256=CdtjRR2iZgfG5pdz13MX-EHTDtN6BdLeZwGCmrZnrkU,635
|
600 |
+
babel/locale-data/la.dat,sha256=DDW-oS3Lp1q3n1J6787FxfrG6B7s7ud8DnZuZb7QfLw,35701
|
601 |
+
babel/locale-data/la_VA.dat,sha256=dhULocaXyJGitrljd1w688DTmezcmmY8YcoKsT30n34,653
|
602 |
+
babel/locale-data/lag.dat,sha256=rME76vdHS3s5EKyGtnVWSvW-_F8CJmRid4F0d97JFLo,16855
|
603 |
+
babel/locale-data/lag_TZ.dat,sha256=LlfEls8DDvoVp07MYnFdLBPUhkJs2kzwUDk45BZIO-g,617
|
604 |
+
babel/locale-data/lb.dat,sha256=pHw62uemLovgiVlep0pCtW_dToq36Kv1O0rEGv2Hxzk,165821
|
605 |
+
babel/locale-data/lb_LU.dat,sha256=s0AY2-F7BqA4tMcRPjCfbzbXRbHsKnD6uIQGSkulCT8,653
|
606 |
+
babel/locale-data/lg.dat,sha256=2OuuUUKOOAuMMprPQo_nAJJ58OREAn1OzGISkXWsF10,16330
|
607 |
+
babel/locale-data/lg_UG.dat,sha256=nyn_HKdBHGkHlbjlDX28L5Z9k59MKFqvmVL3vg222s0,639
|
608 |
+
babel/locale-data/lij.dat,sha256=BoCWfNladj1i2Iz-zTdDgR1qugvTSWEOtcMw73UNWyE,154215
|
609 |
+
babel/locale-data/lij_IT.dat,sha256=rtPerU7ltwkHHc7HErfwJfX8TDSCpTHvBzwKBdSt4x4,654
|
610 |
+
babel/locale-data/lkt.dat,sha256=y_oObtwK66QVFI0voX4zQlpkbH8Nob9LqKqYtVzQxt4,12492
|
611 |
+
babel/locale-data/lkt_US.dat,sha256=ywWg9m80tNjumAxGNrBwYhXhc28rC4OSdyvkdXAKs5Y,654
|
612 |
+
babel/locale-data/lmo.dat,sha256=GYoR98Ap5hosG9bfENEA3sCkR-msF_KvxV2nLydjs9s,1659
|
613 |
+
babel/locale-data/lmo_IT.dat,sha256=Xg4Qvye_hPNJLCTwoBuRMAvhtjQb8VlD9SaH_5hVG9s,654
|
614 |
+
babel/locale-data/ln.dat,sha256=NVsdj_LgEQEmpiTN1jc9xRl8s6u2K9xJysJokThkkJ8,25824
|
615 |
+
babel/locale-data/ln_AO.dat,sha256=VNcFViSaGw3f92D60Uk7vxQ8i6Q9H1FD6paDpJh-r4M,636
|
616 |
+
babel/locale-data/ln_CD.dat,sha256=Ao_lUWuswJgGHhVJYs2_Z8LyN4iqgYsAda8f9UarT6s,616
|
617 |
+
babel/locale-data/ln_CF.dat,sha256=g5Jy7ovUkwcn0W5Ov5bu5SBc2iM4SWwUFwtzWzAAb34,616
|
618 |
+
babel/locale-data/ln_CG.dat,sha256=jQld0yw63ufWbhlOt81wjf731zZluc2zWc1A65kBlAM,616
|
619 |
+
babel/locale-data/lo.dat,sha256=-2yOGrzLzZwzcjtIpmBCUMERnScEm9OuO3vLLj6lGik,242881
|
620 |
+
babel/locale-data/lo_LA.dat,sha256=gNa7KRGYWI0h0PcHJ35bwnPskILOH-1jLjHCXP85jaU,635
|
621 |
+
babel/locale-data/lrc.dat,sha256=LLyO2gxi4MNG0JEFZ7BKYa6g1nvRTMQWWxSkNLmv96g,19325
|
622 |
+
babel/locale-data/lrc_IQ.dat,sha256=cy9DO9oAKI51NMitAb2MTbZoxtaAPzaYVGV0-xd0mGA,1255
|
623 |
+
babel/locale-data/lrc_IR.dat,sha256=-ca4EmTX5VAi_5tDfimpevJFb-g8vAjgpe_jkDTDZWQ,679
|
624 |
+
babel/locale-data/lt.dat,sha256=ayZByNT5skVArE87dP2f-tcj1h7D4ZOKRgq5cm5EdR0,332515
|
625 |
+
babel/locale-data/lt_LT.dat,sha256=j8dIQrFc0s77xJ4P-UGiDcaNqZW6CXOEiOh30FemNiY,653
|
626 |
+
babel/locale-data/lu.dat,sha256=vXjd-K_YhUylyGo_hqNWzsGmjGd9KggrmjUEMXITAKY,15825
|
627 |
+
babel/locale-data/lu_CD.dat,sha256=K3k0wMpIbjusgPC2W1q2sxyxynx2M78zOLjt4ikcoZA,616
|
628 |
+
babel/locale-data/luo.dat,sha256=mlvd9-4xl7PcHqaDMyna_Eu3UWtZOb73hlxlxqgvXdo,15781
|
629 |
+
babel/locale-data/luo_KE.dat,sha256=jVUd3oO_U7IP6KmvSkVHYNmlCc8_-m2mpJMBaqArSFI,636
|
630 |
+
babel/locale-data/luy.dat,sha256=70evj0tg0OheZ5vwOVzq4YVyz9oMIyNZZ5-6xQQgPcU,15755
|
631 |
+
babel/locale-data/luy_KE.dat,sha256=NVkQAtmDBXUws3KybnM706J3lwUc5fJo-YEjKd1zhiw,636
|
632 |
+
babel/locale-data/lv.dat,sha256=QTnBtKAoRW2D1FzgP3yMSEnVmkUMtMzt_0zLxWiTa-8,255908
|
633 |
+
babel/locale-data/lv_LV.dat,sha256=oS9W0pdiTNtMTeGOsef2K7Va2O6k-dQEtN02qCaAoFw,635
|
634 |
+
babel/locale-data/mai.dat,sha256=gd7TmTtbREsB7R7rUtkMt_ajz3kIfIfgHiWJPkA5EA8,104503
|
635 |
+
babel/locale-data/mai_IN.dat,sha256=DoclpHa5nlHcAflg286ycOjQ6trZP8uHThzcp37Y91E,659
|
636 |
+
babel/locale-data/mas.dat,sha256=PhzhoV8zn93he2AS8EJ-aft1AerbudSZhbGCA3G4PtU,17211
|
637 |
+
babel/locale-data/mas_KE.dat,sha256=zH3Le4j03YNsPjt_-GL5RvPG0znnJKQ3ifbLhMZsoYQ,636
|
638 |
+
babel/locale-data/mas_TZ.dat,sha256=VyRJlBqV_fukTqSR9Jxr-PujSA7u-MP9aXrJBVJCKiA,638
|
639 |
+
babel/locale-data/mdf.dat,sha256=KLWsB8nHbvJQCML8zcqIYUk1ZDIelckeBlZAlfPYWqg,2136
|
640 |
+
babel/locale-data/mdf_RU.dat,sha256=sVnTxgzU2rEwl7P4d5UY6XOKv1XUCbtkEQO0cu2OlOk,654
|
641 |
+
babel/locale-data/mer.dat,sha256=1IhN4YFj9zmZAlrOzfcJg99NlD8Gplaad6KCvIFS6jo,16002
|
642 |
+
babel/locale-data/mer_KE.dat,sha256=WqDQTsO6BtbROdcj3p3omUZk8XB6HiJrIlCCj_wLPxo,636
|
643 |
+
babel/locale-data/mfe.dat,sha256=emRd-yzbPo_ATc4KG2yYsuo0PPpdppTOJ4Yy3pKicGc,14842
|
644 |
+
babel/locale-data/mfe_MU.dat,sha256=MHUOKiQPHuUbhT6hQXJEkpGDvTUyMV4btJTuiLhJQ4k,617
|
645 |
+
babel/locale-data/mg.dat,sha256=kwsUKMdiqF-Kt3pVWIO5K3O8p0_ZtzfIRLL1s62cC_M,23722
|
646 |
+
babel/locale-data/mg_MG.dat,sha256=uJbGeEzIn4Rh5Bh4hyV-Hs0_qez9KBeOi4hvfC3zkIw,616
|
647 |
+
babel/locale-data/mgh.dat,sha256=RbrZzWNTriTwiGpvPV-26217sk_8nMgW9g6wDtCDRFE,10218
|
648 |
+
babel/locale-data/mgh_MZ.dat,sha256=aFZZ41qtARE6CeecCEx99tzW_fp-XfkAc10wpQ5YeGM,636
|
649 |
+
babel/locale-data/mgo.dat,sha256=6gETqFSIyq7W6-XtpYMXwgMaKFwNh2bodKlkVOCf0U8,8257
|
650 |
+
babel/locale-data/mgo_CM.dat,sha256=Nsp33t4abZsKdDmIgB8tb08OsEh-7JXMY_JKCsd61zY,636
|
651 |
+
babel/locale-data/mi.dat,sha256=GGB55X75ngxlnbBqYDokM2IfP8J6XR8q2YNQn7k4x9c,50301
|
652 |
+
babel/locale-data/mi_NZ.dat,sha256=RElP_P4F1HDHjSHsdt54vriFcz0TcIeT26pm-_dy-Mk,635
|
653 |
+
babel/locale-data/mk.dat,sha256=ReFBouBnKwy3ySqiVMOQEr0U5tuzY659mSfB1cx34ZQ,260709
|
654 |
+
babel/locale-data/mk_MK.dat,sha256=qlI1ZtLgyX2fcYS9pnTa8illdSnPmfNXORjws-H93lc,635
|
655 |
+
babel/locale-data/ml.dat,sha256=H5MEpV6hC-ITLTwAvT128eTAb6-t6scsbaZzoZd5-Uw,319609
|
656 |
+
babel/locale-data/ml_IN.dat,sha256=VwCnSFs3oh7xo4-nS1HzWj_xICDzG6E-AW0Oxi6Lu08,658
|
657 |
+
babel/locale-data/mn.dat,sha256=FjtScSmoJ_9TPyMBMczjmFuiJMuFrH0K8RmJjyjEdL4,241487
|
658 |
+
babel/locale-data/mn_MN.dat,sha256=qhJGIDXSglsa3BYCalsusoyiKgOj7PJ90Yi4ET2-nxc,635
|
659 |
+
babel/locale-data/mn_Mong.dat,sha256=DhbpwA41sPBzDr_gadoIfAFfiXPvp3C_c-7o18BGFzI,2310
|
660 |
+
babel/locale-data/mn_Mong_CN.dat,sha256=WTF89EShdtBd0Vz62erFwl9KTG-GgEyzjjmKWuJCFH0,635
|
661 |
+
babel/locale-data/mn_Mong_MN.dat,sha256=mcXWuP7AhWm5YDzteeRNMVDCx8l732MhYQwspy4m7s0,14024
|
662 |
+
babel/locale-data/mni.dat,sha256=ZRY33HsSwuJDHN7vgQK2a8PGkIfdTO5ILZqjUrawzno,16463
|
663 |
+
babel/locale-data/mni_Beng.dat,sha256=7PTKZT_UE3WNiipyGHnn2SDNFNhAcqHhEJ8T0Y3O7gI,693
|
664 |
+
babel/locale-data/mni_Beng_IN.dat,sha256=nAW_LfRtJqC6-ehdC8yyszjhibXqMAXPkuaz8POQav8,659
|
665 |
+
babel/locale-data/mni_Mtei.dat,sha256=zdzwNyaRIil7lkjEf6ProQX0nwYlc5VF4r4gHNTUVTY,1720
|
666 |
+
babel/locale-data/mni_Mtei_IN.dat,sha256=nAW_LfRtJqC6-ehdC8yyszjhibXqMAXPkuaz8POQav8,659
|
667 |
+
babel/locale-data/moh.dat,sha256=4ew78Uxue7R-Rm4jJeZ-UA3Ors6UNqnX5FUNFgcuu4s,1358
|
668 |
+
babel/locale-data/moh_CA.dat,sha256=AXdrS_As8DrrTGs5IHmQwXoEXndFuoWoTGXPXcL4Pk4,636
|
669 |
+
babel/locale-data/mr.dat,sha256=7ZPGySE1iaXP4as5IjWMoTrAz7StlcQeDUkmYT1A2_U,281124
|
670 |
+
babel/locale-data/mr_IN.dat,sha256=HOu9QR1BLbciqF6BeTfWvD0L5Igwv5HrCWu9y_vNns0,658
|
671 |
+
babel/locale-data/ms.dat,sha256=olOwb4asrHoVg1aq1WD4rLDTW9DnLeXfQ9YrWips3pI,172528
|
672 |
+
babel/locale-data/ms_Arab.dat,sha256=S1UK611gCf7hJ6NhS2MVPebOi5gql5cbeKZOMa-hlns,17516
|
673 |
+
babel/locale-data/ms_Arab_BN.dat,sha256=vTEKSh0hjyiWJhf503-fwjADvTCN0AqRSzF6muL52JE,1335
|
674 |
+
babel/locale-data/ms_Arab_MY.dat,sha256=w6ZZrz3qEmnsLsWtJA8rTohqF1cxctkzSj4WN0XHuHE,635
|
675 |
+
babel/locale-data/ms_BN.dat,sha256=EDfyP39y0loC9OYv8o_KBHiSMRX4AyO3WKSrJw59-wg,1355
|
676 |
+
babel/locale-data/ms_ID.dat,sha256=Bu0vs6QgGGSjRV8w_79uSKRyDOTzEJoY0zkaDmifZeM,3591
|
677 |
+
babel/locale-data/ms_MY.dat,sha256=w6ZZrz3qEmnsLsWtJA8rTohqF1cxctkzSj4WN0XHuHE,635
|
678 |
+
babel/locale-data/ms_SG.dat,sha256=jsfNag5WQWdejzh5hayA7_-IbY03MUVPAPDHUJyCZRg,654
|
679 |
+
babel/locale-data/mt.dat,sha256=Y1FOafPkLPfdxbpnRWeg_bn4j7Y3UhXGZQhEnOtVAZU,81584
|
680 |
+
babel/locale-data/mt_MT.dat,sha256=L5q5LizZQL0-FLj2U-wn2YhkpL3p7ZvjdyAvH1wwUG0,635
|
681 |
+
babel/locale-data/mua.dat,sha256=r6Z52nAqw-NTHFh5oS8e6Ka4eumfO-zgvh_cnYXOwhs,16522
|
682 |
+
babel/locale-data/mua_CM.dat,sha256=Ib4K67KfndwGsoZDH0ehHA-F7V_SUj7q9VsK2juzaIQ,636
|
683 |
+
babel/locale-data/mus.dat,sha256=6HDGlgPkgIs0969LeNwy3PlDUu39-Kb7VphEdGRRC0U,2815
|
684 |
+
babel/locale-data/mus_US.dat,sha256=xcd4KKUIqBwSefSC0GGSDkvXL46eDWgWolJsGuSf654,654
|
685 |
+
babel/locale-data/my.dat,sha256=xtHbCYyOQxLWAK_tbnWf98GzJKa9cCkORtoOjDX373g,237294
|
686 |
+
babel/locale-data/my_MM.dat,sha256=l53-D5YL-BbmLZYveFV2ISa4NcrSwTfKsRRc41Jd42U,635
|
687 |
+
babel/locale-data/myv.dat,sha256=IrUiviXedgwt8UpDFgAh2dGcsMMhL6Q8IEPefcG_s68,17716
|
688 |
+
babel/locale-data/myv_RU.dat,sha256=sncxwOpjfFkRASKHMP1ytKcjpF4w4GjU_JEVqXv84Tg,654
|
689 |
+
babel/locale-data/mzn.dat,sha256=nBwkbxjQxQvO5evMrWb9rAUV2LYq52-lXw0ZgU6QQhU,65671
|
690 |
+
babel/locale-data/mzn_IR.dat,sha256=fjN1ek2fAzZyzFJpjX_MIc5oFOEqj7LS_SNdBOQS9ZY,679
|
691 |
+
babel/locale-data/naq.dat,sha256=_a4WOpBhdnn0fdmjjQw2cCoPvBDw0caDDg45VxxBmBk,16519
|
692 |
+
babel/locale-data/naq_NA.dat,sha256=e5gAIOo7le-dVOAX_k2OW6gEyVfEUxcYDUJu_MBDY5M,617
|
693 |
+
babel/locale-data/nb.dat,sha256=-bGHDSonSEdqfb2PxNC1_3jOHELm3CwV7xzEtpmWZUE,1330
|
694 |
+
babel/locale-data/nb_NO.dat,sha256=J1UiN-AG900acMz4p0fBHtXDpS0HD6uGAi7gg9gOrsY,653
|
695 |
+
babel/locale-data/nb_SJ.dat,sha256=XcK9_nKriUY_4k09kmgJalGTls-e5-YS-MCPEKLP8vA,634
|
696 |
+
babel/locale-data/nd.dat,sha256=3Kq2nRkxqxjSBKbrnxergjiyQ1mcOT20xkhdNA8kUcw,16226
|
697 |
+
babel/locale-data/nd_ZW.dat,sha256=KpZHrPr_0Ru0t9ojSK9ZiqGZ6-rSpvA7cX9C483ocRk,635
|
698 |
+
babel/locale-data/nds.dat,sha256=sqomo8seDm1VS2hqw2GeyzPt3YjmRkuOGM1sbtRV-cM,50795
|
699 |
+
babel/locale-data/nds_DE.dat,sha256=Qmh5DjX65W58jXXXX3pxfxS_HVTJVavMspBPdph9sfc,654
|
700 |
+
babel/locale-data/nds_NL.dat,sha256=E_EO3ylaBjJNThr211Yzefh5DRbkEFFVpbBMXIQ4U1U,654
|
701 |
+
babel/locale-data/ne.dat,sha256=A1QCwmbxXBqeDzICTbjG3q5foUJGH4HgfSi2ZWw-498,274134
|
702 |
+
babel/locale-data/ne_IN.dat,sha256=SFloADZtyb42wygQmrMy7yx-aADGQECZJUey796oqnw,1292
|
703 |
+
babel/locale-data/ne_NP.dat,sha256=LGc7Z5TRi0HRNQdY4bqPitV73gzTPWLd_g-6aPyvryc,635
|
704 |
+
babel/locale-data/nl.dat,sha256=Y2MSK7SKYCNriwQrNxioqepkfIXObt3tcjaYGcDvJaM,237923
|
705 |
+
babel/locale-data/nl_AW.dat,sha256=HYycPPe5HDhuP_zN89ysXR2AqjIbx_-XB2n0-TUPhxw,638
|
706 |
+
babel/locale-data/nl_BE.dat,sha256=Yl6u2wQU62h3hvXobO9r3sXdrq2d9pans2N_wImwRDs,1910
|
707 |
+
babel/locale-data/nl_BQ.dat,sha256=lZQzrmWsFTpiWwT9l6FakrNoll3QNP3drIMcxFkAy6Y,635
|
708 |
+
babel/locale-data/nl_CW.dat,sha256=doEeLSsQVaSocP4jr5LxNrT5luSiG4hkgsMvoYjJBtY,638
|
709 |
+
babel/locale-data/nl_NL.dat,sha256=bGo4nyjhqe1VtDHlP5EUmNkBKsViUSiH3h_ikXcPuRo,653
|
710 |
+
babel/locale-data/nl_SR.dat,sha256=d-YXA5QA5b2Bh-WhxNTkyKQ4ROhuEg1CeGN5XmzWcZM,696
|
711 |
+
babel/locale-data/nl_SX.dat,sha256=ciTQIntv0njAJGIUENzo6stN8yarfh-eBpmEzxmpJbs,638
|
712 |
+
babel/locale-data/nmg.dat,sha256=z-vVhNGtHFAW9D6NBmqzxDbj7G0g8L4n-l3v_E3UlyU,16148
|
713 |
+
babel/locale-data/nmg_CM.dat,sha256=0A-cVUgt1l1ITnPRdcgWiQ68ZGqHDYd-k2wSc_nXnMQ,636
|
714 |
+
babel/locale-data/nn.dat,sha256=n_PmkSBfFrxqtO7GJhiZTr8QEMdgc3MfPQnKboH7x-c,68872
|
715 |
+
babel/locale-data/nn_NO.dat,sha256=98eWK3CBq5T_dI4a6dQH2TktRygMH0EnpO1EO7w8lVY,653
|
716 |
+
babel/locale-data/nnh.dat,sha256=6DL18mnBvO-sh9vGPjLSWi6qgIQmp_msS58XsYLm9eE,6673
|
717 |
+
babel/locale-data/nnh_CM.dat,sha256=dt9ZNHX5ZQo-kcyT4-mVRCUiuzL-H2A9e0s0JrHwZts,636
|
718 |
+
babel/locale-data/no.dat,sha256=w8PeOU8qfV0seaM005KYEJ7Yh0XQYM1OrjqoJqUaEHg,238457
|
719 |
+
babel/locale-data/nqo.dat,sha256=oA-5QvYHoJE5ebe0YRBb6mfPWCK7OZPDvlODJH1F39M,56658
|
720 |
+
babel/locale-data/nqo_GN.dat,sha256=3eOSTBaZM0RNLUDZFr__KTR_9iZoGUFq9M6bhtmHjcU,617
|
721 |
+
babel/locale-data/nr.dat,sha256=UihZdFPq2Dl8TZ0SYLb7UGKgnqBuVdVIljmNBSY-gKw,2479
|
722 |
+
babel/locale-data/nr_ZA.dat,sha256=e4_czqcyMye0qthJd2hzn_9inTS8WjjbFOzRJ3wAS24,635
|
723 |
+
babel/locale-data/nso.dat,sha256=0v5HeipvUI_2TeT_TsgkBwj0WilGl3bnwxakwGhJ0js,12632
|
724 |
+
babel/locale-data/nso_ZA.dat,sha256=TdOqVTzKNigLD6zOPR7W7QHT-Aw40ylsUE7bmMwgaKY,636
|
725 |
+
babel/locale-data/nus.dat,sha256=hgxjaDWCEyVcGI79vpmpF0aM8bcM_pPyFrz5TqLM0Ho,9148
|
726 |
+
babel/locale-data/nus_SS.dat,sha256=Is_mWvnSS7j05Vk9RHcCfyLOdhOeOWRqgXDf8FGNEJQ,617
|
727 |
+
babel/locale-data/nv.dat,sha256=6KleoDsaTjhXti0fFXfR8hwOUnjmVx_lLgI6Y9MIP8w,763
|
728 |
+
babel/locale-data/nv_US.dat,sha256=ak7j2GDaOMbAAmXQhfC9PRM8E9h_hJZL3UDqxqjCtoI,653
|
729 |
+
babel/locale-data/ny.dat,sha256=XXvyFcRnNcH9KcAH1K7jzS5xLFsXMlXVW3yowhXPIO0,2152
|
730 |
+
babel/locale-data/ny_MW.dat,sha256=kyhkcpqgIwSrUcfxve2OS2P9S1AfXItRHmy94K7cQ48,616
|
731 |
+
babel/locale-data/nyn.dat,sha256=s-r3dAJZdZd90y363lu3h75xm4kE8i5V9jUu6Wwwl2g,16171
|
732 |
+
babel/locale-data/nyn_UG.dat,sha256=fEm-RMI6-PvIjbMUoZK68dTaiAmOqH1iDQBn23a6r2w,640
|
733 |
+
babel/locale-data/oc.dat,sha256=3hoLz_ob_rlkYOi9YmwU2O7M4vpKsmFpLytl4vvPdnE,69557
|
734 |
+
babel/locale-data/oc_ES.dat,sha256=XLBR4MaYZHXQwSW_BAWrwO8-an84qeuxT_y8LZfor2U,53139
|
735 |
+
babel/locale-data/oc_FR.dat,sha256=L80Ivl6dUpQJF4fAY1xaAeCRO9BkN0l6oCr8nRwogsM,653
|
736 |
+
babel/locale-data/om.dat,sha256=t9tYtK7T7OxJ9GlX2op8x97NSpY9hynKctK2FJB9Esc,16883
|
737 |
+
babel/locale-data/om_ET.dat,sha256=v0wHN7iwcuJN-iFgWFPrGdplH6P-0c8B2OEqYOEeb40,635
|
738 |
+
babel/locale-data/om_KE.dat,sha256=h8jCIllRrl8-c9jorHeFxZrbDZ2Ncj-L5iSbTFnB_XM,1593
|
739 |
+
babel/locale-data/or.dat,sha256=GAMdIa-3woF-LrVd7XoDCeF1odh4_5SmSfC2qIF5Z-o,272016
|
740 |
+
babel/locale-data/or_IN.dat,sha256=ur6a2cCdapMoKd-6KLXR2xAF2YU8xaueeW7UTPL2yLU,658
|
741 |
+
babel/locale-data/os.dat,sha256=22JgCp7PlYngzY6Rf6dC3Z6KgRriV3XWyUWCz0oxgEs,17450
|
742 |
+
babel/locale-data/os_GE.dat,sha256=8NgIdMuGlNow1dXmjW6y4xOis1_3raiXcj_jLBPirpI,635
|
743 |
+
babel/locale-data/os_RU.dat,sha256=76MsfCZxiy_RXfhW7Do3Z8q4-jhp1hOXTBIsA6SlA-Q,695
|
744 |
+
babel/locale-data/osa.dat,sha256=HBDT8EMk5cd05q10hoLjEGh7revrpG6P171zyhjG3sE,5342
|
745 |
+
babel/locale-data/osa_US.dat,sha256=qFfjNw8tVOdprzqK2wBlGH4eNMxDxDQqDDReucJZR-E,654
|
746 |
+
babel/locale-data/pa.dat,sha256=uFEQPuvdFRt6GA6MY9-PNZ1wRbwl8MfIClyhopgohks,276394
|
747 |
+
babel/locale-data/pa_Arab.dat,sha256=TgKzLQj1KONLtB3XehaNU2OVQB4o-FW_tmu7_-9VtDc,3859
|
748 |
+
babel/locale-data/pa_Arab_PK.dat,sha256=1Si67Mz8DZfo2D8Ld0b5IlZpvnSMgg4W8_zZLrHrWQ0,635
|
749 |
+
babel/locale-data/pa_Guru.dat,sha256=fs7wqdmuGaKQCCwGkT3lRQSKmf1dxG3jyLboZeVtPmE,1276
|
750 |
+
babel/locale-data/pa_Guru_IN.dat,sha256=kpz873B1I65nfS3Z5vDLmmGliFVPlPM58sB6jW9nkBY,658
|
751 |
+
babel/locale-data/pap.dat,sha256=JDZLD-YVW6iQlqyeCDtVM4lsmtXnidOt-dwN-u8lRu4,2099
|
752 |
+
babel/locale-data/pap_AW.dat,sha256=XZSGzQPijHNf5GjxUjDJQt88iD0ETRdZSTF8gn-1U4M,617
|
753 |
+
babel/locale-data/pap_CW.dat,sha256=Mu-gCfh3bv9pzz9RrylMffuphhqgiRaODEZm6TtCpaI,617
|
754 |
+
babel/locale-data/pcm.dat,sha256=rokktGzg-etVOw21TmIJaE9wa-1nb-BG7LkKlkUMpSc,211372
|
755 |
+
babel/locale-data/pcm_NG.dat,sha256=3gBp38NIuVEbHlKAtQPQXJjT3DKvy7zvUqMAZS6pGzk,617
|
756 |
+
babel/locale-data/pis.dat,sha256=yQDFCHO03lZB3LsXLP9mJQ6FdiFcmHz5LtYdyLf6Q-U,2135
|
757 |
+
babel/locale-data/pis_SB.dat,sha256=-CDkXv_877c__o56bBeYHAAq2X9CcnKdI65DiE61_M0,617
|
758 |
+
babel/locale-data/pl.dat,sha256=SS79Wa03ABQ_sOKashUvUN5oqbZmOylvFuNsfdbtZJQ,304460
|
759 |
+
babel/locale-data/pl_PL.dat,sha256=3s2XpVyaKha_K9MesXKD6sZNGSn1PVRtuz9XYp1xrsg,653
|
760 |
+
babel/locale-data/prg.dat,sha256=LcP5e3z7f9d8Y2JXu1DXyjNTENVMBuBlRsP4j1GF7bA,20302
|
761 |
+
babel/locale-data/prg_001.dat,sha256=6LHF5Z1NaPiOsaIvXpkBZxwHGwZ872NhTmNGqChOiwo,1594
|
762 |
+
babel/locale-data/ps.dat,sha256=js5Ulvl1E87VQIDRr-sVGfhYQpft9MBbg_PoI3DX_Jk,202956
|
763 |
+
babel/locale-data/ps_AF.dat,sha256=sNE6bgx_nV0VWKa8InelUaFYSa3Fpx6byJw0KT4B1o4,678
|
764 |
+
babel/locale-data/ps_PK.dat,sha256=O-ZkUudOlKrlurTpN76tsPXzlVHOLGjFoO_ngnIWGTU,8032
|
765 |
+
babel/locale-data/pt.dat,sha256=Pw81Gan92r5gaZzsLZgcFuhfxJmkrOTg-Xc9TkQIq-M,236660
|
766 |
+
babel/locale-data/pt_AO.dat,sha256=49hMN9AJBDNjcsQw-nl-jY_VKHanO0PGfvd--OxqOxI,1022
|
767 |
+
babel/locale-data/pt_BR.dat,sha256=dVKYp9IwRMbjZ_ee-eXFPudSuTRrROvbFzY3dYTYmn0,635
|
768 |
+
babel/locale-data/pt_CH.dat,sha256=zAvD0sYytEquwzY8ZRbVCcy7DS2ZzUXofl5qXOixZH4,653
|
769 |
+
babel/locale-data/pt_CV.dat,sha256=zOQn8d7--PKrhRUhQ5mPKW1Km6Tyh5JF8hstfxpITzM,1039
|
770 |
+
babel/locale-data/pt_GQ.dat,sha256=qI1hvtuSHOev12ips9o3Vy78NJpOMjhkW625M60lqZU,616
|
771 |
+
babel/locale-data/pt_GW.dat,sha256=SRxbFDIg9FwEjGjutRI9P1SeLiZBqStwSqPuHBFZwLQ,1002
|
772 |
+
babel/locale-data/pt_LU.dat,sha256=z9aq0BTWEnk4lXveNpmi89TKcXN_t6Ud4A_C97uyOuw,672
|
773 |
+
babel/locale-data/pt_MO.dat,sha256=shItJIIDrxwlcQhWLhlZG0uhyTlSBDcTag5ivxmb9TA,1635
|
774 |
+
babel/locale-data/pt_MZ.dat,sha256=UZ1nkXS9CpiCM1IpOG5XpGK2QqM5mE5lAgRLTGAWl-4,1042
|
775 |
+
babel/locale-data/pt_PT.dat,sha256=Ix5iaB2EUBK6SoqBJoxCXo17OXYNvQ_Vijngq2MjnQc,107608
|
776 |
+
babel/locale-data/pt_ST.dat,sha256=Cm2HUxlGtZaz8IXX5Ohms-HYuKgazuBcOZBz5rWOzEU,1022
|
777 |
+
babel/locale-data/pt_TL.dat,sha256=CIIDM_Zo0xiu4gXngxYtkYK6ldTNZMRaikSD_sAokMw,1002
|
778 |
+
babel/locale-data/qu.dat,sha256=kUrGQ4L0tVxwG_b1-9VjN6_N-s5Ox91LzpWgs8H82cM,138806
|
779 |
+
babel/locale-data/qu_BO.dat,sha256=7RUvNrmuLtwqP-qab667GocH_c4gIvpas3dbN1uaGxU,878
|
780 |
+
babel/locale-data/qu_EC.dat,sha256=_5V4RYoPb3eCAA7jOCNfB7WZqd9sWP1E0tlF8mGeqFc,837
|
781 |
+
babel/locale-data/qu_PE.dat,sha256=Vdd0fcK2dtFgyui3Q9NElHuJ841RI-T5l2UHeBq8MQ8,635
|
782 |
+
babel/locale-data/quc.dat,sha256=_Admf-sJxEnpo6MgV3-3kuNF2nk1_RjkW8LIhxCwdlw,817
|
783 |
+
babel/locale-data/quc_GT.dat,sha256=8M8KtmnsJiTCaf-Nl5X174Omtyc6a0ri07kysDC3-5Y,636
|
784 |
+
babel/locale-data/raj.dat,sha256=tjUg3ThgXtza6gABimig-EPb7Up5jKbnM7VanUUi7F0,2491
|
785 |
+
babel/locale-data/raj_IN.dat,sha256=SS8GPzJu5j6nfXlDoX4NFPN2QScl4M0YNsrFmWklymM,659
|
786 |
+
babel/locale-data/rhg.dat,sha256=kKSwVoO_uNQO12F4YP4f8_axq3hThAc2XCwAVZMFHVA,12292
|
787 |
+
babel/locale-data/rhg_Rohg.dat,sha256=DAOuwC-7uaIuZtrIXvUkYt6YkxqaKpHOma1m0-XTtrI,693
|
788 |
+
babel/locale-data/rhg_Rohg_BD.dat,sha256=DcLSBtf_k_f6B102-vbhBOjfzNZjiTDvEUdIOQfVc8M,1212
|
789 |
+
babel/locale-data/rhg_Rohg_MM.dat,sha256=HspZzbytcZQ853Jstp-eFEdqSMAD3-shgjrdxY_KQrE,636
|
790 |
+
babel/locale-data/rif.dat,sha256=eyKDJ1c94TMjWmwGz3xAMgDh2DcLC2kZQsX8CPKvYvQ,1878
|
791 |
+
babel/locale-data/rif_MA.dat,sha256=Qq7ZdymuPdjHeYDUDGCjMuQBRU7w5qGdgzzZ6wPfN2o,617
|
792 |
+
babel/locale-data/rm.dat,sha256=ETvEMTKhZEIQZkxizgoBhv6q7d__PO1AKtrBepjqlR0,103308
|
793 |
+
babel/locale-data/rm_CH.dat,sha256=JHAlYXMD9Vks43cU_gcSEQmqo6pogWPl_R4VMUK2iHI,653
|
794 |
+
babel/locale-data/rn.dat,sha256=6DKqK6D6GMFf8rntv29SEmrq9lsfVTItI7uZHt2HAKg,16744
|
795 |
+
babel/locale-data/rn_BI.dat,sha256=r5Cweh7L4EAZK-qTmJuloWc33iXeR4IJUbknrl0XC3g,616
|
796 |
+
babel/locale-data/ro.dat,sha256=rseUyqgVhgtYT-kbRBh32vn6WsqwGSoiO8ScpySi4fo,269287
|
797 |
+
babel/locale-data/ro_MD.dat,sha256=MICjowyyNQja6u9jytd3Dxi3WI5vSgAcwb43cX_J-eo,3248
|
798 |
+
babel/locale-data/ro_RO.dat,sha256=lLYIYWhDUmq1EZ9oV5SETauVa_5uNN5p52dW7XeemRk,635
|
799 |
+
babel/locale-data/rof.dat,sha256=9MuPz_hPIFVTX4xjou2d6KaH9a5t7AvYlXcPK2jjdsA,16066
|
800 |
+
babel/locale-data/rof_TZ.dat,sha256=I_qwGjqqrcwUR_3UNydHOm_EiiLZYyRV0q-s1qfSSi0,617
|
801 |
+
babel/locale-data/root.dat,sha256=9Vm72r242O-I1COr-r9kDKYpGCUv5oOkVlggG1XdpVY,50707
|
802 |
+
babel/locale-data/ru.dat,sha256=ZgoOvEMNv9bdRiutXP8zUfTjun7Bz3I9GOiytQ_NjQA,353323
|
803 |
+
babel/locale-data/ru_BY.dat,sha256=99UlyhoMWnfyhI5ltXGaJkycWLVfJ3FwdxyRm-yr6kM,676
|
804 |
+
babel/locale-data/ru_KG.dat,sha256=X-iAT1QuQGhk1mIetpGyWqDlwiBskLfwqrK6ant1XS8,659
|
805 |
+
babel/locale-data/ru_KZ.dat,sha256=P1_Gn3esOwDLL8sd8vVYbFA8J7QEsaDAWfZvDsn-WwA,656
|
806 |
+
babel/locale-data/ru_MD.dat,sha256=LU12oBwr7MfPTzfs8Dx7uUZVgHin8ybX_oPHrPIJTkw,654
|
807 |
+
babel/locale-data/ru_RU.dat,sha256=IVG440mXjphW6iCsKysZCW1Gem_z5_O0lZI6-R3oG_E,653
|
808 |
+
babel/locale-data/ru_UA.dat,sha256=aptMDcNM1sBQO4L6D1RYCa0dn76KC793HlTTqKBhyxc,1695
|
809 |
+
babel/locale-data/rw.dat,sha256=8uzBUtHj9ty0o4Vs-UaMa5J87t0y9hGU2w7zgF29CzY,16372
|
810 |
+
babel/locale-data/rw_RW.dat,sha256=tw-gtzH64PeIAmNGeobgUypw7RAyKITeFAcQPGY0MG8,616
|
811 |
+
babel/locale-data/rwk.dat,sha256=7lg1nf_wtYUNHGip2e3MXWnf8ovUeQXVoaYJarV01Eo,15953
|
812 |
+
babel/locale-data/rwk_TZ.dat,sha256=s9duai8NRoHwn8YpQrlMd3VDf6jtQxxcUmu9CIIMzC0,617
|
813 |
+
babel/locale-data/sa.dat,sha256=H5HEaqVC_nVofSqAtVbgDxxSlLCp5SzqqzgoWRfZYuA,24408
|
814 |
+
babel/locale-data/sa_IN.dat,sha256=ABNamoPpYRbO7bK6BGm0tK92kd7su7_OP7Di0wW0zZo,658
|
815 |
+
babel/locale-data/sah.dat,sha256=T8bTksxuDgX0_YzpJ6PgnoRtF4BB3Vm4dVnFafFSWDU,51456
|
816 |
+
babel/locale-data/sah_RU.dat,sha256=jHlseiwMbtN-IsETeG2dsaIn6OB2kqtAogazMnn0f60,654
|
817 |
+
babel/locale-data/saq.dat,sha256=XUklSl56KHtJvgqcNsJpTNm6F2UtAbVLgRqBMdgVgIw,16375
|
818 |
+
babel/locale-data/saq_KE.dat,sha256=kN94cJJt8AT0yBRDqUPGoJtMZdOb2e-83NNsq8hmQ64,636
|
819 |
+
babel/locale-data/sat.dat,sha256=HdKfJKPFyA_KBP1-F9jblRtk7D-FZ2tXC_y82R0uVQ4,72200
|
820 |
+
babel/locale-data/sat_Deva.dat,sha256=0EHZ6UcxsVOfi399xQbOkzaH1OU4jkZ10uqmmWnK8VI,1943
|
821 |
+
babel/locale-data/sat_Deva_IN.dat,sha256=Bzh9Vmzia_8KLAryt9VqCl9ter9tKxng4b8oFYbYK6I,659
|
822 |
+
babel/locale-data/sat_Olck.dat,sha256=mszOmf6B29mFbE6qN6Moy6SfBjwsjaCsbk75dJR245Q,905
|
823 |
+
babel/locale-data/sat_Olck_IN.dat,sha256=Bzh9Vmzia_8KLAryt9VqCl9ter9tKxng4b8oFYbYK6I,659
|
824 |
+
babel/locale-data/sbp.dat,sha256=fBots-db5GaQHSyVL_c670sLPouLKYhpdZi6ZMtAS4U,16442
|
825 |
+
babel/locale-data/sbp_TZ.dat,sha256=chWs0tZniO53SbtBquTHGS6E4v36tgYL2b3enxHcdCU,617
|
826 |
+
babel/locale-data/sc.dat,sha256=SczV0nBRjyJXy2nbFiX9dh9H0DI8-3a3KFLzSoIyRCg,221563
|
827 |
+
babel/locale-data/sc_IT.dat,sha256=0G0vL9YXZQLkTmnzJuuygM5ty2Tw5liDg_aWHLvg32k,653
|
828 |
+
babel/locale-data/scn.dat,sha256=rgcJX2U9DH9ING8FACFnvUaP5ujMIocxT9ahAUMHnQY,10259
|
829 |
+
babel/locale-data/scn_IT.dat,sha256=dTXZIHDRhbFDCw02T0wL1iaJ2kfY1ZUzfbvUs4_WKLs,654
|
830 |
+
babel/locale-data/sd.dat,sha256=D149b57qdbFhjEUs-rEUF0GuBFPnNRcJ51x7TcICWfo,223564
|
831 |
+
babel/locale-data/sd_Arab.dat,sha256=jgkaYGUhPXll1T7CT68ridccZaERHeZdwUzGoAZBUps,879
|
832 |
+
babel/locale-data/sd_Arab_PK.dat,sha256=c3AXdatnrTNDHW_SOh8fNNye4CVey81FnkSXwj7MmcI,635
|
833 |
+
babel/locale-data/sd_Deva.dat,sha256=0bbRtnWIj9j5rK5BzykPR0TGwv_tZc0GIiPX0SkRzQM,16972
|
834 |
+
babel/locale-data/sd_Deva_IN.dat,sha256=0KQFEKHV6hHidc5hxrxQEvhO-YyvFf5P5z6t9hPenH4,658
|
835 |
+
babel/locale-data/sdh.dat,sha256=5cD8u88qanpCtA8kPvHH9AdAi2-HbhznORqis1PYx6M,1032
|
836 |
+
babel/locale-data/sdh_IQ.dat,sha256=B_vUMOiGWVcD1HaR4Zk8XxVzcmMFSISe2vRscyA1lYY,679
|
837 |
+
babel/locale-data/sdh_IR.dat,sha256=hwMmQnne41X_lyjbyNbQq34Lpkl91bAgoavPZRuozwU,679
|
838 |
+
babel/locale-data/se.dat,sha256=_j-UAYXnQAGMshxU_CQsfyR1gVpbb0E8hxXaTmZ4BRc,74113
|
839 |
+
babel/locale-data/se_FI.dat,sha256=MwBlsCN6fqQH2Tes1eRNPZtLFW-jzX1-xI-b3Fc6fo8,47250
|
840 |
+
babel/locale-data/se_NO.dat,sha256=nm5u2VQ3ne0SUFZtFqwsRa8Gg97Xn1OSxjoP2I-i_PU,653
|
841 |
+
babel/locale-data/se_SE.dat,sha256=6M9OxtmQAY_p9fZ_6L8zqo6i--bo_X00cvhTDEbX_UU,694
|
842 |
+
babel/locale-data/seh.dat,sha256=ljLjBHD-_xtD1LXjldrCdX0I2owXk39_jyEpyYDFMPk,15823
|
843 |
+
babel/locale-data/seh_MZ.dat,sha256=Sv94DueqrM3R5RjhCdwrKZsnNdL1WpjLBg6QhBnoaX0,636
|
844 |
+
babel/locale-data/ses.dat,sha256=KhePmTzOCY4zRaDILbPap8IXfykvY6Sfzyv351JqawY,15911
|
845 |
+
babel/locale-data/ses_ML.dat,sha256=y14qGwP_r6VxzJhklYIWfYkolu0OHB-6nJ4tvF7J-iU,617
|
846 |
+
babel/locale-data/sg.dat,sha256=oDMuuvdPatbYyvy9pPBgXNRXcMYkNXHEtvtwCAlTQrE,16548
|
847 |
+
babel/locale-data/sg_CF.dat,sha256=QCNYqo_5l2Sv9JUFEWF6YLDR3MknhgkyMz1mO5j2Gv8,616
|
848 |
+
babel/locale-data/shi.dat,sha256=sIPt4Y_phnDkkvFgui8iDz0VrEf-K9eeU5NBf0ikmGc,21949
|
849 |
+
babel/locale-data/shi_Latn.dat,sha256=v956UEZ6dMSu4Sw4VhTGYFQ6D14OBmDlodFSDId8hAM,15531
|
850 |
+
babel/locale-data/shi_Latn_MA.dat,sha256=X8cwkkvm2LjcClQWzHRxxmiA8P0c37D7P8lf6RO4iNQ,617
|
851 |
+
babel/locale-data/shi_Tfng.dat,sha256=VjsR4oSiK9oFfdIdpaVDwNSIBvFbQ3Jvm63K24bRqk0,974
|
852 |
+
babel/locale-data/shi_Tfng_MA.dat,sha256=X8cwkkvm2LjcClQWzHRxxmiA8P0c37D7P8lf6RO4iNQ,617
|
853 |
+
babel/locale-data/shn.dat,sha256=awBFmgdlHbpKsnUqWZaGAQ-YbTPm9UWkJKMn9IdJ7pM,890
|
854 |
+
babel/locale-data/shn_MM.dat,sha256=7VauV3cmVfAJz7kA76hsF3FdwM75CVjvHdjx6lCoH4M,636
|
855 |
+
babel/locale-data/shn_TH.dat,sha256=QHPmr3V4GzTbb6QA5SDl2EsVzQBjpbaDP6OHfJZ0S0Y,636
|
856 |
+
babel/locale-data/si.dat,sha256=2lhHStmPqL2dqahPVp1A4v_UsMQXtuiVqFs7rM0orBc,285677
|
857 |
+
babel/locale-data/si_LK.dat,sha256=cWCgV9WmnEwIIsBmhsIVzSzbrV8hkkXaV1xH1ultlUw,635
|
858 |
+
babel/locale-data/sid.dat,sha256=1T-sqoV6zk_nJreKj5UADozq_oTLlhQiKMQaKFkdOZc,2237
|
859 |
+
babel/locale-data/sid_ET.dat,sha256=vtwy9BuaZwb5A3XdIl-3mws1cEAVk4s8oKy7i-GnM9o,636
|
860 |
+
babel/locale-data/sk.dat,sha256=exkIRNyNsgi63oGJhX4aYsByTtlpKvxnaC8C_3vScw4,298024
|
861 |
+
babel/locale-data/sk_SK.dat,sha256=eMjPq18mQOAXvkJN5WV6lKEAPyt7-eleGme2pHHevgA,653
|
862 |
+
babel/locale-data/sl.dat,sha256=JsCGVnxl_8sN-rkTjpQh-8pq78fpw-n3WB5Su1CHhyI,293278
|
863 |
+
babel/locale-data/sl_SI.dat,sha256=3Hk2t-MUfAUtqu_Gy0_fTjOhwBUtxdnndQ7Kowg0qek,635
|
864 |
+
babel/locale-data/sma.dat,sha256=F7xP7-QVGODq95JT875VPPyPT-gXV_mUTP1xb6oqk8M,986
|
865 |
+
babel/locale-data/sma_NO.dat,sha256=OeIJ-EJtvWH6z2dZ1Hv8QdmQC7M7r51t-_C6LD6ZyxE,654
|
866 |
+
babel/locale-data/sma_SE.dat,sha256=M_zYllAUd2UaWvccZ6ShB9-Gd8JYzIEln-88Q23syaU,654
|
867 |
+
babel/locale-data/smj.dat,sha256=z6V0DWiup3F-1YSf7NViI9Z4b_jyCJ9V3kPvzt9QcuM,981
|
868 |
+
babel/locale-data/smj_NO.dat,sha256=5fz-YVJEoXswvC-RdFcJWmt-EMGcNXA3c9j_pfmxqCA,654
|
869 |
+
babel/locale-data/smj_SE.dat,sha256=7l73FEZcAemOwXSrfPB3X7a0cto3J4oM7AO9i9PMIBU,654
|
870 |
+
babel/locale-data/smn.dat,sha256=4zPG9DNBrwN7lvXxpsmaXkvOgQQ2Cwmfca-tQxHfJp0,43534
|
871 |
+
babel/locale-data/smn_FI.dat,sha256=VRY3dbCyxEmDUTep9bQXDRldd5wSg4skqQpztnMXplk,654
|
872 |
+
babel/locale-data/sms.dat,sha256=ylATYbrfu8SVEVdQRbC7dTSOKCNSX7O1gjS2wJXA1tU,6521
|
873 |
+
babel/locale-data/sms_FI.dat,sha256=b-Mk20lC32xysqU5v6jGjDUYDZaMDvoMwWOZNdT5yuA,654
|
874 |
+
babel/locale-data/sn.dat,sha256=LTQbCLRgMMr4_Pb9lnGKej-IfTCdxjjcbMeH4sldHbA,23418
|
875 |
+
babel/locale-data/sn_ZW.dat,sha256=8HnH2raHHl8PI25abODlThEhjIOGXJb_u7cyQd5YzZw,635
|
876 |
+
babel/locale-data/so.dat,sha256=LjDx0NEIDSI4TXP_k5xjgWRH210QHqXgdFr0tVxHrpc,209673
|
877 |
+
babel/locale-data/so_DJ.dat,sha256=VWnaj_MuW4dJnlO84t60ySCvfJL7FXI4nIP9PTL5Amo,656
|
878 |
+
babel/locale-data/so_ET.dat,sha256=EvRRqU4yQPMYhkEK8a4MR808fwKHmW7EvPvEJdjltnE,655
|
879 |
+
babel/locale-data/so_KE.dat,sha256=OSiRggRZ7CTNmqiGOvW1W2Cw2RqjVESTVOdUfgVgWyU,1208
|
880 |
+
babel/locale-data/so_SO.dat,sha256=2IPbOqSxQGB5FukQ-B-MEme9FHYn22ClXmAV4x08pNE,616
|
881 |
+
babel/locale-data/sq.dat,sha256=eix8XVeFAi3zDFk9x3xMe_OX4LMLfRJ5nATGg5ecNO8,213937
|
882 |
+
babel/locale-data/sq_AL.dat,sha256=MN2RvkKGG2PXjCRsMHsvcnwnIOOp9tNSpcInh2uCWaI,635
|
883 |
+
babel/locale-data/sq_MK.dat,sha256=L_GaZJ9XuQMs0zw-xZlrefPF36SH0sJqMrdDDbwicZM,1208
|
884 |
+
babel/locale-data/sq_XK.dat,sha256=qILZGRwAhuIBJ9xi_T5WTrrZAVouFjQSvybrwgXTsog,1187
|
885 |
+
babel/locale-data/sr.dat,sha256=yBO5zeiaUB5ar3GHsewRa27K0YdQmalKEaScTRIROgk,322842
|
886 |
+
babel/locale-data/sr_Cyrl.dat,sha256=Tbo90CyBAWciKeDesPhmXf7sdBQfjWsmyyrKBco_NzU,1990
|
887 |
+
babel/locale-data/sr_Cyrl_BA.dat,sha256=Wkwj3MsGyxk-_jgARM2VrlcNFhYdiTPUyoAnNsrTjx4,44464
|
888 |
+
babel/locale-data/sr_Cyrl_ME.dat,sha256=o1cSgsrmMWDkLFHDhK1Mu2tn77XRauf2jsvbfH7zdRY,3908
|
889 |
+
babel/locale-data/sr_Cyrl_RS.dat,sha256=Tn9u1EvJAZZEIdgXloi326qjpq8b1N087nRQ9R1JbWE,635
|
890 |
+
babel/locale-data/sr_Cyrl_XK.dat,sha256=KLlEv9Pu32YZMj8eorGznSio7bTSjicGvEH_-T31qyM,2783
|
891 |
+
babel/locale-data/sr_Latn.dat,sha256=2Q6jJtD2qPwtd7zeKYjkMP9Kq3L5aMTrr2kaSfHExAc,273929
|
892 |
+
babel/locale-data/sr_Latn_BA.dat,sha256=aRa8EvP8C3DEpDCgro7f5IiZMKCxkHcGKn-Q_77Bfi0,34551
|
893 |
+
babel/locale-data/sr_Latn_ME.dat,sha256=Oilwiq74izAYctEOmJe3ROcFMhwUwjTjJOWwWD5bHHw,3277
|
894 |
+
babel/locale-data/sr_Latn_RS.dat,sha256=Tn9u1EvJAZZEIdgXloi326qjpq8b1N087nRQ9R1JbWE,635
|
895 |
+
babel/locale-data/sr_Latn_XK.dat,sha256=48M8oDOTV5ATZpMttuYHlXUl3Tf7YdgMF-RABRDZFWE,2389
|
896 |
+
babel/locale-data/ss.dat,sha256=EBfjK8BcF9PU_ycf49tzaXNE1Bv6cuUB2-dPbNMzofk,2490
|
897 |
+
babel/locale-data/ss_SZ.dat,sha256=X-Va1uVrsPa1ZX5hwhQ-ME6Q_bovUb24XXFS8UQ87lQ,1208
|
898 |
+
babel/locale-data/ss_ZA.dat,sha256=xwT3vZ4tmKEvJpVwFMV9U2j2FLF1tC9PEDN6MC6Qbf4,635
|
899 |
+
babel/locale-data/ssy.dat,sha256=AkCerJDPvk_d2gJSRoplTQhgsFYbl8moCu0uBEGIblA,3058
|
900 |
+
babel/locale-data/ssy_ER.dat,sha256=9CRIaVxgOMeMTc0tcV0Yz9yZzq_uD3g3ylZzqVpYzsM,617
|
901 |
+
babel/locale-data/st.dat,sha256=gTFSFNHmmkv6-8Rqn_DcoR6rhOK_KPKKM1jDsJHhpsw,15534
|
902 |
+
babel/locale-data/st_LS.dat,sha256=pSzdNm6-O5V6-14VcgF2iGNYQPFYIXQlY3SqUW3GcjA,1227
|
903 |
+
babel/locale-data/st_ZA.dat,sha256=5tdUX7dxXEL2xiS_0IvHvqhKF-gWXFsi4supkP0RDAc,635
|
904 |
+
babel/locale-data/su.dat,sha256=vNhYxPh1AzRXMdurBP5yh02ort9F5H7ghd3rk0DE9AA,13795
|
905 |
+
babel/locale-data/su_Latn.dat,sha256=ievzq_m7eD5pZWLnVlH7oMIdeadf8GIMqEuVPJTBjyM,745
|
906 |
+
babel/locale-data/su_Latn_ID.dat,sha256=axNaukDpD_-G-_4R7P1u5w4dh-ToRPN_Yo-QpC1cFRU,635
|
907 |
+
babel/locale-data/sv.dat,sha256=cmdR0j2gMWKpWl8ujFLQXMhIM2id9YP3MQyfHdHWv0Y,242064
|
908 |
+
babel/locale-data/sv_AX.dat,sha256=QFGzIe9UCr5gCpgHunvdPiZ-126vP7GYORL9jjip9-E,653
|
909 |
+
babel/locale-data/sv_FI.dat,sha256=lrcPInOi023u4IdDjftF0dCFSaHuZj36l_Qu795uysU,2695
|
910 |
+
babel/locale-data/sv_SE.dat,sha256=c9PG5p2y_4rnxepGD4uOzemBU3EOQhQNO4BtUS1m3rE,653
|
911 |
+
babel/locale-data/sw.dat,sha256=c2SJSTSB53IVWWKvYt2g1RpTJNEvOVdW5sbSRglK3_8,215403
|
912 |
+
babel/locale-data/sw_CD.dat,sha256=W7Fw8Wqwo3_x4hWlssmWbVTj4hhSQmRv8c-VSnQdlg8,2577
|
913 |
+
babel/locale-data/sw_KE.dat,sha256=UX0V8wV9CmITcAbSyHkERssggIDXA98fyVCOYnXtnik,47932
|
914 |
+
babel/locale-data/sw_TZ.dat,sha256=I1bDbpEDiR1jkCgJ_W9fWCPuPxMhjQmwG3sIueKb-Rk,616
|
915 |
+
babel/locale-data/sw_UG.dat,sha256=kuNdg2N_dLwUKFm7wSheL1wLOdyrukPxLfDw0PN7tT8,660
|
916 |
+
babel/locale-data/syr.dat,sha256=My474Zt8Vw1dvXXXDS1xqsjkVmJew4SeMzeU78pIBso,165027
|
917 |
+
babel/locale-data/syr_IQ.dat,sha256=Mrw63eJwh0vRe3Lpj0vRf6Q4cUZXJcx9tlWkuAmMrss,679
|
918 |
+
babel/locale-data/syr_SY.dat,sha256=l0Yl2UMjm_7kuzvoG2-KqBp5XR88gdjf1ZlpRRNFMuc,679
|
919 |
+
babel/locale-data/szl.dat,sha256=jan4MKB8K_nDa6k4Qn6kTHJqY6ylL5qZOO5miN0vkrY,111023
|
920 |
+
babel/locale-data/szl_PL.dat,sha256=1D5dKaG2l2Haxde8uraWI2J5lzw1dIWGeJtBesua-IM,654
|
921 |
+
babel/locale-data/ta.dat,sha256=GetaBt44B3qiriQrT-fm6JIPWeOXFO2wWgAn6sK0xCM,301942
|
922 |
+
babel/locale-data/ta_IN.dat,sha256=BOFaDBw7fc7C6xSSFYNfkhCgCUd7ydHprJ6u0DaneSE,658
|
923 |
+
babel/locale-data/ta_LK.dat,sha256=Od6ln5oUnWfaAHwt_SDafWv844c7A7_7fTT2OPVTuyw,1208
|
924 |
+
babel/locale-data/ta_MY.dat,sha256=PEUmjhs_RUr1R5kH9uHExdnG59Hy8LmbU18vXZYYPtA,1325
|
925 |
+
babel/locale-data/ta_SG.dat,sha256=tbuefTSiXPMwpeV085Qp53l5uDHLsMMXmt8TPEG2fWY,1344
|
926 |
+
babel/locale-data/te.dat,sha256=3uBiMoaDBVmlh1JN-cFB9eZOZVofJY5vGohotgfHrts,300989
|
927 |
+
babel/locale-data/te_IN.dat,sha256=LICnXU-D0uhvxVpQ986Ul1JeAQktXaX53sXZSUY3L2g,658
|
928 |
+
babel/locale-data/teo.dat,sha256=6wOYzb32RkGey4sEGPkEptonW4zxEum2Gqo__Fy1_3c,16591
|
929 |
+
babel/locale-data/teo_KE.dat,sha256=S_lAg36VkA1w384kzPfXRLmJmGWfmz3ll7MzOQAtcr8,657
|
930 |
+
babel/locale-data/teo_UG.dat,sha256=0WlDglms5bCe1AMwCqroaXpOXu9jQroxllMwXWLb8q0,640
|
931 |
+
babel/locale-data/tg.dat,sha256=T1drajN0RabMR4tG0KK5mWpeGwTlTG5xYjoblk1iYfY,51518
|
932 |
+
babel/locale-data/tg_TJ.dat,sha256=TCrsEipGp0reAS2mAvwT58tyzBnYJfL5oNHWpEe1ttc,635
|
933 |
+
babel/locale-data/th.dat,sha256=Cv5aRObrY8j69jZ3_ZOIOgvdU1Esi1II4BRKyTNc2Zw,261473
|
934 |
+
babel/locale-data/th_TH.dat,sha256=_QhA0WcHmW6Cr_-gU9e6cdpzTMDT19WyHas58fWDUnc,635
|
935 |
+
babel/locale-data/ti.dat,sha256=1pTqX8pN96SKAZPPWLCcA3B-pir9jYjzPQ-GxFojACE,128818
|
936 |
+
babel/locale-data/ti_ER.dat,sha256=m9w0P5TPQ8IqpWKldwdfnw5_1Upv09AjLdO5WUbcRic,962
|
937 |
+
babel/locale-data/ti_ET.dat,sha256=q0b9svPg8aj9xmbXr7F6fPHqeTJmclBl5t_hqQk7IuU,635
|
938 |
+
babel/locale-data/tig.dat,sha256=Zg0qqnVRIz7gyDBe3__hVZOSj-T1_2Iud5sjuoKFNjM,13685
|
939 |
+
babel/locale-data/tig_ER.dat,sha256=OoQ0U6yyzmjKwDtzLUpqR09h_ZaGvzXlp7t-HqNxmm4,617
|
940 |
+
babel/locale-data/tk.dat,sha256=j4XWeKhhe09xRpDTc6BesDQ-yyZciLXqF2cmrkeQHpc,202207
|
941 |
+
babel/locale-data/tk_TM.dat,sha256=lADxEQoz-_ImDBmpCFUqDPuZ0ozVUhZKOQF2ZwyXVlw,635
|
942 |
+
babel/locale-data/tn.dat,sha256=3zvpXUjb5YJyJCVcPI0NpDvy0dHOASFLvHBBFpWSg2g,15028
|
943 |
+
babel/locale-data/tn_BW.dat,sha256=jWMFP1tw-o7rslHAlAIgjEXflko8UCDNaSuQ8ccvNHI,654
|
944 |
+
babel/locale-data/tn_ZA.dat,sha256=S3dMOsYSpBwkUv0tW9q0kKawQQl6yx77LexAL5wQqDU,635
|
945 |
+
babel/locale-data/to.dat,sha256=Wc0FOumWNapJd1yTtBa-yU9XIZi3M6Tun77ai81pSZM,182085
|
946 |
+
babel/locale-data/to_TO.dat,sha256=jcfJ2Pjof8jGE4q1y5LHSP9rb4IanN58kR7OgG8d5Q0,616
|
947 |
+
babel/locale-data/tok.dat,sha256=VZdkFu2hovwGCYZlHO8Qy5BANYa7nSDxpnnNvNvj0no,6057
|
948 |
+
babel/locale-data/tok_001.dat,sha256=PPUMevT2TBOGFSq-U-AccYkLHSbkWnBRDvxtpokTCD4,693
|
949 |
+
babel/locale-data/tpi.dat,sha256=0hp2fl1zHPBF6-3kxfd0W8w7oJNV6t3_QrbaRpG0akc,4771
|
950 |
+
babel/locale-data/tpi_PG.dat,sha256=uZD_c8yCtiYwt2EO2VOYPzhSTqWMQBOJMCuMCXe3Css,617
|
951 |
+
babel/locale-data/tr.dat,sha256=51Me4EB7yjxjFaoVIxvDIAQfCRUoNo8lsw0FU5mCwBQ,233315
|
952 |
+
babel/locale-data/tr_CY.dat,sha256=3EmCqxcPvFuZcHCzpTmHb6pjtPwqQvwCfn27B8rtXNw,1227
|
953 |
+
babel/locale-data/tr_TR.dat,sha256=7lS5CMZw76SVlMJxsmIJW5IfL7k9t8MrfKcnElqISSI,635
|
954 |
+
babel/locale-data/trv.dat,sha256=JbNccv-KkRK3wx94LotNV6WGtJGEti6TVeD-ooHF2aA,10926
|
955 |
+
babel/locale-data/trv_TW.dat,sha256=CTQtGdDW4Z0n2Ckb6B63HgEwNE44YTFnJCetwd8q9GU,636
|
956 |
+
babel/locale-data/trw.dat,sha256=GQbDeIwZZMjP78avX1GXLA-ySyOvBLD7gMOppJ1qcd4,129847
|
957 |
+
babel/locale-data/trw_PK.dat,sha256=pBHdOulrwRLiQuC96g8ilUzpKBeG6kglBqUXB8MlURA,636
|
958 |
+
babel/locale-data/ts.dat,sha256=4DJrk4p_3RiC82zHM5gKgN4nySr-2xHP01BtsUmgPvo,13486
|
959 |
+
babel/locale-data/ts_ZA.dat,sha256=AByEO55W3DVVOBIBxIp1F2QwY01-5v6v8sDFOGSxCF0,635
|
960 |
+
babel/locale-data/tt.dat,sha256=_1urtzP-CZBIsl8rZh6Xm9IRXLVoBGklF981ZxlxguM,43024
|
961 |
+
babel/locale-data/tt_RU.dat,sha256=cmv2MzolKOrsRoqQcFZGcXQj_33dLWGh9oUjnebCnz0,653
|
962 |
+
babel/locale-data/twq.dat,sha256=MLoHw6LLZN372T5bROnq_FI8C0Ty4gmRu-VLaiZWr80,16136
|
963 |
+
babel/locale-data/twq_NE.dat,sha256=y8xQDxMtyStWC83tm_JiekFxAY0Fj-CWWdmic9GBwd4,617
|
964 |
+
babel/locale-data/tzm.dat,sha256=aqmHBfyq6JQZIWyKA2iBtn1Qsi8aE4nxZeVhXl0apj4,16066
|
965 |
+
babel/locale-data/tzm_MA.dat,sha256=8eku_7voAqAjN651VYKCuIWvdYGOScCyqbt1rtSVO_g,617
|
966 |
+
babel/locale-data/ug.dat,sha256=lKw8VTDQjeTp8BlOxPwAesi9dINASmZNbmSjuuR5UYA,129541
|
967 |
+
babel/locale-data/ug_CN.dat,sha256=2UselU1_d6K7NgQj0EDnDfb4Llk51eQZ7z78oYE-Ywg,635
|
968 |
+
babel/locale-data/uk.dat,sha256=uzPkrX0I-NhUbmshyQT2KMZN0mUwWG5ydPC609qPUAc,364290
|
969 |
+
babel/locale-data/uk_UA.dat,sha256=usJw_J4Uu9OD9nrUxNQAx6vMJBWDjbGuc9l7ssJAyuw,635
|
970 |
+
babel/locale-data/ur.dat,sha256=orRmVdptiB_ylinJ6yDIbiSKsTWlYRahX8VAKvAe_qU,231785
|
971 |
+
babel/locale-data/ur_IN.dat,sha256=BDrVnRS4pFnz7kO8V2iTSCbEdlCkQExsdFzZ3LOtRvE,12192
|
972 |
+
babel/locale-data/ur_PK.dat,sha256=EEAGl6fLd1-a7X0n2PwRxlqwYZ0a0ELm2DuLII9spX0,635
|
973 |
+
babel/locale-data/uz.dat,sha256=DqM_s3t-3upGr-FOT0vCGr0AEnViXv7vwMkOJpTWk00,206244
|
974 |
+
babel/locale-data/uz_Arab.dat,sha256=_oBgUeBN8a_aTsv8w3K_JiXkUPOkqQ0scM68z0w3H98,3914
|
975 |
+
babel/locale-data/uz_Arab_AF.dat,sha256=68eUCR8KeB0QDQRCvNMiOIkZVRozGKFTDednrQL1X_Y,678
|
976 |
+
babel/locale-data/uz_Cyrl.dat,sha256=pXZg6iCiiMA7vymcbkY1L4z7Y0gxzuLERuPENHfpPRI,100158
|
977 |
+
babel/locale-data/uz_Cyrl_UZ.dat,sha256=MWJtHPdj_pF2h6abRP4wUwDWAUF4-zr7jBn2RQcZ0z8,635
|
978 |
+
babel/locale-data/uz_Latn.dat,sha256=L5H7Xfz2Ho-vMqviRPC4ai0MnqoF9CIebiq7muISvSA,1292
|
979 |
+
babel/locale-data/uz_Latn_UZ.dat,sha256=MWJtHPdj_pF2h6abRP4wUwDWAUF4-zr7jBn2RQcZ0z8,635
|
980 |
+
babel/locale-data/vai.dat,sha256=LahyKrWiA9SCPtM0Evw9AysdrUJxbYIiEYZYsHw3sOc,19008
|
981 |
+
babel/locale-data/vai_Latn.dat,sha256=aYnJ4VJNwmTPTBF6Nzkj59hhQv6YxLu_DLUNuMmPZsE,15025
|
982 |
+
babel/locale-data/vai_Latn_LR.dat,sha256=LdVmBAL7nzDp-Ab_uHidBAi2crIf9nXhf8tBNfa7xdI,617
|
983 |
+
babel/locale-data/vai_Vaii.dat,sha256=l_IXC76zzJ2lPLfWfjWzSw6xVtFwr-x8LofcHQsSG_0,693
|
984 |
+
babel/locale-data/vai_Vaii_LR.dat,sha256=LdVmBAL7nzDp-Ab_uHidBAi2crIf9nXhf8tBNfa7xdI,617
|
985 |
+
babel/locale-data/ve.dat,sha256=uK759Lvgb-PpNsyxfTEFY0cdGcc0KtygSzFTyNEprPc,2684
|
986 |
+
babel/locale-data/ve_ZA.dat,sha256=uJndHi9RMKtDWd58f_Q3g5WgXjL3W7KLQj91rVueabQ,635
|
987 |
+
babel/locale-data/vec.dat,sha256=oJFbBfJmGgPpvhy1fqKv2DMHHmqvR3TDZVp-v-raP4w,1776
|
988 |
+
babel/locale-data/vec_IT.dat,sha256=mC9jRfk9ndmkpRIpWZNCwdMwvxvB6QX6_9HanawdaUw,654
|
989 |
+
babel/locale-data/vi.dat,sha256=GU5bwQgrbL4lEeWcfS_HuU1shwwwiTfc6abCjX7KHQI,188652
|
990 |
+
babel/locale-data/vi_VN.dat,sha256=cGwN0vw-qIaeA2g89U97N1xHSMmmaIVNPCLL2P_QJMk,635
|
991 |
+
babel/locale-data/vo.dat,sha256=3Z3f56WHslCqteTl1FP1rADNc5CvanU2cOCjyLVHS9c,5258
|
992 |
+
babel/locale-data/vo_001.dat,sha256=iF2xY9XIdxC0mOYEp9hjYZp2EG-si_YaNYXri_60-4w,850
|
993 |
+
babel/locale-data/vun.dat,sha256=akNUDGYNWXhsxEQRKMjeNbA_1UemqCov3KgYBF3Y628,15957
|
994 |
+
babel/locale-data/vun_TZ.dat,sha256=YKrOeOS1VnU3BWQ7HWtxjS-gMKJcKAPQLf4HTgkzf70,617
|
995 |
+
babel/locale-data/wa.dat,sha256=1r6krApI8oecIKQt_9RzbpwSN0LcWSjlG34Y9Rfh07Y,880
|
996 |
+
babel/locale-data/wa_BE.dat,sha256=j4YADQloo07Oek1j3aOrLYkzcFkrViS1UdRrA0Z56-o,653
|
997 |
+
babel/locale-data/wae.dat,sha256=QG4YCienzVk62qMkbSIq0qQ0MMOQwY5JTfZmmBnt9ew,30913
|
998 |
+
babel/locale-data/wae_CH.dat,sha256=Z0Wzu5Q9IVTnLGwWu54ozVx-fgnFz0IE3yrky8Y1IkQ,654
|
999 |
+
babel/locale-data/wal.dat,sha256=bmgXVK3q57btDK3v6en1XeAd8gfsbFVHlbqh1uUdaBc,8567
|
1000 |
+
babel/locale-data/wal_ET.dat,sha256=tNjeuU4GPTWtDmsroGmi4VUql0dA57v1tEtDF4rslVg,636
|
1001 |
+
babel/locale-data/wbp.dat,sha256=IjFhDqCcLq80NrrgBmb7uhiHCi-OgQDQXdqWHo_X4IA,788
|
1002 |
+
babel/locale-data/wbp_AU.dat,sha256=BT2E1-WiomuRrteCzN1_AfLyDUdEOm0ehT5miAiepBQ,636
|
1003 |
+
babel/locale-data/wo.dat,sha256=Yyd7YgFQJT3Ge4CQZEiLe8XPv_fijnJvAUv4UyCRquo,33411
|
1004 |
+
babel/locale-data/wo_SN.dat,sha256=fvlwe-ImWs04fsxSjTsXf8IPxEIiEi45BX8xhoBC_yg,616
|
1005 |
+
babel/locale-data/xh.dat,sha256=2vc9mrCFHX1rAhrFzHB5VrJB9OCAnqy1f-nJphqxocE,93311
|
1006 |
+
babel/locale-data/xh_ZA.dat,sha256=9p6wHW1sxOghJMAgsP6BC3RdUhuvLpHoCkqvjsCmPps,635
|
1007 |
+
babel/locale-data/xog.dat,sha256=9RBj7uyIzJW9uvv83Rzx-4gA7Jn4t1RDnR3RpZfQVjQ,16447
|
1008 |
+
babel/locale-data/xog_UG.dat,sha256=bMX0Tk5zS4P2LqlOLLpVP4nZxBFhS_qc-ndXjilDCNI,640
|
1009 |
+
babel/locale-data/yav.dat,sha256=dNH_Acsvz6mE-Rsv9nLUSJQrNYmMPCrc7uOc_OgRI0M,15285
|
1010 |
+
babel/locale-data/yav_CM.dat,sha256=CsaKwep5CARetyBX-JXHFvUVsFe1KTN4Pyz1Wh7NTHw,636
|
1011 |
+
babel/locale-data/yi.dat,sha256=QeHqecJsPVyQ6QlapeKZU4jECQEYbz1pmUGiH5SVqyY,30133
|
1012 |
+
babel/locale-data/yi_001.dat,sha256=tdGIV8N9o_qjy8kvn7QB-meY7HHe4ZjZxFyhO4Y2NYg,912
|
1013 |
+
babel/locale-data/yo.dat,sha256=odUlozSDJE5yIlr2fv1LjoMEop2HpQsdZ9W6OcYZ6V8,139501
|
1014 |
+
babel/locale-data/yo_BJ.dat,sha256=-2DRkfPNRUia1uqLRmvz-mVx8O-FHp1nojC-ANNudaQ,47102
|
1015 |
+
babel/locale-data/yo_NG.dat,sha256=BEIndIiMT1Mo18S5DAWpjefthptCVQkIPeVs0umSop0,616
|
1016 |
+
babel/locale-data/yrl.dat,sha256=3sVAhKVyZUwrVLJNhN-GBTVmii9sOum1c2M0Zp_FwX4,213577
|
1017 |
+
babel/locale-data/yrl_BR.dat,sha256=aUgLCNwgEORk2wtuez8AqkYahB8_mX41IWSqogt39YE,636
|
1018 |
+
babel/locale-data/yrl_CO.dat,sha256=oeTveb-u18jQraHBxtYXegyt6H4DN-NvAXDgYq0Vvx4,9331
|
1019 |
+
babel/locale-data/yrl_VE.dat,sha256=N5Z7PzXQXLg5_y31iqC4yFLeGQw1TvhxJsnOxgLANbA,9331
|
1020 |
+
babel/locale-data/yue.dat,sha256=d0JUmI3Tx52QGX7M382UFInIMMhDAmKgQ0uKidl47AY,200901
|
1021 |
+
babel/locale-data/yue_Hans.dat,sha256=IXOR94pqC8cNAzBKvvvsjFYc_g9Bxusdjc0lNKImH-k,200610
|
1022 |
+
babel/locale-data/yue_Hans_CN.dat,sha256=MOZnu5r0xokf672rwAXfgzG3VEeTfNlDbu36fR1bB6I,636
|
1023 |
+
babel/locale-data/yue_Hant.dat,sha256=76wefuhsGIjk0jT05KSTEU_pbb7AfNE2u56jdRoJaDM,1306
|
1024 |
+
babel/locale-data/yue_Hant_HK.dat,sha256=eMZ7mOTEyKzQz0MDIjvP_Z57CS9nFIP4-Uf0Jpx1CY4,636
|
1025 |
+
babel/locale-data/zgh.dat,sha256=4_BRrs_rhQZjlMMPGrE3DgaRs-P6rJYR-m19LhtSnvo,30518
|
1026 |
+
babel/locale-data/zgh_MA.dat,sha256=sV8aPBmHY23lKIzsRna-tPz3UiXoKCMQ1Ur2tCyx2YA,617
|
1027 |
+
babel/locale-data/zh.dat,sha256=soO-LIfZqc1zuQbG87Am-XNZF-d1Ym3eVJvfPkQOD9k,199506
|
1028 |
+
babel/locale-data/zh_Hans.dat,sha256=-wR64b65stjA2KWj4GWcBWiF3yI0A24p4K7wApj8qtc,1305
|
1029 |
+
babel/locale-data/zh_Hans_CN.dat,sha256=zz2qPpWEP9ba12T9cGsPXGI7Bg5LcmZ3NkAMiVTf61A,635
|
1030 |
+
babel/locale-data/zh_Hans_HK.dat,sha256=wYEV3_5mxfBkKP74urgX9N2wnD9a5jMMvSZgaqxC7FU,3697
|
1031 |
+
babel/locale-data/zh_Hans_MO.dat,sha256=YFbTnSDiLaoLfkXsmOvrwvC0Sm4e9z7q0-_kLdg3S0A,3828
|
1032 |
+
babel/locale-data/zh_Hans_SG.dat,sha256=AIkbQjmBkpZX80T3Oq6aSPjsYYekE7dELKBkF5kCLoY,4024
|
1033 |
+
babel/locale-data/zh_Hant.dat,sha256=WMLaHeGK2sQW2mWfh0Mfn0lFXlLsMNQqjB2ZwddEoik,203093
|
1034 |
+
babel/locale-data/zh_Hant_HK.dat,sha256=Vxy1c_iJyNSWFFBNBcxa7E9o0B75C2MMhCzRRGTGAyI,61870
|
1035 |
+
babel/locale-data/zh_Hant_MO.dat,sha256=8GSs5WRDxGFvEN8slDp9A3dmsZslPSN3NJDcT5EN4fk,710
|
1036 |
+
babel/locale-data/zh_Hant_TW.dat,sha256=5N4K8I3XG89knCaSoy97HGzTVOTiUcd_VmfvNJlA4Bg,635
|
1037 |
+
babel/locale-data/zu.dat,sha256=fg5PR6NhHCzp30f9PjII1e64zs66X4mJdzJNh594kHw,213979
|
1038 |
+
babel/locale-data/zu_ZA.dat,sha256=jHloBfkNbQETXgE-3xVxvESitWb994_-SoY0G4_JL5E,635
|
1039 |
+
babel/localedata.py,sha256=vdTBpZsR2ExG9jBJLe42Xg-NKbm7XU7Pg5z0lIXod1Y,8239
|
1040 |
+
babel/localtime/__init__.py,sha256=hHBBHcfWoTvnIOfahxHlxqNR7IL4A4yTuxxG7wDZWUk,1043
|
1041 |
+
babel/localtime/__pycache__/__init__.cpython-38.pyc,,
|
1042 |
+
babel/localtime/__pycache__/_fallback.cpython-38.pyc,,
|
1043 |
+
babel/localtime/__pycache__/_helpers.cpython-38.pyc,,
|
1044 |
+
babel/localtime/__pycache__/_unix.cpython-38.pyc,,
|
1045 |
+
babel/localtime/__pycache__/_win32.cpython-38.pyc,,
|
1046 |
+
babel/localtime/_fallback.py,sha256=0ak6R7ATmobpIlVjzQOK667bCMUjaFGcBWfL-IJlFEo,1207
|
1047 |
+
babel/localtime/_helpers.py,sha256=8WIkbnxv1aGVvXm63pFlB_IBRQNsMQlATsx7vorRivQ,1060
|
1048 |
+
babel/localtime/_unix.py,sha256=7ExS68O5KpjqgZ6Dhho2WhxlYQYe2etJiW8BW2mXMCc,3455
|
1049 |
+
babel/localtime/_win32.py,sha256=nSNnxSMOVAlvqvX50h9HSCzBfP7mj8njJ80JZ3pOIWk,3211
|
1050 |
+
babel/messages/__init__.py,sha256=7UsGpKWLQkcEBwmt1oLAW-7xNOXaGXJIBI1upvXH5yU,349
|
1051 |
+
babel/messages/__pycache__/__init__.cpython-38.pyc,,
|
1052 |
+
babel/messages/__pycache__/catalog.cpython-38.pyc,,
|
1053 |
+
babel/messages/__pycache__/checkers.cpython-38.pyc,,
|
1054 |
+
babel/messages/__pycache__/extract.cpython-38.pyc,,
|
1055 |
+
babel/messages/__pycache__/frontend.cpython-38.pyc,,
|
1056 |
+
babel/messages/__pycache__/jslexer.cpython-38.pyc,,
|
1057 |
+
babel/messages/__pycache__/mofile.cpython-38.pyc,,
|
1058 |
+
babel/messages/__pycache__/plurals.cpython-38.pyc,,
|
1059 |
+
babel/messages/__pycache__/pofile.cpython-38.pyc,,
|
1060 |
+
babel/messages/__pycache__/setuptools_frontend.cpython-38.pyc,,
|
1061 |
+
babel/messages/catalog.py,sha256=Dg8qHiACb1JbSjsNcKdJygj-IKgW53w0HFSwKNJSstk,36302
|
1062 |
+
babel/messages/checkers.py,sha256=Vsi4_ImORDqfu4fbDdBisJY7ALbQ3CsOJqi0VnQZCR4,6375
|
1063 |
+
babel/messages/extract.py,sha256=fpfNYBW8jGkVD2XCJcu3PsiE1p0SrbLqhCYmYmaNdc8,34333
|
1064 |
+
babel/messages/frontend.py,sha256=kHprmRt0fL4TMIBk51aJgwoAeoLNb8ZbPFPvkrfDSr8,41618
|
1065 |
+
babel/messages/jslexer.py,sha256=TUv4DXfVES21MDG38e-3HC0HZabAKf-iNvxqzd2Yo1Q,7153
|
1066 |
+
babel/messages/mofile.py,sha256=HewAYZVOdUAqtlsma3A1lojIvntXdWpFjkYkODyMhR4,7345
|
1067 |
+
babel/messages/plurals.py,sha256=dlcmsT2Lu9kzMVs3Yid5_myAR_qhWNH66v6kJeZ26Ys,7319
|
1068 |
+
babel/messages/pofile.py,sha256=mAfl-8uFlQ_KS4HaeHeDEcenrCRoMtSpgECV9KY_m7Y,22325
|
1069 |
+
babel/messages/setuptools_frontend.py,sha256=m1l9NHuawj1pSncZeC82cUJfdwxib_C7JSUb_2EhbUM,3485
|
1070 |
+
babel/numbers.py,sha256=ysT2-EqcI6znM55z-DkeXlZV7G5G8bQgGdp5gCHmDaM,60994
|
1071 |
+
babel/plural.py,sha256=GX8dOZDOyjvUnIhbZhjfxEgh2zd4FKGJkSeKPN9q-8g,23218
|
1072 |
+
babel/py.typed,sha256=DtCsIDq6KOv2NOEdQjTbeMWJKRh6ZEL2E-6Mf1RLeMA,59
|
1073 |
+
babel/support.py,sha256=_LCOy2P2_SgaUGBIR4sOpTh04-pmtjNjcjrdJ1gmeRE,27456
|
1074 |
+
babel/units.py,sha256=J8uwppyWrgaFYptgI-QPotAm105yOGoYSEPk397wE44,13590
|
1075 |
+
babel/util.py,sha256=x_2u0RKmNnUo1nucVAla_6jj9A83RDUMzRj3Vj4FenM,7956
|
Lib/site-packages/Babel-2.14.0.dist-info/WHEEL
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Wheel-Version: 1.0
|
2 |
+
Generator: bdist_wheel (0.42.0)
|
3 |
+
Root-Is-Purelib: true
|
4 |
+
Tag: py3-none-any
|
5 |
+
|
Lib/site-packages/Babel-2.14.0.dist-info/entry_points.txt
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[babel.checkers]
|
2 |
+
num_plurals = babel.messages.checkers:num_plurals
|
3 |
+
python_format = babel.messages.checkers:python_format
|
4 |
+
|
5 |
+
[babel.extractors]
|
6 |
+
ignore = babel.messages.extract:extract_nothing
|
7 |
+
javascript = babel.messages.extract:extract_javascript
|
8 |
+
python = babel.messages.extract:extract_python
|
9 |
+
|
10 |
+
[console_scripts]
|
11 |
+
pybabel = babel.messages.frontend:main
|
12 |
+
|
13 |
+
[distutils.commands]
|
14 |
+
compile_catalog = babel.messages.setuptools_frontend:compile_catalog
|
15 |
+
extract_messages = babel.messages.setuptools_frontend:extract_messages
|
16 |
+
init_catalog = babel.messages.setuptools_frontend:init_catalog
|
17 |
+
update_catalog = babel.messages.setuptools_frontend:update_catalog
|
18 |
+
|
19 |
+
[distutils.setup_keywords]
|
20 |
+
message_extractors = babel.messages.setuptools_frontend:check_message_extractors
|
Lib/site-packages/Babel-2.14.0.dist-info/top_level.txt
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
babel
|
Lib/site-packages/Cython-3.0.10.dist-info/COPYING.txt
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
The original Pyrex code as of 2006-04 is licensed under the following
|
2 |
+
license: "Copyright stuff: Pyrex is free of restrictions. You may use,
|
3 |
+
redistribute, modify and distribute modified versions."
|
4 |
+
|
5 |
+
------------------
|
6 |
+
|
7 |
+
Cython, which derives from Pyrex, is licensed under the Apache 2.0
|
8 |
+
Software License. More precisely, all modifications and new code
|
9 |
+
made to go from Pyrex to Cython are so licensed.
|
10 |
+
|
11 |
+
See LICENSE.txt for more details.
|
12 |
+
|
13 |
+
------------------
|
14 |
+
|
15 |
+
The output of a Cython compilation is NOT considered a derivative
|
16 |
+
work of Cython. Specifically, though the compilation process may
|
17 |
+
embed snippets of varying lengths into the final output, these
|
18 |
+
snippets, as embedded in the output, do not encumber the resulting
|
19 |
+
output with any license restrictions.
|
Lib/site-packages/Cython-3.0.10.dist-info/INSTALLER
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
pip
|
Lib/site-packages/Cython-3.0.10.dist-info/LICENSE.txt
ADDED
@@ -0,0 +1,176 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Apache License
|
2 |
+
Version 2.0, January 2004
|
3 |
+
https://www.apache.org/licenses/
|
4 |
+
|
5 |
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
6 |
+
|
7 |
+
1. Definitions.
|
8 |
+
|
9 |
+
"License" shall mean the terms and conditions for use, reproduction,
|
10 |
+
and distribution as defined by Sections 1 through 9 of this document.
|
11 |
+
|
12 |
+
"Licensor" shall mean the copyright owner or entity authorized by
|
13 |
+
the copyright owner that is granting the License.
|
14 |
+
|
15 |
+
"Legal Entity" shall mean the union of the acting entity and all
|
16 |
+
other entities that control, are controlled by, or are under common
|
17 |
+
control with that entity. For the purposes of this definition,
|
18 |
+
"control" means (i) the power, direct or indirect, to cause the
|
19 |
+
direction or management of such entity, whether by contract or
|
20 |
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
21 |
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
22 |
+
|
23 |
+
"You" (or "Your") shall mean an individual or Legal Entity
|
24 |
+
exercising permissions granted by this License.
|
25 |
+
|
26 |
+
"Source" form shall mean the preferred form for making modifications,
|
27 |
+
including but not limited to software source code, documentation
|
28 |
+
source, and configuration files.
|
29 |
+
|
30 |
+
"Object" form shall mean any form resulting from mechanical
|
31 |
+
transformation or translation of a Source form, including but
|
32 |
+
not limited to compiled object code, generated documentation,
|
33 |
+
and conversions to other media types.
|
34 |
+
|
35 |
+
"Work" shall mean the work of authorship, whether in Source or
|
36 |
+
Object form, made available under the License, as indicated by a
|
37 |
+
copyright notice that is included in or attached to the work
|
38 |
+
(an example is provided in the Appendix below).
|
39 |
+
|
40 |
+
"Derivative Works" shall mean any work, whether in Source or Object
|
41 |
+
form, that is based on (or derived from) the Work and for which the
|
42 |
+
editorial revisions, annotations, elaborations, or other modifications
|
43 |
+
represent, as a whole, an original work of authorship. For the purposes
|
44 |
+
of this License, Derivative Works shall not include works that remain
|
45 |
+
separable from, or merely link (or bind by name) to the interfaces of,
|
46 |
+
the Work and Derivative Works thereof.
|
47 |
+
|
48 |
+
"Contribution" shall mean any work of authorship, including
|
49 |
+
the original version of the Work and any modifications or additions
|
50 |
+
to that Work or Derivative Works thereof, that is intentionally
|
51 |
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
52 |
+
or by an individual or Legal Entity authorized to submit on behalf of
|
53 |
+
the copyright owner. For the purposes of this definition, "submitted"
|
54 |
+
means any form of electronic, verbal, or written communication sent
|
55 |
+
to the Licensor or its representatives, including but not limited to
|
56 |
+
communication on electronic mailing lists, source code control systems,
|
57 |
+
and issue tracking systems that are managed by, or on behalf of, the
|
58 |
+
Licensor for the purpose of discussing and improving the Work, but
|
59 |
+
excluding communication that is conspicuously marked or otherwise
|
60 |
+
designated in writing by the copyright owner as "Not a Contribution."
|
61 |
+
|
62 |
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
63 |
+
on behalf of whom a Contribution has been received by Licensor and
|
64 |
+
subsequently incorporated within the Work.
|
65 |
+
|
66 |
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
67 |
+
this License, each Contributor hereby grants to You a perpetual,
|
68 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
69 |
+
copyright license to reproduce, prepare Derivative Works of,
|
70 |
+
publicly display, publicly perform, sublicense, and distribute the
|
71 |
+
Work and such Derivative Works in Source or Object form.
|
72 |
+
|
73 |
+
3. Grant of Patent License. Subject to the terms and conditions of
|
74 |
+
this License, each Contributor hereby grants to You a perpetual,
|
75 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
76 |
+
(except as stated in this section) patent license to make, have made,
|
77 |
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
78 |
+
where such license applies only to those patent claims licensable
|
79 |
+
by such Contributor that are necessarily infringed by their
|
80 |
+
Contribution(s) alone or by combination of their Contribution(s)
|
81 |
+
with the Work to which such Contribution(s) was submitted. If You
|
82 |
+
institute patent litigation against any entity (including a
|
83 |
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
84 |
+
or a Contribution incorporated within the Work constitutes direct
|
85 |
+
or contributory patent infringement, then any patent licenses
|
86 |
+
granted to You under this License for that Work shall terminate
|
87 |
+
as of the date such litigation is filed.
|
88 |
+
|
89 |
+
4. Redistribution. You may reproduce and distribute copies of the
|
90 |
+
Work or Derivative Works thereof in any medium, with or without
|
91 |
+
modifications, and in Source or Object form, provided that You
|
92 |
+
meet the following conditions:
|
93 |
+
|
94 |
+
(a) You must give any other recipients of the Work or
|
95 |
+
Derivative Works a copy of this License; and
|
96 |
+
|
97 |
+
(b) You must cause any modified files to carry prominent notices
|
98 |
+
stating that You changed the files; and
|
99 |
+
|
100 |
+
(c) You must retain, in the Source form of any Derivative Works
|
101 |
+
that You distribute, all copyright, patent, trademark, and
|
102 |
+
attribution notices from the Source form of the Work,
|
103 |
+
excluding those notices that do not pertain to any part of
|
104 |
+
the Derivative Works; and
|
105 |
+
|
106 |
+
(d) If the Work includes a "NOTICE" text file as part of its
|
107 |
+
distribution, then any Derivative Works that You distribute must
|
108 |
+
include a readable copy of the attribution notices contained
|
109 |
+
within such NOTICE file, excluding those notices that do not
|
110 |
+
pertain to any part of the Derivative Works, in at least one
|
111 |
+
of the following places: within a NOTICE text file distributed
|
112 |
+
as part of the Derivative Works; within the Source form or
|
113 |
+
documentation, if provided along with the Derivative Works; or,
|
114 |
+
within a display generated by the Derivative Works, if and
|
115 |
+
wherever such third-party notices normally appear. The contents
|
116 |
+
of the NOTICE file are for informational purposes only and
|
117 |
+
do not modify the License. You may add Your own attribution
|
118 |
+
notices within Derivative Works that You distribute, alongside
|
119 |
+
or as an addendum to the NOTICE text from the Work, provided
|
120 |
+
that such additional attribution notices cannot be construed
|
121 |
+
as modifying the License.
|
122 |
+
|
123 |
+
You may add Your own copyright statement to Your modifications and
|
124 |
+
may provide additional or different license terms and conditions
|
125 |
+
for use, reproduction, or distribution of Your modifications, or
|
126 |
+
for any such Derivative Works as a whole, provided Your use,
|
127 |
+
reproduction, and distribution of the Work otherwise complies with
|
128 |
+
the conditions stated in this License.
|
129 |
+
|
130 |
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
131 |
+
any Contribution intentionally submitted for inclusion in the Work
|
132 |
+
by You to the Licensor shall be under the terms and conditions of
|
133 |
+
this License, without any additional terms or conditions.
|
134 |
+
Notwithstanding the above, nothing herein shall supersede or modify
|
135 |
+
the terms of any separate license agreement you may have executed
|
136 |
+
with Licensor regarding such Contributions.
|
137 |
+
|
138 |
+
6. Trademarks. This License does not grant permission to use the trade
|
139 |
+
names, trademarks, service marks, or product names of the Licensor,
|
140 |
+
except as required for reasonable and customary use in describing the
|
141 |
+
origin of the Work and reproducing the content of the NOTICE file.
|
142 |
+
|
143 |
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
144 |
+
agreed to in writing, Licensor provides the Work (and each
|
145 |
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
146 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
147 |
+
implied, including, without limitation, any warranties or conditions
|
148 |
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
149 |
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
150 |
+
appropriateness of using or redistributing the Work and assume any
|
151 |
+
risks associated with Your exercise of permissions under this License.
|
152 |
+
|
153 |
+
8. Limitation of Liability. In no event and under no legal theory,
|
154 |
+
whether in tort (including negligence), contract, or otherwise,
|
155 |
+
unless required by applicable law (such as deliberate and grossly
|
156 |
+
negligent acts) or agreed to in writing, shall any Contributor be
|
157 |
+
liable to You for damages, including any direct, indirect, special,
|
158 |
+
incidental, or consequential damages of any character arising as a
|
159 |
+
result of this License or out of the use or inability to use the
|
160 |
+
Work (including but not limited to damages for loss of goodwill,
|
161 |
+
work stoppage, computer failure or malfunction, or any and all
|
162 |
+
other commercial damages or losses), even if such Contributor
|
163 |
+
has been advised of the possibility of such damages.
|
164 |
+
|
165 |
+
9. Accepting Warranty or Additional Liability. While redistributing
|
166 |
+
the Work or Derivative Works thereof, You may choose to offer,
|
167 |
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
168 |
+
or other liability obligations and/or rights consistent with this
|
169 |
+
License. However, in accepting such obligations, You may act only
|
170 |
+
on Your own behalf and on Your sole responsibility, not on behalf
|
171 |
+
of any other Contributor, and only if You agree to indemnify,
|
172 |
+
defend, and hold each Contributor harmless for any liability
|
173 |
+
incurred by, or claims asserted against, such Contributor by reason
|
174 |
+
of your accepting any such warranty or additional liability.
|
175 |
+
|
176 |
+
END OF TERMS AND CONDITIONS
|
Lib/site-packages/Cython-3.0.10.dist-info/METADATA
ADDED
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Metadata-Version: 2.1
|
2 |
+
Name: Cython
|
3 |
+
Version: 3.0.10
|
4 |
+
Summary: The Cython compiler for writing C extensions in the Python language.
|
5 |
+
Home-page: https://cython.org/
|
6 |
+
Author: Robert Bradshaw, Stefan Behnel, Dag Seljebotn, Greg Ewing, et al.
|
7 |
+
Author-email: cython-devel@python.org
|
8 |
+
License: Apache-2.0
|
9 |
+
Project-URL: Documentation, https://cython.readthedocs.io/
|
10 |
+
Project-URL: Donate, https://cython.readthedocs.io/en/latest/src/donating.html
|
11 |
+
Project-URL: Source Code, https://github.com/cython/cython
|
12 |
+
Project-URL: Bug Tracker, https://github.com/cython/cython/issues
|
13 |
+
Project-URL: User Group, https://groups.google.com/g/cython-users
|
14 |
+
Classifier: Development Status :: 5 - Production/Stable
|
15 |
+
Classifier: Intended Audience :: Developers
|
16 |
+
Classifier: License :: OSI Approved :: Apache Software License
|
17 |
+
Classifier: Operating System :: OS Independent
|
18 |
+
Classifier: Programming Language :: Python
|
19 |
+
Classifier: Programming Language :: Python :: 2
|
20 |
+
Classifier: Programming Language :: Python :: 2.7
|
21 |
+
Classifier: Programming Language :: Python :: 3
|
22 |
+
Classifier: Programming Language :: Python :: 3.4
|
23 |
+
Classifier: Programming Language :: Python :: 3.5
|
24 |
+
Classifier: Programming Language :: Python :: 3.6
|
25 |
+
Classifier: Programming Language :: Python :: 3.7
|
26 |
+
Classifier: Programming Language :: Python :: 3.8
|
27 |
+
Classifier: Programming Language :: Python :: 3.9
|
28 |
+
Classifier: Programming Language :: Python :: 3.10
|
29 |
+
Classifier: Programming Language :: Python :: 3.11
|
30 |
+
Classifier: Programming Language :: Python :: 3.12
|
31 |
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
32 |
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
33 |
+
Classifier: Programming Language :: C
|
34 |
+
Classifier: Programming Language :: Cython
|
35 |
+
Classifier: Topic :: Software Development :: Code Generators
|
36 |
+
Classifier: Topic :: Software Development :: Compilers
|
37 |
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
38 |
+
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
|
39 |
+
License-File: LICENSE.txt
|
40 |
+
License-File: COPYING.txt
|
41 |
+
|
42 |
+
The Cython language makes writing C extensions for the Python language as
|
43 |
+
easy as Python itself. Cython is a source code translator based on Pyrex_,
|
44 |
+
but supports more cutting edge functionality and optimizations.
|
45 |
+
|
46 |
+
The Cython language is a superset of the Python language (almost all Python
|
47 |
+
code is also valid Cython code), but Cython additionally supports optional
|
48 |
+
static typing to natively call C functions, operate with C++ classes and
|
49 |
+
declare fast C types on variables and class attributes. This allows the
|
50 |
+
compiler to generate very efficient C code from Cython code.
|
51 |
+
|
52 |
+
This makes Cython the ideal language for writing glue code for external
|
53 |
+
C/C++ libraries, and for fast C modules that speed up the execution of
|
54 |
+
Python code.
|
55 |
+
|
56 |
+
Note that for one-time builds, e.g. for CI/testing, on platforms that are not
|
57 |
+
covered by one of the wheel packages provided on PyPI *and* the pure Python wheel
|
58 |
+
that we provide is not used, it is substantially faster than a full source build
|
59 |
+
to install an uncompiled (slower) version of Cython with::
|
60 |
+
|
61 |
+
pip install Cython --install-option="--no-cython-compile"
|
62 |
+
|
63 |
+
.. _Pyrex: https://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/
|
Lib/site-packages/Cython-3.0.10.dist-info/RECORD
ADDED
@@ -0,0 +1,447 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
../../Scripts/cygdb.exe,sha256=N5E_E6kFUPiAIKE79e2xcOpNyehHNMnWOWPsVVz8YGc,108452
|
2 |
+
../../Scripts/cython.exe,sha256=mqfwvYb-Lo1d0SKKvrzYRt4La9mZ69UXfKMptnGmp3o,108473
|
3 |
+
../../Scripts/cythonize.exe,sha256=HvfwF2zUaNiAwC2LnrUMFuJH4O035dE1Zq1my9gPPj4,108453
|
4 |
+
Cython-3.0.10.dist-info/COPYING.txt,sha256=bBH9iu7VCJgyoSHsOxxkbtWZiCRTKqBoHdVcQpWl6oY,775
|
5 |
+
Cython-3.0.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
6 |
+
Cython-3.0.10.dist-info/LICENSE.txt,sha256=BTbJRMi5EDon8TFTjjeYv71yPfqJiCpPkSC-F28EnDU,10350
|
7 |
+
Cython-3.0.10.dist-info/METADATA,sha256=aXaVAYvFdFjj8-j8hgET_I7fo9Qxb_beDu9Jz7CAh9I,3224
|
8 |
+
Cython-3.0.10.dist-info/RECORD,,
|
9 |
+
Cython-3.0.10.dist-info/WHEEL,sha256=3SeyPJ5-Us2Ct5GSftUVKtLSlm-bNefW4m5qd0GLzww,100
|
10 |
+
Cython-3.0.10.dist-info/entry_points.txt,sha256=VU8NX8gnQyFbyqiWMzfh9BHvYMuoQRS3Nbm3kKcKQeY,139
|
11 |
+
Cython-3.0.10.dist-info/top_level.txt,sha256=jLV8tZV98iCbIfiJR4DVzTX5Ru1Y_pYMZ59wkMCe6SY,24
|
12 |
+
Cython/Build/BuildExecutable.py,sha256=m6IZ7UZ_h2tNpPSHosgmaJLeLmDT59AcI5oAFfo0IKU,4959
|
13 |
+
Cython/Build/Cythonize.py,sha256=BNiJ1SdnCEixcNnwTlFazNCA2dIhjZdOvgcC7SqaWus,10085
|
14 |
+
Cython/Build/Dependencies.py,sha256=DzncslCetaCZHSdQgRDKwYd47Vk-Qb6lsZVaYuVM3b8,54310
|
15 |
+
Cython/Build/Distutils.py,sha256=hxXo722D0j7cfyYCbancdFsKYAuPdfSu9nYmGu6kL6w,50
|
16 |
+
Cython/Build/Inline.py,sha256=nK2x4k8tuTRtZz_XSz_fCo9TO_oCdNdoUDunlSVW8Xg,13460
|
17 |
+
Cython/Build/IpythonMagic.py,sha256=PPUEuBQ1r8kAer2hPqJPGgg8ORWKQ1pYrD2JUCQEz8c,22539
|
18 |
+
Cython/Build/Tests/TestCyCache.py,sha256=v5uUvNmhGr6H3zSK3sfYWEwuAulK42op_CxGZWF5ock,4586
|
19 |
+
Cython/Build/Tests/TestCythonizeArgsParser.py,sha256=Y8MNkwXwf3UlYJ1rRgjoLh_9ciFNPta4qOlo0N6bdw4,20828
|
20 |
+
Cython/Build/Tests/TestDependencies.py,sha256=nBwB0aDTGrLpoWhZHp_YYbAPwBY23Wn6whKdvBxNLDs,5977
|
21 |
+
Cython/Build/Tests/TestInline.py,sha256=XhOeBf5f3lNwsKHCtInPBMbSNvJOdkrnH9DMuNuW9sY,3599
|
22 |
+
Cython/Build/Tests/TestIpythonMagic.py,sha256=PNKz3xDGnnL6rbfn3AyXCe6yfQuf7hdEsTaMOoMdApc,9706
|
23 |
+
Cython/Build/Tests/TestRecythonize.py,sha256=Dw7_qzfsbfT4N7BwSn3ndG3mRgxOwKK7VXoBORPtgTM,6488
|
24 |
+
Cython/Build/Tests/TestStripLiterals.py,sha256=5PgFteJ91xCt1DYDjn8RNKxiMwRGLY3U9iIlss5B0fA,1605
|
25 |
+
Cython/Build/Tests/__init__.py,sha256=qTr7l4s1u10pcMfFjP9cFZGS1PKT6v2Ml_vy3dreto0,14
|
26 |
+
Cython/Build/Tests/__pycache__/TestCyCache.cpython-38.pyc,,
|
27 |
+
Cython/Build/Tests/__pycache__/TestCythonizeArgsParser.cpython-38.pyc,,
|
28 |
+
Cython/Build/Tests/__pycache__/TestDependencies.cpython-38.pyc,,
|
29 |
+
Cython/Build/Tests/__pycache__/TestInline.cpython-38.pyc,,
|
30 |
+
Cython/Build/Tests/__pycache__/TestIpythonMagic.cpython-38.pyc,,
|
31 |
+
Cython/Build/Tests/__pycache__/TestRecythonize.cpython-38.pyc,,
|
32 |
+
Cython/Build/Tests/__pycache__/TestStripLiterals.cpython-38.pyc,,
|
33 |
+
Cython/Build/Tests/__pycache__/__init__.cpython-38.pyc,,
|
34 |
+
Cython/Build/__init__.py,sha256=b6Aw5K0E5t667e-D-xK745uQRAnchOLFSieqle62bIU,415
|
35 |
+
Cython/Build/__pycache__/BuildExecutable.cpython-38.pyc,,
|
36 |
+
Cython/Build/__pycache__/Cythonize.cpython-38.pyc,,
|
37 |
+
Cython/Build/__pycache__/Dependencies.cpython-38.pyc,,
|
38 |
+
Cython/Build/__pycache__/Distutils.cpython-38.pyc,,
|
39 |
+
Cython/Build/__pycache__/Inline.cpython-38.pyc,,
|
40 |
+
Cython/Build/__pycache__/IpythonMagic.cpython-38.pyc,,
|
41 |
+
Cython/Build/__pycache__/__init__.cpython-38.pyc,,
|
42 |
+
Cython/CodeWriter.py,sha256=vYtuEUNkfFOGSsNdw1tlHAXzRHN7QDfIWiOY4sowhtc,25366
|
43 |
+
Cython/Compiler/AnalysedTreeTransforms.py,sha256=vydcZ6Gn79iREYfL5uVLvVFNL4rhrGhkYZD2Cwmb4j8,3933
|
44 |
+
Cython/Compiler/Annotate.py,sha256=z849wv5dVrfR3JsE5qcXS8dnh1LwMODuXZG27HCVMhA,14494
|
45 |
+
Cython/Compiler/AutoDocTransforms.py,sha256=tD313LL4iaGApVGmrm307YDeBpvaiRDmPOBAwJ9YEK0,12056
|
46 |
+
Cython/Compiler/Buffer.py,sha256=ZMU7RkdoEf5u9PNZdAQLvWYp621_XvtqBOP9_IVqxuk,30053
|
47 |
+
Cython/Compiler/Builtin.py,sha256=Loan_cIZUleavCbinMlrWgYC6XwwAStqJw-X_Ml0enA,32711
|
48 |
+
Cython/Compiler/CmdLine.py,sha256=0S6mqX3-qWtSnTVOeyZRF0XAbWy_oa7R0JYvID2oNr4,12777
|
49 |
+
Cython/Compiler/Code.cp38-win_amd64.pyd,sha256=TaEWPjQYUKLlZ15ayXueIbtQ3qKPGwWcwbvJfN-epwg,844288
|
50 |
+
Cython/Compiler/Code.pxd,sha256=ECP1S9TuHAbwUztwa0ghsgY8GBL7AIqNOvBlYM-EVVg,3679
|
51 |
+
Cython/Compiler/Code.py,sha256=pxZtYv6YH-udxfLY7PKMRTPzotQFtKtc2OpEgNUX9Eg,107327
|
52 |
+
Cython/Compiler/CodeGeneration.py,sha256=q3tokV8Ae6Ck6AUYNGUn2R16KRbfXTvQrI7MKJwgg58,1143
|
53 |
+
Cython/Compiler/CythonScope.py,sha256=iIHzxpNuNUrSJvo4JxD3Lg0TSD-SGWfAtkFxEve4cl8,7044
|
54 |
+
Cython/Compiler/Dataclass.py,sha256=Dad1R-j8ARUJajrqvmAA_NcPW5jZvfIFGE0GBdXszdA,36871
|
55 |
+
Cython/Compiler/DebugFlags.py,sha256=5j4pt7JRK5bwWzeDN8906xJVywsNGDmOoiYhFnevbs8,644
|
56 |
+
Cython/Compiler/Errors.py,sha256=NEGZGwRv9YHAmU8Pf5j-Nqex1Zi2GyDt9aoaxpoBbvQ,9612
|
57 |
+
Cython/Compiler/ExprNodes.py,sha256=vdR1ZFdJasYECE8c2shBNRELCEOx9ZLDjCRCyUtGTAY,616594
|
58 |
+
Cython/Compiler/FlowControl.cp38-win_amd64.pyd,sha256=76ytmTqZBsy0RUVEbZNsXjHTQdPeUSsZkTKJO9LoQ4Y,433664
|
59 |
+
Cython/Compiler/FlowControl.pxd,sha256=NbvCrSZVFsPtu8YwxRaFcoRRmWFeNrtStz6Yp31HHtY,3090
|
60 |
+
Cython/Compiler/FlowControl.py,sha256=1aak2rodOfe91EkdjShQXyvUFhnD9dd4sYlc24EYW9Y,50245
|
61 |
+
Cython/Compiler/FusedNode.cp38-win_amd64.pyd,sha256=3DxUFx2fJ0JZQA7A5ctrvjdvf_ASVogDuXX9SbZ7nuA,298496
|
62 |
+
Cython/Compiler/FusedNode.py,sha256=n1goafevt2Z2Sf6KoLkoUqiZOikYK0PxdN33moawPIw,44375
|
63 |
+
Cython/Compiler/Future.py,sha256=2Nk9GuDPE_ssf1eSJHNvScjtp-ukvqKTW7ZQOnAgQtc,645
|
64 |
+
Cython/Compiler/Interpreter.py,sha256=5KuRATS9X3T1w7AZuTV2FtyfWvw6CIuSOqmrq0T8qE8,2178
|
65 |
+
Cython/Compiler/Lexicon.py,sha256=zHaGbKOZa7-hVaHaRjJW7hI1UzD2raym3KiIXbFzInc,22114
|
66 |
+
Cython/Compiler/Main.py,sha256=vu3ysm_do5-pN_dLQkUvl0wt9c07CweXecbn8sYKt80,32994
|
67 |
+
Cython/Compiler/MemoryView.py,sha256=lGg4EANDgwegNKB_fdeAnLP_ihBCm3hDioBB3gxG-pg,31245
|
68 |
+
Cython/Compiler/ModuleNode.py,sha256=84XpHGLIZi5NilzRXT1ioryIh5HG61J5CMClo-3j3jk,188005
|
69 |
+
Cython/Compiler/Naming.py,sha256=kEwC2GPkRxr5qzNwJuUaDlSng-zokEJxx8NwbG_wtRc,8358
|
70 |
+
Cython/Compiler/Nodes.py,sha256=GPlagFFNVHKGFGtk5LeAH-FuZORAVwNt2OiO1nCvX-8,452630
|
71 |
+
Cython/Compiler/Optimize.py,sha256=mQ4dkWOvK2_CCBsaC70AlN8EQEESljlASwCFdKcLyVE,231558
|
72 |
+
Cython/Compiler/Options.py,sha256=M9j84WoXkgRUlZ2c8x1Wb80-NLIZXU25YIzAIdO1Q40,31445
|
73 |
+
Cython/Compiler/ParseTreeTransforms.pxd,sha256=kaicujhdwGVYs5-zKyE_VwI0jPFBnKuZ0w6QE7GrpMY,2667
|
74 |
+
Cython/Compiler/ParseTreeTransforms.py,sha256=wxafCQjj5EzTY9IovS-YE6tgTYRzeS9G_CEe0W5pm48,175768
|
75 |
+
Cython/Compiler/Parsing.cp38-win_amd64.pyd,sha256=4NCtz6gizuBtA-AI9LOg4k9eyXnJEZGCYv6JIEekcw8,714752
|
76 |
+
Cython/Compiler/Parsing.pxd,sha256=jE5HG2e5ePWZDFC1JZuHZ7Mhpb1XuZe4082qSLd5JtE,9371
|
77 |
+
Cython/Compiler/Parsing.py,sha256=F9MEhaoC6CFDPekyFRpQbwk0-0SJXQZClmZ-EN4rB1M,143820
|
78 |
+
Cython/Compiler/Pipeline.py,sha256=kozpch-FZlAv_N40zIl7FwfArBFDikj9u7BB0ddFa_s,16050
|
79 |
+
Cython/Compiler/PyrexTypes.py,sha256=gmvpszyfkFIJNuW2AMZaMPapSMjlqwpisxJnnPe_-Oo,213834
|
80 |
+
Cython/Compiler/Pythran.py,sha256=NKDNEEgsnFgDTeAXqDeVG5ZsfD-HZqb-eAt5XZKjCiw,7494
|
81 |
+
Cython/Compiler/Scanning.cp38-win_amd64.pyd,sha256=U_VWYa1fdqYS1PxGVb4ZBPHw7nrTDpBZBioO7SnkCBM,218624
|
82 |
+
Cython/Compiler/Scanning.pxd,sha256=QOMWvJyz2WHZcuEqo_0Ha2wVZfO7tSb8UPTPM5UmqSw,2134
|
83 |
+
Cython/Compiler/Scanning.py,sha256=YaEMTqvp0anPtlHLXIrgTQXsq9a5UW7wA62IHjhh9HI,20696
|
84 |
+
Cython/Compiler/StringEncoding.py,sha256=xV-gBh82qiiPWleTO_VuPGYw0_B8VrsdDa_vN-bkvWw,12120
|
85 |
+
Cython/Compiler/Symtab.py,sha256=cSPfaGza97c6au3Xx0xsJEEynITm8cEhYN0EinA6SWU,132694
|
86 |
+
Cython/Compiler/Tests/TestBuffer.py,sha256=9XVjnJCET8jQP-qXQiWFgqJNDsEL4fI_t7ky09Jkkfc,4261
|
87 |
+
Cython/Compiler/Tests/TestCmdLine.py,sha256=_eir0HqW3mdvIP87LMjT8XHTdVRf60uHZHX9bJRr3Xc,22423
|
88 |
+
Cython/Compiler/Tests/TestFlowControl.py,sha256=Lk7Md-owaNd4W0jgUZdD3GI5koRaf7T-otHSAPUVZwg,1916
|
89 |
+
Cython/Compiler/Tests/TestGrammar.py,sha256=6gBqrzgKg5VIRexGSvF9b5vcDFwqCmpOrWxxwa7Mr78,5331
|
90 |
+
Cython/Compiler/Tests/TestMemView.py,sha256=gxoHsXE_GMR9i-S_PfQxr8ks87066GqFDOiqmDTLBBg,2588
|
91 |
+
Cython/Compiler/Tests/TestParseTreeTransforms.py,sha256=e89g4S0va7PS02POWj6Kgj6GnLoIHozXE7bQJaf7rjQ,9215
|
92 |
+
Cython/Compiler/Tests/TestScanning.py,sha256=_xkgETyhng-kWaZ2lJHQYVBfFdI1Od00GWq_Lewzkrg,4907
|
93 |
+
Cython/Compiler/Tests/TestSignatureMatching.py,sha256=lS2zsqq7n_5lJSTE1O2cmY0Vg5x2Zsh3D6dxLvJ7pho,3415
|
94 |
+
Cython/Compiler/Tests/TestStringEncoding.py,sha256=caK5Ba948txhW3auiKJVlAm6Pc_Ca55H3y5HNyuX4L4,2359
|
95 |
+
Cython/Compiler/Tests/TestTreeFragment.py,sha256=eT4G2rY1QvYmm-Mcm_zOlfJ3XOhx4n06v0hCG44GePE,2229
|
96 |
+
Cython/Compiler/Tests/TestTreePath.py,sha256=IXfif0sk56Y_jLQoWSInGZN-j4wAar0-m5PR0by-828,4285
|
97 |
+
Cython/Compiler/Tests/TestTypes.py,sha256=9S6DHlvcGAg5IuPjU5TvPqAcjCGudhdHZz2bUAIXSLg,3411
|
98 |
+
Cython/Compiler/Tests/TestUtilityLoad.py,sha256=n2UOdh9-XllrFl7AkzMsV7adjq0megnHc1kpqTRrqYc,4035
|
99 |
+
Cython/Compiler/Tests/TestVisitor.py,sha256=AmO82RIIkx86E7BPjAx1oDM4TarT65Sjuu3q96ahdHk,2289
|
100 |
+
Cython/Compiler/Tests/Utils.py,sha256=NP0oZ2ln0hkVpMUVwusrqA2pcg4Ded5kHXtRkKVU_mY,1101
|
101 |
+
Cython/Compiler/Tests/__init__.py,sha256=qTr7l4s1u10pcMfFjP9cFZGS1PKT6v2Ml_vy3dreto0,14
|
102 |
+
Cython/Compiler/Tests/__pycache__/TestBuffer.cpython-38.pyc,,
|
103 |
+
Cython/Compiler/Tests/__pycache__/TestCmdLine.cpython-38.pyc,,
|
104 |
+
Cython/Compiler/Tests/__pycache__/TestFlowControl.cpython-38.pyc,,
|
105 |
+
Cython/Compiler/Tests/__pycache__/TestGrammar.cpython-38.pyc,,
|
106 |
+
Cython/Compiler/Tests/__pycache__/TestMemView.cpython-38.pyc,,
|
107 |
+
Cython/Compiler/Tests/__pycache__/TestParseTreeTransforms.cpython-38.pyc,,
|
108 |
+
Cython/Compiler/Tests/__pycache__/TestScanning.cpython-38.pyc,,
|
109 |
+
Cython/Compiler/Tests/__pycache__/TestSignatureMatching.cpython-38.pyc,,
|
110 |
+
Cython/Compiler/Tests/__pycache__/TestStringEncoding.cpython-38.pyc,,
|
111 |
+
Cython/Compiler/Tests/__pycache__/TestTreeFragment.cpython-38.pyc,,
|
112 |
+
Cython/Compiler/Tests/__pycache__/TestTreePath.cpython-38.pyc,,
|
113 |
+
Cython/Compiler/Tests/__pycache__/TestTypes.cpython-38.pyc,,
|
114 |
+
Cython/Compiler/Tests/__pycache__/TestUtilityLoad.cpython-38.pyc,,
|
115 |
+
Cython/Compiler/Tests/__pycache__/TestVisitor.cpython-38.pyc,,
|
116 |
+
Cython/Compiler/Tests/__pycache__/Utils.cpython-38.pyc,,
|
117 |
+
Cython/Compiler/Tests/__pycache__/__init__.cpython-38.pyc,,
|
118 |
+
Cython/Compiler/TreeFragment.py,sha256=h8xqculRh6bbcKsM2JTJddlRrQLZTmn1gJQML7ULuVQ,9989
|
119 |
+
Cython/Compiler/TreePath.py,sha256=PyyMZE5r-A8kcmoSdBTKW8qcGwQ40comtaBBKQLdI6M,7937
|
120 |
+
Cython/Compiler/TypeInference.py,sha256=1AS7dhiLkZ_YVi1RxtTfxeAiH7q4p4jJyy_X1pRiMr4,23434
|
121 |
+
Cython/Compiler/TypeSlots.py,sha256=6C7s46CfEjYqSJNjgstZ4d7sqJ8r-Qggt1B0HuhRRWI,51541
|
122 |
+
Cython/Compiler/UFuncs.py,sha256=J86EtQAz5YlXHL084TyocfuZubGLWgqflo93_w1DI8Q,9452
|
123 |
+
Cython/Compiler/UtilNodes.py,sha256=cgOMMOKGZBJyTjA0EkC4GKPZBfRdxwcTL0uXqoiuEgI,12851
|
124 |
+
Cython/Compiler/UtilityCode.py,sha256=POGz0rcCTtTLGUhyh7vYC6ORqjAEESHjE7Xxa1Y4XpA,11218
|
125 |
+
Cython/Compiler/Version.py,sha256=VjgFLzyBKxFHNN5RPglcTAa7HEiUmT-CtzQgX6SgHrc,190
|
126 |
+
Cython/Compiler/Visitor.cp38-win_amd64.pyd,sha256=V9niSVbW9PZIxUbAKW2xUXMZ15_W4VoPuuk_T-Pr_Wo,233472
|
127 |
+
Cython/Compiler/Visitor.pxd,sha256=z7aWTgkW0fLdHRLeu_F6JgsNCENPHsl-lun98REc2vQ,1869
|
128 |
+
Cython/Compiler/Visitor.py,sha256=OXsDb45WADARHgRIFVPJJoUlJ3TcQPlCbE717nNbEQg,32498
|
129 |
+
Cython/Compiler/__init__.py,sha256=qTr7l4s1u10pcMfFjP9cFZGS1PKT6v2Ml_vy3dreto0,14
|
130 |
+
Cython/Compiler/__pycache__/AnalysedTreeTransforms.cpython-38.pyc,,
|
131 |
+
Cython/Compiler/__pycache__/Annotate.cpython-38.pyc,,
|
132 |
+
Cython/Compiler/__pycache__/AutoDocTransforms.cpython-38.pyc,,
|
133 |
+
Cython/Compiler/__pycache__/Buffer.cpython-38.pyc,,
|
134 |
+
Cython/Compiler/__pycache__/Builtin.cpython-38.pyc,,
|
135 |
+
Cython/Compiler/__pycache__/CmdLine.cpython-38.pyc,,
|
136 |
+
Cython/Compiler/__pycache__/Code.cpython-38.pyc,,
|
137 |
+
Cython/Compiler/__pycache__/CodeGeneration.cpython-38.pyc,,
|
138 |
+
Cython/Compiler/__pycache__/CythonScope.cpython-38.pyc,,
|
139 |
+
Cython/Compiler/__pycache__/Dataclass.cpython-38.pyc,,
|
140 |
+
Cython/Compiler/__pycache__/DebugFlags.cpython-38.pyc,,
|
141 |
+
Cython/Compiler/__pycache__/Errors.cpython-38.pyc,,
|
142 |
+
Cython/Compiler/__pycache__/ExprNodes.cpython-38.pyc,,
|
143 |
+
Cython/Compiler/__pycache__/FlowControl.cpython-38.pyc,,
|
144 |
+
Cython/Compiler/__pycache__/FusedNode.cpython-38.pyc,,
|
145 |
+
Cython/Compiler/__pycache__/Future.cpython-38.pyc,,
|
146 |
+
Cython/Compiler/__pycache__/Interpreter.cpython-38.pyc,,
|
147 |
+
Cython/Compiler/__pycache__/Lexicon.cpython-38.pyc,,
|
148 |
+
Cython/Compiler/__pycache__/Main.cpython-38.pyc,,
|
149 |
+
Cython/Compiler/__pycache__/MemoryView.cpython-38.pyc,,
|
150 |
+
Cython/Compiler/__pycache__/ModuleNode.cpython-38.pyc,,
|
151 |
+
Cython/Compiler/__pycache__/Naming.cpython-38.pyc,,
|
152 |
+
Cython/Compiler/__pycache__/Nodes.cpython-38.pyc,,
|
153 |
+
Cython/Compiler/__pycache__/Optimize.cpython-38.pyc,,
|
154 |
+
Cython/Compiler/__pycache__/Options.cpython-38.pyc,,
|
155 |
+
Cython/Compiler/__pycache__/ParseTreeTransforms.cpython-38.pyc,,
|
156 |
+
Cython/Compiler/__pycache__/Parsing.cpython-38.pyc,,
|
157 |
+
Cython/Compiler/__pycache__/Pipeline.cpython-38.pyc,,
|
158 |
+
Cython/Compiler/__pycache__/PyrexTypes.cpython-38.pyc,,
|
159 |
+
Cython/Compiler/__pycache__/Pythran.cpython-38.pyc,,
|
160 |
+
Cython/Compiler/__pycache__/Scanning.cpython-38.pyc,,
|
161 |
+
Cython/Compiler/__pycache__/StringEncoding.cpython-38.pyc,,
|
162 |
+
Cython/Compiler/__pycache__/Symtab.cpython-38.pyc,,
|
163 |
+
Cython/Compiler/__pycache__/TreeFragment.cpython-38.pyc,,
|
164 |
+
Cython/Compiler/__pycache__/TreePath.cpython-38.pyc,,
|
165 |
+
Cython/Compiler/__pycache__/TypeInference.cpython-38.pyc,,
|
166 |
+
Cython/Compiler/__pycache__/TypeSlots.cpython-38.pyc,,
|
167 |
+
Cython/Compiler/__pycache__/UFuncs.cpython-38.pyc,,
|
168 |
+
Cython/Compiler/__pycache__/UtilNodes.cpython-38.pyc,,
|
169 |
+
Cython/Compiler/__pycache__/UtilityCode.cpython-38.pyc,,
|
170 |
+
Cython/Compiler/__pycache__/Version.cpython-38.pyc,,
|
171 |
+
Cython/Compiler/__pycache__/Visitor.cpython-38.pyc,,
|
172 |
+
Cython/Compiler/__pycache__/__init__.cpython-38.pyc,,
|
173 |
+
Cython/Coverage.py,sha256=26OCppQLW6IqGMC_WcXrOTOsjMlHz4tb5P2iOiLeCWg,18900
|
174 |
+
Cython/Debugger/Cygdb.py,sha256=NEc8lFR8ZH0vdJoUZsJjgGhuC6duTUM-g1q40M8GM6w,7091
|
175 |
+
Cython/Debugger/DebugWriter.py,sha256=wuYsCpYmVcMhBurXkb9rfVMOR1LkKxIxEJ44TxVVn84,2576
|
176 |
+
Cython/Debugger/Tests/TestLibCython.py,sha256=s9wX1BRZSQKHcmV88vsASgX-wNJ8qlPPtaDaAvAy1tM,8731
|
177 |
+
Cython/Debugger/Tests/__init__.py,sha256=qTr7l4s1u10pcMfFjP9cFZGS1PKT6v2Ml_vy3dreto0,14
|
178 |
+
Cython/Debugger/Tests/__pycache__/TestLibCython.cpython-38.pyc,,
|
179 |
+
Cython/Debugger/Tests/__pycache__/__init__.cpython-38.pyc,,
|
180 |
+
Cython/Debugger/Tests/__pycache__/test_libcython_in_gdb.cpython-38.pyc,,
|
181 |
+
Cython/Debugger/Tests/__pycache__/test_libpython_in_gdb.cpython-38.pyc,,
|
182 |
+
Cython/Debugger/Tests/cfuncs.c,sha256=0kVEVGhvczwZEmHF5mcoY-_D_Gjcla4bk5GDGsVp7AU,79
|
183 |
+
Cython/Debugger/Tests/codefile,sha256=uQwkatsrp4fgWu4mYGaamnbYXetHRmHqOdlOFQ0FDr8,691
|
184 |
+
Cython/Debugger/Tests/test_libcython_in_gdb.py,sha256=Wfcw_XuoH8u5IByAWD-JRbc6TALxcrHrwhLasJKp4Ac,18601
|
185 |
+
Cython/Debugger/Tests/test_libpython_in_gdb.py,sha256=Cl8y8XFTXzGh6_zoC0Ns1zTENRepx7n4eFMddwJtcbU,4161
|
186 |
+
Cython/Debugger/__init__.py,sha256=qTr7l4s1u10pcMfFjP9cFZGS1PKT6v2Ml_vy3dreto0,14
|
187 |
+
Cython/Debugger/__pycache__/Cygdb.cpython-38.pyc,,
|
188 |
+
Cython/Debugger/__pycache__/DebugWriter.cpython-38.pyc,,
|
189 |
+
Cython/Debugger/__pycache__/__init__.cpython-38.pyc,,
|
190 |
+
Cython/Debugger/__pycache__/libcython.cpython-38.pyc,,
|
191 |
+
Cython/Debugger/__pycache__/libpython.cpython-38.pyc,,
|
192 |
+
Cython/Debugger/libcython.py,sha256=Vom5YnM7FTZMVCnOO7mHvE3qqzzs-kmePRF_Bti7tII,47999
|
193 |
+
Cython/Debugger/libpython.py,sha256=1kSsZ9jb4jLAHB5cUxqmRDJT_ERJf3nkRTAFaiq7xFI,96854
|
194 |
+
Cython/Debugging.py,sha256=gr-gbNyN1yPTAdGgErZXv_l0SSdwhsyNfxfhaREFssM,572
|
195 |
+
Cython/Distutils/__init__.py,sha256=TIPzU9Hr1mcxoWCWMaSpqHtFrFvI9jPSVV3vY4e_D_0,100
|
196 |
+
Cython/Distutils/__pycache__/__init__.cpython-38.pyc,,
|
197 |
+
Cython/Distutils/__pycache__/build_ext.cpython-38.pyc,,
|
198 |
+
Cython/Distutils/__pycache__/extension.cpython-38.pyc,,
|
199 |
+
Cython/Distutils/__pycache__/old_build_ext.cpython-38.pyc,,
|
200 |
+
Cython/Distutils/build_ext.py,sha256=Kn1-QpsYzL_8Gp7lrhn9d2DzGUu5HFfJnjm4Md6Dq0U,5846
|
201 |
+
Cython/Distutils/extension.py,sha256=3ti-4Jdm4WNUJFBfgJE8JArvGsCMkIRsv6U_lBLzxNQ,4763
|
202 |
+
Cython/Distutils/old_build_ext.py,sha256=H3x8lpfCeHp5MoIBK6n8q30qUX7i8eDbwID9CyD7MH0,14182
|
203 |
+
Cython/Includes/cpython/__init__.pxd,sha256=6vIYhBuIK4CdiLayreovD96AMwCyE6N-P9gv3aaA_MM,8493
|
204 |
+
Cython/Includes/cpython/array.pxd,sha256=Tq-3e4mWktjca6kk1i-6YpMrq8qIs1pxg4Vw8HObDnA,6541
|
205 |
+
Cython/Includes/cpython/bool.pxd,sha256=zZuBTAAmxxi648diuEMDauxsWkv6UflqTqaeCdhrOzw,1395
|
206 |
+
Cython/Includes/cpython/buffer.pxd,sha256=qKidu0GQaHS9ZI21s5gZyGm8Zzva5aTDfL8jNtdKWqM,4982
|
207 |
+
Cython/Includes/cpython/bytearray.pxd,sha256=kS_Za3f5R9aAjkPDtOXtMeqMw04xyCXYcB4phK9naSM,1476
|
208 |
+
Cython/Includes/cpython/bytes.pxd,sha256=76NmZiixsUFYB-MSM8ljgZQ8hEdxtPf0Sfo8_4BqpPE,10266
|
209 |
+
Cython/Includes/cpython/cellobject.pxd,sha256=85vWthm3Eaz6osWFHWGir_3A_bkSr84rp0efboO00TI,1425
|
210 |
+
Cython/Includes/cpython/ceval.pxd,sha256=6zfXLYBT0BA2_1ETW9s7zKd7HGxLUAuCfcD-ufjJrDE,244
|
211 |
+
Cython/Includes/cpython/cobject.pxd,sha256=GSM8CF79I32Z4rDiDH-D4xR27zZNybPgX7YFR2bEVH0,1560
|
212 |
+
Cython/Includes/cpython/codecs.pxd,sha256=dManadMa8Q4C36EhWF1Y2H2ULyKLJ81Op-ghKzJ_7kM,5205
|
213 |
+
Cython/Includes/cpython/complex.pxd,sha256=n5qP2oBe7ozLVu6O1le0jk-V3RsSR36zRrSsYguYOro,1897
|
214 |
+
Cython/Includes/cpython/contextvars.pxd,sha256=AoaCZIzsOetNqH286PJRx6SKaxdroK04NnGGwOg7vog,5871
|
215 |
+
Cython/Includes/cpython/conversion.pxd,sha256=nNpUufRfWUJRGm7UxMd1LqsZbZuFMkPXmp5b3lUNJW8,1732
|
216 |
+
Cython/Includes/cpython/datetime.pxd,sha256=VWg7ROEs7q98izjKMB72z31BKauXM3H5Vwf_oETNjOM,16219
|
217 |
+
Cython/Includes/cpython/descr.pxd,sha256=QhWBf2vOQPM-dZuI_Y9fyUhPB8mS-A0uGegpsR_ogd4,754
|
218 |
+
Cython/Includes/cpython/dict.pxd,sha256=RRnxrINalJ0uXR2UgpYFyOwEmLh1ZX_qnxsQG2GyrVc,8125
|
219 |
+
Cython/Includes/cpython/exc.pxd,sha256=T4j6sLOVd3DnhTKr7_bCyVrAbCqJKQyTE-uHwLjOV0s,14093
|
220 |
+
Cython/Includes/cpython/fileobject.pxd,sha256=r1_hRqogYsY4qbWM2Ha4zuDN91KKexrmXoU_lgHO7fA,2946
|
221 |
+
Cython/Includes/cpython/float.pxd,sha256=oW_pjxlD3hXHgCPMOHBMDuC-Rlk2k9v5nH6QLpJMpEg,1696
|
222 |
+
Cython/Includes/cpython/function.pxd,sha256=IQUqqRgcyUb66LCU29DHPnHtIjBi0CqVK85WEsd-80I,2736
|
223 |
+
Cython/Includes/cpython/genobject.pxd,sha256=opzIi9hfc1BKak0GkkfbZOQyfd4aazZlKJ9vTUKckIk,1077
|
224 |
+
Cython/Includes/cpython/getargs.pxd,sha256=FB2VRMRBu_-tJddq5z4qt6_0AMhFD9dhnfiNpYxpd4Q,787
|
225 |
+
Cython/Includes/cpython/instance.pxd,sha256=QJhpwFewdoesdDrA6n8_WVk_bm4gzgVnlWjTEejSY5U,1010
|
226 |
+
Cython/Includes/cpython/int.pxd,sha256=X6TQzCZUpH58YrVDlbIEUzQWIivqDi5xRoXpRTloDxA,4220
|
227 |
+
Cython/Includes/cpython/iterator.pxd,sha256=nlXir1W8Twwr_Z8WLUdSBU9sT-gYs0sCSLShPmj284I,1355
|
228 |
+
Cython/Includes/cpython/iterobject.pxd,sha256=eLH3Jn-3JE45Tk0qPOkg4vyAJiZ19Aft3cYrANPZIC0,1060
|
229 |
+
Cython/Includes/cpython/list.pxd,sha256=7uIMppkZMBnamDSfXvawcqlfdp2tG__9n4oM7Vm7jLE,4188
|
230 |
+
Cython/Includes/cpython/long.pxd,sha256=5eii-LnUDC50yj5EAtjKe-fuaE7KG_aCqPjaif66mYc,7196
|
231 |
+
Cython/Includes/cpython/longintrepr.pxd,sha256=ntKRiWayBSycBCo7xp9ApNHndPsajVQv1vaUC0O4mno,499
|
232 |
+
Cython/Includes/cpython/mapping.pxd,sha256=Z5LZuj_LFDx4A9p3upUZke94bvuUMZsdam95xJEUT0U,2755
|
233 |
+
Cython/Includes/cpython/marshal.pxd,sha256=6QWSzLG9Y9KKyLwlhfRAPIthXgtdFJ2UYTHwCgSGMO4,2963
|
234 |
+
Cython/Includes/cpython/mem.pxd,sha256=4ABFEJy2Y9mx2Kpe1JPF8iwhlRU1oTBLvw485VBXPZ0,6032
|
235 |
+
Cython/Includes/cpython/memoryview.pxd,sha256=9hoTVibI_42w44IL2vl6nKoElSUN-14NvrMP-Rl8vsw,2554
|
236 |
+
Cython/Includes/cpython/method.pxd,sha256=7kVK3IL7JoBUTDjoU27bGzSW33UsfBsa4LnzwRW50kg,2245
|
237 |
+
Cython/Includes/cpython/module.pxd,sha256=QEKerLC-FO0_rmp4ElRFjukVXjCnwdu_h2i3fbnTAws,10336
|
238 |
+
Cython/Includes/cpython/number.pxd,sha256=mpfvgeOnEaFlwh0fZVYVW-Xk63WQDrDWSxt0a2VKH-g,12187
|
239 |
+
Cython/Includes/cpython/object.pxd,sha256=HXaZHzyPm5EXJ8TC6p6SQFA0-NcGmKLYQuHX42qw2q0,20443
|
240 |
+
Cython/Includes/cpython/oldbuffer.pxd,sha256=kWOvn_itUYoDchAEroxsXqFWNlkvyyPOHzyZDwP6Bec,2979
|
241 |
+
Cython/Includes/cpython/pycapsule.pxd,sha256=NivcmjqfGDZBCajreWWQEYbURBRycafpEHG6OK-P13U,5843
|
242 |
+
Cython/Includes/cpython/pylifecycle.pxd,sha256=XysyqlFavqZdT3iAL0ZAeUyVHgz7KoJlbkCH4r_oZCU,2068
|
243 |
+
Cython/Includes/cpython/pyport.pxd,sha256=WsGtMoWtzdu8BuyX5LwCfP3Ev1k37lAqfqGPrvk1EQY,230
|
244 |
+
Cython/Includes/cpython/pystate.pxd,sha256=fkOJxwgMsl7U23NDptFoHxs6wkgRCHVzr1RM4OkErLY,3874
|
245 |
+
Cython/Includes/cpython/pythread.pxd,sha256=SMHFiVCunyePliGzsw3qxwYqT40UnSbgcsgT281adOE,1999
|
246 |
+
Cython/Includes/cpython/ref.pxd,sha256=QMDNmHwQyYAdfYOCajuWva8GbuFYotOCFH3gyR8liEM,2606
|
247 |
+
Cython/Includes/cpython/sequence.pxd,sha256=uvdZ4gFqeWxbLSWukmOJ72lJCI04GOXEnJ6DEo_MIs4,6140
|
248 |
+
Cython/Includes/cpython/set.pxd,sha256=J-GJ5q0WtQ5rg1p7YlSNo2S52sDGKH3AWlm6My76gJk,5502
|
249 |
+
Cython/Includes/cpython/slice.pxd,sha256=JBO8KAj55bAZR8bmJfhNanQahMAuz41XXx6h1RQxO7Y,3181
|
250 |
+
Cython/Includes/cpython/string.pxd,sha256=Y1PdH6xAYobU966AgyuJNF4G0tW-aGlcBJDj5bI8vQw,10138
|
251 |
+
Cython/Includes/cpython/time.pxd,sha256=fbsO5fE6R_V0QanyzaPWzwbExKXWQR5bT6WiHvV7HXE,1416
|
252 |
+
Cython/Includes/cpython/tuple.pxd,sha256=HkEM7OFtbH-GLk6Y1o_QF8WfY50BaF-95_cA2a9Tt2U,3291
|
253 |
+
Cython/Includes/cpython/type.pxd,sha256=n0c_-H-9naDf8ywXSHZuUQTMebPQSkGfynOgk_170d8,2120
|
254 |
+
Cython/Includes/cpython/unicode.pxd,sha256=j2t3mWsUJtwfiv8kkuNxaQmQFSDC64ED6Gq-s35wwFA,31274
|
255 |
+
Cython/Includes/cpython/version.pxd,sha256=ErhXAeFc75yGSMPcxSFPr1tJxdt00m0itsLMPtPWDP4,879
|
256 |
+
Cython/Includes/cpython/weakref.pxd,sha256=gi7MCgySrWvcW_rV2zZUXWKAylBqoykSRHzBwS0gKa4,2026
|
257 |
+
Cython/Includes/libc/__init__.pxd,sha256=qTr7l4s1u10pcMfFjP9cFZGS1PKT6v2Ml_vy3dreto0,14
|
258 |
+
Cython/Includes/libc/complex.pxd,sha256=VfgRxKSvIP8GG8hJCsXmS1PYGjcROL7U_TqXPJRJ-GY,1259
|
259 |
+
Cython/Includes/libc/errno.pxd,sha256=IXvn3dzp0Ou8vy8waJY55QsAT-FEhLwBQQh4UGr_9Tw,2176
|
260 |
+
Cython/Includes/libc/float.pxd,sha256=2ULVOZskbze52RGzLh0pPUcJhkiC96Z0bwDNHcg0ktc,1009
|
261 |
+
Cython/Includes/libc/limits.pxd,sha256=RFcJ6kRt6W-v_TwZXdsVygMfyFmxLycA2SP-NAQGY2I,649
|
262 |
+
Cython/Includes/libc/locale.pxd,sha256=CG-MkozdWa3M8mTGpYa3uvRK_SL3zlXI9P8cvXMwhyw,1186
|
263 |
+
Cython/Includes/libc/math.pxd,sha256=cYBGwXaKcz9MHd1JWUtweowKUIH2SZ__3kXK1oo4lJg,6790
|
264 |
+
Cython/Includes/libc/setjmp.pxd,sha256=K9jXROXUSLe3HFkbhCHEovNmjUm536iWC_1GKzLExkI,307
|
265 |
+
Cython/Includes/libc/signal.pxd,sha256=CCZIummR_6naQIxX30FAoKdxX5xMUOwCDoX5TpRXF8o,1243
|
266 |
+
Cython/Includes/libc/stddef.pxd,sha256=koA_flVJ_GYt_naMynLAjGXCso5wDgDITza1JIaqANY,173
|
267 |
+
Cython/Includes/libc/stdint.pxd,sha256=Euh2--utaCmIRbOGCvrFkAtatB3X9Vdx-pr2AOVCsuo,3554
|
268 |
+
Cython/Includes/libc/stdio.pxd,sha256=lqnoSSBcYIU2u0vTBD8TwRcLqa7E0GIOkl_-A463Ht0,2556
|
269 |
+
Cython/Includes/libc/stdlib.pxd,sha256=XOiWmkplEFgEip83rF-1PvfXZGWnbFl_pdAaS_wDz1E,2516
|
270 |
+
Cython/Includes/libc/string.pxd,sha256=11ac2iMPeDVnthkNneKTyEdk4RO5NLlbWU2CfBHAkBo,2088
|
271 |
+
Cython/Includes/libc/time.pxd,sha256=SV0rV9W5GbfzvkHbwzkVYVC8M-HFMUIvxIRsIh-eumw,1401
|
272 |
+
Cython/Includes/libcpp/__init__.pxd,sha256=iiP2e0YRUsH-6o5S5Hz28Ex9aqB95bFavTgUIArIsJE,98
|
273 |
+
Cython/Includes/libcpp/algorithm.pxd,sha256=HbvUntLfiMDlgyRZ4pby4L8CnAsICoFWESquZJqFvxM,24024
|
274 |
+
Cython/Includes/libcpp/any.pxd,sha256=-1qlgN9NYtp1Pn-iLjal1fSpm_0qlJiqHLOaKCRSj6c,441
|
275 |
+
Cython/Includes/libcpp/atomic.pxd,sha256=PVI97tAHMzgrXy52xAKSX5hFOwSQlvnOi_tmkEgn1XM,1764
|
276 |
+
Cython/Includes/libcpp/bit.pxd,sha256=puRstKjEYW0tU7aiWiGxqodLyP5LaFtyRJDVCjVdj6E,778
|
277 |
+
Cython/Includes/libcpp/cast.pxd,sha256=H417Gs7oTKaAGrYWkj6X2SAV_6RhjLvb93gyPJBg5G8,513
|
278 |
+
Cython/Includes/libcpp/cmath.pxd,sha256=KpNvTbZ5pFPoRSqjff-URoz3CgGCu9ZJR7ccYLubQhA,20453
|
279 |
+
Cython/Includes/libcpp/complex.pxd,sha256=JbTs4yd1KlxbZ89DpaeEOaBC_dUpZ7DuC5IuBEISVS0,3101
|
280 |
+
Cython/Includes/libcpp/deque.pxd,sha256=Tr6rUxRQiLA0YdinvwU7msBgGVh4kjJ66NsGz1-QIms,6804
|
281 |
+
Cython/Includes/libcpp/execution.pxd,sha256=B_SBKxUCzJwtww3WxRIEmkVXUbCZHoLhYld7eUxNw8Q,530
|
282 |
+
Cython/Includes/libcpp/forward_list.pxd,sha256=Cq1I8W6-NwvfbQaVvrMKCyQI2I0CAXwXfAMk1DwZkYQ,2492
|
283 |
+
Cython/Includes/libcpp/functional.pxd,sha256=MGGlhbq2KgVdDPiSjbemhPtoHAaLbv--w64dDHe1A7c,748
|
284 |
+
Cython/Includes/libcpp/iterator.pxd,sha256=3QsYr_EeLm8FIwJbDoimdbPOmqXqHtVs_7mSeQM_hOo,1546
|
285 |
+
Cython/Includes/libcpp/limits.pxd,sha256=jzE3NUl6zjJ05AemEo_DZ5wq3agwVzirQr-fb4rQJlo,1882
|
286 |
+
Cython/Includes/libcpp/list.pxd,sha256=qOZ1FjkrJhOR0wZy3KU_VlhQjS2qLXNeyXmiRChNBRs,4555
|
287 |
+
Cython/Includes/libcpp/map.pxd,sha256=wT3_jyoH8yNad2hxxy33O9mgVCTelbxakL4b_JSyR_E,10733
|
288 |
+
Cython/Includes/libcpp/memory.pxd,sha256=nm56Tx4Oi4L0q3veopuH5Ma5CySnpUpSoVHmrAOwgV4,3708
|
289 |
+
Cython/Includes/libcpp/numbers.pxd,sha256=sb09CA2fOcVPV7HlrsRkeCXcyjy3_EbsHkXVFoB9T7A,410
|
290 |
+
Cython/Includes/libcpp/numeric.pxd,sha256=6dXyjSsgzFT7EYjPTy4ytrnYRWuGzdEH7EpdQy_0VWM,6702
|
291 |
+
Cython/Includes/libcpp/optional.pxd,sha256=8DctLBOpvR0JbMcB2yPi2QnUD1FrAqw_tgd0EAKi2gE,1015
|
292 |
+
Cython/Includes/libcpp/pair.pxd,sha256=Y2DuWJDXEPYbjpq5tWCRoL3VQX3BPYTSf13LX4y74W8,28
|
293 |
+
Cython/Includes/libcpp/queue.pxd,sha256=DNZO-oHeryd0n0lnYKn8hOodpnXoGHV8i0Yq9m686Ug,674
|
294 |
+
Cython/Includes/libcpp/random.pxd,sha256=WuOsS7UYAvsCzE_TqrutiOby-i7_hM78l-xrnRHmwlQ,6369
|
295 |
+
Cython/Includes/libcpp/set.pxd,sha256=72YSpfsYRtWDmc3IxrpmGDCIrQTW9dwAq8zjHYYw19M,9404
|
296 |
+
Cython/Includes/libcpp/stack.pxd,sha256=CUEZWp3K0eEgRlNmYIEJddfU1hwPyyxHCUNRf9821eM,312
|
297 |
+
Cython/Includes/libcpp/string.pxd,sha256=_cFltfJYp07vx_xitm7eMX55sShvGfGT5KR_jgqv1f4,14173
|
298 |
+
Cython/Includes/libcpp/typeindex.pxd,sha256=nhVh7eKB8MMRwqmtuLdzEt3APgE0MzOCQF6luHLsRtg,539
|
299 |
+
Cython/Includes/libcpp/typeinfo.pxd,sha256=hEjs5d-hZXcMJaCps7mT7yC8XJKRXK-gk19nUaGZxZI,314
|
300 |
+
Cython/Includes/libcpp/unordered_map.pxd,sha256=xtlblgMAxtNs_p8V_OxuQXZV58UawRy6XLxyQykRZDM,8138
|
301 |
+
Cython/Includes/libcpp/unordered_set.pxd,sha256=77p1l9dlXAn5-Jq20aG2vhcHGXI4Rh3Knr2txLZ33HI,5962
|
302 |
+
Cython/Includes/libcpp/utility.pxd,sha256=YXAj5htNEbatmvEIO2NnF_RC3Y3cgLmhuEAE6WzZaD8,1070
|
303 |
+
Cython/Includes/libcpp/vector.pxd,sha256=W4dh_Pp57Bx4uo8pLR6N2TFm7y0yJ0n7gibXjEdNxD4,7006
|
304 |
+
Cython/Includes/numpy/__init__.pxd,sha256=xM7NScKrtjEI2s7tvtdiCoZvqjG-EBoFKEOmbi8jAo8,37514
|
305 |
+
Cython/Includes/numpy/math.pxd,sha256=pNwDWvWHy8flAHY9O_sCWuj2Bh4hOjJsLah2F6-l1Rg,5940
|
306 |
+
Cython/Includes/openmp.pxd,sha256=vbg8-WbMFB5gtpSrW5eTN2End53FgnjXb46uUDci72Q,1762
|
307 |
+
Cython/Includes/posix/__init__.pxd,sha256=qTr7l4s1u10pcMfFjP9cFZGS1PKT6v2Ml_vy3dreto0,14
|
308 |
+
Cython/Includes/posix/dlfcn.pxd,sha256=-jmKUbrxB9nC0TAfyaVRARh9fbDxOZx-HnuRK95-xRc,370
|
309 |
+
Cython/Includes/posix/fcntl.pxd,sha256=F1CRQ5Z7sWBJw6HhNUPwgZLdHhwSJAUqfl7Ip8xalp0,1783
|
310 |
+
Cython/Includes/posix/ioctl.pxd,sha256=RzlkJVru0u1sF07_A5ZL6Erwul2OzCJDzW_23Wpjoao,103
|
311 |
+
Cython/Includes/posix/mman.pxd,sha256=D08m5iPDGAtAjDfTfXS4tPVK1LY5a_qAFhwRSmaAyDU,3576
|
312 |
+
Cython/Includes/posix/resource.pxd,sha256=yQdIqcZx2mZAd7wypTA-uqqnPrguUFGJcrGGtu5lvxY,1395
|
313 |
+
Cython/Includes/posix/select.pxd,sha256=RKlotP_ZuumcmJw9Be_IuLTdtPtrjluWXTWiMf1Tvbo,640
|
314 |
+
Cython/Includes/posix/signal.pxd,sha256=V8yD9IR-fO0ojfzGts-RyRZqCbspYk5-LDzcAso9B_U,1949
|
315 |
+
Cython/Includes/posix/stat.pxd,sha256=vBMhGC7AnrjHyV2lj8JwPW9Y3ntOAZ1C3Pcqp8qVESI,2793
|
316 |
+
Cython/Includes/posix/stdio.pxd,sha256=Ja5GfzWVQbu4iWybCy1pTGFzD-CVz9tfEevUPYTNSJs,1092
|
317 |
+
Cython/Includes/posix/stdlib.pxd,sha256=mCTDQ7vJJGHeJw7qsTnkph5n_t9FRu6lQ7Ex013_DZ4,964
|
318 |
+
Cython/Includes/posix/strings.pxd,sha256=dlQxN5qaErBGfDHY841nmrHackQceukW92eBapnM4Nw,383
|
319 |
+
Cython/Includes/posix/time.pxd,sha256=cNxvN3-_2VgCM9vXxzmwBEKZJDN5ca7i1qJvI1zCXq0,2052
|
320 |
+
Cython/Includes/posix/types.pxd,sha256=C2finliVEqGNeEJCNyaDbYY14U4AtOi7Djpg1WRIWIA,1192
|
321 |
+
Cython/Includes/posix/uio.pxd,sha256=fcyEBYJUGMjYrDOmlN6l1ee49OQctATd9ZFi5BKocus,848
|
322 |
+
Cython/Includes/posix/unistd.pxd,sha256=gEBSESCgNxXYQ-0m858AAyjRIrL3x3vX7LfkSjsJ65Y,8332
|
323 |
+
Cython/Includes/posix/wait.pxd,sha256=VWCwCsnKG8_z-ME9QwK5y2q0Xr4s_hASr2Ivh8FxCRE,1284
|
324 |
+
Cython/Plex/Actions.cp38-win_amd64.pyd,sha256=dtNKCBzcloVrUdio_PjSJgmsEo_HQNBsTRk5X06o9Z0,52224
|
325 |
+
Cython/Plex/Actions.pxd,sha256=AX5UHQEovcLHsFsTox15QQxSxaMb8sH-xAe8i6_1U7M,607
|
326 |
+
Cython/Plex/Actions.py,sha256=Pju0yOq--MAo3uOI6M3A0vN_KYSiG2XhCilTnRjdIew,3040
|
327 |
+
Cython/Plex/DFA.cp38-win_amd64.pyd,sha256=zCoN5zFuupc0j8DNP5tHgkXkZtFVTcx1_MPPweqPXAE,78336
|
328 |
+
Cython/Plex/DFA.pxd,sha256=S55YV9creBzHLNbNeu7PcujmrFadkPAJ6TDxm-xJrUY,806
|
329 |
+
Cython/Plex/DFA.py,sha256=H3ohMXzZKx6WxwxZXEUhErk5JQ90slj3QKPKEKwBKD4,5576
|
330 |
+
Cython/Plex/Errors.py,sha256=n-R2119WeROkHgPfSI3cjF0HYYyPsLl-9XDlHHr5RUc,1024
|
331 |
+
Cython/Plex/Lexicons.py,sha256=Kjp7pSSbQlBF6WLigQjrd9px5UJxdTvg6z_SBlGPc_c,6125
|
332 |
+
Cython/Plex/Machines.cp38-win_amd64.pyd,sha256=2THTXKm6iFSyYvjUWtOLuvXtXsQzUldfINCqmVAqYu0,107520
|
333 |
+
Cython/Plex/Machines.pxd,sha256=JTYnwgL_5eBCJP93cm0hjDk4DK1qwDCTAMjP4NI7mU4,765
|
334 |
+
Cython/Plex/Machines.py,sha256=ntPWDMdRjDnbgqmNbI-SV5FRdVWHRWuFhTWTau-eOm0,7926
|
335 |
+
Cython/Plex/Regexps.py,sha256=CHzEWEAy_0Hsccp5iW4wm5NaLXdiF9f3AGbwEvhIinA,15497
|
336 |
+
Cython/Plex/Scanners.cp38-win_amd64.pyd,sha256=S-7RpSPdGGtP9hUgSfOIhbAop7U6b-xRewYvObgB8-A,77824
|
337 |
+
Cython/Plex/Scanners.pxd,sha256=7mG6_kOA2y7uYzu9tVNlf7WayFaipmUx0G9Q76r5kEQ,1600
|
338 |
+
Cython/Plex/Scanners.py,sha256=NLssAIMcilN1KF4SM6SnnteQtyt2Cx54PmiU9t_y8gc,13298
|
339 |
+
Cython/Plex/Transitions.cp38-win_amd64.pyd,sha256=FrJJqIhWmU8OYqMU8PuLsPL9UjL8N3EE3RYkYtRlrhY,85504
|
340 |
+
Cython/Plex/Transitions.pxd,sha256=-FKBO3SUfjlCncGfid4mWEM3X-wPVxBCgVVC2ayfrJU,612
|
341 |
+
Cython/Plex/Transitions.py,sha256=2yOB2Ub5_8qU8MklAWO20JI4v0KU0kdGg9lRRdtbECo,6995
|
342 |
+
Cython/Plex/__init__.py,sha256=Uk6hFjDwFtgsvlvRogNM9YkMbRd1dhjngy0eQ5sT1VQ,1190
|
343 |
+
Cython/Plex/__pycache__/Actions.cpython-38.pyc,,
|
344 |
+
Cython/Plex/__pycache__/DFA.cpython-38.pyc,,
|
345 |
+
Cython/Plex/__pycache__/Errors.cpython-38.pyc,,
|
346 |
+
Cython/Plex/__pycache__/Lexicons.cpython-38.pyc,,
|
347 |
+
Cython/Plex/__pycache__/Machines.cpython-38.pyc,,
|
348 |
+
Cython/Plex/__pycache__/Regexps.cpython-38.pyc,,
|
349 |
+
Cython/Plex/__pycache__/Scanners.cpython-38.pyc,,
|
350 |
+
Cython/Plex/__pycache__/Transitions.cpython-38.pyc,,
|
351 |
+
Cython/Plex/__pycache__/__init__.cpython-38.pyc,,
|
352 |
+
Cython/Runtime/__init__.py,sha256=qTr7l4s1u10pcMfFjP9cFZGS1PKT6v2Ml_vy3dreto0,14
|
353 |
+
Cython/Runtime/__pycache__/__init__.cpython-38.pyc,,
|
354 |
+
Cython/Runtime/refnanny.cp38-win_amd64.pyd,sha256=doMMolEv4nMkiZt94N2lndrF3jbnQxd_4OAuXZKy2G4,57344
|
355 |
+
Cython/Runtime/refnanny.pyx,sha256=32nbl0LcjIAQbh4605oeisZAGjM8UUKjSHzPssFbFwU,6803
|
356 |
+
Cython/Shadow.py,sha256=eW1i5q2hs9Fbx45g8QTaCGNgjkKWSaJE8WJOQ6HmrVE,17887
|
357 |
+
Cython/Shadow.pyi,sha256=40VPeYoZ6iKXQFoPq5lT-drcNfoKSnJYQUE6_YdeBMM,2799
|
358 |
+
Cython/StringIOTree.cp38-win_amd64.pyd,sha256=DchiDha1c2Bw_ZCrRjyljvr7fcQQiH9RkrvJ1kmvli0,57856
|
359 |
+
Cython/StringIOTree.py,sha256=Kmsz_0sgyidhzaMz2qxG9UpWgNhQyXZUiX3n6VfYBEM,5911
|
360 |
+
Cython/Tempita/__init__.py,sha256=f-PIUAOGDzWIsa0jPz4hrg30WCl3PcGHiBPhRCvrwhg,156
|
361 |
+
Cython/Tempita/__pycache__/__init__.cpython-38.pyc,,
|
362 |
+
Cython/Tempita/__pycache__/_looper.cpython-38.pyc,,
|
363 |
+
Cython/Tempita/__pycache__/_tempita.cpython-38.pyc,,
|
364 |
+
Cython/Tempita/__pycache__/compat3.cpython-38.pyc,,
|
365 |
+
Cython/Tempita/_looper.py,sha256=w1J9BWt0YwNZw_IlCRGh_IGBqFSPEiMw4Af5YIqhCLE,4331
|
366 |
+
Cython/Tempita/_tempita.cp38-win_amd64.pyd,sha256=mOoFVx-3ZujQIuQxsFRAbrF4iHUK13rlCtokXIg0s_I,356864
|
367 |
+
Cython/Tempita/_tempita.py,sha256=7PnDWIBZGNPBriWu5euhHxKOaC8M5Nv8vZle5-nIXj8,38741
|
368 |
+
Cython/Tempita/compat3.py,sha256=rJ-gkuakJo43sO260R2sRNxWJIwDVX9SYZYle8dp-ys,950
|
369 |
+
Cython/TestUtils.py,sha256=sGVYUz3OtUE9Em3IkTw2KFugdyg4hsCISEYV35soFt0,15101
|
370 |
+
Cython/Tests/TestCodeWriter.py,sha256=o31QUXhQcYdzOkHHlAOIjiiFLiyzkqy10FNWWr6Yr38,3927
|
371 |
+
Cython/Tests/TestCythonUtils.py,sha256=JzhWB52kgSAxXt34FAqIcy0ySQ2LMP-bolADldgM078,7030
|
372 |
+
Cython/Tests/TestJediTyper.py,sha256=eq7KOaD6v11SKj0UVcLai99iCNovWPoYkMKZs0kuXN4,7246
|
373 |
+
Cython/Tests/TestShadow.py,sha256=PdeabbiiK4B9bl6zayJtzjHvJDLeyQjymrAxKzIqv4M,3463
|
374 |
+
Cython/Tests/TestStringIOTree.py,sha256=F15qCQYEqSKS8TlrIbeZ7k7cwkBGtMC1GFQoNuzpi7w,2013
|
375 |
+
Cython/Tests/TestTestUtils.py,sha256=ql8sU20UU9RszKWwnc8V_HTUuTYGPQcMQxN5T_R2sYY,3058
|
376 |
+
Cython/Tests/__init__.py,sha256=qTr7l4s1u10pcMfFjP9cFZGS1PKT6v2Ml_vy3dreto0,14
|
377 |
+
Cython/Tests/__pycache__/TestCodeWriter.cpython-38.pyc,,
|
378 |
+
Cython/Tests/__pycache__/TestCythonUtils.cpython-38.pyc,,
|
379 |
+
Cython/Tests/__pycache__/TestJediTyper.cpython-38.pyc,,
|
380 |
+
Cython/Tests/__pycache__/TestShadow.cpython-38.pyc,,
|
381 |
+
Cython/Tests/__pycache__/TestStringIOTree.cpython-38.pyc,,
|
382 |
+
Cython/Tests/__pycache__/TestTestUtils.cpython-38.pyc,,
|
383 |
+
Cython/Tests/__pycache__/__init__.cpython-38.pyc,,
|
384 |
+
Cython/Tests/__pycache__/xmlrunner.cpython-38.pyc,,
|
385 |
+
Cython/Tests/xmlrunner.py,sha256=vj13NkmQVQUrJpcqzX-ThU0dM-xoiNnQZSfHHrJ3ulg,15172
|
386 |
+
Cython/Utility/AsyncGen.c,sha256=3FXrTZLtvjItk95VWsIIVo9zEMdSFH8h4BsBliHx1VI,49245
|
387 |
+
Cython/Utility/Buffer.c,sha256=tblFK4HEZP5_JBjKrVc_xfmDKe8jrWPGuf8glwbVB18,30843
|
388 |
+
Cython/Utility/Builtins.c,sha256=ho79w-7VwNu4Kwfy7qJx5xjkBLEtlX7gA87Ew5e8NLI,19988
|
389 |
+
Cython/Utility/CConvert.pyx,sha256=wUjc3CrtIB7IK1-8qfj_yrdr-gywcP0O9luJW_mwZYA,4553
|
390 |
+
Cython/Utility/CMath.c,sha256=4TPbfACvlKPJWxj4ANZwwjL3zIL92c7n7IwL-zkLXMc,2661
|
391 |
+
Cython/Utility/CommonStructures.c,sha256=X7iZ9_rPeQBQOurT-YokV71QtDhRTVWFKPBrKoPgjOk,4829
|
392 |
+
Cython/Utility/Complex.c,sha256=yM6xoReXiiYEqWzg9HSERXUGtn61F4HTafMUWtXvsgk,13975
|
393 |
+
Cython/Utility/Coroutine.c,sha256=AlYXvxO0mnsy-jI40naj_WU3wT6jYJ3QRgkN16kReVQ,101471
|
394 |
+
Cython/Utility/CpdefEnums.pyx,sha256=6OrMdGgaIVZ7bC0Lzik0_czMZChI9jPbFzRNHEw1Pbc,6215
|
395 |
+
Cython/Utility/CppConvert.pyx,sha256=zb3uW6OJmGs-jTKLVVu7WKttvN2rK4JVgOcsvbe4q88,7327
|
396 |
+
Cython/Utility/CppSupport.cpp,sha256=PNQ21D_1FrMSklVty2Mirl2L-7ACUjoyBDvr9im1XcI,5067
|
397 |
+
Cython/Utility/CythonFunction.c,sha256=7TEb7wDVe-rf5j7AaYhNeo4u8YE21ppy0cdZCiS31wk,65846
|
398 |
+
Cython/Utility/Dataclasses.c,sha256=2O9KyLd-4w8zOXSxWYPw1EDBCu5miC0-XgkSNurKwvM,7459
|
399 |
+
Cython/Utility/Dataclasses.py,sha256=ueL7xNyPqaIVMXruhbIs1oyuBgNQIHpNrt39VDe9xVg,4189
|
400 |
+
Cython/Utility/Embed.c,sha256=CrFrtsp7LnnP-RkwN1zOKiPc2QNzCUdUkDL2sMmwDeY,7691
|
401 |
+
Cython/Utility/Exceptions.c,sha256=C6iFsYaoXmMApXxkAidMSi1C7xkUf9K1ZCXuZJd845c,40092
|
402 |
+
Cython/Utility/ExtensionTypes.c,sha256=mUEp0FAX5SE5t8uECqOqogdoJB1aFtdj04opG53IQx0,26077
|
403 |
+
Cython/Utility/FunctionArguments.c,sha256=HYxyvxHsxSuOxTXFCeGubARJlPDmBMlfd1zDSd6fXyg,21327
|
404 |
+
Cython/Utility/ImportExport.c,sha256=4auKONqxWlGiL-yw8zUb7eV4XQgUfeLGHFNs9cTb-1U,30911
|
405 |
+
Cython/Utility/MemoryView.pyx,sha256=XSnIC4xgCxT93sW6EH1YF0LqslAw07E9owwOCyaRgqM,51063
|
406 |
+
Cython/Utility/MemoryView_C.c,sha256=i7xVGQhbSclUURYYGE1xoJqe8Twu09iHkp_vDS_BpdE,32634
|
407 |
+
Cython/Utility/ModuleSetupCode.c,sha256=rrMF0EQNIOYiG35hw8l8xDV9kD72dYgIqRl68ltI-zs,88498
|
408 |
+
Cython/Utility/NumpyImportArray.c,sha256=ylUhO1xwMcuOLwHhhJx8cAxmF88gSP6G3NVAIvMcCIA,2079
|
409 |
+
Cython/Utility/ObjectHandling.c,sha256=CKwwuFGDSggwIhr9WeHBvbQDTC0qTR1Yqz-e_YfjYn4,119822
|
410 |
+
Cython/Utility/Optimize.c,sha256=n0jIXkdQ3HDW27TXoVXy4S7MqaTHskU_588mmGLfri0,62645
|
411 |
+
Cython/Utility/Overflow.c,sha256=wC-SqLF0ppqjWdGCFXO-2803aqZcyXrSZumh8IrQnbU,16278
|
412 |
+
Cython/Utility/Printing.c,sha256=X2bUfkGmu6MObLA6w55J6cQVqsXmeG-zC6GaluyUBeI,5279
|
413 |
+
Cython/Utility/Profile.c,sha256=-hHU8HL8O8EbCFIsb23ihQeVRoeKuP3asxeG9hN25WQ,18577
|
414 |
+
Cython/Utility/StringTools.c,sha256=_dZYj8OFxl4iCqY5qMQLrBHWEf7QBDESHOG3Sg8rZ4g,47085
|
415 |
+
Cython/Utility/TestCyUtilityLoader.pyx,sha256=wsPqsYGkqXrqV_sxF8NKMTFXIqKCO-O4lXbNsRcokjA,160
|
416 |
+
Cython/Utility/TestCythonScope.pyx,sha256=jPupaW_JBl5IBTKhaJRYamNGAyd23hOq_WoKGKIb5Ts,1865
|
417 |
+
Cython/Utility/TestUtilityLoader.c,sha256=ix8dIu4YzXADIVIfBiTiBfiG1J15RxzphNP54Bxa2Gk,291
|
418 |
+
Cython/Utility/TypeConversion.c,sha256=T-uHJxtEjVwoJT2l6csEP5EV8OVlZKL7Pcx2pmu_A_Y,49739
|
419 |
+
Cython/Utility/UFuncs.pyx,sha256=47nPr17bqogb1KyKtVhy6ZGpcUnTQ8e20ColWXd251M,2230
|
420 |
+
Cython/Utility/UFuncs_C.c,sha256=6kb5CwA6OkOPdgUrnVbHWa0JXjgc4UKyqYtDx9TbVs4,1561
|
421 |
+
Cython/Utility/__init__.py,sha256=e_qkVfB5Rvy57CZHmdH5fNrghtPdNGVNSREY4meZJUw,1188
|
422 |
+
Cython/Utility/__pycache__/Dataclasses.cpython-38.pyc,,
|
423 |
+
Cython/Utility/__pycache__/__init__.cpython-38.pyc,,
|
424 |
+
Cython/Utility/arrayarray.h,sha256=71CEek7FG2F7_R1UqGAOuBVi3IaJt__yzIdQdWB0Bls,4238
|
425 |
+
Cython/Utils.cp38-win_amd64.pyd,sha256=llDMYrJbqhHwUTaoMz1wGZ065lojHJUv4-pm2nuOshQ,256000
|
426 |
+
Cython/Utils.py,sha256=69Zh-fNWhKMmyIAhQuOyrNgC4FZyclf_VljIZWNzuAQ,22800
|
427 |
+
Cython/__init__.py,sha256=Mu3ZZzg-CrIPURm79JfIUn7zyIdSZf7eNzg4xcUOATQ,370
|
428 |
+
Cython/__pycache__/CodeWriter.cpython-38.pyc,,
|
429 |
+
Cython/__pycache__/Coverage.cpython-38.pyc,,
|
430 |
+
Cython/__pycache__/Debugging.cpython-38.pyc,,
|
431 |
+
Cython/__pycache__/Shadow.cpython-38.pyc,,
|
432 |
+
Cython/__pycache__/StringIOTree.cpython-38.pyc,,
|
433 |
+
Cython/__pycache__/TestUtils.cpython-38.pyc,,
|
434 |
+
Cython/__pycache__/Utils.cpython-38.pyc,,
|
435 |
+
Cython/__pycache__/__init__.cpython-38.pyc,,
|
436 |
+
__pycache__/cython.cpython-38.pyc,,
|
437 |
+
cython.py,sha256=QLhiwfetr0jJ-3L4S7QJCk5xkzVIBQctXcuusbSoXyY,544
|
438 |
+
pyximport/__init__.py,sha256=NceVc9JV-ifFiQ_XMcyVwAs3iSCD9rgEnNCXXUOvORw,83
|
439 |
+
pyximport/__pycache__/__init__.cpython-38.pyc,,
|
440 |
+
pyximport/__pycache__/_pyximport2.cpython-38.pyc,,
|
441 |
+
pyximport/__pycache__/_pyximport3.cpython-38.pyc,,
|
442 |
+
pyximport/__pycache__/pyxbuild.cpython-38.pyc,,
|
443 |
+
pyximport/__pycache__/pyximport.cpython-38.pyc,,
|
444 |
+
pyximport/_pyximport2.py,sha256=LFsy2q7E0C8-5hc3ob4s0wMLaIkoQUBVCAhI4Smghck,24984
|
445 |
+
pyximport/_pyximport3.py,sha256=zRUmWFn34IXZyuL1pTsu_y4wyPiOG2Jj1soRzKPGU9Y,18858
|
446 |
+
pyximport/pyxbuild.py,sha256=3SFwqu0bUZgGUBuyWpgGJ0M0pOmczkqBQ7zI8sdGdkY,5862
|
447 |
+
pyximport/pyximport.py,sha256=XMqMN-mrPKwSbwLpwBaX4KDJDaLxb6I2vcN7qM7Phks,332
|
Lib/site-packages/Cython-3.0.10.dist-info/WHEEL
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Wheel-Version: 1.0
|
2 |
+
Generator: bdist_wheel (0.42.0)
|
3 |
+
Root-Is-Purelib: false
|
4 |
+
Tag: cp38-cp38-win_amd64
|
5 |
+
|
Lib/site-packages/Cython-3.0.10.dist-info/entry_points.txt
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[console_scripts]
|
2 |
+
cygdb = Cython.Debugger.Cygdb:main
|
3 |
+
cython = Cython.Compiler.Main:setuptools_main
|
4 |
+
cythonize = Cython.Build.Cythonize:main
|
Lib/site-packages/Cython-3.0.10.dist-info/top_level.txt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
Cython
|
2 |
+
cython
|
3 |
+
pyximport
|
Lib/site-packages/Cython/Build/BuildExecutable.py
ADDED
@@ -0,0 +1,170 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Compile a Python script into an executable that embeds CPython.
|
3 |
+
Requires CPython to be built as a shared library ('libpythonX.Y').
|
4 |
+
|
5 |
+
Basic usage:
|
6 |
+
|
7 |
+
python -m Cython.Build.BuildExecutable [ARGS] somefile.py
|
8 |
+
"""
|
9 |
+
|
10 |
+
from __future__ import absolute_import
|
11 |
+
|
12 |
+
DEBUG = True
|
13 |
+
|
14 |
+
import sys
|
15 |
+
import os
|
16 |
+
if sys.version_info < (3, 9):
|
17 |
+
from distutils import sysconfig as _sysconfig
|
18 |
+
|
19 |
+
class sysconfig(object):
|
20 |
+
|
21 |
+
@staticmethod
|
22 |
+
def get_path(name):
|
23 |
+
assert name == 'include'
|
24 |
+
return _sysconfig.get_python_inc()
|
25 |
+
|
26 |
+
get_config_var = staticmethod(_sysconfig.get_config_var)
|
27 |
+
else:
|
28 |
+
# sysconfig can be trusted from cpython >= 3.8.7
|
29 |
+
import sysconfig
|
30 |
+
|
31 |
+
|
32 |
+
def get_config_var(name, default=''):
|
33 |
+
return sysconfig.get_config_var(name) or default
|
34 |
+
|
35 |
+
INCDIR = sysconfig.get_path('include')
|
36 |
+
LIBDIR1 = get_config_var('LIBDIR')
|
37 |
+
LIBDIR2 = get_config_var('LIBPL')
|
38 |
+
PYLIB = get_config_var('LIBRARY')
|
39 |
+
PYLIB_DYN = get_config_var('LDLIBRARY')
|
40 |
+
if PYLIB_DYN == PYLIB:
|
41 |
+
# no shared library
|
42 |
+
PYLIB_DYN = ''
|
43 |
+
else:
|
44 |
+
PYLIB_DYN = os.path.splitext(PYLIB_DYN[3:])[0] # 'lib(XYZ).so' -> XYZ
|
45 |
+
|
46 |
+
CC = get_config_var('CC', os.environ.get('CC', ''))
|
47 |
+
CFLAGS = get_config_var('CFLAGS') + ' ' + os.environ.get('CFLAGS', '')
|
48 |
+
LINKCC = get_config_var('LINKCC', os.environ.get('LINKCC', CC))
|
49 |
+
LINKFORSHARED = get_config_var('LINKFORSHARED')
|
50 |
+
LIBS = get_config_var('LIBS')
|
51 |
+
SYSLIBS = get_config_var('SYSLIBS')
|
52 |
+
EXE_EXT = sysconfig.get_config_var('EXE')
|
53 |
+
|
54 |
+
|
55 |
+
def _debug(msg, *args):
|
56 |
+
if DEBUG:
|
57 |
+
if args:
|
58 |
+
msg = msg % args
|
59 |
+
sys.stderr.write(msg + '\n')
|
60 |
+
|
61 |
+
|
62 |
+
def dump_config():
|
63 |
+
_debug('INCDIR: %s', INCDIR)
|
64 |
+
_debug('LIBDIR1: %s', LIBDIR1)
|
65 |
+
_debug('LIBDIR2: %s', LIBDIR2)
|
66 |
+
_debug('PYLIB: %s', PYLIB)
|
67 |
+
_debug('PYLIB_DYN: %s', PYLIB_DYN)
|
68 |
+
_debug('CC: %s', CC)
|
69 |
+
_debug('CFLAGS: %s', CFLAGS)
|
70 |
+
_debug('LINKCC: %s', LINKCC)
|
71 |
+
_debug('LINKFORSHARED: %s', LINKFORSHARED)
|
72 |
+
_debug('LIBS: %s', LIBS)
|
73 |
+
_debug('SYSLIBS: %s', SYSLIBS)
|
74 |
+
_debug('EXE_EXT: %s', EXE_EXT)
|
75 |
+
|
76 |
+
|
77 |
+
def _parse_args(args):
|
78 |
+
cy_args = []
|
79 |
+
last_arg = None
|
80 |
+
for i, arg in enumerate(args):
|
81 |
+
if arg.startswith('-'):
|
82 |
+
cy_args.append(arg)
|
83 |
+
elif last_arg in ('-X', '--directive'):
|
84 |
+
cy_args.append(arg)
|
85 |
+
else:
|
86 |
+
input_file = arg
|
87 |
+
args = args[i+1:]
|
88 |
+
break
|
89 |
+
last_arg = arg
|
90 |
+
else:
|
91 |
+
raise ValueError('no input file provided')
|
92 |
+
|
93 |
+
return input_file, cy_args, args
|
94 |
+
|
95 |
+
|
96 |
+
def runcmd(cmd, shell=True):
|
97 |
+
if shell:
|
98 |
+
cmd = ' '.join(cmd)
|
99 |
+
_debug(cmd)
|
100 |
+
else:
|
101 |
+
_debug(' '.join(cmd))
|
102 |
+
|
103 |
+
import subprocess
|
104 |
+
returncode = subprocess.call(cmd, shell=shell)
|
105 |
+
|
106 |
+
if returncode:
|
107 |
+
sys.exit(returncode)
|
108 |
+
|
109 |
+
|
110 |
+
def clink(basename):
|
111 |
+
runcmd([LINKCC, '-o', basename + EXE_EXT, basename+'.o', '-L'+LIBDIR1, '-L'+LIBDIR2]
|
112 |
+
+ [PYLIB_DYN and ('-l'+PYLIB_DYN) or os.path.join(LIBDIR1, PYLIB)]
|
113 |
+
+ LIBS.split() + SYSLIBS.split() + LINKFORSHARED.split())
|
114 |
+
|
115 |
+
|
116 |
+
def ccompile(basename):
|
117 |
+
runcmd([CC, '-c', '-o', basename+'.o', basename+'.c', '-I' + INCDIR] + CFLAGS.split())
|
118 |
+
|
119 |
+
|
120 |
+
def cycompile(input_file, options=()):
|
121 |
+
from ..Compiler import Version, CmdLine, Main
|
122 |
+
options, sources = CmdLine.parse_command_line(list(options or ()) + ['--embed', input_file])
|
123 |
+
_debug('Using Cython %s to compile %s', Version.version, input_file)
|
124 |
+
result = Main.compile(sources, options)
|
125 |
+
if result.num_errors > 0:
|
126 |
+
sys.exit(1)
|
127 |
+
|
128 |
+
|
129 |
+
def exec_file(program_name, args=()):
|
130 |
+
runcmd([os.path.abspath(program_name)] + list(args), shell=False)
|
131 |
+
|
132 |
+
|
133 |
+
def build(input_file, compiler_args=(), force=False):
|
134 |
+
"""
|
135 |
+
Build an executable program from a Cython module.
|
136 |
+
|
137 |
+
Returns the name of the executable file.
|
138 |
+
"""
|
139 |
+
basename = os.path.splitext(input_file)[0]
|
140 |
+
exe_file = basename + EXE_EXT
|
141 |
+
if not force and os.path.abspath(exe_file) == os.path.abspath(input_file):
|
142 |
+
raise ValueError("Input and output file names are the same, refusing to overwrite")
|
143 |
+
if (not force and os.path.exists(exe_file) and os.path.exists(input_file)
|
144 |
+
and os.path.getmtime(input_file) <= os.path.getmtime(exe_file)):
|
145 |
+
_debug("File is up to date, not regenerating %s", exe_file)
|
146 |
+
return exe_file
|
147 |
+
cycompile(input_file, compiler_args)
|
148 |
+
ccompile(basename)
|
149 |
+
clink(basename)
|
150 |
+
return exe_file
|
151 |
+
|
152 |
+
|
153 |
+
def build_and_run(args):
|
154 |
+
"""
|
155 |
+
Build an executable program from a Cython module and run it.
|
156 |
+
|
157 |
+
Arguments after the module name will be passed verbatimly to the program.
|
158 |
+
"""
|
159 |
+
program_name, args = _build(args)
|
160 |
+
exec_file(program_name, args)
|
161 |
+
|
162 |
+
|
163 |
+
def _build(args):
|
164 |
+
input_file, cy_args, args = _parse_args(args)
|
165 |
+
program_name = build(input_file, cy_args)
|
166 |
+
return program_name, args
|
167 |
+
|
168 |
+
|
169 |
+
if __name__ == '__main__':
|
170 |
+
_build(sys.argv[1:])
|
Lib/site-packages/Cython/Build/Cythonize.py
ADDED
@@ -0,0 +1,255 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from __future__ import absolute_import, print_function
|
2 |
+
|
3 |
+
import os
|
4 |
+
import shutil
|
5 |
+
import tempfile
|
6 |
+
|
7 |
+
from .Dependencies import cythonize, extended_iglob
|
8 |
+
from ..Utils import is_package_dir
|
9 |
+
from ..Compiler import Options
|
10 |
+
|
11 |
+
try:
|
12 |
+
import multiprocessing
|
13 |
+
parallel_compiles = int(multiprocessing.cpu_count() * 1.5)
|
14 |
+
except ImportError:
|
15 |
+
multiprocessing = None
|
16 |
+
parallel_compiles = 0
|
17 |
+
|
18 |
+
|
19 |
+
class _FakePool(object):
|
20 |
+
def map_async(self, func, args):
|
21 |
+
try:
|
22 |
+
from itertools import imap
|
23 |
+
except ImportError:
|
24 |
+
imap=map
|
25 |
+
for _ in imap(func, args):
|
26 |
+
pass
|
27 |
+
|
28 |
+
def close(self):
|
29 |
+
pass
|
30 |
+
|
31 |
+
def terminate(self):
|
32 |
+
pass
|
33 |
+
|
34 |
+
def join(self):
|
35 |
+
pass
|
36 |
+
|
37 |
+
|
38 |
+
def find_package_base(path):
|
39 |
+
base_dir, package_path = os.path.split(path)
|
40 |
+
while is_package_dir(base_dir):
|
41 |
+
base_dir, parent = os.path.split(base_dir)
|
42 |
+
package_path = '%s/%s' % (parent, package_path)
|
43 |
+
return base_dir, package_path
|
44 |
+
|
45 |
+
def cython_compile(path_pattern, options):
|
46 |
+
all_paths = map(os.path.abspath, extended_iglob(path_pattern))
|
47 |
+
_cython_compile_files(all_paths, options)
|
48 |
+
|
49 |
+
def _cython_compile_files(all_paths, options):
|
50 |
+
pool = None
|
51 |
+
try:
|
52 |
+
for path in all_paths:
|
53 |
+
if options.build_inplace:
|
54 |
+
base_dir = path
|
55 |
+
while not os.path.isdir(base_dir) or is_package_dir(base_dir):
|
56 |
+
base_dir = os.path.dirname(base_dir)
|
57 |
+
else:
|
58 |
+
base_dir = None
|
59 |
+
|
60 |
+
if os.path.isdir(path):
|
61 |
+
# recursively compiling a package
|
62 |
+
paths = [os.path.join(path, '**', '*.{py,pyx}')]
|
63 |
+
else:
|
64 |
+
# assume it's a file(-like thing)
|
65 |
+
paths = [path]
|
66 |
+
|
67 |
+
ext_modules = cythonize(
|
68 |
+
paths,
|
69 |
+
nthreads=options.parallel,
|
70 |
+
exclude_failures=options.keep_going,
|
71 |
+
exclude=options.excludes,
|
72 |
+
compiler_directives=options.directives,
|
73 |
+
compile_time_env=options.compile_time_env,
|
74 |
+
force=options.force,
|
75 |
+
quiet=options.quiet,
|
76 |
+
depfile=options.depfile,
|
77 |
+
language=options.language,
|
78 |
+
**options.options)
|
79 |
+
|
80 |
+
if ext_modules and options.build:
|
81 |
+
if len(ext_modules) > 1 and options.parallel > 1:
|
82 |
+
if pool is None:
|
83 |
+
try:
|
84 |
+
pool = multiprocessing.Pool(options.parallel)
|
85 |
+
except OSError:
|
86 |
+
pool = _FakePool()
|
87 |
+
pool.map_async(run_distutils, [
|
88 |
+
(base_dir, [ext]) for ext in ext_modules])
|
89 |
+
else:
|
90 |
+
run_distutils((base_dir, ext_modules))
|
91 |
+
except:
|
92 |
+
if pool is not None:
|
93 |
+
pool.terminate()
|
94 |
+
raise
|
95 |
+
else:
|
96 |
+
if pool is not None:
|
97 |
+
pool.close()
|
98 |
+
pool.join()
|
99 |
+
|
100 |
+
|
101 |
+
def run_distutils(args):
|
102 |
+
try:
|
103 |
+
from distutils.core import setup
|
104 |
+
except ImportError:
|
105 |
+
try:
|
106 |
+
from setuptools import setup
|
107 |
+
except ImportError:
|
108 |
+
raise ImportError("'distutils' is not available. Please install 'setuptools' for binary builds.")
|
109 |
+
|
110 |
+
base_dir, ext_modules = args
|
111 |
+
script_args = ['build_ext', '-i']
|
112 |
+
cwd = os.getcwd()
|
113 |
+
temp_dir = None
|
114 |
+
try:
|
115 |
+
if base_dir:
|
116 |
+
os.chdir(base_dir)
|
117 |
+
temp_dir = tempfile.mkdtemp(dir=base_dir)
|
118 |
+
script_args.extend(['--build-temp', temp_dir])
|
119 |
+
setup(
|
120 |
+
script_name='setup.py',
|
121 |
+
script_args=script_args,
|
122 |
+
ext_modules=ext_modules,
|
123 |
+
)
|
124 |
+
finally:
|
125 |
+
if base_dir:
|
126 |
+
os.chdir(cwd)
|
127 |
+
if temp_dir and os.path.isdir(temp_dir):
|
128 |
+
shutil.rmtree(temp_dir)
|
129 |
+
|
130 |
+
|
131 |
+
def create_args_parser():
|
132 |
+
from argparse import ArgumentParser, RawDescriptionHelpFormatter
|
133 |
+
from ..Compiler.CmdLine import ParseDirectivesAction, ParseOptionsAction, ParseCompileTimeEnvAction
|
134 |
+
|
135 |
+
parser = ArgumentParser(
|
136 |
+
formatter_class=RawDescriptionHelpFormatter,
|
137 |
+
epilog="""\
|
138 |
+
Environment variables:
|
139 |
+
CYTHON_FORCE_REGEN: if set to 1, forces cythonize to regenerate the output files regardless
|
140 |
+
of modification times and changes.
|
141 |
+
Environment variables accepted by setuptools are supported to configure the C compiler and build:
|
142 |
+
https://setuptools.pypa.io/en/latest/userguide/ext_modules.html#compiler-and-linker-options"""
|
143 |
+
)
|
144 |
+
|
145 |
+
parser.add_argument('-X', '--directive', metavar='NAME=VALUE,...',
|
146 |
+
dest='directives', default={}, type=str,
|
147 |
+
action=ParseDirectivesAction,
|
148 |
+
help='set a compiler directive')
|
149 |
+
parser.add_argument('-E', '--compile-time-env', metavar='NAME=VALUE,...',
|
150 |
+
dest='compile_time_env', default={}, type=str,
|
151 |
+
action=ParseCompileTimeEnvAction,
|
152 |
+
help='set a compile time environment variable')
|
153 |
+
parser.add_argument('-s', '--option', metavar='NAME=VALUE',
|
154 |
+
dest='options', default={}, type=str,
|
155 |
+
action=ParseOptionsAction,
|
156 |
+
help='set a cythonize option')
|
157 |
+
parser.add_argument('-2', dest='language_level', action='store_const', const=2, default=None,
|
158 |
+
help='use Python 2 syntax mode by default')
|
159 |
+
parser.add_argument('-3', dest='language_level', action='store_const', const=3,
|
160 |
+
help='use Python 3 syntax mode by default')
|
161 |
+
parser.add_argument('--3str', dest='language_level', action='store_const', const='3str',
|
162 |
+
help='use Python 3 syntax mode by default')
|
163 |
+
parser.add_argument('-+', '--cplus', dest='language', action='store_const', const='c++', default=None,
|
164 |
+
help='Compile as C++ rather than C')
|
165 |
+
parser.add_argument('-a', '--annotate', action='store_const', const='default', dest='annotate',
|
166 |
+
help='Produce a colorized HTML version of the source.')
|
167 |
+
parser.add_argument('--annotate-fullc', action='store_const', const='fullc', dest='annotate',
|
168 |
+
help='Produce a colorized HTML version of the source '
|
169 |
+
'which includes entire generated C/C++-code.')
|
170 |
+
parser.add_argument('-x', '--exclude', metavar='PATTERN', dest='excludes',
|
171 |
+
action='append', default=[],
|
172 |
+
help='exclude certain file patterns from the compilation')
|
173 |
+
|
174 |
+
parser.add_argument('-b', '--build', dest='build', action='store_true', default=None,
|
175 |
+
help='build extension modules using distutils/setuptools')
|
176 |
+
parser.add_argument('-i', '--inplace', dest='build_inplace', action='store_true', default=None,
|
177 |
+
help='build extension modules in place using distutils/setuptools (implies -b)')
|
178 |
+
parser.add_argument('-j', '--parallel', dest='parallel', metavar='N',
|
179 |
+
type=int, default=parallel_compiles,
|
180 |
+
help=('run builds in N parallel jobs (default: %d)' %
|
181 |
+
parallel_compiles or 1))
|
182 |
+
parser.add_argument('-f', '--force', dest='force', action='store_true', default=None,
|
183 |
+
help='force recompilation')
|
184 |
+
parser.add_argument('-q', '--quiet', dest='quiet', action='store_true', default=None,
|
185 |
+
help='be less verbose during compilation')
|
186 |
+
|
187 |
+
parser.add_argument('--lenient', dest='lenient', action='store_true', default=None,
|
188 |
+
help='increase Python compatibility by ignoring some compile time errors')
|
189 |
+
parser.add_argument('-k', '--keep-going', dest='keep_going', action='store_true', default=None,
|
190 |
+
help='compile as much as possible, ignore compilation failures')
|
191 |
+
parser.add_argument('--no-docstrings', dest='no_docstrings', action='store_true', default=None,
|
192 |
+
help='strip docstrings')
|
193 |
+
parser.add_argument('-M', '--depfile', action='store_true', help='produce depfiles for the sources')
|
194 |
+
parser.add_argument('sources', nargs='*')
|
195 |
+
return parser
|
196 |
+
|
197 |
+
|
198 |
+
def parse_args_raw(parser, args):
|
199 |
+
options, unknown = parser.parse_known_args(args)
|
200 |
+
sources = options.sources
|
201 |
+
# if positional arguments were interspersed
|
202 |
+
# some of them are in unknown
|
203 |
+
for option in unknown:
|
204 |
+
if option.startswith('-'):
|
205 |
+
parser.error("unknown option "+option)
|
206 |
+
else:
|
207 |
+
sources.append(option)
|
208 |
+
del options.sources
|
209 |
+
return (options, sources)
|
210 |
+
|
211 |
+
|
212 |
+
def parse_args(args):
|
213 |
+
parser = create_args_parser()
|
214 |
+
options, args = parse_args_raw(parser, args)
|
215 |
+
|
216 |
+
if not args:
|
217 |
+
parser.error("no source files provided")
|
218 |
+
if options.build_inplace:
|
219 |
+
options.build = True
|
220 |
+
if multiprocessing is None:
|
221 |
+
options.parallel = 0
|
222 |
+
if options.language_level:
|
223 |
+
assert options.language_level in (2, 3, '3str')
|
224 |
+
options.options['language_level'] = options.language_level
|
225 |
+
|
226 |
+
if options.lenient:
|
227 |
+
# increase Python compatibility by ignoring compile time errors
|
228 |
+
Options.error_on_unknown_names = False
|
229 |
+
Options.error_on_uninitialized = False
|
230 |
+
|
231 |
+
if options.annotate:
|
232 |
+
Options.annotate = options.annotate
|
233 |
+
|
234 |
+
if options.no_docstrings:
|
235 |
+
Options.docstrings = False
|
236 |
+
|
237 |
+
return options, args
|
238 |
+
|
239 |
+
|
240 |
+
def main(args=None):
|
241 |
+
options, paths = parse_args(args)
|
242 |
+
|
243 |
+
all_paths = []
|
244 |
+
for path in paths:
|
245 |
+
expanded_path = [os.path.abspath(p) for p in extended_iglob(path)]
|
246 |
+
if not expanded_path:
|
247 |
+
import sys
|
248 |
+
print("{}: No such file or directory: '{}'".format(sys.argv[0], path), file=sys.stderr)
|
249 |
+
sys.exit(1)
|
250 |
+
all_paths.extend(expanded_path)
|
251 |
+
_cython_compile_files(all_paths, options)
|
252 |
+
|
253 |
+
|
254 |
+
if __name__ == '__main__':
|
255 |
+
main()
|
Lib/site-packages/Cython/Build/Dependencies.py
ADDED
@@ -0,0 +1,1380 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from __future__ import absolute_import, print_function
|
2 |
+
|
3 |
+
import cython
|
4 |
+
from .. import __version__
|
5 |
+
|
6 |
+
import collections
|
7 |
+
import contextlib
|
8 |
+
import hashlib
|
9 |
+
import os
|
10 |
+
import shutil
|
11 |
+
import subprocess
|
12 |
+
import re, sys, time
|
13 |
+
from glob import iglob
|
14 |
+
from io import open as io_open
|
15 |
+
from os.path import relpath as _relpath
|
16 |
+
import zipfile
|
17 |
+
|
18 |
+
try:
|
19 |
+
from collections.abc import Iterable
|
20 |
+
except ImportError:
|
21 |
+
from collections import Iterable
|
22 |
+
|
23 |
+
try:
|
24 |
+
import gzip
|
25 |
+
gzip_open = gzip.open
|
26 |
+
gzip_ext = '.gz'
|
27 |
+
except ImportError:
|
28 |
+
gzip_open = open
|
29 |
+
gzip_ext = ''
|
30 |
+
|
31 |
+
try:
|
32 |
+
import zlib
|
33 |
+
zipfile_compression_mode = zipfile.ZIP_DEFLATED
|
34 |
+
except ImportError:
|
35 |
+
zipfile_compression_mode = zipfile.ZIP_STORED
|
36 |
+
|
37 |
+
try:
|
38 |
+
import pythran
|
39 |
+
except:
|
40 |
+
pythran = None
|
41 |
+
|
42 |
+
from .. import Utils
|
43 |
+
from ..Utils import (cached_function, cached_method, path_exists,
|
44 |
+
safe_makedirs, copy_file_to_dir_if_newer, is_package_dir, write_depfile)
|
45 |
+
from ..Compiler import Errors
|
46 |
+
from ..Compiler.Main import Context
|
47 |
+
from ..Compiler.Options import (CompilationOptions, default_options,
|
48 |
+
get_directive_defaults)
|
49 |
+
|
50 |
+
join_path = cached_function(os.path.join)
|
51 |
+
copy_once_if_newer = cached_function(copy_file_to_dir_if_newer)
|
52 |
+
safe_makedirs_once = cached_function(safe_makedirs)
|
53 |
+
|
54 |
+
if sys.version_info[0] < 3:
|
55 |
+
# stupid Py2 distutils enforces str type in list of sources
|
56 |
+
_fs_encoding = sys.getfilesystemencoding()
|
57 |
+
if _fs_encoding is None:
|
58 |
+
_fs_encoding = sys.getdefaultencoding()
|
59 |
+
def encode_filename_in_py2(filename):
|
60 |
+
if not isinstance(filename, bytes):
|
61 |
+
return filename.encode(_fs_encoding)
|
62 |
+
return filename
|
63 |
+
else:
|
64 |
+
def encode_filename_in_py2(filename):
|
65 |
+
return filename
|
66 |
+
basestring = str
|
67 |
+
|
68 |
+
|
69 |
+
def _make_relative(file_paths, base=None):
|
70 |
+
if not base:
|
71 |
+
base = os.getcwd()
|
72 |
+
if base[-1] != os.path.sep:
|
73 |
+
base += os.path.sep
|
74 |
+
return [_relpath(path, base) if path.startswith(base) else path
|
75 |
+
for path in file_paths]
|
76 |
+
|
77 |
+
|
78 |
+
def extended_iglob(pattern):
|
79 |
+
if '{' in pattern:
|
80 |
+
m = re.match('(.*){([^}]+)}(.*)', pattern)
|
81 |
+
if m:
|
82 |
+
before, switch, after = m.groups()
|
83 |
+
for case in switch.split(','):
|
84 |
+
for path in extended_iglob(before + case + after):
|
85 |
+
yield path
|
86 |
+
return
|
87 |
+
|
88 |
+
# We always accept '/' and also '\' on Windows,
|
89 |
+
# because '/' is generally common for relative paths.
|
90 |
+
if '**/' in pattern or os.sep == '\\' and '**\\' in pattern:
|
91 |
+
seen = set()
|
92 |
+
first, rest = re.split(r'\*\*[%s]' % ('/\\\\' if os.sep == '\\' else '/'), pattern, 1)
|
93 |
+
if first:
|
94 |
+
first = iglob(first + os.sep)
|
95 |
+
else:
|
96 |
+
first = ['']
|
97 |
+
for root in first:
|
98 |
+
for path in extended_iglob(join_path(root, rest)):
|
99 |
+
if path not in seen:
|
100 |
+
seen.add(path)
|
101 |
+
yield path
|
102 |
+
for path in extended_iglob(join_path(root, '*', '**', rest)):
|
103 |
+
if path not in seen:
|
104 |
+
seen.add(path)
|
105 |
+
yield path
|
106 |
+
else:
|
107 |
+
for path in iglob(pattern):
|
108 |
+
yield path
|
109 |
+
|
110 |
+
|
111 |
+
def nonempty(it, error_msg="expected non-empty iterator"):
|
112 |
+
empty = True
|
113 |
+
for value in it:
|
114 |
+
empty = False
|
115 |
+
yield value
|
116 |
+
if empty:
|
117 |
+
raise ValueError(error_msg)
|
118 |
+
|
119 |
+
|
120 |
+
@cached_function
|
121 |
+
def file_hash(filename):
|
122 |
+
path = os.path.normpath(filename)
|
123 |
+
prefix = ('%d:%s' % (len(path), path)).encode("UTF-8")
|
124 |
+
m = hashlib.sha1(prefix)
|
125 |
+
with open(path, 'rb') as f:
|
126 |
+
data = f.read(65000)
|
127 |
+
while data:
|
128 |
+
m.update(data)
|
129 |
+
data = f.read(65000)
|
130 |
+
return m.hexdigest()
|
131 |
+
|
132 |
+
|
133 |
+
def update_pythran_extension(ext):
|
134 |
+
if pythran is None:
|
135 |
+
raise RuntimeError("You first need to install Pythran to use the np_pythran directive.")
|
136 |
+
try:
|
137 |
+
pythran_ext = pythran.config.make_extension(python=True)
|
138 |
+
except TypeError: # older pythran version only
|
139 |
+
pythran_ext = pythran.config.make_extension()
|
140 |
+
|
141 |
+
ext.include_dirs.extend(pythran_ext['include_dirs'])
|
142 |
+
ext.extra_compile_args.extend(pythran_ext['extra_compile_args'])
|
143 |
+
ext.extra_link_args.extend(pythran_ext['extra_link_args'])
|
144 |
+
ext.define_macros.extend(pythran_ext['define_macros'])
|
145 |
+
ext.undef_macros.extend(pythran_ext['undef_macros'])
|
146 |
+
ext.library_dirs.extend(pythran_ext['library_dirs'])
|
147 |
+
ext.libraries.extend(pythran_ext['libraries'])
|
148 |
+
ext.language = 'c++'
|
149 |
+
|
150 |
+
# These options are not compatible with the way normal Cython extensions work
|
151 |
+
for bad_option in ["-fwhole-program", "-fvisibility=hidden"]:
|
152 |
+
try:
|
153 |
+
ext.extra_compile_args.remove(bad_option)
|
154 |
+
except ValueError:
|
155 |
+
pass
|
156 |
+
|
157 |
+
|
158 |
+
def parse_list(s):
|
159 |
+
"""
|
160 |
+
>>> parse_list("")
|
161 |
+
[]
|
162 |
+
>>> parse_list("a")
|
163 |
+
['a']
|
164 |
+
>>> parse_list("a b c")
|
165 |
+
['a', 'b', 'c']
|
166 |
+
>>> parse_list("[a, b, c]")
|
167 |
+
['a', 'b', 'c']
|
168 |
+
>>> parse_list('a " " b')
|
169 |
+
['a', ' ', 'b']
|
170 |
+
>>> parse_list('[a, ",a", "a,", ",", ]')
|
171 |
+
['a', ',a', 'a,', ',']
|
172 |
+
"""
|
173 |
+
if len(s) >= 2 and s[0] == '[' and s[-1] == ']':
|
174 |
+
s = s[1:-1]
|
175 |
+
delimiter = ','
|
176 |
+
else:
|
177 |
+
delimiter = ' '
|
178 |
+
s, literals = strip_string_literals(s)
|
179 |
+
def unquote(literal):
|
180 |
+
literal = literal.strip()
|
181 |
+
if literal[0] in "'\"":
|
182 |
+
return literals[literal[1:-1]]
|
183 |
+
else:
|
184 |
+
return literal
|
185 |
+
return [unquote(item) for item in s.split(delimiter) if item.strip()]
|
186 |
+
|
187 |
+
|
188 |
+
transitive_str = object()
|
189 |
+
transitive_list = object()
|
190 |
+
bool_or = object()
|
191 |
+
|
192 |
+
distutils_settings = {
|
193 |
+
'name': str,
|
194 |
+
'sources': list,
|
195 |
+
'define_macros': list,
|
196 |
+
'undef_macros': list,
|
197 |
+
'libraries': transitive_list,
|
198 |
+
'library_dirs': transitive_list,
|
199 |
+
'runtime_library_dirs': transitive_list,
|
200 |
+
'include_dirs': transitive_list,
|
201 |
+
'extra_objects': list,
|
202 |
+
'extra_compile_args': transitive_list,
|
203 |
+
'extra_link_args': transitive_list,
|
204 |
+
'export_symbols': list,
|
205 |
+
'depends': transitive_list,
|
206 |
+
'language': transitive_str,
|
207 |
+
'np_pythran': bool_or
|
208 |
+
}
|
209 |
+
|
210 |
+
|
211 |
+
def _legacy_strtobool(val):
|
212 |
+
# Used to be "distutils.util.strtobool", adapted for deprecation warnings.
|
213 |
+
if val == "True":
|
214 |
+
return True
|
215 |
+
elif val == "False":
|
216 |
+
return False
|
217 |
+
|
218 |
+
import warnings
|
219 |
+
warnings.warn("The 'np_python' option requires 'True' or 'False'", category=DeprecationWarning)
|
220 |
+
val = val.lower()
|
221 |
+
if val in ('y', 'yes', 't', 'true', 'on', '1'):
|
222 |
+
return True
|
223 |
+
elif val in ('n', 'no', 'f', 'false', 'off', '0'):
|
224 |
+
return False
|
225 |
+
else:
|
226 |
+
raise ValueError("invalid truth value %r" % (val,))
|
227 |
+
|
228 |
+
|
229 |
+
@cython.locals(start=cython.Py_ssize_t, end=cython.Py_ssize_t)
|
230 |
+
def line_iter(source):
|
231 |
+
if isinstance(source, basestring):
|
232 |
+
start = 0
|
233 |
+
while True:
|
234 |
+
end = source.find('\n', start)
|
235 |
+
if end == -1:
|
236 |
+
yield source[start:]
|
237 |
+
return
|
238 |
+
yield source[start:end]
|
239 |
+
start = end+1
|
240 |
+
else:
|
241 |
+
for line in source:
|
242 |
+
yield line
|
243 |
+
|
244 |
+
|
245 |
+
class DistutilsInfo(object):
|
246 |
+
|
247 |
+
def __init__(self, source=None, exn=None):
|
248 |
+
self.values = {}
|
249 |
+
if source is not None:
|
250 |
+
for line in line_iter(source):
|
251 |
+
line = line.lstrip()
|
252 |
+
if not line:
|
253 |
+
continue
|
254 |
+
if line[0] != '#':
|
255 |
+
break
|
256 |
+
line = line[1:].lstrip()
|
257 |
+
kind = next((k for k in ("distutils:","cython:") if line.startswith(k)), None)
|
258 |
+
if kind is not None:
|
259 |
+
key, _, value = [s.strip() for s in line[len(kind):].partition('=')]
|
260 |
+
type = distutils_settings.get(key, None)
|
261 |
+
if line.startswith("cython:") and type is None: continue
|
262 |
+
if type in (list, transitive_list):
|
263 |
+
value = parse_list(value)
|
264 |
+
if key == 'define_macros':
|
265 |
+
value = [tuple(macro.split('=', 1))
|
266 |
+
if '=' in macro else (macro, None)
|
267 |
+
for macro in value]
|
268 |
+
if type is bool_or:
|
269 |
+
value = _legacy_strtobool(value)
|
270 |
+
self.values[key] = value
|
271 |
+
elif exn is not None:
|
272 |
+
for key in distutils_settings:
|
273 |
+
if key in ('name', 'sources','np_pythran'):
|
274 |
+
continue
|
275 |
+
value = getattr(exn, key, None)
|
276 |
+
if value:
|
277 |
+
self.values[key] = value
|
278 |
+
|
279 |
+
def merge(self, other):
|
280 |
+
if other is None:
|
281 |
+
return self
|
282 |
+
for key, value in other.values.items():
|
283 |
+
type = distutils_settings[key]
|
284 |
+
if type is transitive_str and key not in self.values:
|
285 |
+
self.values[key] = value
|
286 |
+
elif type is transitive_list:
|
287 |
+
if key in self.values:
|
288 |
+
# Change a *copy* of the list (Trac #845)
|
289 |
+
all = self.values[key][:]
|
290 |
+
for v in value:
|
291 |
+
if v not in all:
|
292 |
+
all.append(v)
|
293 |
+
value = all
|
294 |
+
self.values[key] = value
|
295 |
+
elif type is bool_or:
|
296 |
+
self.values[key] = self.values.get(key, False) | value
|
297 |
+
return self
|
298 |
+
|
299 |
+
def subs(self, aliases):
|
300 |
+
if aliases is None:
|
301 |
+
return self
|
302 |
+
resolved = DistutilsInfo()
|
303 |
+
for key, value in self.values.items():
|
304 |
+
type = distutils_settings[key]
|
305 |
+
if type in [list, transitive_list]:
|
306 |
+
new_value_list = []
|
307 |
+
for v in value:
|
308 |
+
if v in aliases:
|
309 |
+
v = aliases[v]
|
310 |
+
if isinstance(v, list):
|
311 |
+
new_value_list += v
|
312 |
+
else:
|
313 |
+
new_value_list.append(v)
|
314 |
+
value = new_value_list
|
315 |
+
else:
|
316 |
+
if value in aliases:
|
317 |
+
value = aliases[value]
|
318 |
+
resolved.values[key] = value
|
319 |
+
return resolved
|
320 |
+
|
321 |
+
def apply(self, extension):
|
322 |
+
for key, value in self.values.items():
|
323 |
+
type = distutils_settings[key]
|
324 |
+
if type in [list, transitive_list]:
|
325 |
+
value = getattr(extension, key) + list(value)
|
326 |
+
setattr(extension, key, value)
|
327 |
+
|
328 |
+
|
329 |
+
@cython.locals(start=cython.Py_ssize_t, q=cython.Py_ssize_t,
|
330 |
+
single_q=cython.Py_ssize_t, double_q=cython.Py_ssize_t,
|
331 |
+
hash_mark=cython.Py_ssize_t, end=cython.Py_ssize_t,
|
332 |
+
k=cython.Py_ssize_t, counter=cython.Py_ssize_t, quote_len=cython.Py_ssize_t)
|
333 |
+
def strip_string_literals(code, prefix='__Pyx_L'):
|
334 |
+
"""
|
335 |
+
Normalizes every string literal to be of the form '__Pyx_Lxxx',
|
336 |
+
returning the normalized code and a mapping of labels to
|
337 |
+
string literals.
|
338 |
+
"""
|
339 |
+
new_code = []
|
340 |
+
literals = {}
|
341 |
+
counter = 0
|
342 |
+
start = q = 0
|
343 |
+
in_quote = False
|
344 |
+
hash_mark = single_q = double_q = -1
|
345 |
+
code_len = len(code)
|
346 |
+
quote_type = None
|
347 |
+
quote_len = -1
|
348 |
+
|
349 |
+
while True:
|
350 |
+
if hash_mark < q:
|
351 |
+
hash_mark = code.find('#', q)
|
352 |
+
if single_q < q:
|
353 |
+
single_q = code.find("'", q)
|
354 |
+
if double_q < q:
|
355 |
+
double_q = code.find('"', q)
|
356 |
+
q = min(single_q, double_q)
|
357 |
+
if q == -1:
|
358 |
+
q = max(single_q, double_q)
|
359 |
+
|
360 |
+
# We're done.
|
361 |
+
if q == -1 and hash_mark == -1:
|
362 |
+
new_code.append(code[start:])
|
363 |
+
break
|
364 |
+
|
365 |
+
# Try to close the quote.
|
366 |
+
elif in_quote:
|
367 |
+
if code[q-1] == u'\\':
|
368 |
+
k = 2
|
369 |
+
while q >= k and code[q-k] == u'\\':
|
370 |
+
k += 1
|
371 |
+
if k % 2 == 0:
|
372 |
+
q += 1
|
373 |
+
continue
|
374 |
+
if code[q] == quote_type and (
|
375 |
+
quote_len == 1 or (code_len > q + 2 and quote_type == code[q+1] == code[q+2])):
|
376 |
+
counter += 1
|
377 |
+
label = "%s%s_" % (prefix, counter)
|
378 |
+
literals[label] = code[start+quote_len:q]
|
379 |
+
full_quote = code[q:q+quote_len]
|
380 |
+
new_code.append(full_quote)
|
381 |
+
new_code.append(label)
|
382 |
+
new_code.append(full_quote)
|
383 |
+
q += quote_len
|
384 |
+
in_quote = False
|
385 |
+
start = q
|
386 |
+
else:
|
387 |
+
q += 1
|
388 |
+
|
389 |
+
# Process comment.
|
390 |
+
elif -1 != hash_mark and (hash_mark < q or q == -1):
|
391 |
+
new_code.append(code[start:hash_mark+1])
|
392 |
+
end = code.find('\n', hash_mark)
|
393 |
+
counter += 1
|
394 |
+
label = "%s%s_" % (prefix, counter)
|
395 |
+
if end == -1:
|
396 |
+
end_or_none = None
|
397 |
+
else:
|
398 |
+
end_or_none = end
|
399 |
+
literals[label] = code[hash_mark+1:end_or_none]
|
400 |
+
new_code.append(label)
|
401 |
+
if end == -1:
|
402 |
+
break
|
403 |
+
start = q = end
|
404 |
+
|
405 |
+
# Open the quote.
|
406 |
+
else:
|
407 |
+
if code_len >= q+3 and (code[q] == code[q+1] == code[q+2]):
|
408 |
+
quote_len = 3
|
409 |
+
else:
|
410 |
+
quote_len = 1
|
411 |
+
in_quote = True
|
412 |
+
quote_type = code[q]
|
413 |
+
new_code.append(code[start:q])
|
414 |
+
start = q
|
415 |
+
q += quote_len
|
416 |
+
|
417 |
+
return "".join(new_code), literals
|
418 |
+
|
419 |
+
|
420 |
+
# We need to allow spaces to allow for conditional compilation like
|
421 |
+
# IF ...:
|
422 |
+
# cimport ...
|
423 |
+
dependency_regex = re.compile(r"(?:^\s*from +([0-9a-zA-Z_.]+) +cimport)|"
|
424 |
+
r"(?:^\s*cimport +([0-9a-zA-Z_.]+(?: *, *[0-9a-zA-Z_.]+)*))|"
|
425 |
+
r"(?:^\s*cdef +extern +from +['\"]([^'\"]+)['\"])|"
|
426 |
+
r"(?:^\s*include +['\"]([^'\"]+)['\"])", re.M)
|
427 |
+
dependency_after_from_regex = re.compile(
|
428 |
+
r"(?:^\s+\(([0-9a-zA-Z_., ]*)\)[#\n])|"
|
429 |
+
r"(?:^\s+([0-9a-zA-Z_., ]*)[#\n])",
|
430 |
+
re.M)
|
431 |
+
|
432 |
+
|
433 |
+
def normalize_existing(base_path, rel_paths):
|
434 |
+
return normalize_existing0(os.path.dirname(base_path), tuple(set(rel_paths)))
|
435 |
+
|
436 |
+
|
437 |
+
@cached_function
|
438 |
+
def normalize_existing0(base_dir, rel_paths):
|
439 |
+
"""
|
440 |
+
Given some base directory ``base_dir`` and a list of path names
|
441 |
+
``rel_paths``, normalize each relative path name ``rel`` by
|
442 |
+
replacing it by ``os.path.join(base, rel)`` if that file exists.
|
443 |
+
|
444 |
+
Return a couple ``(normalized, needed_base)`` where ``normalized``
|
445 |
+
if the list of normalized file names and ``needed_base`` is
|
446 |
+
``base_dir`` if we actually needed ``base_dir``. If no paths were
|
447 |
+
changed (for example, if all paths were already absolute), then
|
448 |
+
``needed_base`` is ``None``.
|
449 |
+
"""
|
450 |
+
normalized = []
|
451 |
+
needed_base = None
|
452 |
+
for rel in rel_paths:
|
453 |
+
if os.path.isabs(rel):
|
454 |
+
normalized.append(rel)
|
455 |
+
continue
|
456 |
+
path = join_path(base_dir, rel)
|
457 |
+
if path_exists(path):
|
458 |
+
normalized.append(os.path.normpath(path))
|
459 |
+
needed_base = base_dir
|
460 |
+
else:
|
461 |
+
normalized.append(rel)
|
462 |
+
return (normalized, needed_base)
|
463 |
+
|
464 |
+
|
465 |
+
def resolve_depends(depends, include_dirs):
|
466 |
+
include_dirs = tuple(include_dirs)
|
467 |
+
resolved = []
|
468 |
+
for depend in depends:
|
469 |
+
path = resolve_depend(depend, include_dirs)
|
470 |
+
if path is not None:
|
471 |
+
resolved.append(path)
|
472 |
+
return resolved
|
473 |
+
|
474 |
+
|
475 |
+
@cached_function
|
476 |
+
def resolve_depend(depend, include_dirs):
|
477 |
+
if depend[0] == '<' and depend[-1] == '>':
|
478 |
+
return None
|
479 |
+
for dir in include_dirs:
|
480 |
+
path = join_path(dir, depend)
|
481 |
+
if path_exists(path):
|
482 |
+
return os.path.normpath(path)
|
483 |
+
return None
|
484 |
+
|
485 |
+
|
486 |
+
@cached_function
|
487 |
+
def package(filename):
|
488 |
+
dir = os.path.dirname(os.path.abspath(str(filename)))
|
489 |
+
if dir != filename and is_package_dir(dir):
|
490 |
+
return package(dir) + (os.path.basename(dir),)
|
491 |
+
else:
|
492 |
+
return ()
|
493 |
+
|
494 |
+
|
495 |
+
@cached_function
|
496 |
+
def fully_qualified_name(filename):
|
497 |
+
module = os.path.splitext(os.path.basename(filename))[0]
|
498 |
+
return '.'.join(package(filename) + (module,))
|
499 |
+
|
500 |
+
|
501 |
+
@cached_function
|
502 |
+
def parse_dependencies(source_filename):
|
503 |
+
# Actual parsing is way too slow, so we use regular expressions.
|
504 |
+
# The only catch is that we must strip comments and string
|
505 |
+
# literals ahead of time.
|
506 |
+
with Utils.open_source_file(source_filename, error_handling='ignore') as fh:
|
507 |
+
source = fh.read()
|
508 |
+
distutils_info = DistutilsInfo(source)
|
509 |
+
source, literals = strip_string_literals(source)
|
510 |
+
source = source.replace('\\\n', ' ').replace('\t', ' ')
|
511 |
+
|
512 |
+
# TODO: pure mode
|
513 |
+
cimports = []
|
514 |
+
includes = []
|
515 |
+
externs = []
|
516 |
+
for m in dependency_regex.finditer(source):
|
517 |
+
cimport_from, cimport_list, extern, include = m.groups()
|
518 |
+
if cimport_from:
|
519 |
+
cimports.append(cimport_from)
|
520 |
+
m_after_from = dependency_after_from_regex.search(source, pos=m.end())
|
521 |
+
if m_after_from:
|
522 |
+
multiline, one_line = m_after_from.groups()
|
523 |
+
subimports = multiline or one_line
|
524 |
+
cimports.extend("{0}.{1}".format(cimport_from, s.strip())
|
525 |
+
for s in subimports.split(','))
|
526 |
+
|
527 |
+
elif cimport_list:
|
528 |
+
cimports.extend(x.strip() for x in cimport_list.split(","))
|
529 |
+
elif extern:
|
530 |
+
externs.append(literals[extern])
|
531 |
+
else:
|
532 |
+
includes.append(literals[include])
|
533 |
+
return cimports, includes, externs, distutils_info
|
534 |
+
|
535 |
+
|
536 |
+
class DependencyTree(object):
|
537 |
+
|
538 |
+
def __init__(self, context, quiet=False):
|
539 |
+
self.context = context
|
540 |
+
self.quiet = quiet
|
541 |
+
self._transitive_cache = {}
|
542 |
+
|
543 |
+
def parse_dependencies(self, source_filename):
|
544 |
+
if path_exists(source_filename):
|
545 |
+
source_filename = os.path.normpath(source_filename)
|
546 |
+
return parse_dependencies(source_filename)
|
547 |
+
|
548 |
+
@cached_method
|
549 |
+
def included_files(self, filename):
|
550 |
+
# This is messy because included files are textually included, resolving
|
551 |
+
# cimports (but not includes) relative to the including file.
|
552 |
+
all = set()
|
553 |
+
for include in self.parse_dependencies(filename)[1]:
|
554 |
+
include_path = join_path(os.path.dirname(filename), include)
|
555 |
+
if not path_exists(include_path):
|
556 |
+
include_path = self.context.find_include_file(include, source_file_path=filename)
|
557 |
+
if include_path:
|
558 |
+
if '.' + os.path.sep in include_path:
|
559 |
+
include_path = os.path.normpath(include_path)
|
560 |
+
all.add(include_path)
|
561 |
+
all.update(self.included_files(include_path))
|
562 |
+
elif not self.quiet:
|
563 |
+
print(u"Unable to locate '%s' referenced from '%s'" % (filename, include))
|
564 |
+
return all
|
565 |
+
|
566 |
+
@cached_method
|
567 |
+
def cimports_externs_incdirs(self, filename):
|
568 |
+
# This is really ugly. Nested cimports are resolved with respect to the
|
569 |
+
# includer, but includes are resolved with respect to the includee.
|
570 |
+
cimports, includes, externs = self.parse_dependencies(filename)[:3]
|
571 |
+
cimports = set(cimports)
|
572 |
+
externs = set(externs)
|
573 |
+
incdirs = set()
|
574 |
+
for include in self.included_files(filename):
|
575 |
+
included_cimports, included_externs, included_incdirs = self.cimports_externs_incdirs(include)
|
576 |
+
cimports.update(included_cimports)
|
577 |
+
externs.update(included_externs)
|
578 |
+
incdirs.update(included_incdirs)
|
579 |
+
externs, incdir = normalize_existing(filename, externs)
|
580 |
+
if incdir:
|
581 |
+
incdirs.add(incdir)
|
582 |
+
return tuple(cimports), externs, incdirs
|
583 |
+
|
584 |
+
def cimports(self, filename):
|
585 |
+
return self.cimports_externs_incdirs(filename)[0]
|
586 |
+
|
587 |
+
def package(self, filename):
|
588 |
+
return package(filename)
|
589 |
+
|
590 |
+
def fully_qualified_name(self, filename):
|
591 |
+
return fully_qualified_name(filename)
|
592 |
+
|
593 |
+
@cached_method
|
594 |
+
def find_pxd(self, module, filename=None):
|
595 |
+
is_relative = module[0] == '.'
|
596 |
+
if is_relative and not filename:
|
597 |
+
raise NotImplementedError("New relative imports.")
|
598 |
+
if filename is not None:
|
599 |
+
module_path = module.split('.')
|
600 |
+
if is_relative:
|
601 |
+
module_path.pop(0) # just explicitly relative
|
602 |
+
package_path = list(self.package(filename))
|
603 |
+
while module_path and not module_path[0]:
|
604 |
+
try:
|
605 |
+
package_path.pop()
|
606 |
+
except IndexError:
|
607 |
+
return None # FIXME: error?
|
608 |
+
module_path.pop(0)
|
609 |
+
relative = '.'.join(package_path + module_path)
|
610 |
+
pxd = self.context.find_pxd_file(relative, source_file_path=filename)
|
611 |
+
if pxd:
|
612 |
+
return pxd
|
613 |
+
if is_relative:
|
614 |
+
return None # FIXME: error?
|
615 |
+
return self.context.find_pxd_file(module, source_file_path=filename)
|
616 |
+
|
617 |
+
@cached_method
|
618 |
+
def cimported_files(self, filename):
|
619 |
+
filename_root, filename_ext = os.path.splitext(filename)
|
620 |
+
if filename_ext in ('.pyx', '.py') and path_exists(filename_root + '.pxd'):
|
621 |
+
pxd_list = [filename_root + '.pxd']
|
622 |
+
else:
|
623 |
+
pxd_list = []
|
624 |
+
# Cimports generates all possible combinations package.module
|
625 |
+
# when imported as from package cimport module.
|
626 |
+
for module in self.cimports(filename):
|
627 |
+
if module[:7] == 'cython.' or module == 'cython':
|
628 |
+
continue
|
629 |
+
pxd_file = self.find_pxd(module, filename)
|
630 |
+
if pxd_file is not None:
|
631 |
+
pxd_list.append(pxd_file)
|
632 |
+
return tuple(pxd_list)
|
633 |
+
|
634 |
+
@cached_method
|
635 |
+
def immediate_dependencies(self, filename):
|
636 |
+
all_deps = {filename}
|
637 |
+
all_deps.update(self.cimported_files(filename))
|
638 |
+
all_deps.update(self.included_files(filename))
|
639 |
+
return all_deps
|
640 |
+
|
641 |
+
def all_dependencies(self, filename):
|
642 |
+
return self.transitive_merge(filename, self.immediate_dependencies, set.union)
|
643 |
+
|
644 |
+
@cached_method
|
645 |
+
def timestamp(self, filename):
|
646 |
+
return os.path.getmtime(filename)
|
647 |
+
|
648 |
+
def extract_timestamp(self, filename):
|
649 |
+
return self.timestamp(filename), filename
|
650 |
+
|
651 |
+
def newest_dependency(self, filename):
|
652 |
+
return max([self.extract_timestamp(f) for f in self.all_dependencies(filename)])
|
653 |
+
|
654 |
+
def transitive_fingerprint(self, filename, module, compilation_options):
|
655 |
+
r"""
|
656 |
+
Return a fingerprint of a cython file that is about to be cythonized.
|
657 |
+
|
658 |
+
Fingerprints are looked up in future compilations. If the fingerprint
|
659 |
+
is found, the cythonization can be skipped. The fingerprint must
|
660 |
+
incorporate everything that has an influence on the generated code.
|
661 |
+
"""
|
662 |
+
try:
|
663 |
+
m = hashlib.sha1(__version__.encode('UTF-8'))
|
664 |
+
m.update(file_hash(filename).encode('UTF-8'))
|
665 |
+
for x in sorted(self.all_dependencies(filename)):
|
666 |
+
if os.path.splitext(x)[1] not in ('.c', '.cpp', '.h'):
|
667 |
+
m.update(file_hash(x).encode('UTF-8'))
|
668 |
+
# Include the module attributes that change the compilation result
|
669 |
+
# in the fingerprint. We do not iterate over module.__dict__ and
|
670 |
+
# include almost everything here as users might extend Extension
|
671 |
+
# with arbitrary (random) attributes that would lead to cache
|
672 |
+
# misses.
|
673 |
+
m.update(str((
|
674 |
+
module.language,
|
675 |
+
getattr(module, 'py_limited_api', False),
|
676 |
+
getattr(module, 'np_pythran', False)
|
677 |
+
)).encode('UTF-8'))
|
678 |
+
|
679 |
+
m.update(compilation_options.get_fingerprint().encode('UTF-8'))
|
680 |
+
return m.hexdigest()
|
681 |
+
except IOError:
|
682 |
+
return None
|
683 |
+
|
684 |
+
def distutils_info0(self, filename):
|
685 |
+
info = self.parse_dependencies(filename)[3]
|
686 |
+
kwds = info.values
|
687 |
+
cimports, externs, incdirs = self.cimports_externs_incdirs(filename)
|
688 |
+
basedir = os.getcwd()
|
689 |
+
# Add dependencies on "cdef extern from ..." files
|
690 |
+
if externs:
|
691 |
+
externs = _make_relative(externs, basedir)
|
692 |
+
if 'depends' in kwds:
|
693 |
+
kwds['depends'] = list(set(kwds['depends']).union(externs))
|
694 |
+
else:
|
695 |
+
kwds['depends'] = list(externs)
|
696 |
+
# Add include_dirs to ensure that the C compiler will find the
|
697 |
+
# "cdef extern from ..." files
|
698 |
+
if incdirs:
|
699 |
+
include_dirs = list(kwds.get('include_dirs', []))
|
700 |
+
for inc in _make_relative(incdirs, basedir):
|
701 |
+
if inc not in include_dirs:
|
702 |
+
include_dirs.append(inc)
|
703 |
+
kwds['include_dirs'] = include_dirs
|
704 |
+
return info
|
705 |
+
|
706 |
+
def distutils_info(self, filename, aliases=None, base=None):
|
707 |
+
return (self.transitive_merge(filename, self.distutils_info0, DistutilsInfo.merge)
|
708 |
+
.subs(aliases)
|
709 |
+
.merge(base))
|
710 |
+
|
711 |
+
def transitive_merge(self, node, extract, merge):
|
712 |
+
try:
|
713 |
+
seen = self._transitive_cache[extract, merge]
|
714 |
+
except KeyError:
|
715 |
+
seen = self._transitive_cache[extract, merge] = {}
|
716 |
+
return self.transitive_merge_helper(
|
717 |
+
node, extract, merge, seen, {}, self.cimported_files)[0]
|
718 |
+
|
719 |
+
def transitive_merge_helper(self, node, extract, merge, seen, stack, outgoing):
|
720 |
+
if node in seen:
|
721 |
+
return seen[node], None
|
722 |
+
deps = extract(node)
|
723 |
+
if node in stack:
|
724 |
+
return deps, node
|
725 |
+
try:
|
726 |
+
stack[node] = len(stack)
|
727 |
+
loop = None
|
728 |
+
for next in outgoing(node):
|
729 |
+
sub_deps, sub_loop = self.transitive_merge_helper(next, extract, merge, seen, stack, outgoing)
|
730 |
+
if sub_loop is not None:
|
731 |
+
if loop is not None and stack[loop] < stack[sub_loop]:
|
732 |
+
pass
|
733 |
+
else:
|
734 |
+
loop = sub_loop
|
735 |
+
deps = merge(deps, sub_deps)
|
736 |
+
if loop == node:
|
737 |
+
loop = None
|
738 |
+
if loop is None:
|
739 |
+
seen[node] = deps
|
740 |
+
return deps, loop
|
741 |
+
finally:
|
742 |
+
del stack[node]
|
743 |
+
|
744 |
+
|
745 |
+
_dep_tree = None
|
746 |
+
|
747 |
+
def create_dependency_tree(ctx=None, quiet=False):
|
748 |
+
global _dep_tree
|
749 |
+
if _dep_tree is None:
|
750 |
+
if ctx is None:
|
751 |
+
ctx = Context(["."], get_directive_defaults(),
|
752 |
+
options=CompilationOptions(default_options))
|
753 |
+
_dep_tree = DependencyTree(ctx, quiet=quiet)
|
754 |
+
return _dep_tree
|
755 |
+
|
756 |
+
|
757 |
+
# If this changes, change also docs/src/reference/compilation.rst
|
758 |
+
# which mentions this function
|
759 |
+
def default_create_extension(template, kwds):
|
760 |
+
if 'depends' in kwds:
|
761 |
+
include_dirs = kwds.get('include_dirs', []) + ["."]
|
762 |
+
depends = resolve_depends(kwds['depends'], include_dirs)
|
763 |
+
kwds['depends'] = sorted(set(depends + template.depends))
|
764 |
+
|
765 |
+
t = template.__class__
|
766 |
+
ext = t(**kwds)
|
767 |
+
metadata = dict(distutils=kwds, module_name=kwds['name'])
|
768 |
+
return (ext, metadata)
|
769 |
+
|
770 |
+
|
771 |
+
# This may be useful for advanced users?
|
772 |
+
def create_extension_list(patterns, exclude=None, ctx=None, aliases=None, quiet=False, language=None,
|
773 |
+
exclude_failures=False):
|
774 |
+
if language is not None:
|
775 |
+
print('Warning: passing language={0!r} to cythonize() is deprecated. '
|
776 |
+
'Instead, put "# distutils: language={0}" in your .pyx or .pxd file(s)'.format(language))
|
777 |
+
if exclude is None:
|
778 |
+
exclude = []
|
779 |
+
if patterns is None:
|
780 |
+
return [], {}
|
781 |
+
elif isinstance(patterns, basestring) or not isinstance(patterns, Iterable):
|
782 |
+
patterns = [patterns]
|
783 |
+
|
784 |
+
from distutils.extension import Extension
|
785 |
+
if 'setuptools' in sys.modules:
|
786 |
+
# Support setuptools Extension instances as well.
|
787 |
+
extension_classes = (
|
788 |
+
Extension, # should normally be the same as 'setuptools.extension._Extension'
|
789 |
+
sys.modules['setuptools.extension']._Extension,
|
790 |
+
sys.modules['setuptools'].Extension,
|
791 |
+
)
|
792 |
+
else:
|
793 |
+
extension_classes = (Extension,)
|
794 |
+
|
795 |
+
explicit_modules = {m.name for m in patterns if isinstance(m, extension_classes)}
|
796 |
+
deps = create_dependency_tree(ctx, quiet=quiet)
|
797 |
+
|
798 |
+
to_exclude = set()
|
799 |
+
if not isinstance(exclude, list):
|
800 |
+
exclude = [exclude]
|
801 |
+
for pattern in exclude:
|
802 |
+
to_exclude.update(map(os.path.abspath, extended_iglob(pattern)))
|
803 |
+
|
804 |
+
module_list = []
|
805 |
+
module_metadata = {}
|
806 |
+
|
807 |
+
# if no create_extension() function is defined, use a simple
|
808 |
+
# default function.
|
809 |
+
create_extension = ctx.options.create_extension or default_create_extension
|
810 |
+
|
811 |
+
seen = set()
|
812 |
+
for pattern in patterns:
|
813 |
+
if not isinstance(pattern, extension_classes):
|
814 |
+
pattern = encode_filename_in_py2(pattern)
|
815 |
+
if isinstance(pattern, str):
|
816 |
+
filepattern = pattern
|
817 |
+
template = Extension(pattern, []) # Fake Extension without sources
|
818 |
+
name = '*'
|
819 |
+
base = None
|
820 |
+
ext_language = language
|
821 |
+
elif isinstance(pattern, extension_classes):
|
822 |
+
cython_sources = [s for s in pattern.sources
|
823 |
+
if os.path.splitext(s)[1] in ('.py', '.pyx')]
|
824 |
+
if cython_sources:
|
825 |
+
filepattern = cython_sources[0]
|
826 |
+
if len(cython_sources) > 1:
|
827 |
+
print(u"Warning: Multiple cython sources found for extension '%s': %s\n"
|
828 |
+
u"See https://cython.readthedocs.io/en/latest/src/userguide/sharing_declarations.html "
|
829 |
+
u"for sharing declarations among Cython files." % (pattern.name, cython_sources))
|
830 |
+
else:
|
831 |
+
# ignore non-cython modules
|
832 |
+
module_list.append(pattern)
|
833 |
+
continue
|
834 |
+
template = pattern
|
835 |
+
name = template.name
|
836 |
+
base = DistutilsInfo(exn=template)
|
837 |
+
ext_language = None # do not override whatever the Extension says
|
838 |
+
else:
|
839 |
+
msg = str("pattern is not of type str nor subclass of Extension (%s)"
|
840 |
+
" but of type %s and class %s" % (repr(Extension),
|
841 |
+
type(pattern),
|
842 |
+
pattern.__class__))
|
843 |
+
raise TypeError(msg)
|
844 |
+
|
845 |
+
for file in nonempty(sorted(extended_iglob(filepattern)), "'%s' doesn't match any files" % filepattern):
|
846 |
+
if os.path.abspath(file) in to_exclude:
|
847 |
+
continue
|
848 |
+
module_name = deps.fully_qualified_name(file)
|
849 |
+
if '*' in name:
|
850 |
+
if module_name in explicit_modules:
|
851 |
+
continue
|
852 |
+
elif name:
|
853 |
+
module_name = name
|
854 |
+
|
855 |
+
Utils.raise_error_if_module_name_forbidden(module_name)
|
856 |
+
|
857 |
+
if module_name not in seen:
|
858 |
+
try:
|
859 |
+
kwds = deps.distutils_info(file, aliases, base).values
|
860 |
+
except Exception:
|
861 |
+
if exclude_failures:
|
862 |
+
continue
|
863 |
+
raise
|
864 |
+
if base is not None:
|
865 |
+
for key, value in base.values.items():
|
866 |
+
if key not in kwds:
|
867 |
+
kwds[key] = value
|
868 |
+
|
869 |
+
kwds['name'] = module_name
|
870 |
+
|
871 |
+
sources = [file] + [m for m in template.sources if m != filepattern]
|
872 |
+
if 'sources' in kwds:
|
873 |
+
# allow users to add .c files etc.
|
874 |
+
for source in kwds['sources']:
|
875 |
+
source = encode_filename_in_py2(source)
|
876 |
+
if source not in sources:
|
877 |
+
sources.append(source)
|
878 |
+
kwds['sources'] = sources
|
879 |
+
|
880 |
+
if ext_language and 'language' not in kwds:
|
881 |
+
kwds['language'] = ext_language
|
882 |
+
|
883 |
+
np_pythran = kwds.pop('np_pythran', False)
|
884 |
+
|
885 |
+
# Create the new extension
|
886 |
+
m, metadata = create_extension(template, kwds)
|
887 |
+
m.np_pythran = np_pythran or getattr(m, 'np_pythran', False)
|
888 |
+
if m.np_pythran:
|
889 |
+
update_pythran_extension(m)
|
890 |
+
module_list.append(m)
|
891 |
+
|
892 |
+
# Store metadata (this will be written as JSON in the
|
893 |
+
# generated C file but otherwise has no purpose)
|
894 |
+
module_metadata[module_name] = metadata
|
895 |
+
|
896 |
+
if file not in m.sources:
|
897 |
+
# Old setuptools unconditionally replaces .pyx with .c/.cpp
|
898 |
+
target_file = os.path.splitext(file)[0] + ('.cpp' if m.language == 'c++' else '.c')
|
899 |
+
try:
|
900 |
+
m.sources.remove(target_file)
|
901 |
+
except ValueError:
|
902 |
+
# never seen this in the wild, but probably better to warn about this unexpected case
|
903 |
+
print(u"Warning: Cython source file not found in sources list, adding %s" % file)
|
904 |
+
m.sources.insert(0, file)
|
905 |
+
seen.add(name)
|
906 |
+
return module_list, module_metadata
|
907 |
+
|
908 |
+
|
909 |
+
# This is the user-exposed entry point.
|
910 |
+
def cythonize(module_list, exclude=None, nthreads=0, aliases=None, quiet=False, force=None, language=None,
|
911 |
+
exclude_failures=False, show_all_warnings=False, **options):
|
912 |
+
"""
|
913 |
+
Compile a set of source modules into C/C++ files and return a list of distutils
|
914 |
+
Extension objects for them.
|
915 |
+
|
916 |
+
:param module_list: As module list, pass either a glob pattern, a list of glob
|
917 |
+
patterns or a list of Extension objects. The latter
|
918 |
+
allows you to configure the extensions separately
|
919 |
+
through the normal distutils options.
|
920 |
+
You can also pass Extension objects that have
|
921 |
+
glob patterns as their sources. Then, cythonize
|
922 |
+
will resolve the pattern and create a
|
923 |
+
copy of the Extension for every matching file.
|
924 |
+
|
925 |
+
:param exclude: When passing glob patterns as ``module_list``, you can exclude certain
|
926 |
+
module names explicitly by passing them into the ``exclude`` option.
|
927 |
+
|
928 |
+
:param nthreads: The number of concurrent builds for parallel compilation
|
929 |
+
(requires the ``multiprocessing`` module).
|
930 |
+
|
931 |
+
:param aliases: If you want to use compiler directives like ``# distutils: ...`` but
|
932 |
+
can only know at compile time (when running the ``setup.py``) which values
|
933 |
+
to use, you can use aliases and pass a dictionary mapping those aliases
|
934 |
+
to Python strings when calling :func:`cythonize`. As an example, say you
|
935 |
+
want to use the compiler
|
936 |
+
directive ``# distutils: include_dirs = ../static_libs/include/``
|
937 |
+
but this path isn't always fixed and you want to find it when running
|
938 |
+
the ``setup.py``. You can then do ``# distutils: include_dirs = MY_HEADERS``,
|
939 |
+
find the value of ``MY_HEADERS`` in the ``setup.py``, put it in a python
|
940 |
+
variable called ``foo`` as a string, and then call
|
941 |
+
``cythonize(..., aliases={'MY_HEADERS': foo})``.
|
942 |
+
|
943 |
+
:param quiet: If True, Cython won't print error, warning, or status messages during the
|
944 |
+
compilation.
|
945 |
+
|
946 |
+
:param force: Forces the recompilation of the Cython modules, even if the timestamps
|
947 |
+
don't indicate that a recompilation is necessary.
|
948 |
+
|
949 |
+
:param language: To globally enable C++ mode, you can pass ``language='c++'``. Otherwise, this
|
950 |
+
will be determined at a per-file level based on compiler directives. This
|
951 |
+
affects only modules found based on file names. Extension instances passed
|
952 |
+
into :func:`cythonize` will not be changed. It is recommended to rather
|
953 |
+
use the compiler directive ``# distutils: language = c++`` than this option.
|
954 |
+
|
955 |
+
:param exclude_failures: For a broad 'try to compile' mode that ignores compilation
|
956 |
+
failures and simply excludes the failed extensions,
|
957 |
+
pass ``exclude_failures=True``. Note that this only
|
958 |
+
really makes sense for compiling ``.py`` files which can also
|
959 |
+
be used without compilation.
|
960 |
+
|
961 |
+
:param show_all_warnings: By default, not all Cython warnings are printed.
|
962 |
+
Set to true to show all warnings.
|
963 |
+
|
964 |
+
:param annotate: If ``True``, will produce a HTML file for each of the ``.pyx`` or ``.py``
|
965 |
+
files compiled. The HTML file gives an indication
|
966 |
+
of how much Python interaction there is in
|
967 |
+
each of the source code lines, compared to plain C code.
|
968 |
+
It also allows you to see the C/C++ code
|
969 |
+
generated for each line of Cython code. This report is invaluable when
|
970 |
+
optimizing a function for speed,
|
971 |
+
and for determining when to :ref:`release the GIL <nogil>`:
|
972 |
+
in general, a ``nogil`` block may contain only "white" code.
|
973 |
+
See examples in :ref:`determining_where_to_add_types` or
|
974 |
+
:ref:`primes`.
|
975 |
+
|
976 |
+
|
977 |
+
:param annotate-fullc: If ``True`` will produce a colorized HTML version of
|
978 |
+
the source which includes entire generated C/C++-code.
|
979 |
+
|
980 |
+
|
981 |
+
:param compiler_directives: Allow to set compiler directives in the ``setup.py`` like this:
|
982 |
+
``compiler_directives={'embedsignature': True}``.
|
983 |
+
See :ref:`compiler-directives`.
|
984 |
+
|
985 |
+
:param depfile: produce depfiles for the sources if True.
|
986 |
+
"""
|
987 |
+
if exclude is None:
|
988 |
+
exclude = []
|
989 |
+
if 'include_path' not in options:
|
990 |
+
options['include_path'] = ['.']
|
991 |
+
if 'common_utility_include_dir' in options:
|
992 |
+
safe_makedirs(options['common_utility_include_dir'])
|
993 |
+
|
994 |
+
depfile = options.pop('depfile', None)
|
995 |
+
|
996 |
+
if pythran is None:
|
997 |
+
pythran_options = None
|
998 |
+
else:
|
999 |
+
pythran_options = CompilationOptions(**options)
|
1000 |
+
pythran_options.cplus = True
|
1001 |
+
pythran_options.np_pythran = True
|
1002 |
+
|
1003 |
+
if force is None:
|
1004 |
+
force = os.environ.get("CYTHON_FORCE_REGEN") == "1" # allow global overrides for build systems
|
1005 |
+
|
1006 |
+
c_options = CompilationOptions(**options)
|
1007 |
+
cpp_options = CompilationOptions(**options); cpp_options.cplus = True
|
1008 |
+
ctx = Context.from_options(c_options)
|
1009 |
+
options = c_options
|
1010 |
+
module_list, module_metadata = create_extension_list(
|
1011 |
+
module_list,
|
1012 |
+
exclude=exclude,
|
1013 |
+
ctx=ctx,
|
1014 |
+
quiet=quiet,
|
1015 |
+
exclude_failures=exclude_failures,
|
1016 |
+
language=language,
|
1017 |
+
aliases=aliases)
|
1018 |
+
|
1019 |
+
fix_windows_unicode_modules(module_list)
|
1020 |
+
|
1021 |
+
deps = create_dependency_tree(ctx, quiet=quiet)
|
1022 |
+
build_dir = getattr(options, 'build_dir', None)
|
1023 |
+
|
1024 |
+
def copy_to_build_dir(filepath, root=os.getcwd()):
|
1025 |
+
filepath_abs = os.path.abspath(filepath)
|
1026 |
+
if os.path.isabs(filepath):
|
1027 |
+
filepath = filepath_abs
|
1028 |
+
if filepath_abs.startswith(root):
|
1029 |
+
# distutil extension depends are relative to cwd
|
1030 |
+
mod_dir = join_path(build_dir,
|
1031 |
+
os.path.dirname(_relpath(filepath, root)))
|
1032 |
+
copy_once_if_newer(filepath_abs, mod_dir)
|
1033 |
+
|
1034 |
+
modules_by_cfile = collections.defaultdict(list)
|
1035 |
+
to_compile = []
|
1036 |
+
for m in module_list:
|
1037 |
+
if build_dir:
|
1038 |
+
for dep in m.depends:
|
1039 |
+
copy_to_build_dir(dep)
|
1040 |
+
|
1041 |
+
cy_sources = [
|
1042 |
+
source for source in m.sources
|
1043 |
+
if os.path.splitext(source)[1] in ('.pyx', '.py')]
|
1044 |
+
if len(cy_sources) == 1:
|
1045 |
+
# normal "special" case: believe the Extension module name to allow user overrides
|
1046 |
+
full_module_name = m.name
|
1047 |
+
else:
|
1048 |
+
# infer FQMN from source files
|
1049 |
+
full_module_name = None
|
1050 |
+
|
1051 |
+
new_sources = []
|
1052 |
+
for source in m.sources:
|
1053 |
+
base, ext = os.path.splitext(source)
|
1054 |
+
if ext in ('.pyx', '.py'):
|
1055 |
+
if m.np_pythran:
|
1056 |
+
c_file = base + '.cpp'
|
1057 |
+
options = pythran_options
|
1058 |
+
elif m.language == 'c++':
|
1059 |
+
c_file = base + '.cpp'
|
1060 |
+
options = cpp_options
|
1061 |
+
else:
|
1062 |
+
c_file = base + '.c'
|
1063 |
+
options = c_options
|
1064 |
+
|
1065 |
+
# setup for out of place build directory if enabled
|
1066 |
+
if build_dir:
|
1067 |
+
if os.path.isabs(c_file):
|
1068 |
+
c_file = os.path.splitdrive(c_file)[1]
|
1069 |
+
c_file = c_file.split(os.sep, 1)[1]
|
1070 |
+
c_file = os.path.join(build_dir, c_file)
|
1071 |
+
dir = os.path.dirname(c_file)
|
1072 |
+
safe_makedirs_once(dir)
|
1073 |
+
|
1074 |
+
# write out the depfile, if requested
|
1075 |
+
if depfile:
|
1076 |
+
dependencies = deps.all_dependencies(source)
|
1077 |
+
write_depfile(c_file, source, dependencies)
|
1078 |
+
|
1079 |
+
# Missing files and those generated by other Cython versions should always be recreated.
|
1080 |
+
if Utils.file_generated_by_this_cython(c_file):
|
1081 |
+
c_timestamp = os.path.getmtime(c_file)
|
1082 |
+
else:
|
1083 |
+
c_timestamp = -1
|
1084 |
+
|
1085 |
+
# Priority goes first to modified files, second to direct
|
1086 |
+
# dependents, and finally to indirect dependents.
|
1087 |
+
if c_timestamp < deps.timestamp(source):
|
1088 |
+
dep_timestamp, dep = deps.timestamp(source), source
|
1089 |
+
priority = 0
|
1090 |
+
else:
|
1091 |
+
dep_timestamp, dep = deps.newest_dependency(source)
|
1092 |
+
priority = 2 - (dep in deps.immediate_dependencies(source))
|
1093 |
+
if force or c_timestamp < dep_timestamp:
|
1094 |
+
if not quiet and not force:
|
1095 |
+
if source == dep:
|
1096 |
+
print(u"Compiling %s because it changed." % Utils.decode_filename(source))
|
1097 |
+
else:
|
1098 |
+
print(u"Compiling %s because it depends on %s." % (
|
1099 |
+
Utils.decode_filename(source),
|
1100 |
+
Utils.decode_filename(dep),
|
1101 |
+
))
|
1102 |
+
if not force and options.cache:
|
1103 |
+
fingerprint = deps.transitive_fingerprint(source, m, options)
|
1104 |
+
else:
|
1105 |
+
fingerprint = None
|
1106 |
+
to_compile.append((
|
1107 |
+
priority, source, c_file, fingerprint, quiet,
|
1108 |
+
options, not exclude_failures, module_metadata.get(m.name),
|
1109 |
+
full_module_name, show_all_warnings))
|
1110 |
+
new_sources.append(c_file)
|
1111 |
+
modules_by_cfile[c_file].append(m)
|
1112 |
+
else:
|
1113 |
+
new_sources.append(source)
|
1114 |
+
if build_dir:
|
1115 |
+
copy_to_build_dir(source)
|
1116 |
+
m.sources = new_sources
|
1117 |
+
|
1118 |
+
if options.cache:
|
1119 |
+
if not os.path.exists(options.cache):
|
1120 |
+
os.makedirs(options.cache)
|
1121 |
+
to_compile.sort()
|
1122 |
+
# Drop "priority" component of "to_compile" entries and add a
|
1123 |
+
# simple progress indicator.
|
1124 |
+
N = len(to_compile)
|
1125 |
+
progress_fmt = "[{0:%d}/{1}] " % len(str(N))
|
1126 |
+
for i in range(N):
|
1127 |
+
progress = progress_fmt.format(i+1, N)
|
1128 |
+
to_compile[i] = to_compile[i][1:] + (progress,)
|
1129 |
+
|
1130 |
+
if N <= 1:
|
1131 |
+
nthreads = 0
|
1132 |
+
if nthreads:
|
1133 |
+
import multiprocessing
|
1134 |
+
pool = multiprocessing.Pool(
|
1135 |
+
nthreads, initializer=_init_multiprocessing_helper)
|
1136 |
+
# This is a bit more involved than it should be, because KeyboardInterrupts
|
1137 |
+
# break the multiprocessing workers when using a normal pool.map().
|
1138 |
+
# See, for example:
|
1139 |
+
# https://noswap.com/blog/python-multiprocessing-keyboardinterrupt
|
1140 |
+
try:
|
1141 |
+
result = pool.map_async(cythonize_one_helper, to_compile, chunksize=1)
|
1142 |
+
pool.close()
|
1143 |
+
while not result.ready():
|
1144 |
+
try:
|
1145 |
+
result.get(99999) # seconds
|
1146 |
+
except multiprocessing.TimeoutError:
|
1147 |
+
pass
|
1148 |
+
except KeyboardInterrupt:
|
1149 |
+
pool.terminate()
|
1150 |
+
raise
|
1151 |
+
pool.join()
|
1152 |
+
else:
|
1153 |
+
for args in to_compile:
|
1154 |
+
cythonize_one(*args)
|
1155 |
+
|
1156 |
+
if exclude_failures:
|
1157 |
+
failed_modules = set()
|
1158 |
+
for c_file, modules in modules_by_cfile.items():
|
1159 |
+
if not os.path.exists(c_file):
|
1160 |
+
failed_modules.update(modules)
|
1161 |
+
elif os.path.getsize(c_file) < 200:
|
1162 |
+
f = io_open(c_file, 'r', encoding='iso8859-1')
|
1163 |
+
try:
|
1164 |
+
if f.read(len('#error ')) == '#error ':
|
1165 |
+
# dead compilation result
|
1166 |
+
failed_modules.update(modules)
|
1167 |
+
finally:
|
1168 |
+
f.close()
|
1169 |
+
if failed_modules:
|
1170 |
+
for module in failed_modules:
|
1171 |
+
module_list.remove(module)
|
1172 |
+
print(u"Failed compilations: %s" % ', '.join(sorted([
|
1173 |
+
module.name for module in failed_modules])))
|
1174 |
+
|
1175 |
+
if options.cache:
|
1176 |
+
cleanup_cache(options.cache, getattr(options, 'cache_size', 1024 * 1024 * 100))
|
1177 |
+
# cythonize() is often followed by the (non-Python-buffered)
|
1178 |
+
# compiler output, flush now to avoid interleaving output.
|
1179 |
+
sys.stdout.flush()
|
1180 |
+
return module_list
|
1181 |
+
|
1182 |
+
|
1183 |
+
def fix_windows_unicode_modules(module_list):
|
1184 |
+
# Hack around a distutils 3.[5678] bug on Windows for unicode module names.
|
1185 |
+
# https://bugs.python.org/issue39432
|
1186 |
+
if sys.platform != "win32":
|
1187 |
+
return
|
1188 |
+
if sys.version_info < (3, 5) or sys.version_info >= (3, 8, 2):
|
1189 |
+
return
|
1190 |
+
|
1191 |
+
def make_filtered_list(ignored_symbol, old_entries):
|
1192 |
+
class FilteredExportSymbols(list):
|
1193 |
+
# export_symbols for unicode filename cause link errors on Windows
|
1194 |
+
# Cython doesn't need them (it already defines PyInit with the correct linkage)
|
1195 |
+
# so use this class as a temporary fix to stop them from being generated
|
1196 |
+
def __contains__(self, val):
|
1197 |
+
# so distutils doesn't "helpfully" add PyInit_<name>
|
1198 |
+
return val == ignored_symbol or list.__contains__(self, val)
|
1199 |
+
|
1200 |
+
filtered_list = FilteredExportSymbols(old_entries)
|
1201 |
+
if old_entries:
|
1202 |
+
filtered_list.extend(name for name in old_entries if name != ignored_symbol)
|
1203 |
+
return filtered_list
|
1204 |
+
|
1205 |
+
for m in module_list:
|
1206 |
+
# TODO: use m.name.isascii() in Py3.7+
|
1207 |
+
try:
|
1208 |
+
m.name.encode("ascii")
|
1209 |
+
continue
|
1210 |
+
except UnicodeEncodeError:
|
1211 |
+
pass
|
1212 |
+
m.export_symbols = make_filtered_list(
|
1213 |
+
"PyInit_" + m.name.rsplit(".", 1)[-1],
|
1214 |
+
m.export_symbols,
|
1215 |
+
)
|
1216 |
+
|
1217 |
+
|
1218 |
+
if os.environ.get('XML_RESULTS'):
|
1219 |
+
compile_result_dir = os.environ['XML_RESULTS']
|
1220 |
+
def record_results(func):
|
1221 |
+
def with_record(*args):
|
1222 |
+
t = time.time()
|
1223 |
+
success = True
|
1224 |
+
try:
|
1225 |
+
try:
|
1226 |
+
func(*args)
|
1227 |
+
except:
|
1228 |
+
success = False
|
1229 |
+
finally:
|
1230 |
+
t = time.time() - t
|
1231 |
+
module = fully_qualified_name(args[0])
|
1232 |
+
name = "cythonize." + module
|
1233 |
+
failures = 1 - success
|
1234 |
+
if success:
|
1235 |
+
failure_item = ""
|
1236 |
+
else:
|
1237 |
+
failure_item = "failure"
|
1238 |
+
output = open(os.path.join(compile_result_dir, name + ".xml"), "w")
|
1239 |
+
output.write("""
|
1240 |
+
<?xml version="1.0" ?>
|
1241 |
+
<testsuite name="%(name)s" errors="0" failures="%(failures)s" tests="1" time="%(t)s">
|
1242 |
+
<testcase classname="%(name)s" name="cythonize">
|
1243 |
+
%(failure_item)s
|
1244 |
+
</testcase>
|
1245 |
+
</testsuite>
|
1246 |
+
""".strip() % locals())
|
1247 |
+
output.close()
|
1248 |
+
return with_record
|
1249 |
+
else:
|
1250 |
+
def record_results(func):
|
1251 |
+
return func
|
1252 |
+
|
1253 |
+
|
1254 |
+
# TODO: Share context? Issue: pyx processing leaks into pxd module
|
1255 |
+
@record_results
|
1256 |
+
def cythonize_one(pyx_file, c_file, fingerprint, quiet, options=None,
|
1257 |
+
raise_on_failure=True, embedded_metadata=None,
|
1258 |
+
full_module_name=None, show_all_warnings=False,
|
1259 |
+
progress=""):
|
1260 |
+
from ..Compiler.Main import compile_single, default_options
|
1261 |
+
from ..Compiler.Errors import CompileError, PyrexError
|
1262 |
+
|
1263 |
+
if fingerprint:
|
1264 |
+
if not os.path.exists(options.cache):
|
1265 |
+
safe_makedirs(options.cache)
|
1266 |
+
# Cython-generated c files are highly compressible.
|
1267 |
+
# (E.g. a compression ratio of about 10 for Sage).
|
1268 |
+
fingerprint_file_base = join_path(
|
1269 |
+
options.cache, "%s-%s" % (os.path.basename(c_file), fingerprint))
|
1270 |
+
gz_fingerprint_file = fingerprint_file_base + gzip_ext
|
1271 |
+
zip_fingerprint_file = fingerprint_file_base + '.zip'
|
1272 |
+
if os.path.exists(gz_fingerprint_file) or os.path.exists(zip_fingerprint_file):
|
1273 |
+
if not quiet:
|
1274 |
+
print(u"%sFound compiled %s in cache" % (progress, pyx_file))
|
1275 |
+
if os.path.exists(gz_fingerprint_file):
|
1276 |
+
os.utime(gz_fingerprint_file, None)
|
1277 |
+
with contextlib.closing(gzip_open(gz_fingerprint_file, 'rb')) as g:
|
1278 |
+
with contextlib.closing(open(c_file, 'wb')) as f:
|
1279 |
+
shutil.copyfileobj(g, f)
|
1280 |
+
else:
|
1281 |
+
os.utime(zip_fingerprint_file, None)
|
1282 |
+
dirname = os.path.dirname(c_file)
|
1283 |
+
with contextlib.closing(zipfile.ZipFile(zip_fingerprint_file)) as z:
|
1284 |
+
for artifact in z.namelist():
|
1285 |
+
z.extract(artifact, os.path.join(dirname, artifact))
|
1286 |
+
return
|
1287 |
+
if not quiet:
|
1288 |
+
print(u"%sCythonizing %s" % (progress, Utils.decode_filename(pyx_file)))
|
1289 |
+
if options is None:
|
1290 |
+
options = CompilationOptions(default_options)
|
1291 |
+
options.output_file = c_file
|
1292 |
+
options.embedded_metadata = embedded_metadata
|
1293 |
+
|
1294 |
+
old_warning_level = Errors.LEVEL
|
1295 |
+
if show_all_warnings:
|
1296 |
+
Errors.LEVEL = 0
|
1297 |
+
|
1298 |
+
any_failures = 0
|
1299 |
+
try:
|
1300 |
+
result = compile_single(pyx_file, options, full_module_name=full_module_name)
|
1301 |
+
if result.num_errors > 0:
|
1302 |
+
any_failures = 1
|
1303 |
+
except (EnvironmentError, PyrexError) as e:
|
1304 |
+
sys.stderr.write('%s\n' % e)
|
1305 |
+
any_failures = 1
|
1306 |
+
# XXX
|
1307 |
+
import traceback
|
1308 |
+
traceback.print_exc()
|
1309 |
+
except Exception:
|
1310 |
+
if raise_on_failure:
|
1311 |
+
raise
|
1312 |
+
import traceback
|
1313 |
+
traceback.print_exc()
|
1314 |
+
any_failures = 1
|
1315 |
+
finally:
|
1316 |
+
if show_all_warnings:
|
1317 |
+
Errors.LEVEL = old_warning_level
|
1318 |
+
|
1319 |
+
if any_failures:
|
1320 |
+
if raise_on_failure:
|
1321 |
+
raise CompileError(None, pyx_file)
|
1322 |
+
elif os.path.exists(c_file):
|
1323 |
+
os.remove(c_file)
|
1324 |
+
elif fingerprint:
|
1325 |
+
artifacts = list(filter(None, [
|
1326 |
+
getattr(result, attr, None)
|
1327 |
+
for attr in ('c_file', 'h_file', 'api_file', 'i_file')]))
|
1328 |
+
if len(artifacts) == 1:
|
1329 |
+
fingerprint_file = gz_fingerprint_file
|
1330 |
+
with contextlib.closing(open(c_file, 'rb')) as f:
|
1331 |
+
with contextlib.closing(gzip_open(fingerprint_file + '.tmp', 'wb')) as g:
|
1332 |
+
shutil.copyfileobj(f, g)
|
1333 |
+
else:
|
1334 |
+
fingerprint_file = zip_fingerprint_file
|
1335 |
+
with contextlib.closing(zipfile.ZipFile(
|
1336 |
+
fingerprint_file + '.tmp', 'w', zipfile_compression_mode)) as zip:
|
1337 |
+
for artifact in artifacts:
|
1338 |
+
zip.write(artifact, os.path.basename(artifact))
|
1339 |
+
os.rename(fingerprint_file + '.tmp', fingerprint_file)
|
1340 |
+
|
1341 |
+
|
1342 |
+
def cythonize_one_helper(m):
|
1343 |
+
import traceback
|
1344 |
+
try:
|
1345 |
+
return cythonize_one(*m)
|
1346 |
+
except Exception:
|
1347 |
+
traceback.print_exc()
|
1348 |
+
raise
|
1349 |
+
|
1350 |
+
|
1351 |
+
def _init_multiprocessing_helper():
|
1352 |
+
# KeyboardInterrupt kills workers, so don't let them get it
|
1353 |
+
import signal
|
1354 |
+
signal.signal(signal.SIGINT, signal.SIG_IGN)
|
1355 |
+
|
1356 |
+
|
1357 |
+
def cleanup_cache(cache, target_size, ratio=.85):
|
1358 |
+
try:
|
1359 |
+
p = subprocess.Popen(['du', '-s', '-k', os.path.abspath(cache)], stdout=subprocess.PIPE)
|
1360 |
+
stdout, _ = p.communicate()
|
1361 |
+
res = p.wait()
|
1362 |
+
if res == 0:
|
1363 |
+
total_size = 1024 * int(stdout.strip().split()[0])
|
1364 |
+
if total_size < target_size:
|
1365 |
+
return
|
1366 |
+
except (OSError, ValueError):
|
1367 |
+
pass
|
1368 |
+
total_size = 0
|
1369 |
+
all = []
|
1370 |
+
for file in os.listdir(cache):
|
1371 |
+
path = join_path(cache, file)
|
1372 |
+
s = os.stat(path)
|
1373 |
+
total_size += s.st_size
|
1374 |
+
all.append((s.st_atime, s.st_size, path))
|
1375 |
+
if total_size > target_size:
|
1376 |
+
for time, size, file in reversed(sorted(all)):
|
1377 |
+
os.unlink(file)
|
1378 |
+
total_size -= size
|
1379 |
+
if total_size < target_size * ratio:
|
1380 |
+
break
|
Lib/site-packages/Cython/Build/Distutils.py
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
from Cython.Distutils.build_ext import build_ext
|
Lib/site-packages/Cython/Build/Inline.py
ADDED
@@ -0,0 +1,367 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from __future__ import absolute_import
|
2 |
+
|
3 |
+
import hashlib
|
4 |
+
import inspect
|
5 |
+
import os
|
6 |
+
import re
|
7 |
+
import sys
|
8 |
+
|
9 |
+
from distutils.core import Distribution, Extension
|
10 |
+
from distutils.command.build_ext import build_ext
|
11 |
+
|
12 |
+
import Cython
|
13 |
+
from ..Compiler.Main import Context
|
14 |
+
from ..Compiler.Options import (default_options, CompilationOptions,
|
15 |
+
get_directive_defaults)
|
16 |
+
|
17 |
+
from ..Compiler.Visitor import CythonTransform, EnvTransform
|
18 |
+
from ..Compiler.ParseTreeTransforms import SkipDeclarations
|
19 |
+
from ..Compiler.TreeFragment import parse_from_strings
|
20 |
+
from ..Compiler.StringEncoding import _unicode
|
21 |
+
from .Dependencies import strip_string_literals, cythonize, cached_function
|
22 |
+
from ..Compiler import Pipeline
|
23 |
+
from ..Utils import get_cython_cache_dir
|
24 |
+
import cython as cython_module
|
25 |
+
|
26 |
+
|
27 |
+
IS_PY3 = sys.version_info >= (3,)
|
28 |
+
|
29 |
+
# A utility function to convert user-supplied ASCII strings to unicode.
|
30 |
+
if not IS_PY3:
|
31 |
+
def to_unicode(s):
|
32 |
+
if isinstance(s, bytes):
|
33 |
+
return s.decode('ascii')
|
34 |
+
else:
|
35 |
+
return s
|
36 |
+
else:
|
37 |
+
to_unicode = lambda x: x
|
38 |
+
|
39 |
+
|
40 |
+
if sys.version_info < (3, 5):
|
41 |
+
import imp
|
42 |
+
def load_dynamic(name, module_path):
|
43 |
+
return imp.load_dynamic(name, module_path)
|
44 |
+
else:
|
45 |
+
import importlib.util
|
46 |
+
from importlib.machinery import ExtensionFileLoader
|
47 |
+
|
48 |
+
def load_dynamic(name, path):
|
49 |
+
spec = importlib.util.spec_from_file_location(name, loader=ExtensionFileLoader(name, path))
|
50 |
+
module = importlib.util.module_from_spec(spec)
|
51 |
+
spec.loader.exec_module(module)
|
52 |
+
return module
|
53 |
+
|
54 |
+
|
55 |
+
class UnboundSymbols(EnvTransform, SkipDeclarations):
|
56 |
+
def __init__(self):
|
57 |
+
super(EnvTransform, self).__init__(context=None)
|
58 |
+
self.unbound = set()
|
59 |
+
def visit_NameNode(self, node):
|
60 |
+
if not self.current_env().lookup(node.name):
|
61 |
+
self.unbound.add(node.name)
|
62 |
+
return node
|
63 |
+
def __call__(self, node):
|
64 |
+
super(UnboundSymbols, self).__call__(node)
|
65 |
+
return self.unbound
|
66 |
+
|
67 |
+
|
68 |
+
@cached_function
|
69 |
+
def unbound_symbols(code, context=None):
|
70 |
+
code = to_unicode(code)
|
71 |
+
if context is None:
|
72 |
+
context = Context([], get_directive_defaults(),
|
73 |
+
options=CompilationOptions(default_options))
|
74 |
+
from ..Compiler.ParseTreeTransforms import AnalyseDeclarationsTransform
|
75 |
+
tree = parse_from_strings('(tree fragment)', code)
|
76 |
+
for phase in Pipeline.create_pipeline(context, 'pyx'):
|
77 |
+
if phase is None:
|
78 |
+
continue
|
79 |
+
tree = phase(tree)
|
80 |
+
if isinstance(phase, AnalyseDeclarationsTransform):
|
81 |
+
break
|
82 |
+
try:
|
83 |
+
import builtins
|
84 |
+
except ImportError:
|
85 |
+
import __builtin__ as builtins
|
86 |
+
return tuple(UnboundSymbols()(tree) - set(dir(builtins)))
|
87 |
+
|
88 |
+
|
89 |
+
def unsafe_type(arg, context=None):
|
90 |
+
py_type = type(arg)
|
91 |
+
if py_type is int:
|
92 |
+
return 'long'
|
93 |
+
else:
|
94 |
+
return safe_type(arg, context)
|
95 |
+
|
96 |
+
|
97 |
+
def safe_type(arg, context=None):
|
98 |
+
py_type = type(arg)
|
99 |
+
if py_type in (list, tuple, dict, str):
|
100 |
+
return py_type.__name__
|
101 |
+
elif py_type is complex:
|
102 |
+
return 'double complex'
|
103 |
+
elif py_type is float:
|
104 |
+
return 'double'
|
105 |
+
elif py_type is bool:
|
106 |
+
return 'bint'
|
107 |
+
elif 'numpy' in sys.modules and isinstance(arg, sys.modules['numpy'].ndarray):
|
108 |
+
return 'numpy.ndarray[numpy.%s_t, ndim=%s]' % (arg.dtype.name, arg.ndim)
|
109 |
+
else:
|
110 |
+
for base_type in py_type.__mro__:
|
111 |
+
if base_type.__module__ in ('__builtin__', 'builtins'):
|
112 |
+
return 'object'
|
113 |
+
module = context.find_module(base_type.__module__, need_pxd=False)
|
114 |
+
if module:
|
115 |
+
entry = module.lookup(base_type.__name__)
|
116 |
+
if entry.is_type:
|
117 |
+
return '%s.%s' % (base_type.__module__, base_type.__name__)
|
118 |
+
return 'object'
|
119 |
+
|
120 |
+
|
121 |
+
def _get_build_extension():
|
122 |
+
dist = Distribution()
|
123 |
+
# Ensure the build respects distutils configuration by parsing
|
124 |
+
# the configuration files
|
125 |
+
config_files = dist.find_config_files()
|
126 |
+
dist.parse_config_files(config_files)
|
127 |
+
build_extension = build_ext(dist)
|
128 |
+
build_extension.finalize_options()
|
129 |
+
return build_extension
|
130 |
+
|
131 |
+
|
132 |
+
@cached_function
|
133 |
+
def _create_context(cython_include_dirs):
|
134 |
+
return Context(
|
135 |
+
list(cython_include_dirs),
|
136 |
+
get_directive_defaults(),
|
137 |
+
options=CompilationOptions(default_options)
|
138 |
+
)
|
139 |
+
|
140 |
+
|
141 |
+
_cython_inline_cache = {}
|
142 |
+
_cython_inline_default_context = _create_context(('.',))
|
143 |
+
|
144 |
+
|
145 |
+
def _populate_unbound(kwds, unbound_symbols, locals=None, globals=None):
|
146 |
+
for symbol in unbound_symbols:
|
147 |
+
if symbol not in kwds:
|
148 |
+
if locals is None or globals is None:
|
149 |
+
calling_frame = inspect.currentframe().f_back.f_back.f_back
|
150 |
+
if locals is None:
|
151 |
+
locals = calling_frame.f_locals
|
152 |
+
if globals is None:
|
153 |
+
globals = calling_frame.f_globals
|
154 |
+
if symbol in locals:
|
155 |
+
kwds[symbol] = locals[symbol]
|
156 |
+
elif symbol in globals:
|
157 |
+
kwds[symbol] = globals[symbol]
|
158 |
+
else:
|
159 |
+
print("Couldn't find %r" % symbol)
|
160 |
+
|
161 |
+
|
162 |
+
def _inline_key(orig_code, arg_sigs, language_level):
|
163 |
+
key = orig_code, arg_sigs, sys.version_info, sys.executable, language_level, Cython.__version__
|
164 |
+
return hashlib.sha1(_unicode(key).encode('utf-8')).hexdigest()
|
165 |
+
|
166 |
+
|
167 |
+
def cython_inline(code, get_type=unsafe_type,
|
168 |
+
lib_dir=os.path.join(get_cython_cache_dir(), 'inline'),
|
169 |
+
cython_include_dirs=None, cython_compiler_directives=None,
|
170 |
+
force=False, quiet=False, locals=None, globals=None, language_level=None, **kwds):
|
171 |
+
|
172 |
+
if get_type is None:
|
173 |
+
get_type = lambda x: 'object'
|
174 |
+
ctx = _create_context(tuple(cython_include_dirs)) if cython_include_dirs else _cython_inline_default_context
|
175 |
+
|
176 |
+
cython_compiler_directives = dict(cython_compiler_directives) if cython_compiler_directives else {}
|
177 |
+
if language_level is None and 'language_level' not in cython_compiler_directives:
|
178 |
+
language_level = '3str'
|
179 |
+
if language_level is not None:
|
180 |
+
cython_compiler_directives['language_level'] = language_level
|
181 |
+
|
182 |
+
key_hash = None
|
183 |
+
|
184 |
+
# Fast path if this has been called in this session.
|
185 |
+
_unbound_symbols = _cython_inline_cache.get(code)
|
186 |
+
if _unbound_symbols is not None:
|
187 |
+
_populate_unbound(kwds, _unbound_symbols, locals, globals)
|
188 |
+
args = sorted(kwds.items())
|
189 |
+
arg_sigs = tuple([(get_type(value, ctx), arg) for arg, value in args])
|
190 |
+
key_hash = _inline_key(code, arg_sigs, language_level)
|
191 |
+
invoke = _cython_inline_cache.get((code, arg_sigs, key_hash))
|
192 |
+
if invoke is not None:
|
193 |
+
arg_list = [arg[1] for arg in args]
|
194 |
+
return invoke(*arg_list)
|
195 |
+
|
196 |
+
orig_code = code
|
197 |
+
code = to_unicode(code)
|
198 |
+
code, literals = strip_string_literals(code)
|
199 |
+
code = strip_common_indent(code)
|
200 |
+
if locals is None:
|
201 |
+
locals = inspect.currentframe().f_back.f_back.f_locals
|
202 |
+
if globals is None:
|
203 |
+
globals = inspect.currentframe().f_back.f_back.f_globals
|
204 |
+
try:
|
205 |
+
_cython_inline_cache[orig_code] = _unbound_symbols = unbound_symbols(code)
|
206 |
+
_populate_unbound(kwds, _unbound_symbols, locals, globals)
|
207 |
+
except AssertionError:
|
208 |
+
if not quiet:
|
209 |
+
# Parsing from strings not fully supported (e.g. cimports).
|
210 |
+
print("Could not parse code as a string (to extract unbound symbols).")
|
211 |
+
|
212 |
+
cimports = []
|
213 |
+
for name, arg in list(kwds.items()):
|
214 |
+
if arg is cython_module:
|
215 |
+
cimports.append('\ncimport cython as %s' % name)
|
216 |
+
del kwds[name]
|
217 |
+
arg_names = sorted(kwds)
|
218 |
+
arg_sigs = tuple([(get_type(kwds[arg], ctx), arg) for arg in arg_names])
|
219 |
+
if key_hash is None:
|
220 |
+
key_hash = _inline_key(orig_code, arg_sigs, language_level)
|
221 |
+
module_name = "_cython_inline_" + key_hash
|
222 |
+
|
223 |
+
if module_name in sys.modules:
|
224 |
+
module = sys.modules[module_name]
|
225 |
+
|
226 |
+
else:
|
227 |
+
build_extension = None
|
228 |
+
if cython_inline.so_ext is None:
|
229 |
+
# Figure out and cache current extension suffix
|
230 |
+
build_extension = _get_build_extension()
|
231 |
+
cython_inline.so_ext = build_extension.get_ext_filename('')
|
232 |
+
|
233 |
+
lib_dir = os.path.abspath(lib_dir)
|
234 |
+
module_path = os.path.join(lib_dir, module_name + cython_inline.so_ext)
|
235 |
+
|
236 |
+
if not os.path.exists(lib_dir):
|
237 |
+
os.makedirs(lib_dir)
|
238 |
+
if force or not os.path.isfile(module_path):
|
239 |
+
cflags = []
|
240 |
+
define_macros = []
|
241 |
+
c_include_dirs = []
|
242 |
+
qualified = re.compile(r'([.\w]+)[.]')
|
243 |
+
for type, _ in arg_sigs:
|
244 |
+
m = qualified.match(type)
|
245 |
+
if m:
|
246 |
+
cimports.append('\ncimport %s' % m.groups()[0])
|
247 |
+
# one special case
|
248 |
+
if m.groups()[0] == 'numpy':
|
249 |
+
import numpy
|
250 |
+
c_include_dirs.append(numpy.get_include())
|
251 |
+
define_macros.append(("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION"))
|
252 |
+
# cflags.append('-Wno-unused')
|
253 |
+
module_body, func_body = extract_func_code(code)
|
254 |
+
params = ', '.join(['%s %s' % a for a in arg_sigs])
|
255 |
+
module_code = """
|
256 |
+
%(module_body)s
|
257 |
+
%(cimports)s
|
258 |
+
def __invoke(%(params)s):
|
259 |
+
%(func_body)s
|
260 |
+
return locals()
|
261 |
+
""" % {'cimports': '\n'.join(cimports),
|
262 |
+
'module_body': module_body,
|
263 |
+
'params': params,
|
264 |
+
'func_body': func_body }
|
265 |
+
for key, value in literals.items():
|
266 |
+
module_code = module_code.replace(key, value)
|
267 |
+
pyx_file = os.path.join(lib_dir, module_name + '.pyx')
|
268 |
+
fh = open(pyx_file, 'w')
|
269 |
+
try:
|
270 |
+
fh.write(module_code)
|
271 |
+
finally:
|
272 |
+
fh.close()
|
273 |
+
extension = Extension(
|
274 |
+
name=module_name,
|
275 |
+
sources=[pyx_file],
|
276 |
+
include_dirs=c_include_dirs or None,
|
277 |
+
extra_compile_args=cflags or None,
|
278 |
+
define_macros=define_macros or None,
|
279 |
+
)
|
280 |
+
if build_extension is None:
|
281 |
+
build_extension = _get_build_extension()
|
282 |
+
build_extension.extensions = cythonize(
|
283 |
+
[extension],
|
284 |
+
include_path=cython_include_dirs or ['.'],
|
285 |
+
compiler_directives=cython_compiler_directives,
|
286 |
+
quiet=quiet)
|
287 |
+
build_extension.build_temp = os.path.dirname(pyx_file)
|
288 |
+
build_extension.build_lib = lib_dir
|
289 |
+
build_extension.run()
|
290 |
+
|
291 |
+
if sys.platform == 'win32' and sys.version_info >= (3, 8):
|
292 |
+
with os.add_dll_directory(os.path.abspath(lib_dir)):
|
293 |
+
module = load_dynamic(module_name, module_path)
|
294 |
+
else:
|
295 |
+
module = load_dynamic(module_name, module_path)
|
296 |
+
|
297 |
+
_cython_inline_cache[orig_code, arg_sigs, key_hash] = module.__invoke
|
298 |
+
arg_list = [kwds[arg] for arg in arg_names]
|
299 |
+
return module.__invoke(*arg_list)
|
300 |
+
|
301 |
+
|
302 |
+
# Cached suffix used by cython_inline above. None should get
|
303 |
+
# overridden with actual value upon the first cython_inline invocation
|
304 |
+
cython_inline.so_ext = None
|
305 |
+
|
306 |
+
_find_non_space = re.compile('[^ ]').search
|
307 |
+
|
308 |
+
|
309 |
+
def strip_common_indent(code):
|
310 |
+
min_indent = None
|
311 |
+
lines = code.splitlines()
|
312 |
+
for line in lines:
|
313 |
+
match = _find_non_space(line)
|
314 |
+
if not match:
|
315 |
+
continue # blank
|
316 |
+
indent = match.start()
|
317 |
+
if line[indent] == '#':
|
318 |
+
continue # comment
|
319 |
+
if min_indent is None or min_indent > indent:
|
320 |
+
min_indent = indent
|
321 |
+
for ix, line in enumerate(lines):
|
322 |
+
match = _find_non_space(line)
|
323 |
+
if not match or not line or line[indent:indent+1] == '#':
|
324 |
+
continue
|
325 |
+
lines[ix] = line[min_indent:]
|
326 |
+
return '\n'.join(lines)
|
327 |
+
|
328 |
+
|
329 |
+
module_statement = re.compile(r'^((cdef +(extern|class))|cimport|(from .+ cimport)|(from .+ import +[*]))')
|
330 |
+
def extract_func_code(code):
|
331 |
+
module = []
|
332 |
+
function = []
|
333 |
+
current = function
|
334 |
+
code = code.replace('\t', ' ')
|
335 |
+
lines = code.split('\n')
|
336 |
+
for line in lines:
|
337 |
+
if not line.startswith(' '):
|
338 |
+
if module_statement.match(line):
|
339 |
+
current = module
|
340 |
+
else:
|
341 |
+
current = function
|
342 |
+
current.append(line)
|
343 |
+
return '\n'.join(module), ' ' + '\n '.join(function)
|
344 |
+
|
345 |
+
|
346 |
+
def get_body(source):
|
347 |
+
ix = source.index(':')
|
348 |
+
if source[:5] == 'lambda':
|
349 |
+
return "return %s" % source[ix+1:]
|
350 |
+
else:
|
351 |
+
return source[ix+1:]
|
352 |
+
|
353 |
+
|
354 |
+
# Lots to be done here... It would be especially cool if compiled functions
|
355 |
+
# could invoke each other quickly.
|
356 |
+
class RuntimeCompiledFunction(object):
|
357 |
+
|
358 |
+
def __init__(self, f):
|
359 |
+
self._f = f
|
360 |
+
self._body = get_body(inspect.getsource(f))
|
361 |
+
|
362 |
+
def __call__(self, *args, **kwds):
|
363 |
+
all = inspect.getcallargs(self._f, *args, **kwds)
|
364 |
+
if IS_PY3:
|
365 |
+
return cython_inline(self._body, locals=self._f.__globals__, globals=self._f.__globals__, **all)
|
366 |
+
else:
|
367 |
+
return cython_inline(self._body, locals=self._f.func_globals, globals=self._f.func_globals, **all)
|
Lib/site-packages/Cython/Build/IpythonMagic.py
ADDED
@@ -0,0 +1,572 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# -*- coding: utf-8 -*-
|
2 |
+
"""
|
3 |
+
=====================
|
4 |
+
Cython related magics
|
5 |
+
=====================
|
6 |
+
|
7 |
+
Magic command interface for interactive work with Cython
|
8 |
+
|
9 |
+
.. note::
|
10 |
+
|
11 |
+
The ``Cython`` package needs to be installed separately. It
|
12 |
+
can be obtained using ``easy_install`` or ``pip``.
|
13 |
+
|
14 |
+
Usage
|
15 |
+
=====
|
16 |
+
|
17 |
+
To enable the magics below, execute ``%load_ext cython``.
|
18 |
+
|
19 |
+
``%%cython``
|
20 |
+
|
21 |
+
{CYTHON_DOC}
|
22 |
+
|
23 |
+
``%%cython_inline``
|
24 |
+
|
25 |
+
{CYTHON_INLINE_DOC}
|
26 |
+
|
27 |
+
``%%cython_pyximport``
|
28 |
+
|
29 |
+
{CYTHON_PYXIMPORT_DOC}
|
30 |
+
|
31 |
+
Author:
|
32 |
+
* Brian Granger
|
33 |
+
|
34 |
+
Code moved from IPython and adapted by:
|
35 |
+
* Martín Gaitán
|
36 |
+
|
37 |
+
Parts of this code were taken from Cython.inline.
|
38 |
+
"""
|
39 |
+
#-----------------------------------------------------------------------------
|
40 |
+
# Copyright (C) 2010-2011, IPython Development Team.
|
41 |
+
#
|
42 |
+
# Distributed under the terms of the Modified BSD License.
|
43 |
+
#
|
44 |
+
# The full license is in the file ipython-COPYING.rst, distributed with this software.
|
45 |
+
#-----------------------------------------------------------------------------
|
46 |
+
|
47 |
+
from __future__ import absolute_import, print_function
|
48 |
+
|
49 |
+
import io
|
50 |
+
import os
|
51 |
+
import re
|
52 |
+
import sys
|
53 |
+
import time
|
54 |
+
import copy
|
55 |
+
import distutils.log
|
56 |
+
import textwrap
|
57 |
+
|
58 |
+
IO_ENCODING = sys.getfilesystemencoding()
|
59 |
+
IS_PY2 = sys.version_info[0] < 3
|
60 |
+
|
61 |
+
import hashlib
|
62 |
+
from distutils.core import Distribution, Extension
|
63 |
+
from distutils.command.build_ext import build_ext
|
64 |
+
|
65 |
+
from IPython.core import display
|
66 |
+
from IPython.core import magic_arguments
|
67 |
+
from IPython.core.magic import Magics, magics_class, cell_magic
|
68 |
+
try:
|
69 |
+
from IPython.paths import get_ipython_cache_dir
|
70 |
+
except ImportError:
|
71 |
+
# older IPython version
|
72 |
+
from IPython.utils.path import get_ipython_cache_dir
|
73 |
+
from IPython.utils.text import dedent
|
74 |
+
|
75 |
+
from ..Shadow import __version__ as cython_version
|
76 |
+
from ..Compiler.Errors import CompileError
|
77 |
+
from .Inline import cython_inline, load_dynamic
|
78 |
+
from .Dependencies import cythonize
|
79 |
+
from ..Utils import captured_fd, print_captured
|
80 |
+
|
81 |
+
|
82 |
+
PGO_CONFIG = {
|
83 |
+
'gcc': {
|
84 |
+
'gen': ['-fprofile-generate', '-fprofile-dir={TEMPDIR}'],
|
85 |
+
'use': ['-fprofile-use', '-fprofile-correction', '-fprofile-dir={TEMPDIR}'],
|
86 |
+
},
|
87 |
+
# blind copy from 'configure' script in CPython 3.7
|
88 |
+
'icc': {
|
89 |
+
'gen': ['-prof-gen'],
|
90 |
+
'use': ['-prof-use'],
|
91 |
+
}
|
92 |
+
}
|
93 |
+
PGO_CONFIG['mingw32'] = PGO_CONFIG['gcc']
|
94 |
+
|
95 |
+
|
96 |
+
if IS_PY2:
|
97 |
+
def encode_fs(name):
|
98 |
+
return name if isinstance(name, bytes) else name.encode(IO_ENCODING)
|
99 |
+
else:
|
100 |
+
def encode_fs(name):
|
101 |
+
return name
|
102 |
+
|
103 |
+
|
104 |
+
@magics_class
|
105 |
+
class CythonMagics(Magics):
|
106 |
+
|
107 |
+
def __init__(self, shell):
|
108 |
+
super(CythonMagics, self).__init__(shell)
|
109 |
+
self._reloads = {}
|
110 |
+
self._code_cache = {}
|
111 |
+
self._pyximport_installed = False
|
112 |
+
|
113 |
+
def _import_all(self, module):
|
114 |
+
mdict = module.__dict__
|
115 |
+
if '__all__' in mdict:
|
116 |
+
keys = mdict['__all__']
|
117 |
+
else:
|
118 |
+
keys = [k for k in mdict if not k.startswith('_')]
|
119 |
+
|
120 |
+
for k in keys:
|
121 |
+
try:
|
122 |
+
self.shell.push({k: mdict[k]})
|
123 |
+
except KeyError:
|
124 |
+
msg = "'module' object has no attribute '%s'" % k
|
125 |
+
raise AttributeError(msg)
|
126 |
+
|
127 |
+
@cell_magic
|
128 |
+
def cython_inline(self, line, cell):
|
129 |
+
"""Compile and run a Cython code cell using Cython.inline.
|
130 |
+
|
131 |
+
This magic simply passes the body of the cell to Cython.inline
|
132 |
+
and returns the result. If the variables `a` and `b` are defined
|
133 |
+
in the user's namespace, here is a simple example that returns
|
134 |
+
their sum::
|
135 |
+
|
136 |
+
%%cython_inline
|
137 |
+
return a+b
|
138 |
+
|
139 |
+
For most purposes, we recommend the usage of the `%%cython` magic.
|
140 |
+
"""
|
141 |
+
locs = self.shell.user_global_ns
|
142 |
+
globs = self.shell.user_ns
|
143 |
+
return cython_inline(cell, locals=locs, globals=globs)
|
144 |
+
|
145 |
+
@cell_magic
|
146 |
+
def cython_pyximport(self, line, cell):
|
147 |
+
"""Compile and import a Cython code cell using pyximport.
|
148 |
+
|
149 |
+
The contents of the cell are written to a `.pyx` file in the current
|
150 |
+
working directory, which is then imported using `pyximport`. This
|
151 |
+
magic requires a module name to be passed::
|
152 |
+
|
153 |
+
%%cython_pyximport modulename
|
154 |
+
def f(x):
|
155 |
+
return 2.0*x
|
156 |
+
|
157 |
+
The compiled module is then imported and all of its symbols are
|
158 |
+
injected into the user's namespace. For most purposes, we recommend
|
159 |
+
the usage of the `%%cython` magic.
|
160 |
+
"""
|
161 |
+
module_name = line.strip()
|
162 |
+
if not module_name:
|
163 |
+
raise ValueError('module name must be given')
|
164 |
+
fname = module_name + '.pyx'
|
165 |
+
with io.open(fname, 'w', encoding='utf-8') as f:
|
166 |
+
f.write(cell)
|
167 |
+
if 'pyximport' not in sys.modules or not self._pyximport_installed:
|
168 |
+
import pyximport
|
169 |
+
pyximport.install()
|
170 |
+
self._pyximport_installed = True
|
171 |
+
if module_name in self._reloads:
|
172 |
+
module = self._reloads[module_name]
|
173 |
+
# Note: reloading extension modules is not actually supported
|
174 |
+
# (requires PEP-489 reinitialisation support).
|
175 |
+
# Don't know why this should ever have worked as it reads here.
|
176 |
+
# All we really need to do is to update the globals below.
|
177 |
+
#reload(module)
|
178 |
+
else:
|
179 |
+
__import__(module_name)
|
180 |
+
module = sys.modules[module_name]
|
181 |
+
self._reloads[module_name] = module
|
182 |
+
self._import_all(module)
|
183 |
+
|
184 |
+
@magic_arguments.magic_arguments()
|
185 |
+
@magic_arguments.argument(
|
186 |
+
'-a', '--annotate', action='store_const', const='default', dest='annotate',
|
187 |
+
help="Produce a colorized HTML version of the source."
|
188 |
+
)
|
189 |
+
@magic_arguments.argument(
|
190 |
+
'--annotate-fullc', action='store_const', const='fullc', dest='annotate',
|
191 |
+
help="Produce a colorized HTML version of the source "
|
192 |
+
"which includes entire generated C/C++-code."
|
193 |
+
)
|
194 |
+
@magic_arguments.argument(
|
195 |
+
'-+', '--cplus', action='store_true', default=False,
|
196 |
+
help="Output a C++ rather than C file."
|
197 |
+
)
|
198 |
+
@magic_arguments.argument(
|
199 |
+
'-3', dest='language_level', action='store_const', const=3, default=None,
|
200 |
+
help="Select Python 3 syntax."
|
201 |
+
)
|
202 |
+
@magic_arguments.argument(
|
203 |
+
'-2', dest='language_level', action='store_const', const=2, default=None,
|
204 |
+
help="Select Python 2 syntax."
|
205 |
+
)
|
206 |
+
@magic_arguments.argument(
|
207 |
+
'-f', '--force', action='store_true', default=False,
|
208 |
+
help="Force the compilation of a new module, even if the source has been "
|
209 |
+
"previously compiled."
|
210 |
+
)
|
211 |
+
@magic_arguments.argument(
|
212 |
+
'-c', '--compile-args', action='append', default=[],
|
213 |
+
help="Extra flags to pass to compiler via the `extra_compile_args` "
|
214 |
+
"Extension flag (can be specified multiple times)."
|
215 |
+
)
|
216 |
+
@magic_arguments.argument(
|
217 |
+
'--link-args', action='append', default=[],
|
218 |
+
help="Extra flags to pass to linker via the `extra_link_args` "
|
219 |
+
"Extension flag (can be specified multiple times)."
|
220 |
+
)
|
221 |
+
@magic_arguments.argument(
|
222 |
+
'-l', '--lib', action='append', default=[],
|
223 |
+
help="Add a library to link the extension against (can be specified "
|
224 |
+
"multiple times)."
|
225 |
+
)
|
226 |
+
@magic_arguments.argument(
|
227 |
+
'-n', '--name',
|
228 |
+
help="Specify a name for the Cython module."
|
229 |
+
)
|
230 |
+
@magic_arguments.argument(
|
231 |
+
'-L', dest='library_dirs', metavar='dir', action='append', default=[],
|
232 |
+
help="Add a path to the list of library directories (can be specified "
|
233 |
+
"multiple times)."
|
234 |
+
)
|
235 |
+
@magic_arguments.argument(
|
236 |
+
'-I', '--include', action='append', default=[],
|
237 |
+
help="Add a path to the list of include directories (can be specified "
|
238 |
+
"multiple times)."
|
239 |
+
)
|
240 |
+
@magic_arguments.argument(
|
241 |
+
'-S', '--src', action='append', default=[],
|
242 |
+
help="Add a path to the list of src files (can be specified "
|
243 |
+
"multiple times)."
|
244 |
+
)
|
245 |
+
@magic_arguments.argument(
|
246 |
+
'--pgo', dest='pgo', action='store_true', default=False,
|
247 |
+
help=("Enable profile guided optimisation in the C compiler. "
|
248 |
+
"Compiles the cell twice and executes it in between to generate a runtime profile.")
|
249 |
+
)
|
250 |
+
@magic_arguments.argument(
|
251 |
+
'--verbose', dest='quiet', action='store_false', default=True,
|
252 |
+
help=("Print debug information like generated .c/.cpp file location "
|
253 |
+
"and exact gcc/g++ command invoked.")
|
254 |
+
)
|
255 |
+
@cell_magic
|
256 |
+
def cython(self, line, cell):
|
257 |
+
"""Compile and import everything from a Cython code cell.
|
258 |
+
|
259 |
+
The contents of the cell are written to a `.pyx` file in the
|
260 |
+
directory `IPYTHONDIR/cython` using a filename with the hash of the
|
261 |
+
code. This file is then cythonized and compiled. The resulting module
|
262 |
+
is imported and all of its symbols are injected into the user's
|
263 |
+
namespace. The usage is similar to that of `%%cython_pyximport` but
|
264 |
+
you don't have to pass a module name::
|
265 |
+
|
266 |
+
%%cython
|
267 |
+
def f(x):
|
268 |
+
return 2.0*x
|
269 |
+
|
270 |
+
To compile OpenMP codes, pass the required `--compile-args`
|
271 |
+
and `--link-args`. For example with gcc::
|
272 |
+
|
273 |
+
%%cython --compile-args=-fopenmp --link-args=-fopenmp
|
274 |
+
...
|
275 |
+
|
276 |
+
To enable profile guided optimisation, pass the ``--pgo`` option.
|
277 |
+
Note that the cell itself needs to take care of establishing a suitable
|
278 |
+
profile when executed. This can be done by implementing the functions to
|
279 |
+
optimise, and then calling them directly in the same cell on some realistic
|
280 |
+
training data like this::
|
281 |
+
|
282 |
+
%%cython --pgo
|
283 |
+
def critical_function(data):
|
284 |
+
for item in data:
|
285 |
+
...
|
286 |
+
|
287 |
+
# execute function several times to build profile
|
288 |
+
from somewhere import some_typical_data
|
289 |
+
for _ in range(100):
|
290 |
+
critical_function(some_typical_data)
|
291 |
+
|
292 |
+
In Python 3.5 and later, you can distinguish between the profile and
|
293 |
+
non-profile runs as follows::
|
294 |
+
|
295 |
+
if "_pgo_" in __name__:
|
296 |
+
... # execute critical code here
|
297 |
+
"""
|
298 |
+
args = magic_arguments.parse_argstring(self.cython, line)
|
299 |
+
code = cell if cell.endswith('\n') else cell + '\n'
|
300 |
+
lib_dir = os.path.join(get_ipython_cache_dir(), 'cython')
|
301 |
+
key = (code, line, sys.version_info, sys.executable, cython_version)
|
302 |
+
|
303 |
+
if not os.path.exists(lib_dir):
|
304 |
+
os.makedirs(lib_dir)
|
305 |
+
|
306 |
+
if args.pgo:
|
307 |
+
key += ('pgo',)
|
308 |
+
if args.force:
|
309 |
+
# Force a new module name by adding the current time to the
|
310 |
+
# key which is hashed to determine the module name.
|
311 |
+
key += (time.time(),)
|
312 |
+
|
313 |
+
if args.name:
|
314 |
+
module_name = str(args.name) # no-op in Py3
|
315 |
+
else:
|
316 |
+
module_name = "_cython_magic_" + hashlib.sha1(str(key).encode('utf-8')).hexdigest()
|
317 |
+
html_file = os.path.join(lib_dir, module_name + '.html')
|
318 |
+
module_path = os.path.join(lib_dir, module_name + self.so_ext)
|
319 |
+
|
320 |
+
have_module = os.path.isfile(module_path)
|
321 |
+
need_cythonize = args.pgo or not have_module
|
322 |
+
|
323 |
+
if args.annotate:
|
324 |
+
if not os.path.isfile(html_file):
|
325 |
+
need_cythonize = True
|
326 |
+
|
327 |
+
extension = None
|
328 |
+
if need_cythonize:
|
329 |
+
extensions = self._cythonize(module_name, code, lib_dir, args, quiet=args.quiet)
|
330 |
+
if extensions is None:
|
331 |
+
# Compilation failed and printed error message
|
332 |
+
return None
|
333 |
+
assert len(extensions) == 1
|
334 |
+
extension = extensions[0]
|
335 |
+
self._code_cache[key] = module_name
|
336 |
+
|
337 |
+
if args.pgo:
|
338 |
+
self._profile_pgo_wrapper(extension, lib_dir)
|
339 |
+
|
340 |
+
def print_compiler_output(stdout, stderr, where):
|
341 |
+
# On windows, errors are printed to stdout, we redirect both to sys.stderr.
|
342 |
+
print_captured(stdout, where, u"Content of stdout:\n")
|
343 |
+
print_captured(stderr, where, u"Content of stderr:\n")
|
344 |
+
|
345 |
+
get_stderr = get_stdout = None
|
346 |
+
try:
|
347 |
+
with captured_fd(1) as get_stdout:
|
348 |
+
with captured_fd(2) as get_stderr:
|
349 |
+
self._build_extension(
|
350 |
+
extension, lib_dir, pgo_step_name='use' if args.pgo else None, quiet=args.quiet)
|
351 |
+
except (distutils.errors.CompileError, distutils.errors.LinkError):
|
352 |
+
# Build failed, print error message from compiler/linker
|
353 |
+
print_compiler_output(get_stdout(), get_stderr(), sys.stderr)
|
354 |
+
return None
|
355 |
+
|
356 |
+
# Build seems ok, but we might still want to show any warnings that occurred
|
357 |
+
print_compiler_output(get_stdout(), get_stderr(), sys.stdout)
|
358 |
+
|
359 |
+
module = load_dynamic(module_name, module_path)
|
360 |
+
self._import_all(module)
|
361 |
+
|
362 |
+
if args.annotate:
|
363 |
+
try:
|
364 |
+
with io.open(html_file, encoding='utf-8') as f:
|
365 |
+
annotated_html = f.read()
|
366 |
+
except IOError as e:
|
367 |
+
# File could not be opened. Most likely the user has a version
|
368 |
+
# of Cython before 0.15.1 (when `cythonize` learned the
|
369 |
+
# `force` keyword argument) and has already compiled this
|
370 |
+
# exact source without annotation.
|
371 |
+
print('Cython completed successfully but the annotated '
|
372 |
+
'source could not be read.', file=sys.stderr)
|
373 |
+
print(e, file=sys.stderr)
|
374 |
+
else:
|
375 |
+
return display.HTML(self.clean_annotated_html(annotated_html))
|
376 |
+
|
377 |
+
def _profile_pgo_wrapper(self, extension, lib_dir):
|
378 |
+
"""
|
379 |
+
Generate a .c file for a separate extension module that calls the
|
380 |
+
module init function of the original module. This makes sure that the
|
381 |
+
PGO profiler sees the correct .o file of the final module, but it still
|
382 |
+
allows us to import the module under a different name for profiling,
|
383 |
+
before recompiling it into the PGO optimised module. Overwriting and
|
384 |
+
reimporting the same shared library is not portable.
|
385 |
+
"""
|
386 |
+
extension = copy.copy(extension) # shallow copy, do not modify sources in place!
|
387 |
+
module_name = extension.name
|
388 |
+
pgo_module_name = '_pgo_' + module_name
|
389 |
+
pgo_wrapper_c_file = os.path.join(lib_dir, pgo_module_name + '.c')
|
390 |
+
with io.open(pgo_wrapper_c_file, 'w', encoding='utf-8') as f:
|
391 |
+
f.write(textwrap.dedent(u"""
|
392 |
+
#include "Python.h"
|
393 |
+
#if PY_MAJOR_VERSION < 3
|
394 |
+
extern PyMODINIT_FUNC init%(module_name)s(void);
|
395 |
+
PyMODINIT_FUNC init%(pgo_module_name)s(void); /*proto*/
|
396 |
+
PyMODINIT_FUNC init%(pgo_module_name)s(void) {
|
397 |
+
PyObject *sys_modules;
|
398 |
+
init%(module_name)s(); if (PyErr_Occurred()) return;
|
399 |
+
sys_modules = PyImport_GetModuleDict(); /* borrowed, no exception, "never" fails */
|
400 |
+
if (sys_modules) {
|
401 |
+
PyObject *module = PyDict_GetItemString(sys_modules, "%(module_name)s"); if (!module) return;
|
402 |
+
PyDict_SetItemString(sys_modules, "%(pgo_module_name)s", module);
|
403 |
+
Py_DECREF(module);
|
404 |
+
}
|
405 |
+
}
|
406 |
+
#else
|
407 |
+
extern PyMODINIT_FUNC PyInit_%(module_name)s(void);
|
408 |
+
PyMODINIT_FUNC PyInit_%(pgo_module_name)s(void); /*proto*/
|
409 |
+
PyMODINIT_FUNC PyInit_%(pgo_module_name)s(void) {
|
410 |
+
return PyInit_%(module_name)s();
|
411 |
+
}
|
412 |
+
#endif
|
413 |
+
""" % {'module_name': module_name, 'pgo_module_name': pgo_module_name}))
|
414 |
+
|
415 |
+
extension.sources = extension.sources + [pgo_wrapper_c_file] # do not modify in place!
|
416 |
+
extension.name = pgo_module_name
|
417 |
+
|
418 |
+
self._build_extension(extension, lib_dir, pgo_step_name='gen')
|
419 |
+
|
420 |
+
# import and execute module code to generate profile
|
421 |
+
so_module_path = os.path.join(lib_dir, pgo_module_name + self.so_ext)
|
422 |
+
load_dynamic(pgo_module_name, so_module_path)
|
423 |
+
|
424 |
+
def _cythonize(self, module_name, code, lib_dir, args, quiet=True):
|
425 |
+
pyx_file = os.path.join(lib_dir, module_name + '.pyx')
|
426 |
+
pyx_file = encode_fs(pyx_file)
|
427 |
+
|
428 |
+
c_include_dirs = args.include
|
429 |
+
c_src_files = list(map(str, args.src))
|
430 |
+
if 'numpy' in code:
|
431 |
+
import numpy
|
432 |
+
c_include_dirs.append(numpy.get_include())
|
433 |
+
with io.open(pyx_file, 'w', encoding='utf-8') as f:
|
434 |
+
f.write(code)
|
435 |
+
extension = Extension(
|
436 |
+
name=module_name,
|
437 |
+
sources=[pyx_file] + c_src_files,
|
438 |
+
include_dirs=c_include_dirs,
|
439 |
+
library_dirs=args.library_dirs,
|
440 |
+
extra_compile_args=args.compile_args,
|
441 |
+
extra_link_args=args.link_args,
|
442 |
+
libraries=args.lib,
|
443 |
+
language='c++' if args.cplus else 'c',
|
444 |
+
)
|
445 |
+
try:
|
446 |
+
opts = dict(
|
447 |
+
quiet=quiet,
|
448 |
+
annotate=args.annotate,
|
449 |
+
force=True,
|
450 |
+
language_level=min(3, sys.version_info[0]),
|
451 |
+
)
|
452 |
+
if args.language_level is not None:
|
453 |
+
assert args.language_level in (2, 3)
|
454 |
+
opts['language_level'] = args.language_level
|
455 |
+
return cythonize([extension], **opts)
|
456 |
+
except CompileError:
|
457 |
+
return None
|
458 |
+
|
459 |
+
def _build_extension(self, extension, lib_dir, temp_dir=None, pgo_step_name=None, quiet=True):
|
460 |
+
build_extension = self._get_build_extension(
|
461 |
+
extension, lib_dir=lib_dir, temp_dir=temp_dir, pgo_step_name=pgo_step_name)
|
462 |
+
old_threshold = None
|
463 |
+
try:
|
464 |
+
if not quiet:
|
465 |
+
old_threshold = distutils.log.set_threshold(distutils.log.DEBUG)
|
466 |
+
build_extension.run()
|
467 |
+
finally:
|
468 |
+
if not quiet and old_threshold is not None:
|
469 |
+
distutils.log.set_threshold(old_threshold)
|
470 |
+
|
471 |
+
def _add_pgo_flags(self, build_extension, step_name, temp_dir):
|
472 |
+
compiler_type = build_extension.compiler.compiler_type
|
473 |
+
if compiler_type == 'unix':
|
474 |
+
compiler_cmd = build_extension.compiler.compiler_so
|
475 |
+
# TODO: we could try to call "[cmd] --version" for better insights
|
476 |
+
if not compiler_cmd:
|
477 |
+
pass
|
478 |
+
elif 'clang' in compiler_cmd or 'clang' in compiler_cmd[0]:
|
479 |
+
compiler_type = 'clang'
|
480 |
+
elif 'icc' in compiler_cmd or 'icc' in compiler_cmd[0]:
|
481 |
+
compiler_type = 'icc'
|
482 |
+
elif 'gcc' in compiler_cmd or 'gcc' in compiler_cmd[0]:
|
483 |
+
compiler_type = 'gcc'
|
484 |
+
elif 'g++' in compiler_cmd or 'g++' in compiler_cmd[0]:
|
485 |
+
compiler_type = 'gcc'
|
486 |
+
config = PGO_CONFIG.get(compiler_type)
|
487 |
+
orig_flags = []
|
488 |
+
if config and step_name in config:
|
489 |
+
flags = [f.format(TEMPDIR=temp_dir) for f in config[step_name]]
|
490 |
+
for extension in build_extension.extensions:
|
491 |
+
orig_flags.append((extension.extra_compile_args, extension.extra_link_args))
|
492 |
+
extension.extra_compile_args = extension.extra_compile_args + flags
|
493 |
+
extension.extra_link_args = extension.extra_link_args + flags
|
494 |
+
else:
|
495 |
+
print("No PGO %s configuration known for C compiler type '%s'" % (step_name, compiler_type),
|
496 |
+
file=sys.stderr)
|
497 |
+
return orig_flags
|
498 |
+
|
499 |
+
@property
|
500 |
+
def so_ext(self):
|
501 |
+
"""The extension suffix for compiled modules."""
|
502 |
+
try:
|
503 |
+
return self._so_ext
|
504 |
+
except AttributeError:
|
505 |
+
self._so_ext = self._get_build_extension().get_ext_filename('')
|
506 |
+
return self._so_ext
|
507 |
+
|
508 |
+
def _clear_distutils_mkpath_cache(self):
|
509 |
+
"""clear distutils mkpath cache
|
510 |
+
|
511 |
+
prevents distutils from skipping re-creation of dirs that have been removed
|
512 |
+
"""
|
513 |
+
try:
|
514 |
+
from distutils.dir_util import _path_created
|
515 |
+
except ImportError:
|
516 |
+
pass
|
517 |
+
else:
|
518 |
+
_path_created.clear()
|
519 |
+
|
520 |
+
def _get_build_extension(self, extension=None, lib_dir=None, temp_dir=None,
|
521 |
+
pgo_step_name=None, _build_ext=build_ext):
|
522 |
+
self._clear_distutils_mkpath_cache()
|
523 |
+
dist = Distribution()
|
524 |
+
config_files = dist.find_config_files()
|
525 |
+
try:
|
526 |
+
config_files.remove('setup.cfg')
|
527 |
+
except ValueError:
|
528 |
+
pass
|
529 |
+
dist.parse_config_files(config_files)
|
530 |
+
|
531 |
+
if not temp_dir:
|
532 |
+
temp_dir = lib_dir
|
533 |
+
add_pgo_flags = self._add_pgo_flags
|
534 |
+
|
535 |
+
if pgo_step_name:
|
536 |
+
base_build_ext = _build_ext
|
537 |
+
class _build_ext(_build_ext):
|
538 |
+
def build_extensions(self):
|
539 |
+
add_pgo_flags(self, pgo_step_name, temp_dir)
|
540 |
+
base_build_ext.build_extensions(self)
|
541 |
+
|
542 |
+
build_extension = _build_ext(dist)
|
543 |
+
build_extension.finalize_options()
|
544 |
+
if temp_dir:
|
545 |
+
temp_dir = encode_fs(temp_dir)
|
546 |
+
build_extension.build_temp = temp_dir
|
547 |
+
if lib_dir:
|
548 |
+
lib_dir = encode_fs(lib_dir)
|
549 |
+
build_extension.build_lib = lib_dir
|
550 |
+
if extension is not None:
|
551 |
+
build_extension.extensions = [extension]
|
552 |
+
return build_extension
|
553 |
+
|
554 |
+
@staticmethod
|
555 |
+
def clean_annotated_html(html):
|
556 |
+
"""Clean up the annotated HTML source.
|
557 |
+
|
558 |
+
Strips the link to the generated C or C++ file, which we do not
|
559 |
+
present to the user.
|
560 |
+
"""
|
561 |
+
r = re.compile('<p>Raw output: <a href="(.*)">(.*)</a>')
|
562 |
+
html = '\n'.join(l for l in html.splitlines() if not r.match(l))
|
563 |
+
return html
|
564 |
+
|
565 |
+
__doc__ = __doc__.format(
|
566 |
+
# rST doesn't see the -+ flag as part of an option list, so we
|
567 |
+
# hide it from the module-level docstring.
|
568 |
+
CYTHON_DOC=dedent(CythonMagics.cython.__doc__\
|
569 |
+
.replace('-+, --cplus', '--cplus ')),
|
570 |
+
CYTHON_INLINE_DOC=dedent(CythonMagics.cython_inline.__doc__),
|
571 |
+
CYTHON_PYXIMPORT_DOC=dedent(CythonMagics.cython_pyximport.__doc__),
|
572 |
+
)
|
Lib/site-packages/Cython/Build/Tests/TestCyCache.py
ADDED
@@ -0,0 +1,119 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import difflib
|
2 |
+
import glob
|
3 |
+
import gzip
|
4 |
+
import os
|
5 |
+
import sys
|
6 |
+
import tempfile
|
7 |
+
import unittest
|
8 |
+
|
9 |
+
import Cython.Build.Dependencies
|
10 |
+
import Cython.Utils
|
11 |
+
from Cython.TestUtils import CythonTest
|
12 |
+
|
13 |
+
|
14 |
+
class TestCyCache(CythonTest):
|
15 |
+
|
16 |
+
def setUp(self):
|
17 |
+
CythonTest.setUp(self)
|
18 |
+
self.temp_dir = tempfile.mkdtemp(
|
19 |
+
prefix='cycache-test',
|
20 |
+
dir='TEST_TMP' if os.path.isdir('TEST_TMP') else None)
|
21 |
+
self.src_dir = tempfile.mkdtemp(prefix='src', dir=self.temp_dir)
|
22 |
+
self.cache_dir = tempfile.mkdtemp(prefix='cache', dir=self.temp_dir)
|
23 |
+
|
24 |
+
def cache_files(self, file_glob):
|
25 |
+
return glob.glob(os.path.join(self.cache_dir, file_glob))
|
26 |
+
|
27 |
+
def fresh_cythonize(self, *args, **kwargs):
|
28 |
+
Cython.Utils.clear_function_caches()
|
29 |
+
Cython.Build.Dependencies._dep_tree = None # discard method caches
|
30 |
+
Cython.Build.Dependencies.cythonize(*args, **kwargs)
|
31 |
+
|
32 |
+
def test_cycache_switch(self):
|
33 |
+
content1 = 'value = 1\n'
|
34 |
+
content2 = 'value = 2\n'
|
35 |
+
a_pyx = os.path.join(self.src_dir, 'a.pyx')
|
36 |
+
a_c = a_pyx[:-4] + '.c'
|
37 |
+
|
38 |
+
with open(a_pyx, 'w') as f:
|
39 |
+
f.write(content1)
|
40 |
+
self.fresh_cythonize(a_pyx, cache=self.cache_dir)
|
41 |
+
self.fresh_cythonize(a_pyx, cache=self.cache_dir)
|
42 |
+
self.assertEqual(1, len(self.cache_files('a.c*')))
|
43 |
+
with open(a_c) as f:
|
44 |
+
a_contents1 = f.read()
|
45 |
+
os.unlink(a_c)
|
46 |
+
|
47 |
+
with open(a_pyx, 'w') as f:
|
48 |
+
f.write(content2)
|
49 |
+
self.fresh_cythonize(a_pyx, cache=self.cache_dir)
|
50 |
+
with open(a_c) as f:
|
51 |
+
a_contents2 = f.read()
|
52 |
+
os.unlink(a_c)
|
53 |
+
|
54 |
+
self.assertNotEqual(a_contents1, a_contents2, 'C file not changed!')
|
55 |
+
self.assertEqual(2, len(self.cache_files('a.c*')))
|
56 |
+
|
57 |
+
with open(a_pyx, 'w') as f:
|
58 |
+
f.write(content1)
|
59 |
+
self.fresh_cythonize(a_pyx, cache=self.cache_dir)
|
60 |
+
self.assertEqual(2, len(self.cache_files('a.c*')))
|
61 |
+
with open(a_c) as f:
|
62 |
+
a_contents = f.read()
|
63 |
+
self.assertEqual(
|
64 |
+
a_contents, a_contents1,
|
65 |
+
msg='\n'.join(list(difflib.unified_diff(
|
66 |
+
a_contents.split('\n'), a_contents1.split('\n')))[:10]))
|
67 |
+
|
68 |
+
def test_cycache_uses_cache(self):
|
69 |
+
a_pyx = os.path.join(self.src_dir, 'a.pyx')
|
70 |
+
a_c = a_pyx[:-4] + '.c'
|
71 |
+
with open(a_pyx, 'w') as f:
|
72 |
+
f.write('pass')
|
73 |
+
self.fresh_cythonize(a_pyx, cache=self.cache_dir)
|
74 |
+
a_cache = os.path.join(self.cache_dir, os.listdir(self.cache_dir)[0])
|
75 |
+
with gzip.GzipFile(a_cache, 'wb') as gzipfile:
|
76 |
+
gzipfile.write('fake stuff'.encode('ascii'))
|
77 |
+
os.unlink(a_c)
|
78 |
+
self.fresh_cythonize(a_pyx, cache=self.cache_dir)
|
79 |
+
with open(a_c) as f:
|
80 |
+
a_contents = f.read()
|
81 |
+
self.assertEqual(a_contents, 'fake stuff',
|
82 |
+
'Unexpected contents: %s...' % a_contents[:100])
|
83 |
+
|
84 |
+
def test_multi_file_output(self):
|
85 |
+
a_pyx = os.path.join(self.src_dir, 'a.pyx')
|
86 |
+
a_c = a_pyx[:-4] + '.c'
|
87 |
+
a_h = a_pyx[:-4] + '.h'
|
88 |
+
a_api_h = a_pyx[:-4] + '_api.h'
|
89 |
+
with open(a_pyx, 'w') as f:
|
90 |
+
f.write('cdef public api int foo(int x): return x\n')
|
91 |
+
self.fresh_cythonize(a_pyx, cache=self.cache_dir)
|
92 |
+
expected = [a_c, a_h, a_api_h]
|
93 |
+
for output in expected:
|
94 |
+
self.assertTrue(os.path.exists(output), output)
|
95 |
+
os.unlink(output)
|
96 |
+
self.fresh_cythonize(a_pyx, cache=self.cache_dir)
|
97 |
+
for output in expected:
|
98 |
+
self.assertTrue(os.path.exists(output), output)
|
99 |
+
|
100 |
+
def test_options_invalidation(self):
|
101 |
+
hash_pyx = os.path.join(self.src_dir, 'options.pyx')
|
102 |
+
hash_c = hash_pyx[:-len('.pyx')] + '.c'
|
103 |
+
|
104 |
+
with open(hash_pyx, 'w') as f:
|
105 |
+
f.write('pass')
|
106 |
+
self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False)
|
107 |
+
self.assertEqual(1, len(self.cache_files('options.c*')))
|
108 |
+
|
109 |
+
os.unlink(hash_c)
|
110 |
+
self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=True)
|
111 |
+
self.assertEqual(2, len(self.cache_files('options.c*')))
|
112 |
+
|
113 |
+
os.unlink(hash_c)
|
114 |
+
self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False, show_version=False)
|
115 |
+
self.assertEqual(2, len(self.cache_files('options.c*')))
|
116 |
+
|
117 |
+
os.unlink(hash_c)
|
118 |
+
self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False, show_version=True)
|
119 |
+
self.assertEqual(2, len(self.cache_files('options.c*')))
|
Lib/site-packages/Cython/Build/Tests/TestCythonizeArgsParser.py
ADDED
@@ -0,0 +1,482 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from Cython.Build.Cythonize import (
|
2 |
+
create_args_parser, parse_args_raw, parse_args,
|
3 |
+
parallel_compiles
|
4 |
+
)
|
5 |
+
|
6 |
+
from Cython.Compiler import Options
|
7 |
+
from Cython.Compiler.Tests.Utils import backup_Options, restore_Options, check_global_options
|
8 |
+
|
9 |
+
from unittest import TestCase
|
10 |
+
|
11 |
+
import sys
|
12 |
+
try:
|
13 |
+
from StringIO import StringIO
|
14 |
+
except ImportError:
|
15 |
+
from io import StringIO # doesn't accept 'str' in Py2
|
16 |
+
|
17 |
+
|
18 |
+
class TestCythonizeArgsParser(TestCase):
|
19 |
+
|
20 |
+
def setUp(self):
|
21 |
+
TestCase.setUp(self)
|
22 |
+
self.parse_args = lambda x, parser=create_args_parser() : parse_args_raw(parser, x)
|
23 |
+
|
24 |
+
|
25 |
+
def are_default(self, options, skip):
|
26 |
+
# empty containers
|
27 |
+
empty_containers = ['directives', 'compile_time_env', 'options', 'excludes']
|
28 |
+
are_none = ['language_level', 'annotate', 'build', 'build_inplace', 'force', 'quiet', 'lenient', 'keep_going', 'no_docstrings']
|
29 |
+
for opt_name in empty_containers:
|
30 |
+
if len(getattr(options, opt_name))!=0 and (opt_name not in skip):
|
31 |
+
self.assertEqual(opt_name,"", msg="For option "+opt_name)
|
32 |
+
return False
|
33 |
+
for opt_name in are_none:
|
34 |
+
if (getattr(options, opt_name) is not None) and (opt_name not in skip):
|
35 |
+
self.assertEqual(opt_name,"", msg="For option "+opt_name)
|
36 |
+
return False
|
37 |
+
if options.parallel!=parallel_compiles and ('parallel' not in skip):
|
38 |
+
return False
|
39 |
+
return True
|
40 |
+
|
41 |
+
# testing directives:
|
42 |
+
def test_directive_short(self):
|
43 |
+
options, args = self.parse_args(['-X', 'cdivision=True'])
|
44 |
+
self.assertFalse(args)
|
45 |
+
self.assertTrue(self.are_default(options, ['directives']))
|
46 |
+
self.assertEqual(options.directives['cdivision'], True)
|
47 |
+
|
48 |
+
def test_directive_long(self):
|
49 |
+
options, args = self.parse_args(['--directive', 'cdivision=True'])
|
50 |
+
self.assertFalse(args)
|
51 |
+
self.assertTrue(self.are_default(options, ['directives']))
|
52 |
+
self.assertEqual(options.directives['cdivision'], True)
|
53 |
+
|
54 |
+
def test_directive_multiple(self):
|
55 |
+
options, args = self.parse_args(['-X', 'cdivision=True', '-X', 'c_string_type=bytes'])
|
56 |
+
self.assertFalse(args)
|
57 |
+
self.assertTrue(self.are_default(options, ['directives']))
|
58 |
+
self.assertEqual(options.directives['cdivision'], True)
|
59 |
+
self.assertEqual(options.directives['c_string_type'], 'bytes')
|
60 |
+
|
61 |
+
def test_directive_multiple_v2(self):
|
62 |
+
options, args = self.parse_args(['-X', 'cdivision=True,c_string_type=bytes'])
|
63 |
+
self.assertFalse(args)
|
64 |
+
self.assertTrue(self.are_default(options, ['directives']))
|
65 |
+
self.assertEqual(options.directives['cdivision'], True)
|
66 |
+
self.assertEqual(options.directives['c_string_type'], 'bytes')
|
67 |
+
|
68 |
+
def test_directive_value_yes(self):
|
69 |
+
options, args = self.parse_args(['-X', 'cdivision=YeS'])
|
70 |
+
self.assertFalse(args)
|
71 |
+
self.assertTrue(self.are_default(options, ['directives']))
|
72 |
+
self.assertEqual(options.directives['cdivision'], True)
|
73 |
+
|
74 |
+
def test_directive_value_no(self):
|
75 |
+
options, args = self.parse_args(['-X', 'cdivision=no'])
|
76 |
+
self.assertFalse(args)
|
77 |
+
self.assertTrue(self.are_default(options, ['directives']))
|
78 |
+
self.assertEqual(options.directives['cdivision'], False)
|
79 |
+
|
80 |
+
def test_directive_value_invalid(self):
|
81 |
+
with self.assertRaises(ValueError) as context:
|
82 |
+
options, args = self.parse_args(['-X', 'cdivision=sadfasd'])
|
83 |
+
|
84 |
+
def test_directive_key_invalid(self):
|
85 |
+
with self.assertRaises(ValueError) as context:
|
86 |
+
options, args = self.parse_args(['-X', 'abracadabra'])
|
87 |
+
|
88 |
+
def test_directive_no_value(self):
|
89 |
+
with self.assertRaises(ValueError) as context:
|
90 |
+
options, args = self.parse_args(['-X', 'cdivision'])
|
91 |
+
|
92 |
+
def test_directives_types(self):
|
93 |
+
directives = {
|
94 |
+
'auto_pickle': True,
|
95 |
+
'c_string_type': 'bytearray',
|
96 |
+
'c_string_type': 'bytes',
|
97 |
+
'c_string_type': 'str',
|
98 |
+
'c_string_type': 'bytearray',
|
99 |
+
'c_string_type': 'unicode',
|
100 |
+
'c_string_encoding' : 'ascii',
|
101 |
+
'language_level' : 2,
|
102 |
+
'language_level' : 3,
|
103 |
+
'language_level' : '3str',
|
104 |
+
'set_initial_path' : 'my_initial_path',
|
105 |
+
}
|
106 |
+
for key, value in directives.items():
|
107 |
+
cmd = '{key}={value}'.format(key=key, value=str(value))
|
108 |
+
options, args = self.parse_args(['-X', cmd])
|
109 |
+
self.assertFalse(args)
|
110 |
+
self.assertTrue(self.are_default(options, ['directives']), msg = "Error for option: "+cmd)
|
111 |
+
self.assertEqual(options.directives[key], value, msg = "Error for option: "+cmd)
|
112 |
+
|
113 |
+
def test_directives_wrong(self):
|
114 |
+
directives = {
|
115 |
+
'auto_pickle': 42, # for bool type
|
116 |
+
'auto_pickle': 'NONONO', # for bool type
|
117 |
+
'c_string_type': 'bites',
|
118 |
+
#'c_string_encoding' : 'a',
|
119 |
+
#'language_level' : 4,
|
120 |
+
}
|
121 |
+
for key, value in directives.items():
|
122 |
+
cmd = '{key}={value}'.format(key=key, value=str(value))
|
123 |
+
with self.assertRaises(ValueError, msg = "Error for option: "+cmd) as context:
|
124 |
+
options, args = self.parse_args(['-X', cmd])
|
125 |
+
|
126 |
+
def test_compile_time_env_short(self):
|
127 |
+
options, args = self.parse_args(['-E', 'MYSIZE=10'])
|
128 |
+
self.assertFalse(args)
|
129 |
+
self.assertTrue(self.are_default(options, ['compile_time_env']))
|
130 |
+
self.assertEqual(options.compile_time_env['MYSIZE'], 10)
|
131 |
+
|
132 |
+
def test_compile_time_env_long(self):
|
133 |
+
options, args = self.parse_args(['--compile-time-env', 'MYSIZE=10'])
|
134 |
+
self.assertFalse(args)
|
135 |
+
self.assertTrue(self.are_default(options, ['compile_time_env']))
|
136 |
+
self.assertEqual(options.compile_time_env['MYSIZE'], 10)
|
137 |
+
|
138 |
+
def test_compile_time_env_multiple(self):
|
139 |
+
options, args = self.parse_args(['-E', 'MYSIZE=10', '-E', 'ARRSIZE=11'])
|
140 |
+
self.assertFalse(args)
|
141 |
+
self.assertTrue(self.are_default(options, ['compile_time_env']))
|
142 |
+
self.assertEqual(options.compile_time_env['MYSIZE'], 10)
|
143 |
+
self.assertEqual(options.compile_time_env['ARRSIZE'], 11)
|
144 |
+
|
145 |
+
def test_compile_time_env_multiple_v2(self):
|
146 |
+
options, args = self.parse_args(['-E', 'MYSIZE=10,ARRSIZE=11'])
|
147 |
+
self.assertFalse(args)
|
148 |
+
self.assertTrue(self.are_default(options, ['compile_time_env']))
|
149 |
+
self.assertEqual(options.compile_time_env['MYSIZE'], 10)
|
150 |
+
self.assertEqual(options.compile_time_env['ARRSIZE'], 11)
|
151 |
+
|
152 |
+
#testing options
|
153 |
+
def test_option_short(self):
|
154 |
+
options, args = self.parse_args(['-s', 'docstrings=True'])
|
155 |
+
self.assertFalse(args)
|
156 |
+
self.assertTrue(self.are_default(options, ['options']))
|
157 |
+
self.assertEqual(options.options['docstrings'], True)
|
158 |
+
|
159 |
+
def test_option_long(self):
|
160 |
+
options, args = self.parse_args(['--option', 'docstrings=True'])
|
161 |
+
self.assertFalse(args)
|
162 |
+
self.assertTrue(self.are_default(options, ['options']))
|
163 |
+
self.assertEqual(options.options['docstrings'], True)
|
164 |
+
|
165 |
+
def test_option_multiple(self):
|
166 |
+
options, args = self.parse_args(['-s', 'docstrings=True', '-s', 'buffer_max_dims=8'])
|
167 |
+
self.assertFalse(args)
|
168 |
+
self.assertTrue(self.are_default(options, ['options']))
|
169 |
+
self.assertEqual(options.options['docstrings'], True)
|
170 |
+
self.assertEqual(options.options['buffer_max_dims'], True) # really?
|
171 |
+
|
172 |
+
def test_option_multiple_v2(self):
|
173 |
+
options, args = self.parse_args(['-s', 'docstrings=True,buffer_max_dims=8'])
|
174 |
+
self.assertFalse(args)
|
175 |
+
self.assertTrue(self.are_default(options, ['options']))
|
176 |
+
self.assertEqual(options.options['docstrings'], True)
|
177 |
+
self.assertEqual(options.options['buffer_max_dims'], True) # really?
|
178 |
+
|
179 |
+
def test_option_value_yes(self):
|
180 |
+
options, args = self.parse_args(['-s', 'docstrings=YeS'])
|
181 |
+
self.assertFalse(args)
|
182 |
+
self.assertTrue(self.are_default(options, ['options']))
|
183 |
+
self.assertEqual(options.options['docstrings'], True)
|
184 |
+
|
185 |
+
def test_option_value_4242(self):
|
186 |
+
options, args = self.parse_args(['-s', 'docstrings=4242'])
|
187 |
+
self.assertFalse(args)
|
188 |
+
self.assertTrue(self.are_default(options, ['options']))
|
189 |
+
self.assertEqual(options.options['docstrings'], True)
|
190 |
+
|
191 |
+
def test_option_value_0(self):
|
192 |
+
options, args = self.parse_args(['-s', 'docstrings=0'])
|
193 |
+
self.assertFalse(args)
|
194 |
+
self.assertTrue(self.are_default(options, ['options']))
|
195 |
+
self.assertEqual(options.options['docstrings'], False)
|
196 |
+
|
197 |
+
def test_option_value_emptystr(self):
|
198 |
+
options, args = self.parse_args(['-s', 'docstrings='])
|
199 |
+
self.assertFalse(args)
|
200 |
+
self.assertTrue(self.are_default(options, ['options']))
|
201 |
+
self.assertEqual(options.options['docstrings'], True)
|
202 |
+
|
203 |
+
def test_option_value_a_str(self):
|
204 |
+
options, args = self.parse_args(['-s', 'docstrings=BB'])
|
205 |
+
self.assertFalse(args)
|
206 |
+
self.assertTrue(self.are_default(options, ['options']))
|
207 |
+
self.assertEqual(options.options['docstrings'], True)
|
208 |
+
|
209 |
+
def test_option_value_no(self):
|
210 |
+
options, args = self.parse_args(['-s', 'docstrings=nO'])
|
211 |
+
self.assertFalse(args)
|
212 |
+
self.assertTrue(self.are_default(options, ['options']))
|
213 |
+
self.assertEqual(options.options['docstrings'], False)
|
214 |
+
|
215 |
+
def test_option_no_value(self):
|
216 |
+
options, args = self.parse_args(['-s', 'docstrings'])
|
217 |
+
self.assertFalse(args)
|
218 |
+
self.assertTrue(self.are_default(options, ['options']))
|
219 |
+
self.assertEqual(options.options['docstrings'], True)
|
220 |
+
|
221 |
+
def test_option_any_key(self):
|
222 |
+
options, args = self.parse_args(['-s', 'abracadabra'])
|
223 |
+
self.assertFalse(args)
|
224 |
+
self.assertTrue(self.are_default(options, ['options']))
|
225 |
+
self.assertEqual(options.options['abracadabra'], True)
|
226 |
+
|
227 |
+
def test_language_level_2(self):
|
228 |
+
options, args = self.parse_args(['-2'])
|
229 |
+
self.assertFalse(args)
|
230 |
+
self.assertTrue(self.are_default(options, ['language_level']))
|
231 |
+
self.assertEqual(options.language_level, 2)
|
232 |
+
|
233 |
+
def test_language_level_3(self):
|
234 |
+
options, args = self.parse_args(['-3'])
|
235 |
+
self.assertFalse(args)
|
236 |
+
self.assertTrue(self.are_default(options, ['language_level']))
|
237 |
+
self.assertEqual(options.language_level, 3)
|
238 |
+
|
239 |
+
def test_language_level_3str(self):
|
240 |
+
options, args = self.parse_args(['--3str'])
|
241 |
+
self.assertFalse(args)
|
242 |
+
self.assertTrue(self.are_default(options, ['language_level']))
|
243 |
+
self.assertEqual(options.language_level, '3str')
|
244 |
+
|
245 |
+
def test_annotate_short(self):
|
246 |
+
options, args = self.parse_args(['-a'])
|
247 |
+
self.assertFalse(args)
|
248 |
+
self.assertTrue(self.are_default(options, ['annotate']))
|
249 |
+
self.assertEqual(options.annotate, 'default')
|
250 |
+
|
251 |
+
def test_annotate_long(self):
|
252 |
+
options, args = self.parse_args(['--annotate'])
|
253 |
+
self.assertFalse(args)
|
254 |
+
self.assertTrue(self.are_default(options, ['annotate']))
|
255 |
+
self.assertEqual(options.annotate, 'default')
|
256 |
+
|
257 |
+
def test_annotate_fullc(self):
|
258 |
+
options, args = self.parse_args(['--annotate-fullc'])
|
259 |
+
self.assertFalse(args)
|
260 |
+
self.assertTrue(self.are_default(options, ['annotate']))
|
261 |
+
self.assertEqual(options.annotate, 'fullc')
|
262 |
+
|
263 |
+
def test_annotate_and_positional(self):
|
264 |
+
options, args = self.parse_args(['-a', 'foo.pyx'])
|
265 |
+
self.assertEqual(args, ['foo.pyx'])
|
266 |
+
self.assertTrue(self.are_default(options, ['annotate']))
|
267 |
+
self.assertEqual(options.annotate, 'default')
|
268 |
+
|
269 |
+
def test_annotate_and_optional(self):
|
270 |
+
options, args = self.parse_args(['-a', '--3str'])
|
271 |
+
self.assertFalse(args)
|
272 |
+
self.assertTrue(self.are_default(options, ['annotate', 'language_level']))
|
273 |
+
self.assertEqual(options.annotate, 'default')
|
274 |
+
self.assertEqual(options.language_level, '3str')
|
275 |
+
|
276 |
+
def test_exclude_short(self):
|
277 |
+
options, args = self.parse_args(['-x', '*.pyx'])
|
278 |
+
self.assertFalse(args)
|
279 |
+
self.assertTrue(self.are_default(options, ['excludes']))
|
280 |
+
self.assertTrue('*.pyx' in options.excludes)
|
281 |
+
|
282 |
+
def test_exclude_long(self):
|
283 |
+
options, args = self.parse_args(['--exclude', '*.pyx'])
|
284 |
+
self.assertFalse(args)
|
285 |
+
self.assertTrue(self.are_default(options, ['excludes']))
|
286 |
+
self.assertTrue('*.pyx' in options.excludes)
|
287 |
+
|
288 |
+
def test_exclude_multiple(self):
|
289 |
+
options, args = self.parse_args(['--exclude', '*.pyx', '--exclude', '*.py', ])
|
290 |
+
self.assertFalse(args)
|
291 |
+
self.assertTrue(self.are_default(options, ['excludes']))
|
292 |
+
self.assertEqual(options.excludes, ['*.pyx', '*.py'])
|
293 |
+
|
294 |
+
def test_build_short(self):
|
295 |
+
options, args = self.parse_args(['-b'])
|
296 |
+
self.assertFalse(args)
|
297 |
+
self.assertTrue(self.are_default(options, ['build']))
|
298 |
+
self.assertEqual(options.build, True)
|
299 |
+
|
300 |
+
def test_build_long(self):
|
301 |
+
options, args = self.parse_args(['--build'])
|
302 |
+
self.assertFalse(args)
|
303 |
+
self.assertTrue(self.are_default(options, ['build']))
|
304 |
+
self.assertEqual(options.build, True)
|
305 |
+
|
306 |
+
def test_inplace_short(self):
|
307 |
+
options, args = self.parse_args(['-i'])
|
308 |
+
self.assertFalse(args)
|
309 |
+
self.assertTrue(self.are_default(options, ['build_inplace']))
|
310 |
+
self.assertEqual(options.build_inplace, True)
|
311 |
+
|
312 |
+
def test_inplace_long(self):
|
313 |
+
options, args = self.parse_args(['--inplace'])
|
314 |
+
self.assertFalse(args)
|
315 |
+
self.assertTrue(self.are_default(options, ['build_inplace']))
|
316 |
+
self.assertEqual(options.build_inplace, True)
|
317 |
+
|
318 |
+
def test_parallel_short(self):
|
319 |
+
options, args = self.parse_args(['-j', '42'])
|
320 |
+
self.assertFalse(args)
|
321 |
+
self.assertTrue(self.are_default(options, ['parallel']))
|
322 |
+
self.assertEqual(options.parallel, 42)
|
323 |
+
|
324 |
+
def test_parallel_long(self):
|
325 |
+
options, args = self.parse_args(['--parallel', '42'])
|
326 |
+
self.assertFalse(args)
|
327 |
+
self.assertTrue(self.are_default(options, ['parallel']))
|
328 |
+
self.assertEqual(options.parallel, 42)
|
329 |
+
|
330 |
+
def test_force_short(self):
|
331 |
+
options, args = self.parse_args(['-f'])
|
332 |
+
self.assertFalse(args)
|
333 |
+
self.assertTrue(self.are_default(options, ['force']))
|
334 |
+
self.assertEqual(options.force, True)
|
335 |
+
|
336 |
+
def test_force_long(self):
|
337 |
+
options, args = self.parse_args(['--force'])
|
338 |
+
self.assertFalse(args)
|
339 |
+
self.assertTrue(self.are_default(options, ['force']))
|
340 |
+
self.assertEqual(options.force, True)
|
341 |
+
|
342 |
+
def test_quite_short(self):
|
343 |
+
options, args = self.parse_args(['-q'])
|
344 |
+
self.assertFalse(args)
|
345 |
+
self.assertTrue(self.are_default(options, ['quiet']))
|
346 |
+
self.assertEqual(options.quiet, True)
|
347 |
+
|
348 |
+
def test_quite_long(self):
|
349 |
+
options, args = self.parse_args(['--quiet'])
|
350 |
+
self.assertFalse(args)
|
351 |
+
self.assertTrue(self.are_default(options, ['quiet']))
|
352 |
+
self.assertEqual(options.quiet, True)
|
353 |
+
|
354 |
+
def test_lenient_long(self):
|
355 |
+
options, args = self.parse_args(['--lenient'])
|
356 |
+
self.assertTrue(self.are_default(options, ['lenient']))
|
357 |
+
self.assertFalse(args)
|
358 |
+
self.assertEqual(options.lenient, True)
|
359 |
+
|
360 |
+
def test_keep_going_short(self):
|
361 |
+
options, args = self.parse_args(['-k'])
|
362 |
+
self.assertFalse(args)
|
363 |
+
self.assertTrue(self.are_default(options, ['keep_going']))
|
364 |
+
self.assertEqual(options.keep_going, True)
|
365 |
+
|
366 |
+
def test_keep_going_long(self):
|
367 |
+
options, args = self.parse_args(['--keep-going'])
|
368 |
+
self.assertFalse(args)
|
369 |
+
self.assertTrue(self.are_default(options, ['keep_going']))
|
370 |
+
self.assertEqual(options.keep_going, True)
|
371 |
+
|
372 |
+
def test_no_docstrings_long(self):
|
373 |
+
options, args = self.parse_args(['--no-docstrings'])
|
374 |
+
self.assertFalse(args)
|
375 |
+
self.assertTrue(self.are_default(options, ['no_docstrings']))
|
376 |
+
self.assertEqual(options.no_docstrings, True)
|
377 |
+
|
378 |
+
def test_file_name(self):
|
379 |
+
options, args = self.parse_args(['file1.pyx', 'file2.pyx'])
|
380 |
+
self.assertEqual(len(args), 2)
|
381 |
+
self.assertEqual(args[0], 'file1.pyx')
|
382 |
+
self.assertEqual(args[1], 'file2.pyx')
|
383 |
+
self.assertTrue(self.are_default(options, []))
|
384 |
+
|
385 |
+
def test_option_first(self):
|
386 |
+
options, args = self.parse_args(['-i', 'file.pyx'])
|
387 |
+
self.assertEqual(args, ['file.pyx'])
|
388 |
+
self.assertEqual(options.build_inplace, True)
|
389 |
+
self.assertTrue(self.are_default(options, ['build_inplace']))
|
390 |
+
|
391 |
+
def test_file_inbetween(self):
|
392 |
+
options, args = self.parse_args(['-i', 'file.pyx', '-a'])
|
393 |
+
self.assertEqual(args, ['file.pyx'])
|
394 |
+
self.assertEqual(options.build_inplace, True)
|
395 |
+
self.assertEqual(options.annotate, 'default')
|
396 |
+
self.assertTrue(self.are_default(options, ['build_inplace', 'annotate']))
|
397 |
+
|
398 |
+
def test_option_trailing(self):
|
399 |
+
options, args = self.parse_args(['file.pyx', '-i'])
|
400 |
+
self.assertEqual(args, ['file.pyx'])
|
401 |
+
self.assertEqual(options.build_inplace, True)
|
402 |
+
self.assertTrue(self.are_default(options, ['build_inplace']))
|
403 |
+
|
404 |
+
def test_interspersed_positional(self):
|
405 |
+
options, sources = self.parse_args([
|
406 |
+
'file1.pyx', '-a',
|
407 |
+
'file2.pyx'
|
408 |
+
])
|
409 |
+
self.assertEqual(sources, ['file1.pyx', 'file2.pyx'])
|
410 |
+
self.assertEqual(options.annotate, 'default')
|
411 |
+
self.assertTrue(self.are_default(options, ['annotate']))
|
412 |
+
|
413 |
+
def test_interspersed_positional2(self):
|
414 |
+
options, sources = self.parse_args([
|
415 |
+
'file1.pyx', '-a',
|
416 |
+
'file2.pyx', '-a', 'file3.pyx'
|
417 |
+
])
|
418 |
+
self.assertEqual(sources, ['file1.pyx', 'file2.pyx', 'file3.pyx'])
|
419 |
+
self.assertEqual(options.annotate, 'default')
|
420 |
+
self.assertTrue(self.are_default(options, ['annotate']))
|
421 |
+
|
422 |
+
def test_interspersed_positional3(self):
|
423 |
+
options, sources = self.parse_args([
|
424 |
+
'-f', 'f1', 'f2', '-a',
|
425 |
+
'f3', 'f4', '-a', 'f5'
|
426 |
+
])
|
427 |
+
self.assertEqual(sources, ['f1', 'f2', 'f3', 'f4', 'f5'])
|
428 |
+
self.assertEqual(options.annotate, 'default')
|
429 |
+
self.assertEqual(options.force, True)
|
430 |
+
self.assertTrue(self.are_default(options, ['annotate', 'force']))
|
431 |
+
|
432 |
+
def test_wrong_option(self):
|
433 |
+
old_stderr = sys.stderr
|
434 |
+
stderr = sys.stderr = StringIO()
|
435 |
+
try:
|
436 |
+
self.assertRaises(SystemExit, self.parse_args,
|
437 |
+
['--unknown-option']
|
438 |
+
)
|
439 |
+
finally:
|
440 |
+
sys.stderr = old_stderr
|
441 |
+
self.assertTrue(stderr.getvalue())
|
442 |
+
|
443 |
+
|
444 |
+
class TestParseArgs(TestCase):
|
445 |
+
def setUp(self):
|
446 |
+
self._options_backup = backup_Options()
|
447 |
+
|
448 |
+
def tearDown(self):
|
449 |
+
restore_Options(self._options_backup)
|
450 |
+
|
451 |
+
def check_default_global_options(self, white_list=[]):
|
452 |
+
self.assertEqual(check_global_options(self._options_backup, white_list), "")
|
453 |
+
|
454 |
+
def test_build_set_for_inplace(self):
|
455 |
+
options, args = parse_args(['foo.pyx', '-i'])
|
456 |
+
self.assertEqual(options.build, True)
|
457 |
+
self.check_default_global_options()
|
458 |
+
|
459 |
+
def test_lenient(self):
|
460 |
+
options, sources = parse_args(['foo.pyx', '--lenient'])
|
461 |
+
self.assertEqual(sources, ['foo.pyx'])
|
462 |
+
self.assertEqual(Options.error_on_unknown_names, False)
|
463 |
+
self.assertEqual(Options.error_on_uninitialized, False)
|
464 |
+
self.check_default_global_options(['error_on_unknown_names', 'error_on_uninitialized'])
|
465 |
+
|
466 |
+
def test_annotate(self):
|
467 |
+
options, sources = parse_args(['foo.pyx', '--annotate'])
|
468 |
+
self.assertEqual(sources, ['foo.pyx'])
|
469 |
+
self.assertEqual(Options.annotate, 'default')
|
470 |
+
self.check_default_global_options(['annotate'])
|
471 |
+
|
472 |
+
def test_annotate_fullc(self):
|
473 |
+
options, sources = parse_args(['foo.pyx', '--annotate-fullc'])
|
474 |
+
self.assertEqual(sources, ['foo.pyx'])
|
475 |
+
self.assertEqual(Options.annotate, 'fullc')
|
476 |
+
self.check_default_global_options(['annotate'])
|
477 |
+
|
478 |
+
def test_no_docstrings(self):
|
479 |
+
options, sources = parse_args(['foo.pyx', '--no-docstrings'])
|
480 |
+
self.assertEqual(sources, ['foo.pyx'])
|
481 |
+
self.assertEqual(Options.docstrings, False)
|
482 |
+
self.check_default_global_options(['docstrings'])
|
Lib/site-packages/Cython/Build/Tests/TestDependencies.py
ADDED
@@ -0,0 +1,142 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import contextlib
|
2 |
+
import os.path
|
3 |
+
import sys
|
4 |
+
import tempfile
|
5 |
+
import unittest
|
6 |
+
from io import open
|
7 |
+
from os.path import join as pjoin
|
8 |
+
|
9 |
+
from ..Dependencies import extended_iglob
|
10 |
+
|
11 |
+
|
12 |
+
@contextlib.contextmanager
|
13 |
+
def writable_file(dir_path, filename):
|
14 |
+
with open(pjoin(dir_path, filename), "w", encoding="utf8") as f:
|
15 |
+
yield f
|
16 |
+
|
17 |
+
|
18 |
+
class TestGlobbing(unittest.TestCase):
|
19 |
+
@classmethod
|
20 |
+
def setUpClass(cls):
|
21 |
+
cls._orig_dir = os.getcwd()
|
22 |
+
if sys.version_info[0] < 3:
|
23 |
+
temp_path = cls._tmpdir = tempfile.mkdtemp()
|
24 |
+
else:
|
25 |
+
cls._tmpdir = tempfile.TemporaryDirectory()
|
26 |
+
temp_path = cls._tmpdir.name
|
27 |
+
os.chdir(temp_path)
|
28 |
+
|
29 |
+
for dir1 in "abcd":
|
30 |
+
for dir1x in [dir1, dir1 + 'x']:
|
31 |
+
for dir2 in "xyz":
|
32 |
+
dir_path = pjoin(dir1x, dir2)
|
33 |
+
os.makedirs(dir_path)
|
34 |
+
with writable_file(dir_path, "file2_pyx.pyx") as f:
|
35 |
+
f.write(u'""" PYX """')
|
36 |
+
with writable_file(dir_path, "file2_py.py") as f:
|
37 |
+
f.write(u'""" PY """')
|
38 |
+
|
39 |
+
with writable_file(dir1x, "file1_pyx.pyx") as f:
|
40 |
+
f.write(u'""" PYX """')
|
41 |
+
with writable_file(dir1x, "file1_py.py") as f:
|
42 |
+
f.write(u'""" PY """')
|
43 |
+
|
44 |
+
@classmethod
|
45 |
+
def tearDownClass(cls):
|
46 |
+
os.chdir(cls._orig_dir)
|
47 |
+
if sys.version_info[0] < 3:
|
48 |
+
import shutil
|
49 |
+
shutil.rmtree(cls._tmpdir)
|
50 |
+
else:
|
51 |
+
cls._tmpdir.cleanup()
|
52 |
+
|
53 |
+
def files_equal(self, pattern, expected_files):
|
54 |
+
expected_files = sorted(expected_files)
|
55 |
+
# It's the users's choice whether '/' will appear on Windows.
|
56 |
+
matched_files = sorted(path.replace('/', os.sep) for path in extended_iglob(pattern))
|
57 |
+
self.assertListEqual(matched_files, expected_files) # /
|
58 |
+
|
59 |
+
# Special case for Windows: also support '\' in patterns.
|
60 |
+
if os.sep == '\\' and '/' in pattern:
|
61 |
+
matched_files = sorted(extended_iglob(pattern.replace('/', '\\')))
|
62 |
+
self.assertListEqual(matched_files, expected_files) # \
|
63 |
+
|
64 |
+
def test_extended_iglob_simple(self):
|
65 |
+
ax_files = [pjoin("a", "x", "file2_pyx.pyx"), pjoin("a", "x", "file2_py.py")]
|
66 |
+
self.files_equal("a/x/*", ax_files)
|
67 |
+
self.files_equal("a/x/*.c12", [])
|
68 |
+
self.files_equal("a/x/*.{py,pyx,c12}", ax_files)
|
69 |
+
self.files_equal("a/x/*.{py,pyx}", ax_files)
|
70 |
+
self.files_equal("a/x/*.{pyx}", ax_files[:1])
|
71 |
+
self.files_equal("a/x/*.pyx", ax_files[:1])
|
72 |
+
self.files_equal("a/x/*.{py}", ax_files[1:])
|
73 |
+
self.files_equal("a/x/*.py", ax_files[1:])
|
74 |
+
|
75 |
+
def test_extended_iglob_simple_star(self):
|
76 |
+
for basedir in "ad":
|
77 |
+
files = [
|
78 |
+
pjoin(basedir, dirname, filename)
|
79 |
+
for dirname in "xyz"
|
80 |
+
for filename in ["file2_pyx.pyx", "file2_py.py"]
|
81 |
+
]
|
82 |
+
self.files_equal(basedir + "/*/*", files)
|
83 |
+
self.files_equal(basedir + "/*/*.c12", [])
|
84 |
+
self.files_equal(basedir + "/*/*.{py,pyx,c12}", files)
|
85 |
+
self.files_equal(basedir + "/*/*.{py,pyx}", files)
|
86 |
+
self.files_equal(basedir + "/*/*.{pyx}", files[::2])
|
87 |
+
self.files_equal(basedir + "/*/*.pyx", files[::2])
|
88 |
+
self.files_equal(basedir + "/*/*.{py}", files[1::2])
|
89 |
+
self.files_equal(basedir + "/*/*.py", files[1::2])
|
90 |
+
|
91 |
+
for subdir in "xy*":
|
92 |
+
files = [
|
93 |
+
pjoin(basedir, dirname, filename)
|
94 |
+
for dirname in "xyz"
|
95 |
+
if subdir in ('*', dirname)
|
96 |
+
for filename in ["file2_pyx.pyx", "file2_py.py"]
|
97 |
+
]
|
98 |
+
path = basedir + '/' + subdir + '/'
|
99 |
+
self.files_equal(path + "*", files)
|
100 |
+
self.files_equal(path + "*.{py,pyx}", files)
|
101 |
+
self.files_equal(path + "*.{pyx}", files[::2])
|
102 |
+
self.files_equal(path + "*.pyx", files[::2])
|
103 |
+
self.files_equal(path + "*.{py}", files[1::2])
|
104 |
+
self.files_equal(path + "*.py", files[1::2])
|
105 |
+
|
106 |
+
def test_extended_iglob_double_star(self):
|
107 |
+
basedirs = os.listdir(".")
|
108 |
+
files = [
|
109 |
+
pjoin(basedir, dirname, filename)
|
110 |
+
for basedir in basedirs
|
111 |
+
for dirname in "xyz"
|
112 |
+
for filename in ["file2_pyx.pyx", "file2_py.py"]
|
113 |
+
]
|
114 |
+
all_files = [
|
115 |
+
pjoin(basedir, filename)
|
116 |
+
for basedir in basedirs
|
117 |
+
for filename in ["file1_pyx.pyx", "file1_py.py"]
|
118 |
+
] + files
|
119 |
+
self.files_equal("*/*/*", files)
|
120 |
+
self.files_equal("*/*/**/*", files)
|
121 |
+
self.files_equal("*/**/*.*", all_files)
|
122 |
+
self.files_equal("**/*.*", all_files)
|
123 |
+
self.files_equal("*/**/*.c12", [])
|
124 |
+
self.files_equal("**/*.c12", [])
|
125 |
+
self.files_equal("*/*/*.{py,pyx,c12}", files)
|
126 |
+
self.files_equal("*/*/**/*.{py,pyx,c12}", files)
|
127 |
+
self.files_equal("*/**/*/*.{py,pyx,c12}", files)
|
128 |
+
self.files_equal("**/*/*/*.{py,pyx,c12}", files)
|
129 |
+
self.files_equal("**/*.{py,pyx,c12}", all_files)
|
130 |
+
self.files_equal("*/*/*.{py,pyx}", files)
|
131 |
+
self.files_equal("**/*/*/*.{py,pyx}", files)
|
132 |
+
self.files_equal("*/**/*/*.{py,pyx}", files)
|
133 |
+
self.files_equal("**/*.{py,pyx}", all_files)
|
134 |
+
self.files_equal("*/*/*.{pyx}", files[::2])
|
135 |
+
self.files_equal("**/*.{pyx}", all_files[::2])
|
136 |
+
self.files_equal("*/**/*/*.pyx", files[::2])
|
137 |
+
self.files_equal("*/*/*.pyx", files[::2])
|
138 |
+
self.files_equal("**/*.pyx", all_files[::2])
|
139 |
+
self.files_equal("*/*/*.{py}", files[1::2])
|
140 |
+
self.files_equal("**/*.{py}", all_files[1::2])
|
141 |
+
self.files_equal("*/*/*.py", files[1::2])
|
142 |
+
self.files_equal("**/*.py", all_files[1::2])
|
Lib/site-packages/Cython/Build/Tests/TestInline.py
ADDED
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import tempfile
|
3 |
+
import unittest
|
4 |
+
from Cython.Shadow import inline
|
5 |
+
from Cython.Build.Inline import safe_type
|
6 |
+
from Cython.TestUtils import CythonTest
|
7 |
+
|
8 |
+
try:
|
9 |
+
import numpy
|
10 |
+
has_numpy = True
|
11 |
+
except:
|
12 |
+
has_numpy = False
|
13 |
+
|
14 |
+
test_kwds = dict(force=True, quiet=True)
|
15 |
+
|
16 |
+
global_value = 100
|
17 |
+
|
18 |
+
class TestInline(CythonTest):
|
19 |
+
def setUp(self):
|
20 |
+
CythonTest.setUp(self)
|
21 |
+
self._call_kwds = dict(test_kwds)
|
22 |
+
if os.path.isdir('TEST_TMP'):
|
23 |
+
lib_dir = os.path.join('TEST_TMP','inline')
|
24 |
+
else:
|
25 |
+
lib_dir = tempfile.mkdtemp(prefix='cython_inline_')
|
26 |
+
self._call_kwds['lib_dir'] = lib_dir
|
27 |
+
|
28 |
+
def test_simple(self):
|
29 |
+
self.assertEqual(inline("return 1+2", **self._call_kwds), 3)
|
30 |
+
|
31 |
+
def test_types(self):
|
32 |
+
self.assertEqual(inline("""
|
33 |
+
cimport cython
|
34 |
+
return cython.typeof(a), cython.typeof(b)
|
35 |
+
""", a=1.0, b=[], **self._call_kwds), ('double', 'list object'))
|
36 |
+
|
37 |
+
def test_locals(self):
|
38 |
+
a = 1
|
39 |
+
b = 2
|
40 |
+
self.assertEqual(inline("return a+b", **self._call_kwds), 3)
|
41 |
+
|
42 |
+
def test_globals(self):
|
43 |
+
self.assertEqual(inline("return global_value + 1", **self._call_kwds), global_value + 1)
|
44 |
+
|
45 |
+
def test_no_return(self):
|
46 |
+
self.assertEqual(inline("""
|
47 |
+
a = 1
|
48 |
+
cdef double b = 2
|
49 |
+
cdef c = []
|
50 |
+
""", **self._call_kwds), dict(a=1, b=2.0, c=[]))
|
51 |
+
|
52 |
+
def test_def_node(self):
|
53 |
+
foo = inline("def foo(x): return x * x", **self._call_kwds)['foo']
|
54 |
+
self.assertEqual(foo(7), 49)
|
55 |
+
|
56 |
+
def test_class_ref(self):
|
57 |
+
class Type(object):
|
58 |
+
pass
|
59 |
+
tp = inline("Type")['Type']
|
60 |
+
self.assertEqual(tp, Type)
|
61 |
+
|
62 |
+
def test_pure(self):
|
63 |
+
import cython as cy
|
64 |
+
b = inline("""
|
65 |
+
b = cy.declare(float, a)
|
66 |
+
c = cy.declare(cy.pointer(cy.float), &b)
|
67 |
+
return b
|
68 |
+
""", a=3, **self._call_kwds)
|
69 |
+
self.assertEqual(type(b), float)
|
70 |
+
|
71 |
+
def test_compiler_directives(self):
|
72 |
+
self.assertEqual(
|
73 |
+
inline('return sum(x)',
|
74 |
+
x=[1, 2, 3],
|
75 |
+
cython_compiler_directives={'boundscheck': False}),
|
76 |
+
6
|
77 |
+
)
|
78 |
+
|
79 |
+
def test_lang_version(self):
|
80 |
+
# GH-3419. Caching for inline code didn't always respect compiler directives.
|
81 |
+
inline_divcode = "def f(int a, int b): return a/b"
|
82 |
+
self.assertEqual(
|
83 |
+
inline(inline_divcode, language_level=2)['f'](5,2),
|
84 |
+
2
|
85 |
+
)
|
86 |
+
self.assertEqual(
|
87 |
+
inline(inline_divcode, language_level=3)['f'](5,2),
|
88 |
+
2.5
|
89 |
+
)
|
90 |
+
self.assertEqual(
|
91 |
+
inline(inline_divcode, language_level=2)['f'](5,2),
|
92 |
+
2
|
93 |
+
)
|
94 |
+
|
95 |
+
def test_repeated_use(self):
|
96 |
+
inline_mulcode = "def f(int a, int b): return a * b"
|
97 |
+
self.assertEqual(inline(inline_mulcode)['f'](5, 2), 10)
|
98 |
+
self.assertEqual(inline(inline_mulcode)['f'](5, 3), 15)
|
99 |
+
self.assertEqual(inline(inline_mulcode)['f'](6, 2), 12)
|
100 |
+
self.assertEqual(inline(inline_mulcode)['f'](5, 2), 10)
|
101 |
+
|
102 |
+
f = inline(inline_mulcode)['f']
|
103 |
+
self.assertEqual(f(5, 2), 10)
|
104 |
+
self.assertEqual(f(5, 3), 15)
|
105 |
+
|
106 |
+
@unittest.skipIf(not has_numpy, "NumPy is not available")
|
107 |
+
def test_numpy(self):
|
108 |
+
import numpy
|
109 |
+
a = numpy.ndarray((10, 20))
|
110 |
+
a[0,0] = 10
|
111 |
+
self.assertEqual(safe_type(a), 'numpy.ndarray[numpy.float64_t, ndim=2]')
|
112 |
+
self.assertEqual(inline("return a[0,0]", a=a, **self._call_kwds), 10.0)
|
Lib/site-packages/Cython/Build/Tests/TestIpythonMagic.py
ADDED
@@ -0,0 +1,295 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# -*- coding: utf-8 -*-
|
2 |
+
# tag: ipython
|
3 |
+
|
4 |
+
"""Tests for the Cython magics extension."""
|
5 |
+
|
6 |
+
from __future__ import absolute_import
|
7 |
+
|
8 |
+
import os
|
9 |
+
import io
|
10 |
+
import sys
|
11 |
+
from contextlib import contextmanager
|
12 |
+
from unittest import skipIf
|
13 |
+
|
14 |
+
from Cython.Build import IpythonMagic
|
15 |
+
from Cython.TestUtils import CythonTest
|
16 |
+
from Cython.Compiler.Annotate import AnnotationCCodeWriter
|
17 |
+
|
18 |
+
try:
|
19 |
+
import IPython.testing.globalipapp
|
20 |
+
except ImportError:
|
21 |
+
# Disable tests and fake helpers for initialisation below.
|
22 |
+
def skip_if_not_installed(_):
|
23 |
+
return None
|
24 |
+
else:
|
25 |
+
def skip_if_not_installed(c):
|
26 |
+
return c
|
27 |
+
|
28 |
+
# not using IPython's decorators here because they depend on "nose"
|
29 |
+
skip_win32 = skipIf(sys.platform == 'win32', "Skip on Windows")
|
30 |
+
skip_py27 = skipIf(sys.version_info[:2] == (2,7), "Disabled in Py2.7")
|
31 |
+
|
32 |
+
try:
|
33 |
+
# disable IPython history thread before it gets started to avoid having to clean it up
|
34 |
+
from IPython.core.history import HistoryManager
|
35 |
+
HistoryManager.enabled = False
|
36 |
+
except ImportError:
|
37 |
+
pass
|
38 |
+
|
39 |
+
|
40 |
+
@contextmanager
|
41 |
+
def capture_output():
|
42 |
+
backup = sys.stdout, sys.stderr
|
43 |
+
try:
|
44 |
+
replacement = [
|
45 |
+
io.TextIOWrapper(io.BytesIO(), encoding=sys.stdout.encoding),
|
46 |
+
io.TextIOWrapper(io.BytesIO(), encoding=sys.stderr.encoding),
|
47 |
+
]
|
48 |
+
sys.stdout, sys.stderr = replacement
|
49 |
+
output = []
|
50 |
+
yield output
|
51 |
+
finally:
|
52 |
+
sys.stdout, sys.stderr = backup
|
53 |
+
for wrapper in replacement:
|
54 |
+
wrapper.seek(0) # rewind
|
55 |
+
output.append(wrapper.read())
|
56 |
+
wrapper.close()
|
57 |
+
|
58 |
+
|
59 |
+
code = u"""\
|
60 |
+
def f(x):
|
61 |
+
return 2*x
|
62 |
+
"""
|
63 |
+
|
64 |
+
cython3_code = u"""\
|
65 |
+
def f(int x):
|
66 |
+
return 2 / x
|
67 |
+
|
68 |
+
def call(x):
|
69 |
+
return f(*(x,))
|
70 |
+
"""
|
71 |
+
|
72 |
+
pgo_cython3_code = cython3_code + u"""\
|
73 |
+
def main():
|
74 |
+
for _ in range(100): call(5)
|
75 |
+
main()
|
76 |
+
"""
|
77 |
+
|
78 |
+
compile_error_code = u'''\
|
79 |
+
cdef extern from *:
|
80 |
+
"""
|
81 |
+
xxx a=1;
|
82 |
+
"""
|
83 |
+
int a;
|
84 |
+
def doit():
|
85 |
+
return a
|
86 |
+
'''
|
87 |
+
|
88 |
+
compile_warning_code = u'''\
|
89 |
+
cdef extern from *:
|
90 |
+
"""
|
91 |
+
#pragma message ( "CWarning" )
|
92 |
+
int a = 42;
|
93 |
+
"""
|
94 |
+
int a;
|
95 |
+
def doit():
|
96 |
+
return a
|
97 |
+
'''
|
98 |
+
|
99 |
+
|
100 |
+
@skip_if_not_installed
|
101 |
+
class TestIPythonMagic(CythonTest):
|
102 |
+
|
103 |
+
@classmethod
|
104 |
+
def setUpClass(cls):
|
105 |
+
CythonTest.setUpClass()
|
106 |
+
cls._ip = IPython.testing.globalipapp.get_ipython()
|
107 |
+
|
108 |
+
def setUp(self):
|
109 |
+
CythonTest.setUp(self)
|
110 |
+
self._ip.extension_manager.load_extension('cython')
|
111 |
+
|
112 |
+
def test_cython_inline(self):
|
113 |
+
ip = self._ip
|
114 |
+
ip.ex('a=10; b=20')
|
115 |
+
result = ip.run_cell_magic('cython_inline', '', 'return a+b')
|
116 |
+
self.assertEqual(result, 30)
|
117 |
+
|
118 |
+
@skip_win32
|
119 |
+
def test_cython_pyximport(self):
|
120 |
+
ip = self._ip
|
121 |
+
module_name = '_test_cython_pyximport'
|
122 |
+
ip.run_cell_magic('cython_pyximport', module_name, code)
|
123 |
+
ip.ex('g = f(10)')
|
124 |
+
self.assertEqual(ip.user_ns['g'], 20.0)
|
125 |
+
ip.run_cell_magic('cython_pyximport', module_name, code)
|
126 |
+
ip.ex('h = f(-10)')
|
127 |
+
self.assertEqual(ip.user_ns['h'], -20.0)
|
128 |
+
try:
|
129 |
+
os.remove(module_name + '.pyx')
|
130 |
+
except OSError:
|
131 |
+
pass
|
132 |
+
|
133 |
+
def test_cython(self):
|
134 |
+
ip = self._ip
|
135 |
+
ip.run_cell_magic('cython', '', code)
|
136 |
+
ip.ex('g = f(10)')
|
137 |
+
self.assertEqual(ip.user_ns['g'], 20.0)
|
138 |
+
|
139 |
+
def test_cython_name(self):
|
140 |
+
# The Cython module named 'mymodule' defines the function f.
|
141 |
+
ip = self._ip
|
142 |
+
ip.run_cell_magic('cython', '--name=mymodule', code)
|
143 |
+
# This module can now be imported in the interactive namespace.
|
144 |
+
ip.ex('import mymodule; g = mymodule.f(10)')
|
145 |
+
self.assertEqual(ip.user_ns['g'], 20.0)
|
146 |
+
|
147 |
+
def test_cython_language_level(self):
|
148 |
+
# The Cython cell defines the functions f() and call().
|
149 |
+
ip = self._ip
|
150 |
+
ip.run_cell_magic('cython', '', cython3_code)
|
151 |
+
ip.ex('g = f(10); h = call(10)')
|
152 |
+
if sys.version_info[0] < 3:
|
153 |
+
self.assertEqual(ip.user_ns['g'], 2 // 10)
|
154 |
+
self.assertEqual(ip.user_ns['h'], 2 // 10)
|
155 |
+
else:
|
156 |
+
self.assertEqual(ip.user_ns['g'], 2.0 / 10.0)
|
157 |
+
self.assertEqual(ip.user_ns['h'], 2.0 / 10.0)
|
158 |
+
|
159 |
+
def test_cython3(self):
|
160 |
+
# The Cython cell defines the functions f() and call().
|
161 |
+
ip = self._ip
|
162 |
+
ip.run_cell_magic('cython', '-3', cython3_code)
|
163 |
+
ip.ex('g = f(10); h = call(10)')
|
164 |
+
self.assertEqual(ip.user_ns['g'], 2.0 / 10.0)
|
165 |
+
self.assertEqual(ip.user_ns['h'], 2.0 / 10.0)
|
166 |
+
|
167 |
+
def test_cython2(self):
|
168 |
+
# The Cython cell defines the functions f() and call().
|
169 |
+
ip = self._ip
|
170 |
+
ip.run_cell_magic('cython', '-2', cython3_code)
|
171 |
+
ip.ex('g = f(10); h = call(10)')
|
172 |
+
self.assertEqual(ip.user_ns['g'], 2 // 10)
|
173 |
+
self.assertEqual(ip.user_ns['h'], 2 // 10)
|
174 |
+
|
175 |
+
def test_cython_compile_error_shown(self):
|
176 |
+
ip = self._ip
|
177 |
+
with capture_output() as out:
|
178 |
+
ip.run_cell_magic('cython', '-3', compile_error_code)
|
179 |
+
captured_out, captured_err = out
|
180 |
+
|
181 |
+
# it could be that c-level output is captured by distutil-extension
|
182 |
+
# (and not by us) and is printed to stdout:
|
183 |
+
captured_all = captured_out + "\n" + captured_err
|
184 |
+
self.assertTrue("error" in captured_all, msg="error in " + captured_all)
|
185 |
+
|
186 |
+
def test_cython_link_error_shown(self):
|
187 |
+
ip = self._ip
|
188 |
+
with capture_output() as out:
|
189 |
+
ip.run_cell_magic('cython', '-3 -l=xxxxxxxx', code)
|
190 |
+
captured_out, captured_err = out
|
191 |
+
|
192 |
+
# it could be that c-level output is captured by distutil-extension
|
193 |
+
# (and not by us) and is printed to stdout:
|
194 |
+
captured_all = captured_out + "\n!" + captured_err
|
195 |
+
self.assertTrue("error" in captured_all, msg="error in " + captured_all)
|
196 |
+
|
197 |
+
def test_cython_warning_shown(self):
|
198 |
+
ip = self._ip
|
199 |
+
with capture_output() as out:
|
200 |
+
# force rebuild, otherwise no warning as after the first success
|
201 |
+
# no build step is performed
|
202 |
+
ip.run_cell_magic('cython', '-3 -f', compile_warning_code)
|
203 |
+
captured_out, captured_err = out
|
204 |
+
|
205 |
+
# check that warning was printed to stdout even if build hasn't failed
|
206 |
+
self.assertTrue("CWarning" in captured_out)
|
207 |
+
|
208 |
+
@skip_py27 # Not strictly broken in Py2.7 but currently fails in CI due to C compiler issues.
|
209 |
+
@skip_win32
|
210 |
+
def test_cython3_pgo(self):
|
211 |
+
# The Cython cell defines the functions f() and call().
|
212 |
+
ip = self._ip
|
213 |
+
ip.run_cell_magic('cython', '-3 --pgo', pgo_cython3_code)
|
214 |
+
ip.ex('g = f(10); h = call(10); main()')
|
215 |
+
self.assertEqual(ip.user_ns['g'], 2.0 / 10.0)
|
216 |
+
self.assertEqual(ip.user_ns['h'], 2.0 / 10.0)
|
217 |
+
|
218 |
+
@skip_win32
|
219 |
+
def test_extlibs(self):
|
220 |
+
ip = self._ip
|
221 |
+
code = u"""
|
222 |
+
from libc.math cimport sin
|
223 |
+
x = sin(0.0)
|
224 |
+
"""
|
225 |
+
ip.user_ns['x'] = 1
|
226 |
+
ip.run_cell_magic('cython', '-l m', code)
|
227 |
+
self.assertEqual(ip.user_ns['x'], 0)
|
228 |
+
|
229 |
+
|
230 |
+
def test_cython_verbose(self):
|
231 |
+
ip = self._ip
|
232 |
+
ip.run_cell_magic('cython', '--verbose', code)
|
233 |
+
ip.ex('g = f(10)')
|
234 |
+
self.assertEqual(ip.user_ns['g'], 20.0)
|
235 |
+
|
236 |
+
def test_cython_verbose_thresholds(self):
|
237 |
+
@contextmanager
|
238 |
+
def mock_distutils():
|
239 |
+
class MockLog:
|
240 |
+
DEBUG = 1
|
241 |
+
INFO = 2
|
242 |
+
thresholds = [INFO]
|
243 |
+
|
244 |
+
def set_threshold(self, val):
|
245 |
+
self.thresholds.append(val)
|
246 |
+
return self.thresholds[-2]
|
247 |
+
|
248 |
+
|
249 |
+
new_log = MockLog()
|
250 |
+
old_log = IpythonMagic.distutils.log
|
251 |
+
try:
|
252 |
+
IpythonMagic.distutils.log = new_log
|
253 |
+
yield new_log
|
254 |
+
finally:
|
255 |
+
IpythonMagic.distutils.log = old_log
|
256 |
+
|
257 |
+
ip = self._ip
|
258 |
+
with mock_distutils() as verbose_log:
|
259 |
+
ip.run_cell_magic('cython', '--verbose', code)
|
260 |
+
ip.ex('g = f(10)')
|
261 |
+
self.assertEqual(ip.user_ns['g'], 20.0)
|
262 |
+
self.assertEqual([verbose_log.INFO, verbose_log.DEBUG, verbose_log.INFO],
|
263 |
+
verbose_log.thresholds)
|
264 |
+
|
265 |
+
with mock_distutils() as normal_log:
|
266 |
+
ip.run_cell_magic('cython', '', code)
|
267 |
+
ip.ex('g = f(10)')
|
268 |
+
self.assertEqual(ip.user_ns['g'], 20.0)
|
269 |
+
self.assertEqual([normal_log.INFO], normal_log.thresholds)
|
270 |
+
|
271 |
+
def test_cython_no_annotate(self):
|
272 |
+
ip = self._ip
|
273 |
+
html = ip.run_cell_magic('cython', '', code)
|
274 |
+
self.assertTrue(html is None)
|
275 |
+
|
276 |
+
def test_cython_annotate(self):
|
277 |
+
ip = self._ip
|
278 |
+
html = ip.run_cell_magic('cython', '--annotate', code)
|
279 |
+
# somewhat brittle way to differentiate between annotated htmls
|
280 |
+
# with/without complete source code:
|
281 |
+
self.assertTrue(AnnotationCCodeWriter.COMPLETE_CODE_TITLE not in html.data)
|
282 |
+
|
283 |
+
def test_cython_annotate_default(self):
|
284 |
+
ip = self._ip
|
285 |
+
html = ip.run_cell_magic('cython', '-a', code)
|
286 |
+
# somewhat brittle way to differentiate between annotated htmls
|
287 |
+
# with/without complete source code:
|
288 |
+
self.assertTrue(AnnotationCCodeWriter.COMPLETE_CODE_TITLE not in html.data)
|
289 |
+
|
290 |
+
def test_cython_annotate_complete_c_code(self):
|
291 |
+
ip = self._ip
|
292 |
+
html = ip.run_cell_magic('cython', '--annotate-fullc', code)
|
293 |
+
# somewhat brittle way to differentiate between annotated htmls
|
294 |
+
# with/without complete source code:
|
295 |
+
self.assertTrue(AnnotationCCodeWriter.COMPLETE_CODE_TITLE in html.data)
|
Lib/site-packages/Cython/Build/Tests/TestRecythonize.py
ADDED
@@ -0,0 +1,212 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import shutil
|
2 |
+
import os
|
3 |
+
import tempfile
|
4 |
+
import time
|
5 |
+
|
6 |
+
import Cython.Build.Dependencies
|
7 |
+
import Cython.Utils
|
8 |
+
from Cython.TestUtils import CythonTest
|
9 |
+
|
10 |
+
|
11 |
+
def fresh_cythonize(*args, **kwargs):
|
12 |
+
Cython.Utils.clear_function_caches()
|
13 |
+
Cython.Build.Dependencies._dep_tree = None # discard method caches
|
14 |
+
Cython.Build.Dependencies.cythonize(*args, **kwargs)
|
15 |
+
|
16 |
+
class TestRecythonize(CythonTest):
|
17 |
+
|
18 |
+
def setUp(self):
|
19 |
+
CythonTest.setUp(self)
|
20 |
+
self.temp_dir = (
|
21 |
+
tempfile.mkdtemp(
|
22 |
+
prefix='recythonize-test',
|
23 |
+
dir='TEST_TMP' if os.path.isdir('TEST_TMP') else None
|
24 |
+
)
|
25 |
+
)
|
26 |
+
|
27 |
+
def tearDown(self):
|
28 |
+
CythonTest.tearDown(self)
|
29 |
+
shutil.rmtree(self.temp_dir)
|
30 |
+
|
31 |
+
def test_recythonize_pyx_on_pxd_change(self):
|
32 |
+
|
33 |
+
src_dir = tempfile.mkdtemp(prefix='src', dir=self.temp_dir)
|
34 |
+
|
35 |
+
a_pxd = os.path.join(src_dir, 'a.pxd')
|
36 |
+
a_pyx = os.path.join(src_dir, 'a.pyx')
|
37 |
+
a_c = os.path.join(src_dir, 'a.c')
|
38 |
+
dep_tree = Cython.Build.Dependencies.create_dependency_tree()
|
39 |
+
|
40 |
+
with open(a_pxd, 'w') as f:
|
41 |
+
f.write('cdef int value\n')
|
42 |
+
|
43 |
+
with open(a_pyx, 'w') as f:
|
44 |
+
f.write('value = 1\n')
|
45 |
+
|
46 |
+
|
47 |
+
# The dependencies for "a.pyx" are "a.pxd" and "a.pyx".
|
48 |
+
self.assertEqual({a_pxd, a_pyx}, dep_tree.all_dependencies(a_pyx))
|
49 |
+
|
50 |
+
# Cythonize to create a.c
|
51 |
+
fresh_cythonize(a_pyx)
|
52 |
+
|
53 |
+
# Sleep to address coarse time-stamp precision.
|
54 |
+
time.sleep(1)
|
55 |
+
|
56 |
+
with open(a_c) as f:
|
57 |
+
a_c_contents1 = f.read()
|
58 |
+
|
59 |
+
with open(a_pxd, 'w') as f:
|
60 |
+
f.write('cdef double value\n')
|
61 |
+
|
62 |
+
fresh_cythonize(a_pyx)
|
63 |
+
|
64 |
+
with open(a_c) as f:
|
65 |
+
a_c_contents2 = f.read()
|
66 |
+
|
67 |
+
self.assertTrue("__pyx_v_1a_value = 1;" in a_c_contents1)
|
68 |
+
self.assertFalse("__pyx_v_1a_value = 1;" in a_c_contents2)
|
69 |
+
self.assertTrue("__pyx_v_1a_value = 1.0;" in a_c_contents2)
|
70 |
+
self.assertFalse("__pyx_v_1a_value = 1.0;" in a_c_contents1)
|
71 |
+
|
72 |
+
|
73 |
+
def test_recythonize_py_on_pxd_change(self):
|
74 |
+
|
75 |
+
src_dir = tempfile.mkdtemp(prefix='src', dir=self.temp_dir)
|
76 |
+
|
77 |
+
a_pxd = os.path.join(src_dir, 'a.pxd')
|
78 |
+
a_py = os.path.join(src_dir, 'a.py')
|
79 |
+
a_c = os.path.join(src_dir, 'a.c')
|
80 |
+
dep_tree = Cython.Build.Dependencies.create_dependency_tree()
|
81 |
+
|
82 |
+
with open(a_pxd, 'w') as f:
|
83 |
+
f.write('cdef int value\n')
|
84 |
+
|
85 |
+
with open(a_py, 'w') as f:
|
86 |
+
f.write('value = 1\n')
|
87 |
+
|
88 |
+
|
89 |
+
# The dependencies for "a.py" are "a.pxd" and "a.py".
|
90 |
+
self.assertEqual({a_pxd, a_py}, dep_tree.all_dependencies(a_py))
|
91 |
+
|
92 |
+
# Cythonize to create a.c
|
93 |
+
fresh_cythonize(a_py)
|
94 |
+
|
95 |
+
# Sleep to address coarse time-stamp precision.
|
96 |
+
time.sleep(1)
|
97 |
+
|
98 |
+
with open(a_c) as f:
|
99 |
+
a_c_contents1 = f.read()
|
100 |
+
|
101 |
+
with open(a_pxd, 'w') as f:
|
102 |
+
f.write('cdef double value\n')
|
103 |
+
|
104 |
+
fresh_cythonize(a_py)
|
105 |
+
|
106 |
+
with open(a_c) as f:
|
107 |
+
a_c_contents2 = f.read()
|
108 |
+
|
109 |
+
|
110 |
+
self.assertTrue("__pyx_v_1a_value = 1;" in a_c_contents1)
|
111 |
+
self.assertFalse("__pyx_v_1a_value = 1;" in a_c_contents2)
|
112 |
+
self.assertTrue("__pyx_v_1a_value = 1.0;" in a_c_contents2)
|
113 |
+
self.assertFalse("__pyx_v_1a_value = 1.0;" in a_c_contents1)
|
114 |
+
|
115 |
+
def test_recythonize_pyx_on_dep_pxd_change(self):
|
116 |
+
src_dir = tempfile.mkdtemp(prefix='src', dir=self.temp_dir)
|
117 |
+
|
118 |
+
a_pxd = os.path.join(src_dir, 'a.pxd')
|
119 |
+
a_pyx = os.path.join(src_dir, 'a.pyx')
|
120 |
+
b_pyx = os.path.join(src_dir, 'b.pyx')
|
121 |
+
b_c = os.path.join(src_dir, 'b.c')
|
122 |
+
dep_tree = Cython.Build.Dependencies.create_dependency_tree()
|
123 |
+
|
124 |
+
with open(a_pxd, 'w') as f:
|
125 |
+
f.write('cdef int value\n')
|
126 |
+
|
127 |
+
with open(a_pyx, 'w') as f:
|
128 |
+
f.write('value = 1\n')
|
129 |
+
|
130 |
+
with open(b_pyx, 'w') as f:
|
131 |
+
f.write('cimport a\n' + 'a.value = 2\n')
|
132 |
+
|
133 |
+
|
134 |
+
# The dependencies for "b.pyx" are "a.pxd" and "b.pyx".
|
135 |
+
self.assertEqual({a_pxd, b_pyx}, dep_tree.all_dependencies(b_pyx))
|
136 |
+
|
137 |
+
|
138 |
+
# Cythonize to create b.c
|
139 |
+
fresh_cythonize([a_pyx, b_pyx])
|
140 |
+
|
141 |
+
# Sleep to address coarse time-stamp precision.
|
142 |
+
time.sleep(1)
|
143 |
+
|
144 |
+
with open(b_c) as f:
|
145 |
+
b_c_contents1 = f.read()
|
146 |
+
|
147 |
+
with open(a_pxd, 'w') as f:
|
148 |
+
f.write('cdef double value\n')
|
149 |
+
|
150 |
+
fresh_cythonize([a_pyx, b_pyx])
|
151 |
+
|
152 |
+
with open(b_c) as f:
|
153 |
+
b_c_contents2 = f.read()
|
154 |
+
|
155 |
+
|
156 |
+
|
157 |
+
self.assertTrue("__pyx_v_1a_value = 2;" in b_c_contents1)
|
158 |
+
self.assertFalse("__pyx_v_1a_value = 2;" in b_c_contents2)
|
159 |
+
self.assertTrue("__pyx_v_1a_value = 2.0;" in b_c_contents2)
|
160 |
+
self.assertFalse("__pyx_v_1a_value = 2.0;" in b_c_contents1)
|
161 |
+
|
162 |
+
|
163 |
+
|
164 |
+
def test_recythonize_py_on_dep_pxd_change(self):
|
165 |
+
|
166 |
+
src_dir = tempfile.mkdtemp(prefix='src', dir=self.temp_dir)
|
167 |
+
|
168 |
+
a_pxd = os.path.join(src_dir, 'a.pxd')
|
169 |
+
a_pyx = os.path.join(src_dir, 'a.pyx')
|
170 |
+
b_pxd = os.path.join(src_dir, 'b.pxd')
|
171 |
+
b_py = os.path.join(src_dir, 'b.py')
|
172 |
+
b_c = os.path.join(src_dir, 'b.c')
|
173 |
+
dep_tree = Cython.Build.Dependencies.create_dependency_tree()
|
174 |
+
|
175 |
+
with open(a_pxd, 'w') as f:
|
176 |
+
f.write('cdef int value\n')
|
177 |
+
|
178 |
+
with open(a_pyx, 'w') as f:
|
179 |
+
f.write('value = 1\n')
|
180 |
+
|
181 |
+
with open(b_pxd, 'w') as f:
|
182 |
+
f.write('cimport a\n')
|
183 |
+
|
184 |
+
with open(b_py, 'w') as f:
|
185 |
+
f.write('a.value = 2\n')
|
186 |
+
|
187 |
+
|
188 |
+
# The dependencies for b.py are "a.pxd", "b.pxd" and "b.py".
|
189 |
+
self.assertEqual({a_pxd, b_pxd, b_py}, dep_tree.all_dependencies(b_py))
|
190 |
+
|
191 |
+
|
192 |
+
# Cythonize to create b.c
|
193 |
+
fresh_cythonize([a_pyx, b_py])
|
194 |
+
|
195 |
+
# Sleep to address coarse time-stamp precision.
|
196 |
+
time.sleep(1)
|
197 |
+
|
198 |
+
with open(b_c) as f:
|
199 |
+
b_c_contents1 = f.read()
|
200 |
+
|
201 |
+
with open(a_pxd, 'w') as f:
|
202 |
+
f.write('cdef double value\n')
|
203 |
+
|
204 |
+
fresh_cythonize([a_pyx, b_py])
|
205 |
+
|
206 |
+
with open(b_c) as f:
|
207 |
+
b_c_contents2 = f.read()
|
208 |
+
|
209 |
+
self.assertTrue("__pyx_v_1a_value = 2;" in b_c_contents1)
|
210 |
+
self.assertFalse("__pyx_v_1a_value = 2;" in b_c_contents2)
|
211 |
+
self.assertTrue("__pyx_v_1a_value = 2.0;" in b_c_contents2)
|
212 |
+
self.assertFalse("__pyx_v_1a_value = 2.0;" in b_c_contents1)
|
Lib/site-packages/Cython/Build/Tests/TestStripLiterals.py
ADDED
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from Cython.Build.Dependencies import strip_string_literals
|
2 |
+
|
3 |
+
from Cython.TestUtils import CythonTest
|
4 |
+
|
5 |
+
class TestStripLiterals(CythonTest):
|
6 |
+
|
7 |
+
def t(self, before, expected):
|
8 |
+
actual, literals = strip_string_literals(before, prefix="_L")
|
9 |
+
self.assertEqual(expected, actual)
|
10 |
+
for key, value in literals.items():
|
11 |
+
actual = actual.replace(key, value)
|
12 |
+
self.assertEqual(before, actual)
|
13 |
+
|
14 |
+
def test_empty(self):
|
15 |
+
self.t("", "")
|
16 |
+
|
17 |
+
def test_single_quote(self):
|
18 |
+
self.t("'x'", "'_L1_'")
|
19 |
+
|
20 |
+
def test_double_quote(self):
|
21 |
+
self.t('"x"', '"_L1_"')
|
22 |
+
|
23 |
+
def test_nested_quotes(self):
|
24 |
+
self.t(""" '"' "'" """, """ '_L1_' "_L2_" """)
|
25 |
+
|
26 |
+
def test_triple_quote(self):
|
27 |
+
self.t(" '''a\n''' ", " '''_L1_''' ")
|
28 |
+
|
29 |
+
def test_backslash(self):
|
30 |
+
self.t(r"'a\'b'", "'_L1_'")
|
31 |
+
self.t(r"'a\\'", "'_L1_'")
|
32 |
+
self.t(r"'a\\\'b'", "'_L1_'")
|
33 |
+
|
34 |
+
def test_unicode(self):
|
35 |
+
self.t("u'abc'", "u'_L1_'")
|
36 |
+
|
37 |
+
def test_raw(self):
|
38 |
+
self.t(r"r'abc\\'", "r'_L1_'")
|
39 |
+
|
40 |
+
def test_raw_unicode(self):
|
41 |
+
self.t(r"ru'abc\\'", "ru'_L1_'")
|
42 |
+
|
43 |
+
def test_comment(self):
|
44 |
+
self.t("abc # foo", "abc #_L1_")
|
45 |
+
|
46 |
+
def test_comment_and_quote(self):
|
47 |
+
self.t("abc # 'x'", "abc #_L1_")
|
48 |
+
self.t("'abc#'", "'_L1_'")
|
49 |
+
|
50 |
+
def test_include(self):
|
51 |
+
self.t("include 'a.pxi' # something here",
|
52 |
+
"include '_L1_' #_L2_")
|
53 |
+
|
54 |
+
def test_extern(self):
|
55 |
+
self.t("cdef extern from 'a.h': # comment",
|
56 |
+
"cdef extern from '_L1_': #_L2_")
|
Lib/site-packages/Cython/Build/Tests/__init__.py
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
# empty file
|
Lib/site-packages/Cython/Build/Tests/__pycache__/TestCyCache.cpython-38.pyc
ADDED
Binary file (4.16 kB). View file
|
|
Lib/site-packages/Cython/Build/Tests/__pycache__/TestCythonizeArgsParser.cpython-38.pyc
ADDED
Binary file (20.4 kB). View file
|
|
Lib/site-packages/Cython/Build/Tests/__pycache__/TestDependencies.cpython-38.pyc
ADDED
Binary file (5.32 kB). View file
|
|
Lib/site-packages/Cython/Build/Tests/__pycache__/TestInline.cpython-38.pyc
ADDED
Binary file (4.62 kB). View file
|
|
Lib/site-packages/Cython/Build/Tests/__pycache__/TestIpythonMagic.cpython-38.pyc
ADDED
Binary file (8.9 kB). View file
|
|
Lib/site-packages/Cython/Build/Tests/__pycache__/TestRecythonize.cpython-38.pyc
ADDED
Binary file (4.44 kB). View file
|
|
Lib/site-packages/Cython/Build/Tests/__pycache__/TestStripLiterals.cpython-38.pyc
ADDED
Binary file (3.15 kB). View file
|
|
Lib/site-packages/Cython/Build/Tests/__pycache__/__init__.cpython-38.pyc
ADDED
Binary file (213 Bytes). View file
|
|
Lib/site-packages/Cython/Build/__init__.py
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .Dependencies import cythonize
|
2 |
+
|
3 |
+
import sys
|
4 |
+
if sys.version_info < (3, 7):
|
5 |
+
from .Distutils import build_ext
|
6 |
+
del sys
|
7 |
+
|
8 |
+
|
9 |
+
def __getattr__(name):
|
10 |
+
if name == 'build_ext':
|
11 |
+
# Lazy import, fails if distutils is not available (in Python 3.12+).
|
12 |
+
from .Distutils import build_ext
|
13 |
+
return build_ext
|
14 |
+
raise AttributeError("module '%s' has no attribute '%s'" % (__name__, name))
|
Lib/site-packages/Cython/Build/__pycache__/BuildExecutable.cpython-38.pyc
ADDED
Binary file (5.12 kB). View file
|
|
Lib/site-packages/Cython/Build/__pycache__/Cythonize.cpython-38.pyc
ADDED
Binary file (7.83 kB). View file
|
|
Lib/site-packages/Cython/Build/__pycache__/Dependencies.cpython-38.pyc
ADDED
Binary file (37.3 kB). View file
|
|
Lib/site-packages/Cython/Build/__pycache__/Distutils.cpython-38.pyc
ADDED
Binary file (268 Bytes). View file
|
|
Lib/site-packages/Cython/Build/__pycache__/Inline.cpython-38.pyc
ADDED
Binary file (10.6 kB). View file
|
|
Lib/site-packages/Cython/Build/__pycache__/IpythonMagic.cpython-38.pyc
ADDED
Binary file (17.4 kB). View file
|
|
Lib/site-packages/Cython/Build/__pycache__/__init__.cpython-38.pyc
ADDED
Binary file (601 Bytes). View file
|
|
Lib/site-packages/Cython/CodeWriter.py
ADDED
@@ -0,0 +1,820 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Serializes a Cython code tree to Cython code. This is primarily useful for
|
3 |
+
debugging and testing purposes.
|
4 |
+
The output is in a strict format, no whitespace or comments from the input
|
5 |
+
is preserved (and it could not be as it is not present in the code tree).
|
6 |
+
"""
|
7 |
+
|
8 |
+
from __future__ import absolute_import, print_function
|
9 |
+
|
10 |
+
from .Compiler.Visitor import TreeVisitor
|
11 |
+
from .Compiler.ExprNodes import *
|
12 |
+
from .Compiler.Nodes import CSimpleBaseTypeNode
|
13 |
+
|
14 |
+
|
15 |
+
class LinesResult(object):
|
16 |
+
def __init__(self):
|
17 |
+
self.lines = []
|
18 |
+
self.s = u""
|
19 |
+
|
20 |
+
def put(self, s):
|
21 |
+
self.s += s
|
22 |
+
|
23 |
+
def newline(self):
|
24 |
+
self.lines.append(self.s)
|
25 |
+
self.s = u""
|
26 |
+
|
27 |
+
def putline(self, s):
|
28 |
+
self.put(s)
|
29 |
+
self.newline()
|
30 |
+
|
31 |
+
|
32 |
+
class DeclarationWriter(TreeVisitor):
|
33 |
+
"""
|
34 |
+
A Cython code writer that is limited to declarations nodes.
|
35 |
+
"""
|
36 |
+
|
37 |
+
indent_string = u" "
|
38 |
+
|
39 |
+
def __init__(self, result=None):
|
40 |
+
super(DeclarationWriter, self).__init__()
|
41 |
+
if result is None:
|
42 |
+
result = LinesResult()
|
43 |
+
self.result = result
|
44 |
+
self.numindents = 0
|
45 |
+
self.tempnames = {}
|
46 |
+
self.tempblockindex = 0
|
47 |
+
|
48 |
+
def write(self, tree):
|
49 |
+
self.visit(tree)
|
50 |
+
return self.result
|
51 |
+
|
52 |
+
def indent(self):
|
53 |
+
self.numindents += 1
|
54 |
+
|
55 |
+
def dedent(self):
|
56 |
+
self.numindents -= 1
|
57 |
+
|
58 |
+
def startline(self, s=u""):
|
59 |
+
self.result.put(self.indent_string * self.numindents + s)
|
60 |
+
|
61 |
+
def put(self, s):
|
62 |
+
self.result.put(s)
|
63 |
+
|
64 |
+
def putline(self, s):
|
65 |
+
self.result.putline(self.indent_string * self.numindents + s)
|
66 |
+
|
67 |
+
def endline(self, s=u""):
|
68 |
+
self.result.putline(s)
|
69 |
+
|
70 |
+
def line(self, s):
|
71 |
+
self.startline(s)
|
72 |
+
self.endline()
|
73 |
+
|
74 |
+
def comma_separated_list(self, items, output_rhs=False):
|
75 |
+
if len(items) > 0:
|
76 |
+
for item in items[:-1]:
|
77 |
+
self.visit(item)
|
78 |
+
if output_rhs and item.default is not None:
|
79 |
+
self.put(u" = ")
|
80 |
+
self.visit(item.default)
|
81 |
+
self.put(u", ")
|
82 |
+
self.visit(items[-1])
|
83 |
+
if output_rhs and items[-1].default is not None:
|
84 |
+
self.put(u" = ")
|
85 |
+
self.visit(items[-1].default)
|
86 |
+
|
87 |
+
def _visit_indented(self, node):
|
88 |
+
self.indent()
|
89 |
+
self.visit(node)
|
90 |
+
self.dedent()
|
91 |
+
|
92 |
+
def visit_Node(self, node):
|
93 |
+
raise AssertionError("Node not handled by serializer: %r" % node)
|
94 |
+
|
95 |
+
def visit_ModuleNode(self, node):
|
96 |
+
self.visitchildren(node)
|
97 |
+
|
98 |
+
def visit_StatListNode(self, node):
|
99 |
+
self.visitchildren(node)
|
100 |
+
|
101 |
+
def visit_CDefExternNode(self, node):
|
102 |
+
if node.include_file is None:
|
103 |
+
file = u'*'
|
104 |
+
else:
|
105 |
+
file = u'"%s"' % node.include_file
|
106 |
+
self.putline(u"cdef extern from %s:" % file)
|
107 |
+
self._visit_indented(node.body)
|
108 |
+
|
109 |
+
def visit_CPtrDeclaratorNode(self, node):
|
110 |
+
self.put('*')
|
111 |
+
self.visit(node.base)
|
112 |
+
|
113 |
+
def visit_CReferenceDeclaratorNode(self, node):
|
114 |
+
self.put('&')
|
115 |
+
self.visit(node.base)
|
116 |
+
|
117 |
+
def visit_CArrayDeclaratorNode(self, node):
|
118 |
+
self.visit(node.base)
|
119 |
+
self.put(u'[')
|
120 |
+
if node.dimension is not None:
|
121 |
+
self.visit(node.dimension)
|
122 |
+
self.put(u']')
|
123 |
+
|
124 |
+
def visit_CFuncDeclaratorNode(self, node):
|
125 |
+
# TODO: except, gil, etc.
|
126 |
+
self.visit(node.base)
|
127 |
+
self.put(u'(')
|
128 |
+
self.comma_separated_list(node.args)
|
129 |
+
self.endline(u')')
|
130 |
+
|
131 |
+
def visit_CNameDeclaratorNode(self, node):
|
132 |
+
self.put(node.name)
|
133 |
+
|
134 |
+
def visit_CSimpleBaseTypeNode(self, node):
|
135 |
+
# See Parsing.p_sign_and_longness
|
136 |
+
if node.is_basic_c_type:
|
137 |
+
self.put(("unsigned ", "", "signed ")[node.signed])
|
138 |
+
if node.longness < 0:
|
139 |
+
self.put("short " * -node.longness)
|
140 |
+
elif node.longness > 0:
|
141 |
+
self.put("long " * node.longness)
|
142 |
+
if node.name is not None:
|
143 |
+
self.put(node.name)
|
144 |
+
|
145 |
+
def visit_CComplexBaseTypeNode(self, node):
|
146 |
+
self.visit(node.base_type)
|
147 |
+
self.visit(node.declarator)
|
148 |
+
|
149 |
+
def visit_CNestedBaseTypeNode(self, node):
|
150 |
+
self.visit(node.base_type)
|
151 |
+
self.put(u'.')
|
152 |
+
self.put(node.name)
|
153 |
+
|
154 |
+
def visit_TemplatedTypeNode(self, node):
|
155 |
+
self.visit(node.base_type_node)
|
156 |
+
self.put(u'[')
|
157 |
+
self.comma_separated_list(node.positional_args + node.keyword_args.key_value_pairs)
|
158 |
+
self.put(u']')
|
159 |
+
|
160 |
+
def visit_CVarDefNode(self, node):
|
161 |
+
self.startline(u"cdef ")
|
162 |
+
self.visit(node.base_type)
|
163 |
+
self.put(u" ")
|
164 |
+
self.comma_separated_list(node.declarators, output_rhs=True)
|
165 |
+
self.endline()
|
166 |
+
|
167 |
+
def _visit_container_node(self, node, decl, extras, attributes):
|
168 |
+
# TODO: visibility
|
169 |
+
self.startline(decl)
|
170 |
+
if node.name:
|
171 |
+
self.put(u' ')
|
172 |
+
self.put(node.name)
|
173 |
+
if node.cname is not None:
|
174 |
+
self.put(u' "%s"' % node.cname)
|
175 |
+
if extras:
|
176 |
+
self.put(extras)
|
177 |
+
self.endline(':')
|
178 |
+
self.indent()
|
179 |
+
if not attributes:
|
180 |
+
self.putline('pass')
|
181 |
+
else:
|
182 |
+
for attribute in attributes:
|
183 |
+
self.visit(attribute)
|
184 |
+
self.dedent()
|
185 |
+
|
186 |
+
def visit_CStructOrUnionDefNode(self, node):
|
187 |
+
if node.typedef_flag:
|
188 |
+
decl = u'ctypedef '
|
189 |
+
else:
|
190 |
+
decl = u'cdef '
|
191 |
+
if node.visibility == 'public':
|
192 |
+
decl += u'public '
|
193 |
+
if node.packed:
|
194 |
+
decl += u'packed '
|
195 |
+
decl += node.kind
|
196 |
+
self._visit_container_node(node, decl, None, node.attributes)
|
197 |
+
|
198 |
+
def visit_CppClassNode(self, node):
|
199 |
+
extras = ""
|
200 |
+
if node.templates:
|
201 |
+
extras = u"[%s]" % ", ".join(node.templates)
|
202 |
+
if node.base_classes:
|
203 |
+
extras += "(%s)" % ", ".join(node.base_classes)
|
204 |
+
self._visit_container_node(node, u"cdef cppclass", extras, node.attributes)
|
205 |
+
|
206 |
+
def visit_CEnumDefNode(self, node):
|
207 |
+
self._visit_container_node(node, u"cdef enum", None, node.items)
|
208 |
+
|
209 |
+
def visit_CEnumDefItemNode(self, node):
|
210 |
+
self.startline(node.name)
|
211 |
+
if node.cname:
|
212 |
+
self.put(u' "%s"' % node.cname)
|
213 |
+
if node.value:
|
214 |
+
self.put(u" = ")
|
215 |
+
self.visit(node.value)
|
216 |
+
self.endline()
|
217 |
+
|
218 |
+
def visit_CClassDefNode(self, node):
|
219 |
+
assert not node.module_name
|
220 |
+
if node.decorators:
|
221 |
+
for decorator in node.decorators:
|
222 |
+
self.visit(decorator)
|
223 |
+
self.startline(u"cdef class ")
|
224 |
+
self.put(node.class_name)
|
225 |
+
if node.base_class_name:
|
226 |
+
self.put(u"(")
|
227 |
+
if node.base_class_module:
|
228 |
+
self.put(node.base_class_module)
|
229 |
+
self.put(u".")
|
230 |
+
self.put(node.base_class_name)
|
231 |
+
self.put(u")")
|
232 |
+
self.endline(u":")
|
233 |
+
self._visit_indented(node.body)
|
234 |
+
|
235 |
+
def visit_CTypeDefNode(self, node):
|
236 |
+
self.startline(u"ctypedef ")
|
237 |
+
self.visit(node.base_type)
|
238 |
+
self.put(u" ")
|
239 |
+
self.visit(node.declarator)
|
240 |
+
self.endline()
|
241 |
+
|
242 |
+
def visit_FuncDefNode(self, node):
|
243 |
+
# TODO: support cdef + cpdef functions
|
244 |
+
self.startline(u"def %s(" % node.name)
|
245 |
+
self.comma_separated_list(node.args)
|
246 |
+
self.endline(u"):")
|
247 |
+
self._visit_indented(node.body)
|
248 |
+
|
249 |
+
def visit_CFuncDefNode(self, node):
|
250 |
+
self.startline(u'cpdef ' if node.overridable else u'cdef ')
|
251 |
+
if node.modifiers:
|
252 |
+
self.put(' '.join(node.modifiers))
|
253 |
+
self.put(' ')
|
254 |
+
if node.visibility != 'private':
|
255 |
+
self.put(node.visibility)
|
256 |
+
self.put(u' ')
|
257 |
+
if node.api:
|
258 |
+
self.put(u'api ')
|
259 |
+
|
260 |
+
if node.base_type:
|
261 |
+
self.visit(node.base_type)
|
262 |
+
if node.base_type.name is not None:
|
263 |
+
self.put(u' ')
|
264 |
+
|
265 |
+
# visit the CFuncDeclaratorNode, but put a `:` at the end of line
|
266 |
+
self.visit(node.declarator.base)
|
267 |
+
self.put(u'(')
|
268 |
+
self.comma_separated_list(node.declarator.args)
|
269 |
+
self.endline(u'):')
|
270 |
+
|
271 |
+
self._visit_indented(node.body)
|
272 |
+
|
273 |
+
def visit_CArgDeclNode(self, node):
|
274 |
+
# For "CSimpleBaseTypeNode", the variable type may have been parsed as type.
|
275 |
+
# For other node types, the "name" is always None.
|
276 |
+
if not isinstance(node.base_type, CSimpleBaseTypeNode) or \
|
277 |
+
node.base_type.name is not None:
|
278 |
+
self.visit(node.base_type)
|
279 |
+
|
280 |
+
# If we printed something for "node.base_type", we may need to print an extra ' '.
|
281 |
+
#
|
282 |
+
# Special case: if "node.declarator" is a "CNameDeclaratorNode",
|
283 |
+
# its "name" might be an empty string, for example, for "cdef f(x)".
|
284 |
+
if node.declarator.declared_name():
|
285 |
+
self.put(u" ")
|
286 |
+
self.visit(node.declarator)
|
287 |
+
if node.default is not None:
|
288 |
+
self.put(u" = ")
|
289 |
+
self.visit(node.default)
|
290 |
+
|
291 |
+
def visit_CImportStatNode(self, node):
|
292 |
+
self.startline(u"cimport ")
|
293 |
+
self.put(node.module_name)
|
294 |
+
if node.as_name:
|
295 |
+
self.put(u" as ")
|
296 |
+
self.put(node.as_name)
|
297 |
+
self.endline()
|
298 |
+
|
299 |
+
def visit_FromCImportStatNode(self, node):
|
300 |
+
self.startline(u"from ")
|
301 |
+
self.put(node.module_name)
|
302 |
+
self.put(u" cimport ")
|
303 |
+
first = True
|
304 |
+
for pos, name, as_name, kind in node.imported_names:
|
305 |
+
assert kind is None
|
306 |
+
if first:
|
307 |
+
first = False
|
308 |
+
else:
|
309 |
+
self.put(u", ")
|
310 |
+
self.put(name)
|
311 |
+
if as_name:
|
312 |
+
self.put(u" as ")
|
313 |
+
self.put(as_name)
|
314 |
+
self.endline()
|
315 |
+
|
316 |
+
def visit_NameNode(self, node):
|
317 |
+
self.put(node.name)
|
318 |
+
|
319 |
+
def visit_DecoratorNode(self, node):
|
320 |
+
self.startline("@")
|
321 |
+
self.visit(node.decorator)
|
322 |
+
self.endline()
|
323 |
+
|
324 |
+
def visit_PassStatNode(self, node):
|
325 |
+
self.startline(u"pass")
|
326 |
+
self.endline()
|
327 |
+
|
328 |
+
|
329 |
+
class StatementWriter(DeclarationWriter):
|
330 |
+
"""
|
331 |
+
A Cython code writer for most language statement features.
|
332 |
+
"""
|
333 |
+
|
334 |
+
def visit_SingleAssignmentNode(self, node):
|
335 |
+
self.startline()
|
336 |
+
self.visit(node.lhs)
|
337 |
+
self.put(u" = ")
|
338 |
+
self.visit(node.rhs)
|
339 |
+
self.endline()
|
340 |
+
|
341 |
+
def visit_CascadedAssignmentNode(self, node):
|
342 |
+
self.startline()
|
343 |
+
for lhs in node.lhs_list:
|
344 |
+
self.visit(lhs)
|
345 |
+
self.put(u" = ")
|
346 |
+
self.visit(node.rhs)
|
347 |
+
self.endline()
|
348 |
+
|
349 |
+
def visit_PrintStatNode(self, node):
|
350 |
+
self.startline(u"print ")
|
351 |
+
self.comma_separated_list(node.arg_tuple.args)
|
352 |
+
if not node.append_newline:
|
353 |
+
self.put(u",")
|
354 |
+
self.endline()
|
355 |
+
|
356 |
+
def visit_ForInStatNode(self, node):
|
357 |
+
self.startline(u"for ")
|
358 |
+
if node.target.is_sequence_constructor:
|
359 |
+
self.comma_separated_list(node.target.args)
|
360 |
+
else:
|
361 |
+
self.visit(node.target)
|
362 |
+
self.put(u" in ")
|
363 |
+
self.visit(node.iterator.sequence)
|
364 |
+
self.endline(u":")
|
365 |
+
self._visit_indented(node.body)
|
366 |
+
if node.else_clause is not None:
|
367 |
+
self.line(u"else:")
|
368 |
+
self._visit_indented(node.else_clause)
|
369 |
+
|
370 |
+
def visit_IfStatNode(self, node):
|
371 |
+
# The IfClauseNode is handled directly without a separate match
|
372 |
+
# for clariy.
|
373 |
+
self.startline(u"if ")
|
374 |
+
self.visit(node.if_clauses[0].condition)
|
375 |
+
self.endline(":")
|
376 |
+
self._visit_indented(node.if_clauses[0].body)
|
377 |
+
for clause in node.if_clauses[1:]:
|
378 |
+
self.startline("elif ")
|
379 |
+
self.visit(clause.condition)
|
380 |
+
self.endline(":")
|
381 |
+
self._visit_indented(clause.body)
|
382 |
+
if node.else_clause is not None:
|
383 |
+
self.line("else:")
|
384 |
+
self._visit_indented(node.else_clause)
|
385 |
+
|
386 |
+
def visit_WhileStatNode(self, node):
|
387 |
+
self.startline(u"while ")
|
388 |
+
self.visit(node.condition)
|
389 |
+
self.endline(u":")
|
390 |
+
self._visit_indented(node.body)
|
391 |
+
if node.else_clause is not None:
|
392 |
+
self.line("else:")
|
393 |
+
self._visit_indented(node.else_clause)
|
394 |
+
|
395 |
+
def visit_ContinueStatNode(self, node):
|
396 |
+
self.line(u"continue")
|
397 |
+
|
398 |
+
def visit_BreakStatNode(self, node):
|
399 |
+
self.line(u"break")
|
400 |
+
|
401 |
+
def visit_SequenceNode(self, node):
|
402 |
+
self.comma_separated_list(node.args) # Might need to discover whether we need () around tuples...hmm...
|
403 |
+
|
404 |
+
def visit_ExprStatNode(self, node):
|
405 |
+
self.startline()
|
406 |
+
self.visit(node.expr)
|
407 |
+
self.endline()
|
408 |
+
|
409 |
+
def visit_InPlaceAssignmentNode(self, node):
|
410 |
+
self.startline()
|
411 |
+
self.visit(node.lhs)
|
412 |
+
self.put(u" %s= " % node.operator)
|
413 |
+
self.visit(node.rhs)
|
414 |
+
self.endline()
|
415 |
+
|
416 |
+
def visit_WithStatNode(self, node):
|
417 |
+
self.startline()
|
418 |
+
self.put(u"with ")
|
419 |
+
self.visit(node.manager)
|
420 |
+
if node.target is not None:
|
421 |
+
self.put(u" as ")
|
422 |
+
self.visit(node.target)
|
423 |
+
self.endline(u":")
|
424 |
+
self._visit_indented(node.body)
|
425 |
+
|
426 |
+
def visit_TryFinallyStatNode(self, node):
|
427 |
+
self.line(u"try:")
|
428 |
+
self._visit_indented(node.body)
|
429 |
+
self.line(u"finally:")
|
430 |
+
self._visit_indented(node.finally_clause)
|
431 |
+
|
432 |
+
def visit_TryExceptStatNode(self, node):
|
433 |
+
self.line(u"try:")
|
434 |
+
self._visit_indented(node.body)
|
435 |
+
for x in node.except_clauses:
|
436 |
+
self.visit(x)
|
437 |
+
if node.else_clause is not None:
|
438 |
+
self.visit(node.else_clause)
|
439 |
+
|
440 |
+
def visit_ExceptClauseNode(self, node):
|
441 |
+
self.startline(u"except")
|
442 |
+
if node.pattern is not None:
|
443 |
+
self.put(u" ")
|
444 |
+
self.visit(node.pattern)
|
445 |
+
if node.target is not None:
|
446 |
+
self.put(u", ")
|
447 |
+
self.visit(node.target)
|
448 |
+
self.endline(":")
|
449 |
+
self._visit_indented(node.body)
|
450 |
+
|
451 |
+
def visit_ReturnStatNode(self, node):
|
452 |
+
self.startline("return")
|
453 |
+
if node.value is not None:
|
454 |
+
self.put(u" ")
|
455 |
+
self.visit(node.value)
|
456 |
+
self.endline()
|
457 |
+
|
458 |
+
def visit_ReraiseStatNode(self, node):
|
459 |
+
self.line("raise")
|
460 |
+
|
461 |
+
def visit_ImportNode(self, node):
|
462 |
+
self.put(u"(import %s)" % node.module_name.value)
|
463 |
+
|
464 |
+
def visit_TempsBlockNode(self, node):
|
465 |
+
"""
|
466 |
+
Temporaries are output like $1_1', where the first number is
|
467 |
+
an index of the TempsBlockNode and the second number is an index
|
468 |
+
of the temporary which that block allocates.
|
469 |
+
"""
|
470 |
+
idx = 0
|
471 |
+
for handle in node.temps:
|
472 |
+
self.tempnames[handle] = "$%d_%d" % (self.tempblockindex, idx)
|
473 |
+
idx += 1
|
474 |
+
self.tempblockindex += 1
|
475 |
+
self.visit(node.body)
|
476 |
+
|
477 |
+
def visit_TempRefNode(self, node):
|
478 |
+
self.put(self.tempnames[node.handle])
|
479 |
+
|
480 |
+
|
481 |
+
class ExpressionWriter(TreeVisitor):
|
482 |
+
"""
|
483 |
+
A Cython code writer that is intentionally limited to expressions.
|
484 |
+
"""
|
485 |
+
|
486 |
+
def __init__(self, result=None):
|
487 |
+
super(ExpressionWriter, self).__init__()
|
488 |
+
if result is None:
|
489 |
+
result = u""
|
490 |
+
self.result = result
|
491 |
+
self.precedence = [0]
|
492 |
+
|
493 |
+
def write(self, tree):
|
494 |
+
self.visit(tree)
|
495 |
+
return self.result
|
496 |
+
|
497 |
+
def put(self, s):
|
498 |
+
self.result += s
|
499 |
+
|
500 |
+
def remove(self, s):
|
501 |
+
if self.result.endswith(s):
|
502 |
+
self.result = self.result[:-len(s)]
|
503 |
+
|
504 |
+
def comma_separated_list(self, items):
|
505 |
+
if len(items) > 0:
|
506 |
+
for item in items[:-1]:
|
507 |
+
self.visit(item)
|
508 |
+
self.put(u", ")
|
509 |
+
self.visit(items[-1])
|
510 |
+
|
511 |
+
def visit_Node(self, node):
|
512 |
+
raise AssertionError("Node not handled by serializer: %r" % node)
|
513 |
+
|
514 |
+
def visit_IntNode(self, node):
|
515 |
+
self.put(node.value)
|
516 |
+
|
517 |
+
def visit_FloatNode(self, node):
|
518 |
+
self.put(node.value)
|
519 |
+
|
520 |
+
def visit_NoneNode(self, node):
|
521 |
+
self.put(u"None")
|
522 |
+
|
523 |
+
def visit_NameNode(self, node):
|
524 |
+
self.put(node.name)
|
525 |
+
|
526 |
+
def visit_EllipsisNode(self, node):
|
527 |
+
self.put(u"...")
|
528 |
+
|
529 |
+
def visit_BoolNode(self, node):
|
530 |
+
self.put(str(node.value))
|
531 |
+
|
532 |
+
def visit_ConstNode(self, node):
|
533 |
+
self.put(str(node.value))
|
534 |
+
|
535 |
+
def visit_ImagNode(self, node):
|
536 |
+
self.put(node.value)
|
537 |
+
self.put(u"j")
|
538 |
+
|
539 |
+
def emit_string(self, node, prefix=u""):
|
540 |
+
repr_val = repr(node.value)
|
541 |
+
if repr_val[0] in 'ub':
|
542 |
+
repr_val = repr_val[1:]
|
543 |
+
self.put(u"%s%s" % (prefix, repr_val))
|
544 |
+
|
545 |
+
def visit_BytesNode(self, node):
|
546 |
+
self.emit_string(node, u"b")
|
547 |
+
|
548 |
+
def visit_StringNode(self, node):
|
549 |
+
self.emit_string(node)
|
550 |
+
|
551 |
+
def visit_UnicodeNode(self, node):
|
552 |
+
self.emit_string(node, u"u")
|
553 |
+
|
554 |
+
def emit_sequence(self, node, parens=(u"", u"")):
|
555 |
+
open_paren, close_paren = parens
|
556 |
+
items = node.subexpr_nodes()
|
557 |
+
self.put(open_paren)
|
558 |
+
self.comma_separated_list(items)
|
559 |
+
self.put(close_paren)
|
560 |
+
|
561 |
+
def visit_ListNode(self, node):
|
562 |
+
self.emit_sequence(node, u"[]")
|
563 |
+
|
564 |
+
def visit_TupleNode(self, node):
|
565 |
+
self.emit_sequence(node, u"()")
|
566 |
+
|
567 |
+
def visit_SetNode(self, node):
|
568 |
+
if len(node.subexpr_nodes()) > 0:
|
569 |
+
self.emit_sequence(node, u"{}")
|
570 |
+
else:
|
571 |
+
self.put(u"set()")
|
572 |
+
|
573 |
+
def visit_DictNode(self, node):
|
574 |
+
self.emit_sequence(node, u"{}")
|
575 |
+
|
576 |
+
def visit_DictItemNode(self, node):
|
577 |
+
self.visit(node.key)
|
578 |
+
self.put(u": ")
|
579 |
+
self.visit(node.value)
|
580 |
+
|
581 |
+
unop_precedence = {
|
582 |
+
'not': 3, '!': 3,
|
583 |
+
'+': 11, '-': 11, '~': 11,
|
584 |
+
}
|
585 |
+
binop_precedence = {
|
586 |
+
'or': 1,
|
587 |
+
'and': 2,
|
588 |
+
# unary: 'not': 3, '!': 3,
|
589 |
+
'in': 4, 'not_in': 4, 'is': 4, 'is_not': 4, '<': 4, '<=': 4, '>': 4, '>=': 4, '!=': 4, '==': 4,
|
590 |
+
'|': 5,
|
591 |
+
'^': 6,
|
592 |
+
'&': 7,
|
593 |
+
'<<': 8, '>>': 8,
|
594 |
+
'+': 9, '-': 9,
|
595 |
+
'*': 10, '@': 10, '/': 10, '//': 10, '%': 10,
|
596 |
+
# unary: '+': 11, '-': 11, '~': 11
|
597 |
+
'**': 12,
|
598 |
+
}
|
599 |
+
|
600 |
+
def operator_enter(self, new_prec):
|
601 |
+
old_prec = self.precedence[-1]
|
602 |
+
if old_prec > new_prec:
|
603 |
+
self.put(u"(")
|
604 |
+
self.precedence.append(new_prec)
|
605 |
+
|
606 |
+
def operator_exit(self):
|
607 |
+
old_prec, new_prec = self.precedence[-2:]
|
608 |
+
if old_prec > new_prec:
|
609 |
+
self.put(u")")
|
610 |
+
self.precedence.pop()
|
611 |
+
|
612 |
+
def visit_NotNode(self, node):
|
613 |
+
op = 'not'
|
614 |
+
prec = self.unop_precedence[op]
|
615 |
+
self.operator_enter(prec)
|
616 |
+
self.put(u"not ")
|
617 |
+
self.visit(node.operand)
|
618 |
+
self.operator_exit()
|
619 |
+
|
620 |
+
def visit_UnopNode(self, node):
|
621 |
+
op = node.operator
|
622 |
+
prec = self.unop_precedence[op]
|
623 |
+
self.operator_enter(prec)
|
624 |
+
self.put(u"%s" % node.operator)
|
625 |
+
self.visit(node.operand)
|
626 |
+
self.operator_exit()
|
627 |
+
|
628 |
+
def visit_BinopNode(self, node):
|
629 |
+
op = node.operator
|
630 |
+
prec = self.binop_precedence.get(op, 0)
|
631 |
+
self.operator_enter(prec)
|
632 |
+
self.visit(node.operand1)
|
633 |
+
self.put(u" %s " % op.replace('_', ' '))
|
634 |
+
self.visit(node.operand2)
|
635 |
+
self.operator_exit()
|
636 |
+
|
637 |
+
def visit_BoolBinopNode(self, node):
|
638 |
+
self.visit_BinopNode(node)
|
639 |
+
|
640 |
+
def visit_PrimaryCmpNode(self, node):
|
641 |
+
self.visit_BinopNode(node)
|
642 |
+
|
643 |
+
def visit_IndexNode(self, node):
|
644 |
+
self.visit(node.base)
|
645 |
+
self.put(u"[")
|
646 |
+
if isinstance(node.index, TupleNode):
|
647 |
+
if node.index.subexpr_nodes():
|
648 |
+
self.emit_sequence(node.index)
|
649 |
+
else:
|
650 |
+
self.put(u"()")
|
651 |
+
else:
|
652 |
+
self.visit(node.index)
|
653 |
+
self.put(u"]")
|
654 |
+
|
655 |
+
def visit_SliceIndexNode(self, node):
|
656 |
+
self.visit(node.base)
|
657 |
+
self.put(u"[")
|
658 |
+
if node.start:
|
659 |
+
self.visit(node.start)
|
660 |
+
self.put(u":")
|
661 |
+
if node.stop:
|
662 |
+
self.visit(node.stop)
|
663 |
+
if node.slice:
|
664 |
+
self.put(u":")
|
665 |
+
self.visit(node.slice)
|
666 |
+
self.put(u"]")
|
667 |
+
|
668 |
+
def visit_SliceNode(self, node):
|
669 |
+
if not node.start.is_none:
|
670 |
+
self.visit(node.start)
|
671 |
+
self.put(u":")
|
672 |
+
if not node.stop.is_none:
|
673 |
+
self.visit(node.stop)
|
674 |
+
if not node.step.is_none:
|
675 |
+
self.put(u":")
|
676 |
+
self.visit(node.step)
|
677 |
+
|
678 |
+
def visit_CondExprNode(self, node):
|
679 |
+
self.visit(node.true_val)
|
680 |
+
self.put(u" if ")
|
681 |
+
self.visit(node.test)
|
682 |
+
self.put(u" else ")
|
683 |
+
self.visit(node.false_val)
|
684 |
+
|
685 |
+
def visit_AttributeNode(self, node):
|
686 |
+
self.visit(node.obj)
|
687 |
+
self.put(u".%s" % node.attribute)
|
688 |
+
|
689 |
+
def visit_SimpleCallNode(self, node):
|
690 |
+
self.visit(node.function)
|
691 |
+
self.put(u"(")
|
692 |
+
self.comma_separated_list(node.args)
|
693 |
+
self.put(")")
|
694 |
+
|
695 |
+
def emit_pos_args(self, node):
|
696 |
+
if node is None:
|
697 |
+
return
|
698 |
+
if isinstance(node, AddNode):
|
699 |
+
self.emit_pos_args(node.operand1)
|
700 |
+
self.emit_pos_args(node.operand2)
|
701 |
+
elif isinstance(node, TupleNode):
|
702 |
+
for expr in node.subexpr_nodes():
|
703 |
+
self.visit(expr)
|
704 |
+
self.put(u", ")
|
705 |
+
elif isinstance(node, AsTupleNode):
|
706 |
+
self.put("*")
|
707 |
+
self.visit(node.arg)
|
708 |
+
self.put(u", ")
|
709 |
+
else:
|
710 |
+
self.visit(node)
|
711 |
+
self.put(u", ")
|
712 |
+
|
713 |
+
def emit_kwd_args(self, node):
|
714 |
+
if node is None:
|
715 |
+
return
|
716 |
+
if isinstance(node, MergedDictNode):
|
717 |
+
for expr in node.subexpr_nodes():
|
718 |
+
self.emit_kwd_args(expr)
|
719 |
+
elif isinstance(node, DictNode):
|
720 |
+
for expr in node.subexpr_nodes():
|
721 |
+
self.put(u"%s=" % expr.key.value)
|
722 |
+
self.visit(expr.value)
|
723 |
+
self.put(u", ")
|
724 |
+
else:
|
725 |
+
self.put(u"**")
|
726 |
+
self.visit(node)
|
727 |
+
self.put(u", ")
|
728 |
+
|
729 |
+
def visit_GeneralCallNode(self, node):
|
730 |
+
self.visit(node.function)
|
731 |
+
self.put(u"(")
|
732 |
+
self.emit_pos_args(node.positional_args)
|
733 |
+
self.emit_kwd_args(node.keyword_args)
|
734 |
+
self.remove(u", ")
|
735 |
+
self.put(")")
|
736 |
+
|
737 |
+
def emit_comprehension(self, body, target,
|
738 |
+
sequence, condition,
|
739 |
+
parens=(u"", u"")):
|
740 |
+
open_paren, close_paren = parens
|
741 |
+
self.put(open_paren)
|
742 |
+
self.visit(body)
|
743 |
+
self.put(u" for ")
|
744 |
+
self.visit(target)
|
745 |
+
self.put(u" in ")
|
746 |
+
self.visit(sequence)
|
747 |
+
if condition:
|
748 |
+
self.put(u" if ")
|
749 |
+
self.visit(condition)
|
750 |
+
self.put(close_paren)
|
751 |
+
|
752 |
+
def visit_ComprehensionAppendNode(self, node):
|
753 |
+
self.visit(node.expr)
|
754 |
+
|
755 |
+
def visit_DictComprehensionAppendNode(self, node):
|
756 |
+
self.visit(node.key_expr)
|
757 |
+
self.put(u": ")
|
758 |
+
self.visit(node.value_expr)
|
759 |
+
|
760 |
+
def visit_ComprehensionNode(self, node):
|
761 |
+
tpmap = {'list': u"[]", 'dict': u"{}", 'set': u"{}"}
|
762 |
+
parens = tpmap[node.type.py_type_name()]
|
763 |
+
body = node.loop.body
|
764 |
+
target = node.loop.target
|
765 |
+
sequence = node.loop.iterator.sequence
|
766 |
+
condition = None
|
767 |
+
if hasattr(body, 'if_clauses'):
|
768 |
+
# type(body) is Nodes.IfStatNode
|
769 |
+
condition = body.if_clauses[0].condition
|
770 |
+
body = body.if_clauses[0].body
|
771 |
+
self.emit_comprehension(body, target, sequence, condition, parens)
|
772 |
+
|
773 |
+
def visit_GeneratorExpressionNode(self, node):
|
774 |
+
body = node.loop.body
|
775 |
+
target = node.loop.target
|
776 |
+
sequence = node.loop.iterator.sequence
|
777 |
+
condition = None
|
778 |
+
if hasattr(body, 'if_clauses'):
|
779 |
+
# type(body) is Nodes.IfStatNode
|
780 |
+
condition = body.if_clauses[0].condition
|
781 |
+
body = body.if_clauses[0].body.expr.arg
|
782 |
+
elif hasattr(body, 'expr'):
|
783 |
+
# type(body) is Nodes.ExprStatNode
|
784 |
+
body = body.expr.arg
|
785 |
+
self.emit_comprehension(body, target, sequence, condition, u"()")
|
786 |
+
|
787 |
+
|
788 |
+
class PxdWriter(DeclarationWriter, ExpressionWriter):
|
789 |
+
"""
|
790 |
+
A Cython code writer for everything supported in pxd files.
|
791 |
+
(currently unused)
|
792 |
+
"""
|
793 |
+
|
794 |
+
def __call__(self, node):
|
795 |
+
print(u'\n'.join(self.write(node).lines))
|
796 |
+
return node
|
797 |
+
|
798 |
+
def visit_CFuncDefNode(self, node):
|
799 |
+
if node.overridable:
|
800 |
+
self.startline(u'cpdef ')
|
801 |
+
else:
|
802 |
+
self.startline(u'cdef ')
|
803 |
+
if node.modifiers:
|
804 |
+
self.put(' '.join(node.modifiers))
|
805 |
+
self.put(' ')
|
806 |
+
if node.visibility != 'private':
|
807 |
+
self.put(node.visibility)
|
808 |
+
self.put(u' ')
|
809 |
+
if node.api:
|
810 |
+
self.put(u'api ')
|
811 |
+
self.visit(node.declarator)
|
812 |
+
|
813 |
+
def visit_StatNode(self, node):
|
814 |
+
pass
|
815 |
+
|
816 |
+
|
817 |
+
class CodeWriter(StatementWriter, ExpressionWriter):
|
818 |
+
"""
|
819 |
+
A complete Cython code writer.
|
820 |
+
"""
|
Lib/site-packages/Cython/Compiler/AnalysedTreeTransforms.py
ADDED
@@ -0,0 +1,99 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from __future__ import absolute_import
|
2 |
+
|
3 |
+
from .Visitor import ScopeTrackingTransform
|
4 |
+
from .Nodes import StatListNode, SingleAssignmentNode, CFuncDefNode, DefNode
|
5 |
+
from .ExprNodes import DictNode, DictItemNode, NameNode, UnicodeNode
|
6 |
+
from .PyrexTypes import py_object_type
|
7 |
+
from .StringEncoding import EncodedString
|
8 |
+
from . import Symtab
|
9 |
+
|
10 |
+
class AutoTestDictTransform(ScopeTrackingTransform):
|
11 |
+
# Handles autotestdict directive
|
12 |
+
|
13 |
+
excludelist = ['__cinit__', '__dealloc__', '__richcmp__',
|
14 |
+
'__nonzero__', '__bool__',
|
15 |
+
'__len__', '__contains__']
|
16 |
+
|
17 |
+
def visit_ModuleNode(self, node):
|
18 |
+
if node.is_pxd:
|
19 |
+
return node
|
20 |
+
self.scope_type = 'module'
|
21 |
+
self.scope_node = node
|
22 |
+
|
23 |
+
if not self.current_directives['autotestdict']:
|
24 |
+
return node
|
25 |
+
self.all_docstrings = self.current_directives['autotestdict.all']
|
26 |
+
self.cdef_docstrings = self.all_docstrings or self.current_directives['autotestdict.cdef']
|
27 |
+
|
28 |
+
assert isinstance(node.body, StatListNode)
|
29 |
+
|
30 |
+
# First see if __test__ is already created
|
31 |
+
if u'__test__' in node.scope.entries:
|
32 |
+
# Do nothing
|
33 |
+
return node
|
34 |
+
|
35 |
+
pos = node.pos
|
36 |
+
|
37 |
+
self.tests = []
|
38 |
+
self.testspos = node.pos
|
39 |
+
|
40 |
+
test_dict_entry = node.scope.declare_var(EncodedString(u'__test__'),
|
41 |
+
py_object_type,
|
42 |
+
pos,
|
43 |
+
visibility='public')
|
44 |
+
create_test_dict_assignment = SingleAssignmentNode(pos,
|
45 |
+
lhs=NameNode(pos, name=EncodedString(u'__test__'),
|
46 |
+
entry=test_dict_entry),
|
47 |
+
rhs=DictNode(pos, key_value_pairs=self.tests))
|
48 |
+
self.visitchildren(node)
|
49 |
+
node.body.stats.append(create_test_dict_assignment)
|
50 |
+
return node
|
51 |
+
|
52 |
+
def add_test(self, testpos, path, doctest):
|
53 |
+
pos = self.testspos
|
54 |
+
keystr = u'%s (line %d)' % (path, testpos[1])
|
55 |
+
key = UnicodeNode(pos, value=EncodedString(keystr))
|
56 |
+
value = UnicodeNode(pos, value=doctest)
|
57 |
+
self.tests.append(DictItemNode(pos, key=key, value=value))
|
58 |
+
|
59 |
+
def visit_ExprNode(self, node):
|
60 |
+
# expressions cannot contain functions and lambda expressions
|
61 |
+
# do not have a docstring
|
62 |
+
return node
|
63 |
+
|
64 |
+
def visit_FuncDefNode(self, node):
|
65 |
+
if not node.doc or (isinstance(node, DefNode) and node.fused_py_func):
|
66 |
+
return node
|
67 |
+
if not self.cdef_docstrings:
|
68 |
+
if isinstance(node, CFuncDefNode) and not node.py_func:
|
69 |
+
return node
|
70 |
+
if not self.all_docstrings and '>>>' not in node.doc:
|
71 |
+
return node
|
72 |
+
|
73 |
+
pos = self.testspos
|
74 |
+
if self.scope_type == 'module':
|
75 |
+
path = node.entry.name
|
76 |
+
elif self.scope_type in ('pyclass', 'cclass'):
|
77 |
+
if isinstance(node, CFuncDefNode):
|
78 |
+
if node.py_func is not None:
|
79 |
+
name = node.py_func.name
|
80 |
+
else:
|
81 |
+
name = node.entry.name
|
82 |
+
else:
|
83 |
+
name = node.name
|
84 |
+
if self.scope_type == 'cclass' and name in self.excludelist:
|
85 |
+
return node
|
86 |
+
if self.scope_type == 'pyclass':
|
87 |
+
class_name = self.scope_node.name
|
88 |
+
else:
|
89 |
+
class_name = self.scope_node.class_name
|
90 |
+
if isinstance(node.entry.scope, Symtab.PropertyScope):
|
91 |
+
property_method_name = node.entry.scope.name
|
92 |
+
path = "%s.%s.%s" % (class_name, node.entry.scope.name,
|
93 |
+
node.entry.name)
|
94 |
+
else:
|
95 |
+
path = "%s.%s" % (class_name, node.entry.name)
|
96 |
+
else:
|
97 |
+
assert False
|
98 |
+
self.add_test(node.pos, path, node.doc)
|
99 |
+
return node
|
Lib/site-packages/Cython/Compiler/Annotate.py
ADDED
@@ -0,0 +1,341 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Note: Work in progress
|
2 |
+
|
3 |
+
from __future__ import absolute_import
|
4 |
+
|
5 |
+
import os
|
6 |
+
import os.path
|
7 |
+
import re
|
8 |
+
import codecs
|
9 |
+
import textwrap
|
10 |
+
from datetime import datetime
|
11 |
+
from functools import partial
|
12 |
+
from collections import defaultdict
|
13 |
+
from xml.sax.saxutils import escape as html_escape
|
14 |
+
try:
|
15 |
+
from StringIO import StringIO
|
16 |
+
except ImportError:
|
17 |
+
from io import StringIO # does not support writing 'str' in Py2
|
18 |
+
|
19 |
+
from . import Version
|
20 |
+
from .Code import CCodeWriter
|
21 |
+
from .. import Utils
|
22 |
+
|
23 |
+
|
24 |
+
class AnnotationCCodeWriter(CCodeWriter):
|
25 |
+
|
26 |
+
# also used as marker for detection of complete code emission in tests
|
27 |
+
COMPLETE_CODE_TITLE = "Complete cythonized code"
|
28 |
+
|
29 |
+
def __init__(self, create_from=None, buffer=None, copy_formatting=True, show_entire_c_code=False, source_desc=None):
|
30 |
+
CCodeWriter.__init__(self, create_from, buffer, copy_formatting=copy_formatting)
|
31 |
+
self.show_entire_c_code = show_entire_c_code
|
32 |
+
if create_from is None:
|
33 |
+
self.annotation_buffer = StringIO()
|
34 |
+
self.last_annotated_pos = None
|
35 |
+
# annotations[filename][line] -> [(column, AnnotationItem)*]
|
36 |
+
self.annotations = defaultdict(partial(defaultdict, list))
|
37 |
+
# code[filename][line] -> str
|
38 |
+
self.code = defaultdict(partial(defaultdict, str))
|
39 |
+
# scopes[filename][line] -> set(scopes)
|
40 |
+
self.scopes = defaultdict(partial(defaultdict, set))
|
41 |
+
else:
|
42 |
+
# When creating an insertion point, keep references to the same database
|
43 |
+
self.annotation_buffer = create_from.annotation_buffer
|
44 |
+
self.annotations = create_from.annotations
|
45 |
+
self.code = create_from.code
|
46 |
+
self.scopes = create_from.scopes
|
47 |
+
self.last_annotated_pos = create_from.last_annotated_pos
|
48 |
+
|
49 |
+
def create_new(self, create_from, buffer, copy_formatting):
|
50 |
+
return AnnotationCCodeWriter(create_from, buffer, copy_formatting)
|
51 |
+
|
52 |
+
def _write_to_buffer(self, s):
|
53 |
+
self.buffer.write(s)
|
54 |
+
self.annotation_buffer.write(s)
|
55 |
+
|
56 |
+
def mark_pos(self, pos, trace=True):
|
57 |
+
if pos is not None:
|
58 |
+
CCodeWriter.mark_pos(self, pos, trace)
|
59 |
+
if self.funcstate and self.funcstate.scope:
|
60 |
+
# lambdas and genexprs can result in multiple scopes per line => keep them in a set
|
61 |
+
self.scopes[pos[0].filename][pos[1]].add(self.funcstate.scope)
|
62 |
+
if self.last_annotated_pos:
|
63 |
+
source_desc, line, _ = self.last_annotated_pos
|
64 |
+
pos_code = self.code[source_desc.filename]
|
65 |
+
pos_code[line] += self.annotation_buffer.getvalue()
|
66 |
+
self.annotation_buffer = StringIO()
|
67 |
+
self.last_annotated_pos = pos
|
68 |
+
|
69 |
+
def annotate(self, pos, item):
|
70 |
+
self.annotations[pos[0].filename][pos[1]].append((pos[2], item))
|
71 |
+
|
72 |
+
def _css(self):
|
73 |
+
"""css template will later allow to choose a colormap"""
|
74 |
+
css = [self._css_template]
|
75 |
+
for i in range(255):
|
76 |
+
color = u"FFFF%02x" % int(255.0 // (1.0 + i/10.0))
|
77 |
+
css.append('.cython.score-%d {background-color: #%s;}' % (i, color))
|
78 |
+
try:
|
79 |
+
from pygments.formatters import HtmlFormatter
|
80 |
+
except ImportError:
|
81 |
+
pass
|
82 |
+
else:
|
83 |
+
css.append(HtmlFormatter().get_style_defs('.cython'))
|
84 |
+
return '\n'.join(css)
|
85 |
+
|
86 |
+
_css_template = textwrap.dedent("""
|
87 |
+
body.cython { font-family: courier; font-size: 12; }
|
88 |
+
|
89 |
+
.cython.tag { }
|
90 |
+
.cython.line { color: #000000; margin: 0em }
|
91 |
+
.cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; }
|
92 |
+
|
93 |
+
.cython.line .run { background-color: #B0FFB0; }
|
94 |
+
.cython.line .mis { background-color: #FFB0B0; }
|
95 |
+
.cython.code.run { border-left: 8px solid #B0FFB0; }
|
96 |
+
.cython.code.mis { border-left: 8px solid #FFB0B0; }
|
97 |
+
|
98 |
+
.cython.code .py_c_api { color: red; }
|
99 |
+
.cython.code .py_macro_api { color: #FF7000; }
|
100 |
+
.cython.code .pyx_c_api { color: #FF3000; }
|
101 |
+
.cython.code .pyx_macro_api { color: #FF7000; }
|
102 |
+
.cython.code .refnanny { color: #FFA000; }
|
103 |
+
.cython.code .trace { color: #FFA000; }
|
104 |
+
.cython.code .error_goto { color: #FFA000; }
|
105 |
+
|
106 |
+
.cython.code .coerce { color: #008000; border: 1px dotted #008000 }
|
107 |
+
.cython.code .py_attr { color: #FF0000; font-weight: bold; }
|
108 |
+
.cython.code .c_attr { color: #0000FF; }
|
109 |
+
.cython.code .py_call { color: #FF0000; font-weight: bold; }
|
110 |
+
.cython.code .c_call { color: #0000FF; }
|
111 |
+
""")
|
112 |
+
|
113 |
+
# on-click toggle function to show/hide C source code
|
114 |
+
_onclick_attr = ' onclick="{0}"'.format((
|
115 |
+
"(function(s){"
|
116 |
+
" s.display = s.display === 'block' ? 'none' : 'block'"
|
117 |
+
"})(this.nextElementSibling.style)"
|
118 |
+
).replace(' ', '') # poor dev's JS minification
|
119 |
+
)
|
120 |
+
|
121 |
+
def save_annotation(self, source_filename, target_filename, coverage_xml=None):
|
122 |
+
with Utils.open_source_file(source_filename) as f:
|
123 |
+
code = f.read()
|
124 |
+
generated_code = self.code.get(source_filename, {})
|
125 |
+
c_file = Utils.decode_filename(os.path.basename(target_filename))
|
126 |
+
html_filename = os.path.splitext(target_filename)[0] + ".html"
|
127 |
+
|
128 |
+
with codecs.open(html_filename, "w", encoding="UTF-8") as out_buffer:
|
129 |
+
out_buffer.write(self._save_annotation(code, generated_code, c_file, source_filename, coverage_xml))
|
130 |
+
|
131 |
+
def _save_annotation_header(self, c_file, source_filename, coverage_timestamp=None):
|
132 |
+
coverage_info = ''
|
133 |
+
if coverage_timestamp:
|
134 |
+
coverage_info = u' with coverage data from {timestamp}'.format(
|
135 |
+
timestamp=datetime.fromtimestamp(int(coverage_timestamp) // 1000))
|
136 |
+
|
137 |
+
outlist = [
|
138 |
+
textwrap.dedent(u'''\
|
139 |
+
<!DOCTYPE html>
|
140 |
+
<!-- Generated by Cython {watermark} -->
|
141 |
+
<html>
|
142 |
+
<head>
|
143 |
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
144 |
+
<title>Cython: {filename}</title>
|
145 |
+
<style type="text/css">
|
146 |
+
{css}
|
147 |
+
</style>
|
148 |
+
</head>
|
149 |
+
<body class="cython">
|
150 |
+
<p><span style="border-bottom: solid 1px grey;">Generated by Cython {watermark}</span>{more_info}</p>
|
151 |
+
<p>
|
152 |
+
<span style="background-color: #FFFF00">Yellow lines</span> hint at Python interaction.<br />
|
153 |
+
Click on a line that starts with a "<code>+</code>" to see the C code that Cython generated for it.
|
154 |
+
</p>
|
155 |
+
''').format(css=self._css(), watermark=Version.watermark,
|
156 |
+
filename=os.path.basename(source_filename) if source_filename else '',
|
157 |
+
more_info=coverage_info)
|
158 |
+
]
|
159 |
+
if c_file:
|
160 |
+
outlist.append(u'<p>Raw output: <a href="%s">%s</a></p>\n' % (c_file, c_file))
|
161 |
+
return outlist
|
162 |
+
|
163 |
+
def _save_annotation_footer(self):
|
164 |
+
return (u'</body></html>\n',)
|
165 |
+
|
166 |
+
def _save_annotation(self, code, generated_code, c_file=None, source_filename=None, coverage_xml=None):
|
167 |
+
"""
|
168 |
+
lines : original cython source code split by lines
|
169 |
+
generated_code : generated c code keyed by line number in original file
|
170 |
+
target filename : name of the file in which to store the generated html
|
171 |
+
c_file : filename in which the c_code has been written
|
172 |
+
"""
|
173 |
+
if coverage_xml is not None and source_filename:
|
174 |
+
coverage_timestamp = coverage_xml.get('timestamp', '').strip()
|
175 |
+
covered_lines = self._get_line_coverage(coverage_xml, source_filename)
|
176 |
+
else:
|
177 |
+
coverage_timestamp = covered_lines = None
|
178 |
+
annotation_items = dict(self.annotations[source_filename])
|
179 |
+
scopes = dict(self.scopes[source_filename])
|
180 |
+
|
181 |
+
outlist = []
|
182 |
+
outlist.extend(self._save_annotation_header(c_file, source_filename, coverage_timestamp))
|
183 |
+
outlist.extend(self._save_annotation_body(code, generated_code, annotation_items, scopes, covered_lines))
|
184 |
+
outlist.extend(self._save_annotation_footer())
|
185 |
+
return ''.join(outlist)
|
186 |
+
|
187 |
+
def _get_line_coverage(self, coverage_xml, source_filename):
|
188 |
+
coverage_data = None
|
189 |
+
for entry in coverage_xml.iterfind('.//class'):
|
190 |
+
if not entry.get('filename'):
|
191 |
+
continue
|
192 |
+
if (entry.get('filename') == source_filename or
|
193 |
+
os.path.abspath(entry.get('filename')) == source_filename):
|
194 |
+
coverage_data = entry
|
195 |
+
break
|
196 |
+
elif source_filename.endswith(entry.get('filename')):
|
197 |
+
coverage_data = entry # but we might still find a better match...
|
198 |
+
if coverage_data is None:
|
199 |
+
return None
|
200 |
+
return dict(
|
201 |
+
(int(line.get('number')), int(line.get('hits')))
|
202 |
+
for line in coverage_data.iterfind('lines/line')
|
203 |
+
)
|
204 |
+
|
205 |
+
def _htmlify_code(self, code, language):
|
206 |
+
try:
|
207 |
+
from pygments import highlight
|
208 |
+
from pygments.lexers import CythonLexer, CppLexer
|
209 |
+
from pygments.formatters import HtmlFormatter
|
210 |
+
except ImportError:
|
211 |
+
# no Pygments, just escape the code
|
212 |
+
return html_escape(code)
|
213 |
+
|
214 |
+
if language == "cython":
|
215 |
+
lexer = CythonLexer(stripnl=False, stripall=False)
|
216 |
+
elif language == "c/cpp":
|
217 |
+
lexer = CppLexer(stripnl=False, stripall=False)
|
218 |
+
else:
|
219 |
+
# unknown language, use fallback
|
220 |
+
return html_escape(code)
|
221 |
+
html_code = highlight(
|
222 |
+
code, lexer,
|
223 |
+
HtmlFormatter(nowrap=True))
|
224 |
+
return html_code
|
225 |
+
|
226 |
+
def _save_annotation_body(self, cython_code, generated_code, annotation_items, scopes, covered_lines=None):
|
227 |
+
outlist = [u'<div class="cython">']
|
228 |
+
pos_comment_marker = u'/* \N{HORIZONTAL ELLIPSIS} */\n'
|
229 |
+
new_calls_map = dict(
|
230 |
+
(name, 0) for name in
|
231 |
+
'refnanny trace py_macro_api py_c_api pyx_macro_api pyx_c_api error_goto'.split()
|
232 |
+
).copy
|
233 |
+
|
234 |
+
self.mark_pos(None)
|
235 |
+
|
236 |
+
def annotate(match):
|
237 |
+
group_name = match.lastgroup
|
238 |
+
calls[group_name] += 1
|
239 |
+
return u"<span class='%s'>%s</span>" % (
|
240 |
+
group_name, match.group(group_name))
|
241 |
+
|
242 |
+
lines = self._htmlify_code(cython_code, "cython").splitlines()
|
243 |
+
lineno_width = len(str(len(lines)))
|
244 |
+
if not covered_lines:
|
245 |
+
covered_lines = None
|
246 |
+
|
247 |
+
for k, line in enumerate(lines, 1):
|
248 |
+
try:
|
249 |
+
c_code = generated_code[k]
|
250 |
+
except KeyError:
|
251 |
+
c_code = ''
|
252 |
+
else:
|
253 |
+
c_code = _replace_pos_comment(pos_comment_marker, c_code)
|
254 |
+
if c_code.startswith(pos_comment_marker):
|
255 |
+
c_code = c_code[len(pos_comment_marker):]
|
256 |
+
c_code = html_escape(c_code)
|
257 |
+
|
258 |
+
calls = new_calls_map()
|
259 |
+
c_code = _parse_code(annotate, c_code)
|
260 |
+
score = (5 * calls['py_c_api'] + 2 * calls['pyx_c_api'] +
|
261 |
+
calls['py_macro_api'] + calls['pyx_macro_api'])
|
262 |
+
|
263 |
+
if c_code:
|
264 |
+
onclick = self._onclick_attr
|
265 |
+
expandsymbol = '+'
|
266 |
+
else:
|
267 |
+
onclick = ''
|
268 |
+
expandsymbol = ' '
|
269 |
+
|
270 |
+
covered = ''
|
271 |
+
if covered_lines is not None and k in covered_lines:
|
272 |
+
hits = covered_lines[k]
|
273 |
+
if hits is not None:
|
274 |
+
covered = 'run' if hits else 'mis'
|
275 |
+
|
276 |
+
outlist.append(
|
277 |
+
u'<pre class="cython line score-{score}"{onclick}>'
|
278 |
+
# generate line number with expand symbol in front,
|
279 |
+
# and the right number of digit
|
280 |
+
u'{expandsymbol}<span class="{covered}">{line:0{lineno_width}d}</span>: {code}</pre>\n'.format(
|
281 |
+
score=score,
|
282 |
+
expandsymbol=expandsymbol,
|
283 |
+
covered=covered,
|
284 |
+
lineno_width=lineno_width,
|
285 |
+
line=k,
|
286 |
+
code=line.rstrip(),
|
287 |
+
onclick=onclick,
|
288 |
+
))
|
289 |
+
if c_code:
|
290 |
+
outlist.append(u"<pre class='cython code score-{score} {covered}'>{code}</pre>".format(
|
291 |
+
score=score, covered=covered, code=c_code))
|
292 |
+
outlist.append(u"</div>")
|
293 |
+
|
294 |
+
# now the whole c-code if needed:
|
295 |
+
if self.show_entire_c_code:
|
296 |
+
outlist.append(u'<p><div class="cython">')
|
297 |
+
onclick_title = u"<pre class='cython line'{onclick}>+ {title}</pre>\n"
|
298 |
+
outlist.append(onclick_title.format(
|
299 |
+
onclick=self._onclick_attr,
|
300 |
+
title=AnnotationCCodeWriter.COMPLETE_CODE_TITLE,
|
301 |
+
))
|
302 |
+
complete_code_as_html = self._htmlify_code(self.buffer.getvalue(), "c/cpp")
|
303 |
+
outlist.append(u"<pre class='cython code'>{code}</pre>".format(code=complete_code_as_html))
|
304 |
+
outlist.append(u"</div></p>")
|
305 |
+
|
306 |
+
return outlist
|
307 |
+
|
308 |
+
|
309 |
+
_parse_code = re.compile((
|
310 |
+
br'(?P<refnanny>__Pyx_X?(?:GOT|GIVE)REF|__Pyx_RefNanny[A-Za-z]+)|'
|
311 |
+
br'(?P<trace>__Pyx_Trace[A-Za-z]+)|'
|
312 |
+
br'(?:'
|
313 |
+
br'(?P<pyx_macro_api>__Pyx_[A-Z][A-Z_]+)|'
|
314 |
+
br'(?P<pyx_c_api>(?:__Pyx_[A-Z][a-z_][A-Za-z_]*)|__pyx_convert_[A-Za-z_]*)|'
|
315 |
+
br'(?P<py_macro_api>Py[A-Z][a-z]+_[A-Z][A-Z_]+)|'
|
316 |
+
br'(?P<py_c_api>Py[A-Z][a-z]+_[A-Z][a-z][A-Za-z_]*)'
|
317 |
+
br')(?=\()|' # look-ahead to exclude subsequent '(' from replacement
|
318 |
+
br'(?P<error_goto>(?:(?<=;) *if [^;]* +)?__PYX_ERR\([^)]+\))'
|
319 |
+
).decode('ascii')).sub
|
320 |
+
|
321 |
+
|
322 |
+
_replace_pos_comment = re.compile(
|
323 |
+
# this matches what Cython generates as code line marker comment
|
324 |
+
br'^\s*/\*(?:(?:[^*]|\*[^/])*\n)+\s*\*/\s*\n'.decode('ascii'),
|
325 |
+
re.M
|
326 |
+
).sub
|
327 |
+
|
328 |
+
|
329 |
+
class AnnotationItem(object):
|
330 |
+
|
331 |
+
def __init__(self, style, text, tag="", size=0):
|
332 |
+
self.style = style
|
333 |
+
self.text = text
|
334 |
+
self.tag = tag
|
335 |
+
self.size = size
|
336 |
+
|
337 |
+
def start(self):
|
338 |
+
return u"<span class='cython tag %s' title='%s'>%s" % (self.style, self.text, self.tag)
|
339 |
+
|
340 |
+
def end(self):
|
341 |
+
return self.size, u"</span>"
|