├── setup.cfg
├── poetry.toml
├── .github
└── FUNDING.yml
├── cythonizer
├── __main__.py
└── __init__.py
├── MANIFEST.in
├── CHANGES.txt
├── .idea
├── vcs.xml
├── .gitignore
├── misc.xml
├── inspectionProfiles
│ ├── profiles_settings.xml
│ └── Project_Default.xml
├── modules.xml
├── cythonizer.iml
└── icon.svg
├── pyproject.toml
├── LICENSE.txt
├── README.rst
├── .gitignore
├── setup.py
└── poetry.lock
/setup.cfg:
--------------------------------------------------------------------------------
1 | [bdist_wheel]
2 | universal=1
3 |
--------------------------------------------------------------------------------
/poetry.toml:
--------------------------------------------------------------------------------
1 | [virtualenvs]
2 | in-project = true
3 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | custom: https://buymeacoffee.com/rizwan486
2 |
--------------------------------------------------------------------------------
/cythonizer/__main__.py:
--------------------------------------------------------------------------------
1 | from . import main
2 |
3 | if __name__ == "__main__":
4 | main()
5 |
--------------------------------------------------------------------------------
/MANIFEST.in:
--------------------------------------------------------------------------------
1 | include LICENSE.txt
2 | include CHANGES.txt
3 | include requirements.txt
4 | include README.rst
--------------------------------------------------------------------------------
/CHANGES.txt:
--------------------------------------------------------------------------------
1 | v1.2.0b3, 01-01-2020 -- Basic structural changes.
2 | v1.2.0b2, 21-12-2020 -- Fixed some bugs.
3 | v1.2.0b1, 21-12-2020 -- Initial release.
4 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Editor-based HTTP Client requests
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/cythonizer.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------
1 | [tool.poetry]
2 | name = "cythonizer"
3 | version = "1.2.0b3"
4 | description = "Convert .py and .pyx to (.pyd | .so) very easily."
5 | authors = ["Rizwan-Hasan "]
6 | homepage = "https://pypi.org/project/cythonizer/"
7 | repository = "https://github.com/TechLearnersInc/cythonizer"
8 | license = "MIT"
9 | readme = "README.rst"
10 |
11 | [tool.poetry.dependencies]
12 | python = ">=3.8"
13 | numpy = ">=1.19.4"
14 | Cython = ">=0.29.21"
15 |
16 | [tool.poetry.dev-dependencies]
17 | black = ">=21.12b0"
18 |
19 | [build-system]
20 | requires = ["poetry-core>=1.0.0"]
21 | build-backend = "poetry.core.masonry.api"
22 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 TechLearners Inc.
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.rst:
--------------------------------------------------------------------------------
1 | ==========
2 | cythonizer
3 | ==========
4 |
5 | *Cythonize one step faster*
6 |
7 | .. image:: https://img.shields.io/badge/build-beta-brightgreen
8 | :target: https://github.com/TechLearnersInc/cythonizer
9 |
10 | .. image:: https://img.shields.io/badge/license-MIT-green
11 | :target: LICENSE.txt
12 |
13 | .. image:: https://img.shields.io/static/v1?label=Created%20with%20%E2%9D%A4%EF%B8%8F%20by&message=TechLearners&color=red
14 | :target: https://github.com/TechLearnersInc
15 |
16 | Introduction
17 | ------------
18 |
19 | :code:`cythonizer.py` is a script that will attempt to
20 | automatically convert one or more :code:`.py` and :code:`.pyx` files into
21 | the corresponding compiled :code:`.pyd | .so` binary modules
22 | files. Example::
23 |
24 | $ python cythonizer.py myext.pyx
25 |
26 | :code:`pip install cythonizer` will automatically create an
27 | executable script in your :code:`Scripts/` folder, so you
28 | should be able to simply::
29 |
30 | $ cythonizer myext.py
31 |
32 | or even::
33 |
34 | $ cythonizer *.pyx
35 |
36 | You can type::
37 |
38 | $ cythonizer -h
39 |
40 | to obtain the following CLI::
41 |
42 | usage: cythonizer.py [-h] [--annotation] [--numpy-includes]
43 | [--debugmode] filenames [filenames ...]
44 |
45 | positional arguments:
46 | filenames .py and .pyx files only
47 |
48 | optional arguments:
49 | -h, --help show this help message and exit
50 | --annotation (default: False)
51 | --numpy-includes (default: False)
52 | --debugmode (default: False)
53 |
54 |
55 | - :code:`--annotation` will create the HTML Cython annotation file.
56 | - :code:`--numpy-includes` will add the numpy headers to the build command.
57 | - Compiler flags :code:`-O2 -march=native` are automatically passed to the compiler.
58 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # VSCode
2 | .vscode/
3 |
4 | # Byte-compiled / optimized / DLL files
5 | __pycache__/
6 | *.py[cod]
7 | *$py.class
8 |
9 | # C extensions
10 | *.so
11 |
12 | # Distribution / packaging
13 | .Python
14 | build/
15 | develop-eggs/
16 | dist/
17 | downloads/
18 | eggs/
19 | .eggs/
20 | lib/
21 | lib64/
22 | parts/
23 | sdist/
24 | var/
25 | wheels/
26 | pip-wheel-metadata/
27 | share/python-wheels/
28 | *.egg-info/
29 | .installed.cfg
30 | *.egg
31 | MANIFEST
32 |
33 | # PyInstaller
34 | # Usually these files are written by a python script from a template
35 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
36 | *.manifest
37 | *.spec
38 |
39 | # Installer logs
40 | pip-log.txt
41 | pip-delete-this-directory.txt
42 |
43 | # Unit test / coverage reports
44 | htmlcov/
45 | .tox/
46 | .nox/
47 | .coverage
48 | .coverage.*
49 | .cache
50 | nosetests.xml
51 | coverage.xml
52 | *.cover
53 | *.py,cover
54 | .hypothesis/
55 | .pytest_cache/
56 |
57 | # Translations
58 | *.mo
59 | *.pot
60 |
61 | # Django stuff:
62 | *.log
63 | local_settings.py
64 | db.sqlite3
65 | db.sqlite3-journal
66 |
67 | # Flask stuff:
68 | instance/
69 | .webassets-cache
70 |
71 | # Scrapy stuff:
72 | .scrapy
73 |
74 | # Sphinx documentation
75 | docs/_build/
76 |
77 | # PyBuilder
78 | target/
79 |
80 | # Jupyter Notebook
81 | .ipynb_checkpoints
82 |
83 | # IPython
84 | profile_default/
85 | ipython_config.py
86 |
87 | # pyenv
88 | .python-version
89 |
90 | # pipenv
91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
94 | # install all needed dependencies.
95 | #Pipfile.lock
96 |
97 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
98 | __pypackages__/
99 |
100 | # Celery stuff
101 | celerybeat-schedule
102 | celerybeat.pid
103 |
104 | # SageMath parsed files
105 | *.sage.py
106 |
107 | # Environments
108 | .env
109 | .venv
110 | env/
111 | venv/
112 | ENV/
113 | env.bak/
114 | venv.bak/
115 |
116 | # Spyder project settings
117 | .spyderproject
118 | .spyproject
119 |
120 | # Rope project settings
121 | .ropeproject
122 |
123 | # mkdocs documentation
124 | /site
125 |
126 | # mypy
127 | .mypy_cache/
128 | .dmypy.json
129 | dmypy.json
130 |
131 | # Pyre type checker
132 | .pyre/
133 |
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | # Always prefer setuptools over distutils
4 | from setuptools import find_packages, setup
5 |
6 |
7 | def main():
8 | here = os.path.abspath(os.path.dirname(__file__))
9 |
10 | # Get the long description from the relevant file
11 | long_description = ""
12 | # noinspection PyBroadException
13 | try:
14 | with open(os.path.join(here, "README.rst"), encoding="utf-8") as f:
15 | long_description = f.read()
16 | except Exception:
17 | pass
18 |
19 | setup(
20 | name="Cythonizer",
21 | # Versions should comply with PEP440. For a discussion on single-sourcing
22 | # the version across setup.py and the project code, see
23 | # http://packaging.python.org/en/latest/tutorial.html#version
24 | version="1.2.0b3",
25 | description="Convert .py and .pyx to (.pyd | .so) very easily.",
26 | long_description=long_description,
27 | long_description_content_type="text/x-rst",
28 | # The project's main homepage.
29 | url="https://github.com/TechLearnersInc/cythonizer",
30 | # Author details
31 | author="Rizwan Hasan",
32 | author_email="rizwan.hasan486@gmail.com",
33 | # Choose your license
34 | license="MIT",
35 | # Minimum Python version required
36 | python_requires=">=3.6",
37 | # See https://pypi.python.org/pypi?%3Aaction=list_classifiers
38 | project_urls={
39 | "Source": "https://github.com/TechLearnersInc/cythonizer",
40 | "Tracker": "https://github.com/TechLearnersInc/cythonizer/issues",
41 | "Facebook": "https://www.facebook.com/TechLearnersInc",
42 | "Linkedin": "https://www.linkedin.com/company/techlearners/",
43 | "Telegram": "https://t.me/TechLearners",
44 | },
45 | classifiers=[
46 | # How mature is this project? Common values are
47 | # 3 - Alpha
48 | # 4 - Beta
49 | # 5 - Production/Stable
50 | "Development Status :: 4 - Beta",
51 | "Environment :: Console",
52 | # Indicate who your project is intended for
53 | "Intended Audience :: Developers",
54 | "Intended Audience :: Science/Research",
55 | "Topic :: Software Development :: Build Tools",
56 | "Programming Language :: Cython",
57 | # Pick your license as you wish (should match "license" above)
58 | "License :: OSI Approved :: MIT License",
59 | # Specify the Python versions you support here. In particular, ensure
60 | # that you indicate whether you support Python 2, Python 3 or both.
61 | "Programming Language :: Python :: 3",
62 | "Topic :: Software Development :: Build Tools",
63 | ],
64 | # What does your project relate to?
65 | keywords="cython Cythonizer",
66 | # You can just specify the packages manually here if your project is
67 | # simple. Or you can use find_packages().
68 | packages=find_packages(),
69 | # List run-time dependencies here. These will be installed by pip
70 | # when your project is installed. For an analysis of "install_requires"
71 | # vs pip's requirements files see:
72 | # https://packaging.python.org/en/latest/technical.html#install-requires-vs-requirements-files
73 | install_requires=["cython", "numpy"],
74 | # To provide executable scripts, use entry points in preference to the
75 | # "scripts" keyword. Entry points provide cross-platform support and allow
76 | # pip to create the appropriate form of executable for the target platform.
77 | entry_points={
78 | "console_scripts": [
79 | "cythonizer = cythonizer:main",
80 | ],
81 | },
82 | )
83 |
84 |
85 | if __name__ == "__main__":
86 | main()
87 |
--------------------------------------------------------------------------------
/cythonizer/__init__.py:
--------------------------------------------------------------------------------
1 | import argparse
2 | import logging
3 | import os
4 | import pathlib
5 | import sys
6 |
7 | # Always prefer setuptools over distutils
8 | from setuptools import Extension, setup
9 | import Cython.Compiler.Options
10 | from Cython.Build import cythonize
11 | from Cython.Distutils import build_ext
12 |
13 | logging.basicConfig(level=logging.DEBUG, format="%(levelname)s: %(message)s")
14 |
15 |
16 | class Cythonizer:
17 | def __init__(self) -> None:
18 | self.__extension: list = []
19 | self.__args = self.__arguments()
20 | self.__checking()
21 | self.__compiling()
22 | # self.__cleanup()
23 |
24 | # Arguments Parser ↓
25 | # noinspection PyMethodMayBeStatic
26 | def __arguments(self):
27 | parser = argparse.ArgumentParser(
28 | description='A script that will attempt to automatically convert one or more .py and .pyx files into the '
29 | 'corresponding compiled .pyd or .so binary modules files. '
30 | )
31 |
32 | # Taking Files ↓
33 | parser.add_argument(
34 | "filenames", type=pathlib.Path, nargs="+", help=".py and .pyx files only"
35 | )
36 |
37 | # Cython Annotation ↓
38 | parser.add_argument(
39 | "--annotation",
40 | default=False,
41 | action="store_true",
42 | help="(default: False)",
43 | )
44 |
45 | # Numpy Includes ↓
46 | parser.add_argument(
47 | "--numpy-includes",
48 | default=False,
49 | action="store_true",
50 | help="(default: False)",
51 | )
52 |
53 | # Cython Debugmode ↓
54 | parser.add_argument(
55 | "--debugmode",
56 | default=False,
57 | action="store_true",
58 | help="(default: False)",
59 | )
60 |
61 | return parser.parse_args().__dict__
62 |
63 | # Received File Checking ↓
64 | def __checking(self):
65 | for file in self.__args.get("filenames"):
66 | if not os.path.exists(file):
67 | logging.error(f'"{file}" doesn\'t exist.')
68 | sys.exit(-1)
69 | if not os.path.isfile(file):
70 | logging.error(f'"{file}" is not a file')
71 | sys.exit(-1)
72 | if os.path.splitext(file)[-1] not in (".py", ".pyx"):
73 | logging.error(f'"{file}" is not a valid file')
74 | sys.exit(-1)
75 |
76 | # Includes Directory ↓
77 | def __includes_dir(self):
78 | # Extra include folders. Mainly for numpy.
79 | if self.__args.get("numpy_includes"):
80 | try:
81 | import numpy as np
82 |
83 | except ModuleNotFoundError:
84 | logging.error("Numpy is required, but not found. Please install it")
85 | sys.exit(-1)
86 | return [np.get_include()]
87 | else:
88 | return []
89 |
90 | # Cython Compilation ↓
91 | def __compiling(self):
92 | Cython.Compiler.Options.annotate = self.__args.get("annotation")
93 |
94 | ext_modules: list = []
95 | for _ in self.__args.get("filenames"):
96 | file: str = str(_)
97 | # The name must be plain, no path
98 | module_name = os.path.basename(file)
99 | module_name = os.path.splitext(module_name)[0]
100 | ext_modules.append(
101 | Extension(
102 | module_name, [file], extra_compile_args=["-O2", "-march=native"]
103 | )
104 | )
105 |
106 | sys.argv = [sys.argv[0], "build_ext", "--inplace"]
107 |
108 | setup(
109 | cmdclass={"build_ext": build_ext},
110 | include_dirs=self.__includes_dir(),
111 | ext_modules=cythonize(module_list=ext_modules, language_level="3"),
112 | )
113 |
114 | def __cleanup(self):
115 | # Delete intermediate C files.
116 | for _ in self.__args.get("filenames"):
117 | filename = str(_)
118 | filename = f"{filename}.c"
119 | if os.path.exists(filename):
120 | os.remove(filename)
121 |
122 |
123 | def main():
124 | try:
125 | Cythonizer()
126 | except Exception as e:
127 | logging.error(e)
128 |
129 |
130 | if __name__ == "__main__":
131 | pass
132 |
--------------------------------------------------------------------------------
/.idea/icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
114 |
--------------------------------------------------------------------------------
/poetry.lock:
--------------------------------------------------------------------------------
1 | [[package]]
2 | name = "black"
3 | version = "22.8.0"
4 | description = "The uncompromising code formatter."
5 | category = "dev"
6 | optional = false
7 | python-versions = ">=3.6.2"
8 |
9 | [package.dependencies]
10 | click = ">=8.0.0"
11 | mypy-extensions = ">=0.4.3"
12 | pathspec = ">=0.9.0"
13 | platformdirs = ">=2"
14 | tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""}
15 | typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}
16 |
17 | [package.extras]
18 | colorama = ["colorama (>=0.4.3)"]
19 | d = ["aiohttp (>=3.7.4)"]
20 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
21 | uvloop = ["uvloop (>=0.15.2)"]
22 |
23 | [[package]]
24 | name = "click"
25 | version = "8.1.3"
26 | description = "Composable command line interface toolkit"
27 | category = "dev"
28 | optional = false
29 | python-versions = ">=3.7"
30 |
31 | [package.dependencies]
32 | colorama = {version = "*", markers = "platform_system == \"Windows\""}
33 |
34 | [[package]]
35 | name = "colorama"
36 | version = "0.4.5"
37 | description = "Cross-platform colored terminal text."
38 | category = "dev"
39 | optional = false
40 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
41 |
42 | [[package]]
43 | name = "Cython"
44 | version = "0.29.32"
45 | description = "The Cython compiler for writing C extensions for the Python language."
46 | category = "main"
47 | optional = false
48 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
49 |
50 | [[package]]
51 | name = "mypy-extensions"
52 | version = "0.4.3"
53 | description = "Experimental type system extensions for programs checked with the mypy typechecker."
54 | category = "dev"
55 | optional = false
56 | python-versions = "*"
57 |
58 | [[package]]
59 | name = "numpy"
60 | version = "1.23.3"
61 | description = "NumPy is the fundamental package for array computing with Python."
62 | category = "main"
63 | optional = false
64 | python-versions = ">=3.8"
65 |
66 | [[package]]
67 | name = "pathspec"
68 | version = "0.10.1"
69 | description = "Utility library for gitignore style pattern matching of file paths."
70 | category = "dev"
71 | optional = false
72 | python-versions = ">=3.7"
73 |
74 | [[package]]
75 | name = "platformdirs"
76 | version = "2.5.2"
77 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
78 | category = "dev"
79 | optional = false
80 | python-versions = ">=3.7"
81 |
82 | [package.extras]
83 | docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"]
84 | test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"]
85 |
86 | [[package]]
87 | name = "tomli"
88 | version = "2.0.1"
89 | description = "A lil' TOML parser"
90 | category = "dev"
91 | optional = false
92 | python-versions = ">=3.7"
93 |
94 | [[package]]
95 | name = "typing-extensions"
96 | version = "4.3.0"
97 | description = "Backported and Experimental Type Hints for Python 3.7+"
98 | category = "dev"
99 | optional = false
100 | python-versions = ">=3.7"
101 |
102 | [metadata]
103 | lock-version = "1.1"
104 | python-versions = ">=3.8"
105 | content-hash = "0283f2be9585fd844e3df882f4b7bdcf24992db4e5dac60794897a620152ff22"
106 |
107 | [metadata.files]
108 | black = [
109 | {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"},
110 | {file = "black-22.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27"},
111 | {file = "black-22.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747"},
112 | {file = "black-22.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869"},
113 | {file = "black-22.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90"},
114 | {file = "black-22.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe"},
115 | {file = "black-22.8.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342"},
116 | {file = "black-22.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab"},
117 | {file = "black-22.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3"},
118 | {file = "black-22.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e"},
119 | {file = "black-22.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16"},
120 | {file = "black-22.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c"},
121 | {file = "black-22.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5"},
122 | {file = "black-22.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411"},
123 | {file = "black-22.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3"},
124 | {file = "black-22.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"},
125 | {file = "black-22.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c"},
126 | {file = "black-22.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497"},
127 | {file = "black-22.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c"},
128 | {file = "black-22.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41"},
129 | {file = "black-22.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec"},
130 | {file = "black-22.8.0-py3-none-any.whl", hash = "sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4"},
131 | {file = "black-22.8.0.tar.gz", hash = "sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e"},
132 | ]
133 | click = [
134 | {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"},
135 | {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"},
136 | ]
137 | colorama = [
138 | {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"},
139 | {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"},
140 | ]
141 | Cython = [
142 | {file = "Cython-0.29.32-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:39afb4679b8c6bf7ccb15b24025568f4f9b4d7f9bf3cbd981021f542acecd75b"},
143 | {file = "Cython-0.29.32-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:dbee03b8d42dca924e6aa057b836a064c769ddfd2a4c2919e65da2c8a362d528"},
144 | {file = "Cython-0.29.32-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ba622326f2862f9c1f99ca8d47ade49871241920a352c917e16861e25b0e5c3"},
145 | {file = "Cython-0.29.32-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e6ffa08aa1c111a1ebcbd1cf4afaaec120bc0bbdec3f2545f8bb7d3e8e77a1cd"},
146 | {file = "Cython-0.29.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:97335b2cd4acebf30d14e2855d882de83ad838491a09be2011745579ac975833"},
147 | {file = "Cython-0.29.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:06be83490c906b6429b4389e13487a26254ccaad2eef6f3d4ee21d8d3a4aaa2b"},
148 | {file = "Cython-0.29.32-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:eefd2b9a5f38ded8d859fe96cc28d7d06e098dc3f677e7adbafda4dcdd4a461c"},
149 | {file = "Cython-0.29.32-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5514f3b4122cb22317122a48e175a7194e18e1803ca555c4c959d7dfe68eaf98"},
150 | {file = "Cython-0.29.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:656dc5ff1d269de4d11ee8542f2ffd15ab466c447c1f10e5b8aba6f561967276"},
151 | {file = "Cython-0.29.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:cdf10af3e2e3279dc09fdc5f95deaa624850a53913f30350ceee824dc14fc1a6"},
152 | {file = "Cython-0.29.32-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:3875c2b2ea752816a4d7ae59d45bb546e7c4c79093c83e3ba7f4d9051dd02928"},
153 | {file = "Cython-0.29.32-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:79e3bab19cf1b021b613567c22eb18b76c0c547b9bc3903881a07bfd9e7e64cf"},
154 | {file = "Cython-0.29.32-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0595aee62809ba353cebc5c7978e0e443760c3e882e2c7672c73ffe46383673"},
155 | {file = "Cython-0.29.32-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0ea8267fc373a2c5064ad77d8ff7bf0ea8b88f7407098ff51829381f8ec1d5d9"},
156 | {file = "Cython-0.29.32-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:c8e8025f496b5acb6ba95da2fb3e9dacffc97d9a92711aacfdd42f9c5927e094"},
157 | {file = "Cython-0.29.32-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:afbce249133a830f121b917f8c9404a44f2950e0e4f5d1e68f043da4c2e9f457"},
158 | {file = "Cython-0.29.32-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:513e9707407608ac0d306c8b09d55a28be23ea4152cbd356ceaec0f32ef08d65"},
159 | {file = "Cython-0.29.32-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e83228e0994497900af954adcac27f64c9a57cd70a9ec768ab0cb2c01fd15cf1"},
160 | {file = "Cython-0.29.32-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ea1dcc07bfb37367b639415333cfbfe4a93c3be340edf1db10964bc27d42ed64"},
161 | {file = "Cython-0.29.32-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8669cadeb26d9a58a5e6b8ce34d2c8986cc3b5c0bfa77eda6ceb471596cb2ec3"},
162 | {file = "Cython-0.29.32-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:ed087eeb88a8cf96c60fb76c5c3b5fb87188adee5e179f89ec9ad9a43c0c54b3"},
163 | {file = "Cython-0.29.32-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:3f85eb2343d20d91a4ea9cf14e5748092b376a64b7e07fc224e85b2753e9070b"},
164 | {file = "Cython-0.29.32-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:63b79d9e1f7c4d1f498ab1322156a0d7dc1b6004bf981a8abda3f66800e140cd"},
165 | {file = "Cython-0.29.32-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e1958e0227a4a6a2c06fd6e35b7469de50adf174102454db397cec6e1403cce3"},
166 | {file = "Cython-0.29.32-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:856d2fec682b3f31583719cb6925c6cdbb9aa30f03122bcc45c65c8b6f515754"},
167 | {file = "Cython-0.29.32-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:479690d2892ca56d34812fe6ab8f58e4b2e0129140f3d94518f15993c40553da"},
168 | {file = "Cython-0.29.32-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:67fdd2f652f8d4840042e2d2d91e15636ba2bcdcd92e7e5ffbc68e6ef633a754"},
169 | {file = "Cython-0.29.32-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:4a4b03ab483271f69221c3210f7cde0dcc456749ecf8243b95bc7a701e5677e0"},
170 | {file = "Cython-0.29.32-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:40eff7aa26e91cf108fd740ffd4daf49f39b2fdffadabc7292b4b7dc5df879f0"},
171 | {file = "Cython-0.29.32-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0bbc27abdf6aebfa1bce34cd92bd403070356f28b0ecb3198ff8a182791d58b9"},
172 | {file = "Cython-0.29.32-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cddc47ec746a08603037731f5d10aebf770ced08666100bd2cdcaf06a85d4d1b"},
173 | {file = "Cython-0.29.32-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca3065a1279456e81c615211d025ea11bfe4e19f0c5650b859868ca04b3fcbd"},
174 | {file = "Cython-0.29.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:d968ffc403d92addf20b68924d95428d523436adfd25cf505d427ed7ba3bee8b"},
175 | {file = "Cython-0.29.32-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f3fd44cc362eee8ae569025f070d56208908916794b6ab21e139cea56470a2b3"},
176 | {file = "Cython-0.29.32-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:b6da3063c5c476f5311fd76854abae6c315f1513ef7d7904deed2e774623bbb9"},
177 | {file = "Cython-0.29.32-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:061e25151c38f2361bc790d3bcf7f9d9828a0b6a4d5afa56fbed3bd33fb2373a"},
178 | {file = "Cython-0.29.32-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f9944013588a3543fca795fffb0a070a31a243aa4f2d212f118aa95e69485831"},
179 | {file = "Cython-0.29.32-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:07d173d3289415bb496e72cb0ddd609961be08fe2968c39094d5712ffb78672b"},
180 | {file = "Cython-0.29.32-py2.py3-none-any.whl", hash = "sha256:eeb475eb6f0ccf6c039035eb4f0f928eb53ead88777e0a760eccb140ad90930b"},
181 | {file = "Cython-0.29.32.tar.gz", hash = "sha256:8733cf4758b79304f2a4e39ebfac5e92341bce47bcceb26c1254398b2f8c1af7"},
182 | ]
183 | mypy-extensions = [
184 | {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
185 | {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
186 | ]
187 | numpy = [
188 | {file = "numpy-1.23.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9f707b5bb73bf277d812ded9896f9512a43edff72712f31667d0a8c2f8e71ee"},
189 | {file = "numpy-1.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffcf105ecdd9396e05a8e58e81faaaf34d3f9875f137c7372450baa5d77c9a54"},
190 | {file = "numpy-1.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ea3f98a0ffce3f8f57675eb9119f3f4edb81888b6874bc1953f91e0b1d4f440"},
191 | {file = "numpy-1.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004f0efcb2fe1c0bd6ae1fcfc69cc8b6bf2407e0f18be308612007a0762b4089"},
192 | {file = "numpy-1.23.3-cp310-cp310-win32.whl", hash = "sha256:98dcbc02e39b1658dc4b4508442a560fe3ca5ca0d989f0df062534e5ca3a5c1a"},
193 | {file = "numpy-1.23.3-cp310-cp310-win_amd64.whl", hash = "sha256:39a664e3d26ea854211867d20ebcc8023257c1800ae89773cbba9f9e97bae036"},
194 | {file = "numpy-1.23.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1f27b5322ac4067e67c8f9378b41c746d8feac8bdd0e0ffede5324667b8a075c"},
195 | {file = "numpy-1.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ad3ec9a748a8943e6eb4358201f7e1c12ede35f510b1a2221b70af4bb64295c"},
196 | {file = "numpy-1.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdc9febce3e68b697d931941b263c59e0c74e8f18861f4064c1f712562903411"},
197 | {file = "numpy-1.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:301c00cf5e60e08e04d842fc47df641d4a181e651c7135c50dc2762ffe293dbd"},
198 | {file = "numpy-1.23.3-cp311-cp311-win32.whl", hash = "sha256:7cd1328e5bdf0dee621912f5833648e2daca72e3839ec1d6695e91089625f0b4"},
199 | {file = "numpy-1.23.3-cp311-cp311-win_amd64.whl", hash = "sha256:8355fc10fd33a5a70981a5b8a0de51d10af3688d7a9e4a34fcc8fa0d7467bb7f"},
200 | {file = "numpy-1.23.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc6e8da415f359b578b00bcfb1d08411c96e9a97f9e6c7adada554a0812a6cc6"},
201 | {file = "numpy-1.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:22d43376ee0acd547f3149b9ec12eec2f0ca4a6ab2f61753c5b29bb3e795ac4d"},
202 | {file = "numpy-1.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a64403f634e5ffdcd85e0b12c08f04b3080d3e840aef118721021f9b48fc1460"},
203 | {file = "numpy-1.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd9d3abe5774404becdb0748178b48a218f1d8c44e0375475732211ea47c67e"},
204 | {file = "numpy-1.23.3-cp38-cp38-win32.whl", hash = "sha256:f8c02ec3c4c4fcb718fdf89a6c6f709b14949408e8cf2a2be5bfa9c49548fd85"},
205 | {file = "numpy-1.23.3-cp38-cp38-win_amd64.whl", hash = "sha256:e868b0389c5ccfc092031a861d4e158ea164d8b7fdbb10e3b5689b4fc6498df6"},
206 | {file = "numpy-1.23.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09f6b7bdffe57fc61d869a22f506049825d707b288039d30f26a0d0d8ea05164"},
207 | {file = "numpy-1.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c79d7cf86d049d0c5089231a5bcd31edb03555bd93d81a16870aa98c6cfb79d"},
208 | {file = "numpy-1.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5d5420053bbb3dd64c30e58f9363d7a9c27444c3648e61460c1237f9ec3fa14"},
209 | {file = "numpy-1.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5422d6a1ea9b15577a9432e26608c73a78faf0b9039437b075cf322c92e98e7"},
210 | {file = "numpy-1.23.3-cp39-cp39-win32.whl", hash = "sha256:c1ba66c48b19cc9c2975c0d354f24058888cdc674bebadceb3cdc9ec403fb5d1"},
211 | {file = "numpy-1.23.3-cp39-cp39-win_amd64.whl", hash = "sha256:78a63d2df1d947bd9d1b11d35564c2f9e4b57898aae4626638056ec1a231c40c"},
212 | {file = "numpy-1.23.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:17c0e467ade9bda685d5ac7f5fa729d8d3e76b23195471adae2d6a6941bd2c18"},
213 | {file = "numpy-1.23.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91b8d6768a75247026e951dce3b2aac79dc7e78622fc148329135ba189813584"},
214 | {file = "numpy-1.23.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:94c15ca4e52671a59219146ff584488907b1f9b3fc232622b47e2cf832e94fb8"},
215 | {file = "numpy-1.23.3.tar.gz", hash = "sha256:51bf49c0cd1d52be0a240aa66f3458afc4b95d8993d2d04f0d91fa60c10af6cd"},
216 | ]
217 | pathspec = [
218 | {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"},
219 | {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"},
220 | ]
221 | platformdirs = [
222 | {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"},
223 | {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"},
224 | ]
225 | tomli = [
226 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
227 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
228 | ]
229 | typing-extensions = [
230 | {file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"},
231 | {file = "typing_extensions-4.3.0.tar.gz", hash = "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"},
232 | ]
233 |
--------------------------------------------------------------------------------