diff --git a/poetry.lock b/poetry.lock index a1fa07c08..2d190768a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,77 +1,123 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + [[package]] name = "ansicon" version = "1.89.0" description = "Python wrapper for loading Jason Hood's ANSICON" -category = "main" optional = false python-versions = "*" +files = [ + {file = "ansicon-1.89.0-py2.py3-none-any.whl", hash = "sha256:f1def52d17f65c2c9682cf8370c03f541f410c1752d6a14029f97318e4b9dfec"}, + {file = "ansicon-1.89.0.tar.gz", hash = "sha256:e4d039def5768a47e4afec8e89e83ec3ae5a26bf00ad851f914d1240b444d2b1"}, +] [[package]] name = "appdirs" version = "1.4.4" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] [[package]] name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] [[package]] name = "arrow" -version = "1.2.2" +version = "1.2.3" description = "Better dates & times for Python" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, + {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, +] [package.dependencies] python-dateutil = ">=2.7.0" [[package]] name = "asgiref" -version = "3.5.0" +version = "3.7.2" description = "ASGI specs, helper code, and adapters" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "asgiref-3.7.2-py3-none-any.whl", hash = "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"}, + {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} [package.extras] -tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"] +tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "astropy" -version = "5.0.4" +version = "5.3" description = "Astronomy and astrophysics core library" -category = "main" optional = false -python-versions = ">=3.8" - -[package.dependencies] -numpy = ">=1.18" +python-versions = ">=3.9" +files = [ + {file = "astropy-5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a9eeda64e35d28d5e408df5ee4c5ad1ef5501b58986d05e91b0ea6bb40288e14"}, + {file = "astropy-5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32b24ba8cf6c345103f3f09f0b3229c99b71f17bc523dc9a608cee5ec43deb83"}, + {file = "astropy-5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250f9c257d215020d7827ed9aa49f1c7994f663ab809749b4c81aeb2675e74ca"}, + {file = "astropy-5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:acf5b88c371d172dd3d79e2aacef0a3ab35ea89c9e78c9179c1abe23c4b416da"}, + {file = "astropy-5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f6e36a06561d66be3c28f64fe509c9c029a1f3350191cbb5b5b19ed22463441"}, + {file = "astropy-5.3-cp310-cp310-win32.whl", hash = "sha256:2c5e568bf6c11115f126d39353df2a7666b7cc1a7b11a6868ad478733195364c"}, + {file = "astropy-5.3-cp310-cp310-win_amd64.whl", hash = "sha256:5f2f861f62c89ffdbf98541d62b41cd12cf50a9bd102513889d927ba73c8094e"}, + {file = "astropy-5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:52f415dc724eae77be6af6c1e20cd4a9ae903881e12d0d07f7358f481cdf6ade"}, + {file = "astropy-5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75e6da73734b85c07e833175205e2847d176e155559f90a1132b034ec359322d"}, + {file = "astropy-5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87d652a22379211f3daa5c7fbaf9c3810c9967e4b5c803c62a1ce775da961f85"}, + {file = "astropy-5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db4bcf9f5770c661f25c1ffed9c4d9cb6a376c3741c91f12fce3621a1ca01b6"}, + {file = "astropy-5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be46392aea07f237ed8a0df45fb0c44d857a8e11feba3b2f53e752c911ce8248"}, + {file = "astropy-5.3-cp311-cp311-win32.whl", hash = "sha256:7f0270f9710b92be926dc210fba8262784d70690558bef2fccb8af3a11720ed5"}, + {file = "astropy-5.3-cp311-cp311-win_amd64.whl", hash = "sha256:e3fabb89411a81cfcdacf95c3c80d7aa83dc138e33dd44167c99e972434a617b"}, + {file = "astropy-5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:aa01cfedd1c62b0c764002e62a52ad966025f254cc9ec0b2c2a11610b3815b19"}, + {file = "astropy-5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2d85e0325de35bf027b9adbeb220db04fbd65b897c1c08a51c1babbf12aeead0"}, + {file = "astropy-5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfa99e66c37b981505b1bbac0334c878ad8076d1da8847587c1891bf516a25c7"}, + {file = "astropy-5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f21e62e734f1f52f34fd3a38baab981e679aebd22a3824b47ead4005b1d43ec7"}, + {file = "astropy-5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2c492930cbb89789b37da0b869c062dcf87cd4e5af98197ab89cc39e1a8656ad"}, + {file = "astropy-5.3-cp39-cp39-win32.whl", hash = "sha256:d7c0a05628f0c8f99cb30463ffb431902118d65224b2822a4a33f69bcf4b17df"}, + {file = "astropy-5.3-cp39-cp39-win_amd64.whl", hash = "sha256:7240bd5784f7c856fb0b69c3b556572c8196d9f4c7bbc075b573b4fae113cefd"}, + {file = "astropy-5.3.tar.gz", hash = "sha256:1f694be1c2b32309aca15cf7b54aa17546e944135209394cdceebd7a7889e4e5"}, +] + +[package.dependencies] +numpy = ">=1.21" packaging = ">=19.0" pyerfa = ">=2.0" PyYAML = ">=3.13" [package.extras] -all = ["scipy (>=1.3)", "matplotlib (>=3.1,!=3.4.0)", "certifi", "dask", "h5py", "pyarrow (>=5.0.0)", "beautifulsoup4", "html5lib", "bleach", "pandas", "sortedcontainers", "pytz", "jplephem", "mpmath", "asdf (>=2.9.2)", "bottleneck", "ipython (>=4.2)", "pytest (>=7.0)", "typing-extensions (>=3.10.0.1)"] -docs = ["sphinx (<4)", "sphinx-astropy (>=1.6)", "pytest (>=7.0)", "scipy (>=1.3)", "matplotlib (>=3.1,!=3.4.0)", "sphinx-changelog (>=1.1.0)", "Jinja2 (<3.1)"] -recommended = ["scipy (>=1.3)", "matplotlib (>=3.1,!=3.4.0)"] -test = ["pytest (>=7.0)", "pytest-doctestplus (>=0.12)", "pytest-astropy-header (>=0.2.1)", "pytest-astropy (>=0.9)", "pytest-xdist"] -test_all = ["pytest (>=7.0)", "pytest-doctestplus (>=0.12)", "pytest-astropy-header (>=0.2.1)", "pytest-astropy (>=0.9)", "pytest-xdist", "objgraph", "ipython (>=4.2)", "coverage", "skyfield (>=1.20)", "sgp4 (>=2.3)"] +all = ["asdf (>=2.10.0)", "beautifulsoup4", "bleach", "bottleneck", "certifi", "dask[array]", "fsspec[http] (>=2022.8.2)", "h5py", "html5lib", "ipython (>=4.2)", "jplephem", "matplotlib (>=3.3,!=3.4.0,!=3.5.2)", "mpmath", "pandas", "pre-commit", "pyarrow (>=5.0.0)", "pytest (>=7.0)", "pytz", "s3fs (>=2022.8.2)", "scipy (>=1.5)", "sortedcontainers", "typing-extensions (>=3.10.0.1)"] +docs = ["Jinja2 (>=3.0)", "matplotlib (>=3.3,!=3.4.0,!=3.5.2)", "pytest (>=7.0)", "scipy (>=1.3)", "sphinx", "sphinx-astropy (>=1.6)", "sphinx-changelog (>=1.2.0)"] +recommended = ["matplotlib (>=3.3,!=3.4.0,!=3.5.2)", "scipy (>=1.5)"] +test = ["pytest (>=7.0)", "pytest-astropy (>=0.10)", "pytest-astropy-header (>=0.2.1)", "pytest-doctestplus (>=0.12)", "pytest-xdist"] +test-all = ["coverage[toml]", "ipython (>=4.2)", "objgraph", "pytest (>=7.0)", "pytest-astropy (>=0.10)", "pytest-astropy-header (>=0.2.1)", "pytest-doctestplus (>=0.12)", "pytest-xdist", "sgp4 (>=2.3)", "skyfield (>=1.20)", "timezonefinder"] [[package]] name = "astroquery" version = "0.4.6" description = "Functions and classes to access online astronomical data resources" -category = "main" optional = false python-versions = "*" +files = [ + {file = "astroquery-0.4.6-py3-none-any.whl", hash = "sha256:e1bc4996af7500370837d31491bd4ee7f0c954c78d24cd54fb1cceb755469094"}, + {file = "astroquery-0.4.6.tar.gz", hash = "sha256:307ca554cb734a0ca9a22f86f5effe7e413af913ae65e1578972d847b1fe13ee"}, +] [package.dependencies] astropy = ">=4.0" @@ -83,102 +129,106 @@ pyvo = ">=1.1" requests = ">=2.4.3" [package.extras] -all = ["mocpy (>=0.5.2)", "astropy-healpix", "boto3", "regions", "pyregion", "aplpy"] -docs = ["sphinx-astropy (>=1.5)", "scipy"] -test = ["pytest-astropy", "matplotlib", "jinja2", "flask", "pytest-dependency"] - -[[package]] -name = "astunparse" -version = "1.6.3" -description = "An AST unparser for Python" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -six = ">=1.6.1,<2.0" +all = ["aplpy", "astropy-healpix", "boto3", "mocpy (>=0.5.2)", "pyregion", "regions"] +docs = ["scipy", "sphinx-astropy (>=1.5)"] +test = ["flask", "jinja2", "matplotlib", "pytest-astropy", "pytest-dependency"] [[package]] name = "attrs" -version = "21.4.0" +version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "autobahn" -version = "22.3.2" +version = "23.6.2" description = "WebSocket client & server library, WAMP real-time framework" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +files = [ + {file = "autobahn-23.6.2.tar.gz", hash = "sha256:ec9421c52a2103364d1ef0468036e6019ee84f71721e86b36fe19ad6966c1181"}, +] [package.dependencies] cryptography = ">=3.4.6" hyperlink = ">=21.0.0" +setuptools = "*" txaio = ">=21.2.1" [package.extras] -accelerate = ["wsaccel (>=0.6.3)"] -all = ["zope.interface (>=5.2.0)", "twisted (>=20.3.0)", "attrs (>=20.3.0)", "wsaccel (>=0.6.3)", "python-snappy (>=0.6.0)", "msgpack (>=1.0.2)", "ujson (>=4.0.2)", "cbor2 (>=5.2.0)", "py-ubjson (>=0.16.1)", "flatbuffers (>=1.12)", "pyopenssl (>=20.0.1)", "service_identity (>=18.1.0)", "pynacl (>=1.4.0)", "pytrie (>=0.4.0)", "pyqrcode (>=1.2.1)", "cffi (>=1.14.5)", "argon2_cffi (>=20.1.0)", "passlib (>=1.7.4)", "cffi (>=1.14.5)", "xbr (>=21.2.1)", "cbor2 (>=5.2.0)", "zlmdb (>=21.2.1)", "twisted (>=20.3.0)", "web3 (>=5.16.0)", "rlp (>=2.0.1)", "py-eth-sig-utils (>=0.4.0)", "py-ecc (>=5.1.0)", "eth-abi (>=2.1.1)", "mnemonic (>=0.19)", "base58 (>=2.1.0)", "ecdsa (>=0.16.1)", "py-multihash (>=2.0.1)", "jinja2 (>=2.11.3)", "yapf (==0.29.0)", "spake2 (>=0.8)", "hkdf (>=0.0.3)", "PyGObject (>=3.40.0)", "xbr (>=21.2.1)", "cbor2 (>=5.2.0)", "zlmdb (>=21.2.1)", "twisted (>=20.3.0)", "web3 (>=5.16.0)", "rlp (>=2.0.1)", "py-eth-sig-utils (>=0.4.0)", "py-ecc (>=5.1.0)", "eth-abi (>=2.1.1)", "mnemonic (>=0.19)", "base58 (>=2.1.0)", "ecdsa (>=0.16.1)", "py-multihash (>=2.0.1)", "jinja2 (>=2.11.3)", "yapf (==0.29.0)", "spake2 (>=0.8)", "hkdf (>=0.0.3)"] +all = ["PyGObject (>=3.40.0)", "argon2_cffi (>=20.1.0)", "attrs (>=20.3.0)", "base58 (>=2.1.0)", "bitarray (>=2.7.5)", "cbor2 (>=5.2.0)", "cffi (>=1.14.5)", "click (>=8.1.2)", "ecdsa (>=0.16.1)", "eth-abi (>=4.0.0)", "flatbuffers (>=22.12.6)", "hkdf (>=0.0.3)", "jinja2 (>=2.11.3)", "mnemonic (>=0.19)", "msgpack (>=1.0.2)", "passlib (>=1.7.4)", "py-ecc (>=5.1.0)", "py-eth-sig-utils (>=0.4.0)", "py-multihash (>=2.0.1)", "py-ubjson (>=0.16.1)", "pynacl (>=1.4.0)", "pyopenssl (>=20.0.1)", "python-snappy (>=0.6.0)", "pytrie (>=0.4.0)", "qrcode (>=7.3.1)", "rlp (>=2.0.1)", "service_identity (>=18.1.0)", "spake2 (>=0.8)", "twisted (>=20.3.0)", "ujson (>=4.0.2)", "web3[ipfs] (>=6.0.0)", "xbr (>=21.2.1)", "yapf (==0.29.0)", "zlmdb (>=21.2.1)", "zope.interface (>=5.2.0)"] compress = ["python-snappy (>=0.6.0)"] -dev = ["awscli", "backports.tempfile (>=1.0)", "bumpversion (>=0.5.3)", "codecov (>=2.0.15)", "flake8 (>=3.5.0)", "humanize (>=0.5.1)", "passlib", "pep8-naming (>=0.3.3)", "pip (>=9.0.1)", "pyenchant (>=1.6.6)", "pyflakes (>=1.0.0)", "pyinstaller (>=4.2)", "pylint (>=1.9.2)", "pytest-aiohttp", "pytest-asyncio (>=0.14.0)", "pytest-runner (>=2.11.1)", "pytest (>=3.4.2)", "pyyaml (>=4.2b4)", "qualname", "sphinx-autoapi (>=1.7.0)", "sphinx (>=1.7.1)", "sphinx_rtd_theme (>=0.1.9)", "sphinxcontrib-images (>=0.9.1)", "tox-gh-actions (>=2.2.0)", "tox (>=2.9.1)", "twine (>=3.3.0)", "twisted (>=18.7.0)", "txaio (>=20.4.1)", "watchdog (>=0.8.3)", "wheel (>=0.36.2)", "yapf (==0.29.0)", "mypy (>=0.610)"] -encryption = ["pyopenssl (>=20.0.1)", "service_identity (>=18.1.0)", "pynacl (>=1.4.0)", "pytrie (>=0.4.0)", "pyqrcode (>=1.2.1)"] +dev = ["backports.tempfile (>=1.0)", "bumpversion (>=0.5.3)", "codecov (>=2.0.15)", "flake8 (<5)", "humanize (>=0.5.1)", "mypy (>=0.610)", "passlib", "pep8-naming (>=0.3.3)", "pip (>=9.0.1)", "pyenchant (>=1.6.6)", "pyflakes (>=1.0.0)", "pyinstaller (>=4.2)", "pylint (>=1.9.2)", "pytest (>=3.4.2)", "pytest-aiohttp", "pytest-asyncio (>=0.14.0)", "pytest-runner (>=2.11.1)", "pyyaml (>=4.2b4)", "qualname", "sphinx (>=1.7.1)", "sphinx-autoapi (>=1.7.0)", "sphinx_rtd_theme (>=0.1.9)", "sphinxcontrib-images (>=0.9.1)", "tox (>=4.2.8)", "tox-gh-actions (>=2.2.0)", "twine (>=3.3.0)", "twisted (>=22.10.0)", "txaio (>=20.4.1)", "watchdog (>=0.8.3)", "wheel (>=0.36.2)", "yapf (==0.29.0)"] +encryption = ["pynacl (>=1.4.0)", "pyopenssl (>=20.0.1)", "pytrie (>=0.4.0)", "qrcode (>=7.3.1)", "service_identity (>=18.1.0)"] nvx = ["cffi (>=1.14.5)"] -scram = ["cffi (>=1.14.5)", "argon2_cffi (>=20.1.0)", "passlib (>=1.7.4)"] -serialization = ["msgpack (>=1.0.2)", "ujson (>=4.0.2)", "cbor2 (>=5.2.0)", "py-ubjson (>=0.16.1)", "flatbuffers (>=1.12)"] -twisted = ["zope.interface (>=5.2.0)", "twisted (>=20.3.0)", "attrs (>=20.3.0)"] +scram = ["argon2_cffi (>=20.1.0)", "cffi (>=1.14.5)", "passlib (>=1.7.4)"] +serialization = ["cbor2 (>=5.2.0)", "flatbuffers (>=22.12.6)", "msgpack (>=1.0.2)", "py-ubjson (>=0.16.1)", "ujson (>=4.0.2)"] +twisted = ["attrs (>=20.3.0)", "twisted (>=20.3.0)", "zope.interface (>=5.2.0)"] ui = ["PyGObject (>=3.40.0)"] -xbr = ["xbr (>=21.2.1)", "cbor2 (>=5.2.0)", "zlmdb (>=21.2.1)", "twisted (>=20.3.0)", "web3 (>=5.16.0)", "rlp (>=2.0.1)", "py-eth-sig-utils (>=0.4.0)", "py-ecc (>=5.1.0)", "eth-abi (>=2.1.1)", "mnemonic (>=0.19)", "base58 (>=2.1.0)", "ecdsa (>=0.16.1)", "py-multihash (>=2.0.1)", "jinja2 (>=2.11.3)", "yapf (==0.29.0)", "spake2 (>=0.8)", "hkdf (>=0.0.3)"] +xbr = ["base58 (>=2.1.0)", "bitarray (>=2.7.5)", "cbor2 (>=5.2.0)", "click (>=8.1.2)", "ecdsa (>=0.16.1)", "eth-abi (>=4.0.0)", "hkdf (>=0.0.3)", "jinja2 (>=2.11.3)", "mnemonic (>=0.19)", "py-ecc (>=5.1.0)", "py-eth-sig-utils (>=0.4.0)", "py-multihash (>=2.0.1)", "rlp (>=2.0.1)", "spake2 (>=0.8)", "twisted (>=20.3.0)", "web3[ipfs] (>=6.0.0)", "xbr (>=21.2.1)", "yapf (==0.29.0)", "zlmdb (>=21.2.1)"] [[package]] name = "automat" -version = "20.2.0" +version = "22.10.0" description = "Self-service finite-state machines for the programmer on the go." -category = "main" optional = false python-versions = "*" +files = [ + {file = "Automat-22.10.0-py2.py3-none-any.whl", hash = "sha256:c3164f8742b9dc440f3682482d32aaff7bb53f71740dd018533f9de286b64180"}, + {file = "Automat-22.10.0.tar.gz", hash = "sha256:e56beb84edad19dcc11d30e8d9b895f75deeb5ef5e96b84a467066b3b84bb04e"}, +] [package.dependencies] attrs = ">=19.2.0" six = "*" [package.extras] -visualize = ["graphviz (>0.5.1)", "Twisted (>=16.1.1)"] +visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] [[package]] name = "babel" -version = "2.9.1" +version = "2.12.1" description = "Internationalization utilities" -category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pytz = ">=2015.7" +python-versions = ">=3.7" +files = [ + {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, + {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, +] [[package]] name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] [[package]] name = "beautifulsoup4" -version = "4.10.0" +version = "4.12.2" description = "Screen-scraping library" -category = "main" optional = false -python-versions = ">3.0.0" +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] [package.dependencies] soupsieve = ">1.2" @@ -191,9 +241,11 @@ lxml = ["lxml"] name = "black" version = "20.8b1" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, +] [package.dependencies] appdirs = "*" @@ -211,27 +263,32 @@ d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] [[package]] name = "bleach" -version = "5.0.0" +version = "6.0.0" description = "An easy safelist-based HTML-sanitizing tool." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, + {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, +] [package.dependencies] six = ">=1.9.0" webencodings = "*" [package.extras] -css = ["tinycss2 (>=1.1.0)"] -dev = ["pip-tools (==6.5.1)", "pytest (==7.1.1)", "flake8 (==4.0.1)", "tox (==3.24.5)", "sphinx (==4.3.2)", "twine (==4.0.0)", "wheel (==0.37.1)", "hashin (==0.17.0)", "black (==22.3.0)", "mypy (==0.942)"] +css = ["tinycss2 (>=1.1.0,<1.2)"] [[package]] name = "blessed" -version = "1.19.1" +version = "1.20.0" description = "Easy, practical library for making terminal apps, by providing an elegant, well-documented interface to Colors, Keyboard input, and screen Positioning capabilities." -category = "main" optional = false python-versions = ">=2.7" +files = [ + {file = "blessed-1.20.0-py2.py3-none-any.whl", hash = "sha256:0c542922586a265e699188e52d5f5ac5ec0dd517e5a1041d90d2bbf23f906058"}, + {file = "blessed-1.20.0.tar.gz", hash = "sha256:2cdd67f8746e048f00df47a2880f4d6acbcdb399031b604e34ba8f71d5787680"}, +] [package.dependencies] jinxed = {version = ">=1.1.0", markers = "platform_system == \"Windows\""} @@ -242,9 +299,12 @@ wcwidth = ">=0.1.4" name = "bokeh" version = "2.4.2" description = "Interactive plots and applications in the browser from Python" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "bokeh-2.4.2-py3-none-any.whl", hash = "sha256:2a842d717feeee802e668054277c09054b6f1561557a16dddaf5f7c452f2728c"}, + {file = "bokeh-2.4.2.tar.gz", hash = "sha256:f0a4b53364ed3b7eb936c5cb1a4f4132369e394c7ae0a8ef420459410958033d"}, +] [package.dependencies] Jinja2 = ">=2.9" @@ -257,57 +317,204 @@ typing-extensions = ">=3.10.0" [[package]] name = "certifi" -version = "2021.10.8" +version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] [[package]] name = "cffi" -version = "1.15.0" +version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] [package.dependencies] pycparser = "*" [[package]] name = "channels" -version = "3.0.4" +version = "3.0.5" description = "Brings async, event-driven capabilities to Django. Django 2.2 and up only." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "channels-3.0.5-py3-none-any.whl", hash = "sha256:3813b8025bf85509769793aca720e6c3b1c5bde1cb253a961252bf0242b60a26"}, + {file = "channels-3.0.5.tar.gz", hash = "sha256:a3dc3339cc033e7c2afe083fb3dedf74fc5009815967e317e080e7bfdc92ea26"}, +] [package.dependencies] -asgiref = ">=3.3.1,<4" +asgiref = ">=3.5.0,<4" daphne = ">=3.0,<4" Django = ">=2.2" [package.extras] -tests = ["pytest", "pytest-django", "pytest-asyncio", "async-timeout", "coverage (>=4.5,<5.0)"] +tests = ["async-timeout", "coverage (>=4.5,<5.0)", "pytest", "pytest-asyncio", "pytest-django"] [[package]] name = "charset-normalizer" -version = "2.0.12" +version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] [[package]] name = "click" -version = "8.1.2" +version = "8.1.3" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -316,25 +523,34 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "cloudpickle" version = "1.6.0" description = "Extended pickling support for Python objects" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "cloudpickle-1.6.0-py3-none-any.whl", hash = "sha256:3a32d0eb0bc6f4d0c57fbc4f3e3780f7a81e6fee0fa935072884d58ae8e1cc7c"}, + {file = "cloudpickle-1.6.0.tar.gz", hash = "sha256:9bc994f9e9447593bd0a45371f0e7ac7333710fcf64a4eb9834bf149f4ef2f32"}, +] [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "colorcet" version = "2.0.6" description = "Collection of perceptually uniform colormaps" -category = "main" optional = false python-versions = ">=2.7" +files = [ + {file = "colorcet-2.0.6-py2.py3-none-any.whl", hash = "sha256:4c203d31b50a1cdd2f5dcb2f59be8b6d459de1cf74a85611215ebc25994aa261"}, + {file = "colorcet-2.0.6.tar.gz", hash = "sha256:efa44b6f4078261e62d0039c76aba17ac8d3ebaf0bc2291a111aee3905313433"}, +] [package.dependencies] param = ">=1.7.0" @@ -343,61 +559,152 @@ pyct = ">=0.4.4" [package.extras] all = ["bokeh", "flake8", "holoviews", "matplotlib", "nbsite (>=0.6.1)", "nbsmoke (>=0.2.6)", "numpy", "param (>=1.7.0)", "pyct (>=0.4.4)", "pytest (>=2.8.5)", "pytest-mpl", "setuptools (>=30.3.0)", "sphinx-holoviz-theme", "wheel"] build = ["param (>=1.7.0)", "pyct (>=0.4.4)", "setuptools (>=30.3.0)", "wheel"] -doc = ["numpy", "holoviews", "matplotlib", "bokeh", "nbsite (>=0.6.1)", "sphinx-holoviz-theme"] -examples = ["numpy", "holoviews", "matplotlib", "bokeh"] +doc = ["bokeh", "holoviews", "matplotlib", "nbsite (>=0.6.1)", "numpy", "sphinx-holoviz-theme"] +examples = ["bokeh", "holoviews", "matplotlib", "numpy"] tests = ["flake8", "nbsmoke (>=0.2.6)", "pytest (>=2.8.5)"] -tests_extra = ["flake8", "nbsmoke (>=0.2.6)", "pytest (>=2.8.5)", "pytest-mpl"] +tests-extra = ["flake8", "nbsmoke (>=0.2.6)", "pytest (>=2.8.5)", "pytest-mpl"] [[package]] name = "constantly" version = "15.1.0" description = "Symbolic constants in Python" -category = "main" optional = false python-versions = "*" +files = [ + {file = "constantly-15.1.0-py2.py3-none-any.whl", hash = "sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d"}, + {file = "constantly-15.1.0.tar.gz", hash = "sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35"}, +] + +[[package]] +name = "contourpy" +version = "1.1.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc"}, + {file = "contourpy-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, + {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, + {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, + {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, + {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, + {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, + {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, + {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, + {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, + {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, + {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, + {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, + {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, + {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, + {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f"}, + {file = "contourpy-1.1.0.tar.gz", hash = "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21"}, +] + +[package.dependencies] +numpy = ">=1.16" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "cryptography" -version = "36.0.2" +version = "41.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"}, + {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3"}, + {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db"}, + {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31"}, + {file = "cryptography-41.0.1-cp37-abi3-win32.whl", hash = "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5"}, + {file = "cryptography-41.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5"}, + {file = "cryptography-41.0.1.tar.gz", hash = "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006"}, +] [package.dependencies] cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools_rust (>=0.11.4)"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] [[package]] name = "csscompressor" version = "0.9.5" description = "A python port of YUI CSS Compressor" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05"}, +] [[package]] name = "cycler" version = "0.11.0" description = "Composable style cycles" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, + {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, +] [[package]] name = "daphne" version = "3.0.2" description = "Django ASGI (HTTP/WebSocket) server" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "daphne-3.0.2-py3-none-any.whl", hash = "sha256:a9af943c79717bc52fe64a3c236ae5d3adccc8b5be19c881b442d2c3db233393"}, + {file = "daphne-3.0.2.tar.gz", hash = "sha256:76ffae916ba3aa66b46996c14fa713e46004788167a4873d647544e750e0e99f"}, +] [package.dependencies] asgiref = ">=3.2.10,<4" @@ -409,68 +716,78 @@ tests = ["hypothesis (==4.23)", "pytest (>=3.10,<4.0)", "pytest-asyncio (>=0.8,< [[package]] name = "dask" -version = "2022.4.0" +version = "2023.6.1" description = "Parallel PyData with Task Scheduling" -category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +files = [ + {file = "dask-2023.6.1-py3-none-any.whl", hash = "sha256:56ccfb800c09ac7048435392f2bca2919a39bb9da502f0fddd728c9214d00098"}, + {file = "dask-2023.6.1.tar.gz", hash = "sha256:8077b708a8a6169da208714a8a9212937e7bed0326e5fa4681456a3538fc15a6"}, +] [package.dependencies] -bokeh = {version = ">=2.4.2", optional = true, markers = "extra == \"complete\""} -cloudpickle = ">=1.1.1" -distributed = {version = "2022.04.0", optional = true, markers = "extra == \"complete\""} -fsspec = ">=0.6.0" -jinja2 = {version = "*", optional = true, markers = "extra == \"complete\""} -numpy = {version = ">=1.18", optional = true, markers = "extra == \"dataframe\""} +click = ">=8.0" +cloudpickle = ">=1.5.0" +fsspec = ">=2021.09.0" +importlib-metadata = ">=4.13.0" +numpy = {version = ">=1.21", optional = true, markers = "extra == \"dataframe\""} packaging = ">=20.0" -pandas = {version = ">=1.0", optional = true, markers = "extra == \"dataframe\""} -partd = ">=0.3.10" +pandas = {version = ">=1.3", optional = true, markers = "extra == \"dataframe\""} +partd = ">=1.2.0" pyyaml = ">=5.3.1" -toolz = ">=0.8.2" +toolz = ">=0.10.0" [package.extras] -array = ["numpy (>=1.18)"] -complete = ["bokeh (>=2.4.2)", "distributed (==2022.04.0)", "jinja2", "numpy (>=1.18)", "pandas (>=1.0)"] -dataframe = ["numpy (>=1.18)", "pandas (>=1.0)"] -diagnostics = ["bokeh (>=2.4.2)", "jinja2"] -distributed = ["distributed (==2022.04.0)"] -test = ["pytest", "pytest-rerunfailures", "pytest-xdist", "pre-commit"] +array = ["numpy (>=1.21)"] +complete = ["dask[array,dataframe,diagnostics,distributed]", "lz4 (>=4.3.2)", "pyarrow (>=7.0)"] +dataframe = ["numpy (>=1.21)", "pandas (>=1.3)"] +diagnostics = ["bokeh (>=2.4.2)", "jinja2 (>=2.10.3)"] +distributed = ["distributed (==2023.6.1)"] +test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist"] [[package]] name = "datashader" -version = "0.13.0" +version = "0.15.0" description = "Data visualization toolchain based on aggregating into a grid" -category = "main" optional = false -python-versions = ">=2.7" +python-versions = ">=3.8" +files = [ + {file = "datashader-0.15.0-py2.py3-none-any.whl", hash = "sha256:25832aec902b73d485a21d526fc518ae659e5004aad64db97b6f39d87d066453"}, + {file = "datashader-0.15.0.tar.gz", hash = "sha256:81b0481a75530e713cfacf421da5e062ca5791832466987f70b59724cc03872f"}, +] [package.dependencies] -colorcet = ">=0.9.0" -dask = {version = ">=0.18.0", extras = ["complete"]} -datashape = ">=0.5.1" -numba = ">=0.51" -numpy = ">=1.7" -pandas = ">=0.24.1" -param = ">=1.6.1" -pillow = ">=3.1.1" -pyct = ">=0.4.5" +colorcet = "*" +dask = "*" +datashape = "*" +numba = "*" +numpy = "*" +pandas = "*" +param = "*" +pillow = "*" +pyct = "*" +requests = "*" scipy = "*" -xarray = ">=0.9.6" +toolz = "*" +xarray = "*" [package.extras] -all = ["bokeh", "codecov", "fastparquet", "fastparquet (>=0.1.6)", "flake8", "graphviz", "holoviews (>=1.10.0)", "keyring", "matplotlib", "nbconvert (<6)", "nbsite (>=0.5.2)", "nbsmoke[all] (>=0.4.0)", "netcdf4", "networkx (>=2.0)", "numpydoc", "pyarrow", "pytest (>=3.9.3,<6.0)", "pytest-benchmark (>=3.0.0)", "pytest-cov", "python-graphviz", "python-snappy", "rasterio", "rfc3986", "scikit-image", "snappy", "spatialpandas", "sphinx-holoviz-theme", "streamz (>=0.2.0)", "twine"] -doc = ["holoviews (>=1.10.0)", "scikit-image", "bokeh", "matplotlib", "networkx (>=2.0)", "streamz (>=0.2.0)", "graphviz", "python-graphviz", "fastparquet", "python-snappy", "rasterio", "snappy", "nbsite (>=0.5.2)", "sphinx-holoviz-theme", "numpydoc"] -examples = ["holoviews (>=1.10.0)", "scikit-image", "bokeh", "matplotlib"] -examples_extra = ["holoviews (>=1.10.0)", "scikit-image", "bokeh", "matplotlib", "networkx (>=2.0)", "streamz (>=0.2.0)", "graphviz", "python-graphviz", "fastparquet", "python-snappy", "rasterio", "snappy"] -tests = ["pytest (>=3.9.3,<6.0)", "pytest-benchmark (>=3.0.0)", "pytest-cov", "codecov", "flake8", "nbconvert (<6)", "nbsmoke[all] (>=0.4.0)", "fastparquet (>=0.1.6)", "holoviews (>=1.10.0)", "bokeh", "pyarrow", "netcdf4", "twine", "rfc3986", "keyring", "spatialpandas"] +all = ["bokeh", "codecov", "fastparquet", "flake8", "geopandas", "graphviz", "holoviews", "matplotlib", "nbconvert", "nbformat", "nbsite (==0.8.0)", "nbsmoke[verify] (>0.5)", "netcdf4", "networkx", "numpydoc", "pyarrow (<11)", "pytest", "pytest-benchmark", "pytest-cov", "python-graphviz", "python-snappy", "rasterio", "rioxarray", "scikit-image", "spatialpandas", "streamz"] +doc = ["bokeh", "fastparquet", "geopandas", "graphviz", "holoviews", "matplotlib", "nbsite (==0.8.0)", "networkx", "numpydoc", "python-graphviz", "python-snappy", "rasterio", "scikit-image", "spatialpandas", "streamz"] +examples = ["bokeh", "geopandas", "holoviews", "matplotlib", "scikit-image", "spatialpandas"] +examples-extra = ["bokeh", "fastparquet", "geopandas", "graphviz", "holoviews", "matplotlib", "networkx", "python-graphviz", "python-snappy", "rasterio", "scikit-image", "spatialpandas", "streamz"] +gpu-tests = ["cudf", "cupy", "dask-cudf"] +tests = ["codecov", "fastparquet", "flake8", "nbconvert", "nbformat", "nbsmoke[verify] (>0.5)", "netcdf4", "pyarrow (<11)", "pytest", "pytest-benchmark", "pytest-cov", "rasterio", "rioxarray", "spatialpandas"] [[package]] name = "datashape" version = "0.5.2" description = "A data description language." -category = "main" optional = false python-versions = "*" +files = [ + {file = "datashape-0.5.2.tar.gz", hash = "sha256:2356ea690c3cf003c1468a243a9063144235de45b080b3652de4f3d44e57d783"}, +] [package.dependencies] multipledispatch = ">=0.4.7" @@ -481,60 +798,48 @@ python-dateutil = "*" name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] [[package]] name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] [[package]] name = "dill" -version = "0.3.4" +version = "0.3.6" description = "serialize all of python" -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*" +python-versions = ">=3.7" +files = [ + {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, + {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, +] [package.extras] graph = ["objgraph (>=1.7.2)"] -[[package]] -name = "distributed" -version = "2022.4.0" -description = "Distributed scheduler for Dask" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -click = ">=6.6" -cloudpickle = ">=1.5.0" -dask = "2022.04.0" -jinja2 = "*" -msgpack = ">=0.6.0" -packaging = ">=20.0" -psutil = ">=5.0" -pyyaml = "*" -sortedcontainers = "<2.0.0 || >2.0.0,<2.0.1 || >2.0.1" -tblib = ">=1.6.0" -toolz = ">=0.8.2" -tornado = ">=6.0.3" -urllib3 = "*" -zict = ">=0.1.3" - [[package]] name = "django" -version = "3.2.13" +version = "3.2.19" description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "Django-3.2.19-py3-none-any.whl", hash = "sha256:21cc991466245d659ab79cb01204f9515690f8dae00e5eabde307f14d24d4d7d"}, + {file = "Django-3.2.19.tar.gz", hash = "sha256:031365bae96814da19c10706218c44dff3b654cc4de20a98bd2d29b9bde469f0"}, +] [package.dependencies] asgiref = ">=3.3.2,<4" @@ -549,51 +854,66 @@ bcrypt = ["bcrypt"] name = "django-crispy-forms" version = "1.14.0" description = "Best way to have Django DRY forms" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "django-crispy-forms-1.14.0.tar.gz", hash = "sha256:35887b8851a931374dd697207a8f56c57a9c5cb9dbf0b9fa54314da5666cea5b"}, + {file = "django_crispy_forms-1.14.0-py3-none-any.whl", hash = "sha256:bc4d2037f6de602d39c0bc452ac3029d1f5d65e88458872cc4dbc01c3a400604"}, +] [[package]] name = "django-debug-toolbar" -version = "3.2.4" +version = "3.8.1" description = "A configurable set of panels that display various debug information about the current request/response." -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "django_debug_toolbar-3.8.1-py3-none-any.whl", hash = "sha256:879f8a4672d41621c06a4d322dcffa630fc4df056cada6e417ed01db0e5e0478"}, + {file = "django_debug_toolbar-3.8.1.tar.gz", hash = "sha256:24ef1a7d44d25e60d7951e378454c6509bf536dce7e7d9d36e7c387db499bc27"}, +] [package.dependencies] -Django = ">=2.2" -sqlparse = ">=0.2.0" +django = ">=3.2.4" +sqlparse = ">=0.2" [[package]] name = "django-environ" version = "0.4.5" description = "Django-environ allows you to utilize 12factor inspired environment variables to configure your Django application." -category = "main" optional = false python-versions = "*" +files = [ + {file = "django-environ-0.4.5.tar.gz", hash = "sha256:6c9d87660142608f63ec7d5ce5564c49b603ea8ff25da595fd6098f6dc82afde"}, + {file = "django_environ-0.4.5-py2.py3-none-any.whl", hash = "sha256:c57b3c11ec1f319d9474e3e5a79134f40174b17c7cc024bbb2fad84646b120c4"}, +] [[package]] name = "django-extensions" -version = "3.1.5" +version = "3.2.3" description = "Extensions for Django" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "django-extensions-3.2.3.tar.gz", hash = "sha256:44d27919d04e23b3f40231c4ab7af4e61ce832ef46d610cc650d53e68328410a"}, + {file = "django_extensions-3.2.3-py3-none-any.whl", hash = "sha256:9600b7562f79a92cbf1fde6403c04fee314608fefbb595502e34383ae8203401"}, +] [package.dependencies] -Django = ">=2.2" +Django = ">=3.2" [[package]] name = "django-picklefield" -version = "3.0.1" +version = "3.1" description = "Pickled object field for Django" -category = "main" optional = false python-versions = ">=3" +files = [ + {file = "django-picklefield-3.1.tar.gz", hash = "sha256:c786cbeda78d6def2b43bff4840d19787809c8909f7ad683961703060398d356"}, + {file = "django_picklefield-3.1-py3-none-any.whl", hash = "sha256:d77c504df7311e8ec14e8b779f10ca6fec74de6c7f8e2c136e1ef60cf955125d"}, +] [package.dependencies] -Django = ">=2.2" +Django = ">=3.2" [package.extras] tests = ["tox"] @@ -602,9 +922,12 @@ tests = ["tox"] name = "django-q" version = "1.3.9" description = "A multiprocessing distributed task queue for Django" -category = "main" optional = false python-versions = ">=3.6.2,<4" +files = [ + {file = "django-q-1.3.9.tar.gz", hash = "sha256:5c6b4d530aa3aabf9c6aa57376da1ca2abf89a1562b77038b7a04e52a4a0a91b"}, + {file = "django_q-1.3.9-py3-none-any.whl", hash = "sha256:1b74ce3a8931990b136903e3a7bc9b07243282a2b5355117246f05ed5d076e68"}, +] [package.dependencies] arrow = ">=1.1.0,<2.0.0" @@ -614,17 +937,20 @@ django-picklefield = ">=3.0.1,<4.0.0" redis = ">=3.5.3,<4.0.0" [package.extras] -testing = ["hiredis (>=1.0.1,<2.0.0)", "psutil (>=5.7.0,<6.0.0)", "django-redis (>=4.12.1,<5.0.0)", "iron-mq (>=0.9,<0.10)", "boto3 (>=1.14.12,<2.0.0)", "pymongo (>=3.10.1,<4.0.0)", "croniter (>=0.3.34,<0.4.0)"] rollbar = ["django-q-rollbar (>=0.1)"] sentry = ["django-q-sentry (>=0.1)"] +testing = ["boto3 (>=1.14.12,<2.0.0)", "croniter (>=0.3.34,<0.4.0)", "django-redis (>=4.12.1,<5.0.0)", "hiredis (>=1.0.1,<2.0.0)", "iron-mq (>=0.9,<0.10)", "psutil (>=5.7.0,<6.0.0)", "pymongo (>=3.10.1,<4.0.0)"] [[package]] name = "django-stubs" version = "1.9.0" description = "Mypy stubs for Django" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "django-stubs-1.9.0.tar.gz", hash = "sha256:664843091636a917faf5256d028476559dc360fdef9050b6df87ab61b21607bf"}, + {file = "django_stubs-1.9.0-py3-none-any.whl", hash = "sha256:59c9f81af64d214b1954eaf90f037778c8d2b9c2de946a3cda177fefcf588fbd"}, +] [package.dependencies] django = "*" @@ -637,11 +963,14 @@ typing-extensions = "*" [[package]] name = "django-stubs-ext" -version = "0.4.0" +version = "4.2.2" description = "Monkey-patching and extensions for django-stubs" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "django-stubs-ext-4.2.2.tar.gz", hash = "sha256:c69d1cc46f1c4c3b7894b685a5022c29b2a36c7cfb52e23762eaf357ebfc2c98"}, + {file = "django_stubs_ext-4.2.2-py3-none-any.whl", hash = "sha256:fdacc65a14d2d4b97334b58ff178a5853ec8c8c76cec406e417916ad67536ce4"}, +] [package.dependencies] django = "*" @@ -651,32 +980,41 @@ typing-extensions = "*" name = "django-tagulous" version = "1.3.3" description = "Fabulous Tagging for Django" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "django-tagulous-1.3.3.tar.gz", hash = "sha256:d445590ae1b5cb9b8c5a425f97bf5f01148a33419c19edeb721ebd9fdd6792fe"}, + {file = "django_tagulous-1.3.3-py3-none-any.whl", hash = "sha256:ad3bb85f4cce83a47e4c0257143229cb92a294defa02fe661823b0442b35d478"}, +] [package.dependencies] Django = ">=2.2" [[package]] name = "djangorestframework" -version = "3.13.1" +version = "3.14.0" description = "Web APIs for Django, made easy." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "djangorestframework-3.14.0-py3-none-any.whl", hash = "sha256:eb63f58c9f218e1a7d064d17a70751f528ed4e1d35547fdade9aaf4cd103fd08"}, + {file = "djangorestframework-3.14.0.tar.gz", hash = "sha256:579a333e6256b09489cbe0a067e66abe55c6595d8926be6b99423786334350c8"}, +] [package.dependencies] -django = ">=2.2" +django = ">=3.0" pytz = "*" [[package]] name = "djangorestframework-datatables" version = "0.5.1" description = "Seamless integration between Django REST framework and Datatables (https://datatables.net)" -category = "main" optional = false python-versions = "*" +files = [ + {file = "djangorestframework-datatables-0.5.1.tar.gz", hash = "sha256:6eedec2ab10772bf435c82652def29f8b245f5ef217bd5218e9b441c7545bf31"}, + {file = "djangorestframework_datatables-0.5.1-py2.py3-none-any.whl", hash = "sha256:cd76fca59c9bb96f1dd92838a82649922ae0deaaa27c11b20d6b1dc60be7ef37"}, +] [package.dependencies] djangorestframework = ">=3.5.0" @@ -685,9 +1023,12 @@ djangorestframework = ">=3.5.0" name = "flake8" version = "3.9.2" description = "the modular source code checker: pep8 pyflakes and co" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, + {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, +] [package.dependencies] mccabe = ">=0.6.0,<0.7.0" @@ -696,32 +1037,68 @@ pyflakes = ">=2.3.0,<2.4.0" [[package]] name = "fonttools" -version = "4.31.2" +version = "4.40.0" description = "Tools to manipulate font files" -category = "main" optional = false -python-versions = ">=3.7" - -[package.extras] -all = ["fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "zopfli (>=0.1.4)", "lz4 (>=1.7.4.2)", "matplotlib", "sympy", "skia-pathops (>=0.5.0)", "brotlicffi (>=0.8.0)", "scipy", "brotli (>=1.0.1)", "munkres", "unicodedata2 (>=14.0.0)", "xattr"] +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.40.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b802dcbf9bcff74672f292b2466f6589ab8736ce4dcf36f48eb994c2847c4b30"}, + {file = "fonttools-4.40.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f6e3fa3da923063c286320e728ba2270e49c73386e3a711aa680f4b0747d692"}, + {file = "fonttools-4.40.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdf60f8a5c6bcce7d024a33f7e4bc7921f5b74e8ea13bccd204f2c8b86f3470"}, + {file = "fonttools-4.40.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91784e21a1a085fac07c6a407564f4a77feb471b5954c9ee55a4f9165151f6c1"}, + {file = "fonttools-4.40.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:05171f3c546f64d78569f10adc0de72561882352cac39ec7439af12304d8d8c0"}, + {file = "fonttools-4.40.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7449e5e306f3a930a8944c85d0cbc8429cba13503372a1a40f23124d6fb09b58"}, + {file = "fonttools-4.40.0-cp310-cp310-win32.whl", hash = "sha256:bae8c13abbc2511e9a855d2142c0ab01178dd66b1a665798f357da0d06253e0d"}, + {file = "fonttools-4.40.0-cp310-cp310-win_amd64.whl", hash = "sha256:425b74a608427499b0e45e433c34ddc350820b6f25b7c8761963a08145157a66"}, + {file = "fonttools-4.40.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:00ab569b2a3e591e00425023ade87e8fef90380c1dde61be7691cb524ca5f743"}, + {file = "fonttools-4.40.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:18ea64ac43e94c9e0c23d7a9475f1026be0e25b10dda8f236fc956188761df97"}, + {file = "fonttools-4.40.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:022c4a16b412293e7f1ce21b8bab7a6f9d12c4ffdf171fdc67122baddb973069"}, + {file = "fonttools-4.40.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530c5d35109f3e0cea2535742d6a3bc99c0786cf0cbd7bb2dc9212387f0d908c"}, + {file = "fonttools-4.40.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5e00334c66f4e83535384cb5339526d01d02d77f142c23b2f97bd6a4f585497a"}, + {file = "fonttools-4.40.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb52c10fda31159c22c7ed85074e05f8b97da8773ea461706c273e31bcbea836"}, + {file = "fonttools-4.40.0-cp311-cp311-win32.whl", hash = "sha256:6a8d71b9a5c884c72741868e845c0e563c5d83dcaf10bb0ceeec3b4b2eb14c67"}, + {file = "fonttools-4.40.0-cp311-cp311-win_amd64.whl", hash = "sha256:15abb3d055c1b2dff9ce376b6c3db10777cb74b37b52b78f61657634fd348a0d"}, + {file = "fonttools-4.40.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14037c31138fbd21847ad5e5441dfdde003e0a8f3feb5812a1a21fd1c255ffbd"}, + {file = "fonttools-4.40.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:94c915f6716589f78bc00fbc14c5b8de65cfd11ee335d32504f1ef234524cb24"}, + {file = "fonttools-4.40.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37467cee0f32cada2ec08bc16c9c31f9b53ea54b2f5604bf25a1246b5f50593a"}, + {file = "fonttools-4.40.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56d4d85f5374b45b08d2f928517d1e313ea71b4847240398decd0ab3ebbca885"}, + {file = "fonttools-4.40.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8c4305b171b61040b1ee75d18f9baafe58bd3b798d1670078efe2c92436bfb63"}, + {file = "fonttools-4.40.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a954b90d1473c85a22ecf305761d9fd89da93bbd31dae86e7dea436ad2cb5dc9"}, + {file = "fonttools-4.40.0-cp38-cp38-win32.whl", hash = "sha256:1bc4c5b147be8dbc5df9cc8ac5e93ee914ad030fe2a201cc8f02f499db71011d"}, + {file = "fonttools-4.40.0-cp38-cp38-win_amd64.whl", hash = "sha256:8a917828dbfdb1cbe50cf40eeae6fbf9c41aef9e535649ed8f4982b2ef65c091"}, + {file = "fonttools-4.40.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:882983279bf39afe4e945109772c2ffad2be2c90983d6559af8b75c19845a80a"}, + {file = "fonttools-4.40.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c55f1b4109dbc3aeb496677b3e636d55ef46dc078c2a5e3f3db4e90f1c6d2907"}, + {file = "fonttools-4.40.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec468c022d09f1817c691cf884feb1030ef6f1e93e3ea6831b0d8144c06480d1"}, + {file = "fonttools-4.40.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d5adf4ba114f028fc3f5317a221fd8b0f4ef7a2e5524a2b1e0fd891b093791a"}, + {file = "fonttools-4.40.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aa83b3f151bc63970f39b2b42a06097c5a22fd7ed9f7ba008e618de4503d3895"}, + {file = "fonttools-4.40.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97d95b8301b62bdece1af943b88bcb3680fd385f88346a4a899ee145913b414a"}, + {file = "fonttools-4.40.0-cp39-cp39-win32.whl", hash = "sha256:1a003608400dd1cca3e089e8c94973c6b51a4fb1ef00ff6d7641617b9242e637"}, + {file = "fonttools-4.40.0-cp39-cp39-win_amd64.whl", hash = "sha256:7961575221e3da0841c75da53833272c520000d76f7f71274dbf43370f8a1065"}, + {file = "fonttools-4.40.0-py3-none-any.whl", hash = "sha256:200729d12461e2038700d31f0d49ad5a7b55855dec7525074979a06b46f88505"}, + {file = "fonttools-4.40.0.tar.gz", hash = "sha256:337b6e83d7ee73c40ea62407f2ce03b07c3459e213b6f332b94a69923b9e1cb9"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["scipy", "munkres"] +interpolatable = ["munkres", "scipy"] lxml = ["lxml (>=4.0,<5)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=14.0.0)"] -woff = ["zopfli (>=0.1.4)", "brotlicffi (>=0.8.0)", "brotli (>=1.0.1)"] +unicode = ["unicodedata2 (>=15.0.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] -name = "forced_phot" +name = "forced-phot" version = "0.1.0" -description = "" -category = "main" +description = "Simple forced photometry on FITS images with optional source clustering." optional = false python-versions = "*" +files = [] develop = false [package.dependencies] @@ -733,24 +1110,28 @@ scipy = "*" [package.source] type = "git" url = "https://github.com/askap-vast/forced_phot.git" -reference = "master" +reference = "HEAD" resolved_reference = "8f4307825781743755d189418a9cb9111aaf0b63" [[package]] name = "fsspec" -version = "2022.3.0" +version = "2023.6.0" description = "File-system specification" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.6.0-py3-none-any.whl", hash = "sha256:1cbad1faef3e391fba6dc005ae9b5bdcbf43005c9167ce78c915549c352c869a"}, + {file = "fsspec-2023.6.0.tar.gz", hash = "sha256:d0b2f935446169753e7a5c5c55681c54ea91996cc67be93c39a154fb3a2742af"}, +] [package.extras] abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -dropbox = ["dropboxdrivefs", "requests", "dropbox"] -entrypoints = ["importlib-metadata"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] fuse = ["fusepy"] gcs = ["gcsfs"] git = ["pygit2"] @@ -758,7 +1139,7 @@ github = ["requests"] gs = ["gcsfs"] gui = ["panel"] hdfs = ["pyarrow (>=1)"] -http = ["requests", "aiohttp"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] libarchive = ["libarchive-c"] oci = ["ocifs"] s3 = ["s3fs"] @@ -771,13 +1152,48 @@ tqdm = ["tqdm"] name = "gevent" version = "21.12.0" description = "Coroutine-based network library" -category = "main" optional = true python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5" +files = [ + {file = "gevent-21.12.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:2afa3f3ad528155433f6ac8bd64fa5cc303855b97004416ec719a6b1ca179481"}, + {file = "gevent-21.12.0-cp27-cp27m-win32.whl", hash = "sha256:177f93a3a90f46a5009e0841fef561601e5c637ba4332ab8572edd96af650101"}, + {file = "gevent-21.12.0-cp27-cp27m-win_amd64.whl", hash = "sha256:a5ad4ed8afa0a71e1927623589f06a9b5e8b5e77810be3125cb4d93050d3fd1f"}, + {file = "gevent-21.12.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:eae3c46f9484eaacd67ffcdf4eaf6ca830f587edd543613b0f5c4eb3c11d052d"}, + {file = "gevent-21.12.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e1899b921219fc8959ff9afb94dae36be82e0769ed13d330a393594d478a0b3a"}, + {file = "gevent-21.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c21cb5c9f4e14d75b3fe0b143ec875d7dbd1495fad6d49704b00e57e781ee0f"}, + {file = "gevent-21.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:542ae891e2aa217d2cf6d8446538fcd2f3263a40eec123b970b899bac391c47a"}, + {file = "gevent-21.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:0082d8a5d23c35812ce0e716a91ede597f6dd2c5ff508a02a998f73598c59397"}, + {file = "gevent-21.12.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da8d2d51a49b2a5beb02ad619ca9ddbef806ef4870ba04e5ac7b8b41a5b61db3"}, + {file = "gevent-21.12.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfff82f05f14b7f5d9ed53ccb7a609ae8604df522bb05c971bca78ec9d8b2b9"}, + {file = "gevent-21.12.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7909780f0cf18a1fc32aafd8c8e130cdd93c6e285b11263f7f2d1a0f3678bc50"}, + {file = "gevent-21.12.0-cp36-cp36m-win32.whl", hash = "sha256:bb5cb8db753469c7a9a0b8a972d2660fe851aa06eee699a1ca42988afb0aaa02"}, + {file = "gevent-21.12.0-cp36-cp36m-win_amd64.whl", hash = "sha256:c43f081cbca41d27fd8fef9c6a32cf83cb979345b20abc07bf68df165cdadb24"}, + {file = "gevent-21.12.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:74fc1ef16b86616cfddcc74f7292642b0f72dde4dd95aebf4c45bb236744be54"}, + {file = "gevent-21.12.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc2fef0f98ee180704cf95ec84f2bc2d86c6c3711bb6b6740d74e0afe708b62c"}, + {file = "gevent-21.12.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08b4c17064e28f4eb85604486abc89f442c7407d2aed249cf54544ce5c9baee6"}, + {file = "gevent-21.12.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:973749bacb7bc4f4181a8fb2a7e0e2ff44038de56d08e856dd54a5ac1d7331b4"}, + {file = "gevent-21.12.0-cp37-cp37m-win32.whl", hash = "sha256:6a02a88723ed3f0fd92cbf1df3c4cd2fbd87d82b0a4bac3e36a8875923115214"}, + {file = "gevent-21.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f289fae643a3f1c3b909d6b033e6921b05234a4907e9c9c8c3f1fe403e6ac452"}, + {file = "gevent-21.12.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:3baeeccc4791ba3f8db27179dff11855a8f9210ddd754f6c9b48e0d2561c2aea"}, + {file = "gevent-21.12.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05c5e8a50cd6868dd36536c92fb4468d18090e801bd63611593c0717bab63692"}, + {file = "gevent-21.12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d86438ede1cbe0fde6ef4cc3f72bf2f1ecc9630d8b633ff344a3aeeca272cdd"}, + {file = "gevent-21.12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:01928770972181ad8866ee37ea3504f1824587b188fcab782ef1619ce7538766"}, + {file = "gevent-21.12.0-cp38-cp38-win32.whl", hash = "sha256:3c012c73e6c61f13c75e3a4869dbe6a2ffa025f103421a6de9c85e627e7477b1"}, + {file = "gevent-21.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:b7709c64afa8bb3000c28bb91ec42c79594a7cb0f322e20427d57f9762366a5b"}, + {file = "gevent-21.12.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:ec21f9eaaa6a7b1e62da786132d6788675b314f25f98d9541f1bf00584ed4749"}, + {file = "gevent-21.12.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:22ce1f38fdfe2149ffe8ec2131ca45281791c1e464db34b3b4321ae9d8d2efbb"}, + {file = "gevent-21.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ccffcf708094564e442ac6fde46f0ae9e40015cb69d995f4b39cc29a7643881"}, + {file = "gevent-21.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24d3550fbaeef5fddd794819c2853bca45a86c3d64a056a2c268d981518220d1"}, + {file = "gevent-21.12.0-cp39-cp39-win32.whl", hash = "sha256:2bcec9f80196c751fdcf389ca9f7141e7b0db960d8465ed79be5e685bfcad682"}, + {file = "gevent-21.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:3dad62f55fad839d498c801e139481348991cee6e1c7706041b5fe096cb6a279"}, + {file = "gevent-21.12.0-pp27-pypy_73-win_amd64.whl", hash = "sha256:9f9652d1e4062d4b5b5a0a49ff679fa890430b5f76969d35dccb2df114c55e0f"}, + {file = "gevent-21.12.0.tar.gz", hash = "sha256:f48b64578c367b91fa793bf8eaaaf4995cb93c8bc45860e473bf868070ad094e"}, +] [package.dependencies] cffi = {version = ">=1.12.2", markers = "platform_python_implementation == \"CPython\" and sys_platform == \"win32\""} greenlet = {version = ">=1.1.0,<2.0", markers = "platform_python_implementation == \"CPython\""} +setuptools = "*" "zope.event" = "*" "zope.interface" = "*" @@ -785,74 +1201,159 @@ greenlet = {version = ">=1.1.0,<2.0", markers = "platform_python_implementation dnspython = ["dnspython (>=1.16.0,<2.0)", "idna"] docs = ["repoze.sphinx.autointerface", "sphinxcontrib-programoutput", "zope.schema"] monitor = ["psutil (>=5.7.0)"] -recommended = ["cffi (>=1.12.2)", "dnspython (>=1.16.0,<2.0)", "idna", "selectors2", "backports.socketpair", "psutil (>=5.7.0)"] -test = ["requests", "objgraph", "cffi (>=1.12.2)", "dnspython (>=1.16.0,<2.0)", "idna", "selectors2", "futures", "mock", "backports.socketpair", "contextvars (==2.4)", "coverage (>=5.0)", "coveralls (>=1.7.0)", "psutil (>=5.7.0)"] +recommended = ["backports.socketpair", "cffi (>=1.12.2)", "dnspython (>=1.16.0,<2.0)", "idna", "psutil (>=5.7.0)", "selectors2"] +test = ["backports.socketpair", "cffi (>=1.12.2)", "contextvars (==2.4)", "coverage (>=5.0)", "coveralls (>=1.7.0)", "dnspython (>=1.16.0,<2.0)", "futures", "idna", "mock", "objgraph", "psutil (>=5.7.0)", "requests", "selectors2"] [[package]] name = "ghp-import" -version = "2.0.2" +version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." -category = "dev" optional = false python-versions = "*" +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] [package.dependencies] python-dateutil = ">=2.8.1" [package.extras] -dev = ["twine", "markdown", "flake8", "wheel"] +dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "gitdb" -version = "4.0.9" +version = "4.0.10" description = "Git Object Database" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, + {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, +] [package.dependencies] smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.27" -description = "GitPython is a python library used to interact with Git repositories" -category = "dev" +version = "3.1.31" +description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, + {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, +] [package.dependencies] gitdb = ">=4.0.1,<5" [[package]] name = "greenlet" -version = "1.1.2" +version = "1.1.3.post0" description = "Lightweight in-process concurrent programming" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" - -[package.extras] -docs = ["sphinx"] +files = [ + {file = "greenlet-1.1.3.post0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:949c9061b8c6d3e6e439466a9be1e787208dec6246f4ec5fffe9677b4c19fcc3"}, + {file = "greenlet-1.1.3.post0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:d7815e1519a8361c5ea2a7a5864945906f8e386fa1bc26797b4d443ab11a4589"}, + {file = "greenlet-1.1.3.post0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9649891ab4153f217f319914455ccf0b86986b55fc0573ce803eb998ad7d6854"}, + {file = "greenlet-1.1.3.post0-cp27-cp27m-win32.whl", hash = "sha256:11fc7692d95cc7a6a8447bb160d98671ab291e0a8ea90572d582d57361360f05"}, + {file = "greenlet-1.1.3.post0-cp27-cp27m-win_amd64.whl", hash = "sha256:05ae7383f968bba4211b1fbfc90158f8e3da86804878442b4fb6c16ccbcaa519"}, + {file = "greenlet-1.1.3.post0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ccbe7129a282ec5797df0451ca1802f11578be018a32979131065565da89b392"}, + {file = "greenlet-1.1.3.post0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a8b58232f5b72973350c2b917ea3df0bebd07c3c82a0a0e34775fc2c1f857e9"}, + {file = "greenlet-1.1.3.post0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:f6661b58412879a2aa099abb26d3c93e91dedaba55a6394d1fb1512a77e85de9"}, + {file = "greenlet-1.1.3.post0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c6e942ca9835c0b97814d14f78da453241837419e0d26f7403058e8db3e38f8"}, + {file = "greenlet-1.1.3.post0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a812df7282a8fc717eafd487fccc5ba40ea83bb5b13eb3c90c446d88dbdfd2be"}, + {file = "greenlet-1.1.3.post0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83a7a6560df073ec9de2b7cb685b199dfd12519bc0020c62db9d1bb522f989fa"}, + {file = "greenlet-1.1.3.post0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:17a69967561269b691747e7f436d75a4def47e5efcbc3c573180fc828e176d80"}, + {file = "greenlet-1.1.3.post0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:60839ab4ea7de6139a3be35b77e22e0398c270020050458b3d25db4c7c394df5"}, + {file = "greenlet-1.1.3.post0-cp310-cp310-win_amd64.whl", hash = "sha256:8926a78192b8b73c936f3e87929931455a6a6c6c385448a07b9f7d1072c19ff3"}, + {file = "greenlet-1.1.3.post0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:c6f90234e4438062d6d09f7d667f79edcc7c5e354ba3a145ff98176f974b8132"}, + {file = "greenlet-1.1.3.post0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:814f26b864ed2230d3a7efe0336f5766ad012f94aad6ba43a7c54ca88dd77cba"}, + {file = "greenlet-1.1.3.post0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fda1139d87ce5f7bd80e80e54f9f2c6fe2f47983f1a6f128c47bf310197deb6"}, + {file = "greenlet-1.1.3.post0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0643250dd0756f4960633f5359884f609a234d4066686754e834073d84e9b51"}, + {file = "greenlet-1.1.3.post0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cb863057bed786f6622982fb8b2c122c68e6e9eddccaa9fa98fd937e45ee6c4f"}, + {file = "greenlet-1.1.3.post0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8c0581077cf2734569f3e500fab09c0ff6a2ab99b1afcacbad09b3c2843ae743"}, + {file = "greenlet-1.1.3.post0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:695d0d8b5ae42c800f1763c9fce9d7b94ae3b878919379150ee5ba458a460d57"}, + {file = "greenlet-1.1.3.post0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:5662492df0588a51d5690f6578f3bbbd803e7f8d99a99f3bf6128a401be9c269"}, + {file = "greenlet-1.1.3.post0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:bffba15cff4802ff493d6edcf20d7f94ab1c2aee7cfc1e1c7627c05f1102eee8"}, + {file = "greenlet-1.1.3.post0-cp35-cp35m-win32.whl", hash = "sha256:7afa706510ab079fd6d039cc6e369d4535a48e202d042c32e2097f030a16450f"}, + {file = "greenlet-1.1.3.post0-cp35-cp35m-win_amd64.whl", hash = "sha256:3a24f3213579dc8459e485e333330a921f579543a5214dbc935bc0763474ece3"}, + {file = "greenlet-1.1.3.post0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:64e10f303ea354500c927da5b59c3802196a07468332d292aef9ddaca08d03dd"}, + {file = "greenlet-1.1.3.post0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:eb6ac495dccb1520667cfea50d89e26f9ffb49fa28496dea2b95720d8b45eb54"}, + {file = "greenlet-1.1.3.post0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:88720794390002b0c8fa29e9602b395093a9a766b229a847e8d88349e418b28a"}, + {file = "greenlet-1.1.3.post0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39464518a2abe9c505a727af7c0b4efff2cf242aa168be5f0daa47649f4d7ca8"}, + {file = "greenlet-1.1.3.post0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0914f02fcaa8f84f13b2df4a81645d9e82de21ed95633765dd5cc4d3af9d7403"}, + {file = "greenlet-1.1.3.post0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96656c5f7c95fc02c36d4f6ef32f4e94bb0b6b36e6a002c21c39785a4eec5f5d"}, + {file = "greenlet-1.1.3.post0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4f74aa0092602da2069df0bc6553919a15169d77bcdab52a21f8c5242898f519"}, + {file = "greenlet-1.1.3.post0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:3aeac044c324c1a4027dca0cde550bd83a0c0fbff7ef2c98df9e718a5086c194"}, + {file = "greenlet-1.1.3.post0-cp36-cp36m-win32.whl", hash = "sha256:fe7c51f8a2ab616cb34bc33d810c887e89117771028e1e3d3b77ca25ddeace04"}, + {file = "greenlet-1.1.3.post0-cp36-cp36m-win_amd64.whl", hash = "sha256:70048d7b2c07c5eadf8393e6398595591df5f59a2f26abc2f81abca09610492f"}, + {file = "greenlet-1.1.3.post0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:66aa4e9a726b70bcbfcc446b7ba89c8cec40f405e51422c39f42dfa206a96a05"}, + {file = "greenlet-1.1.3.post0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:025b8de2273d2809f027d347aa2541651d2e15d593bbce0d5f502ca438c54136"}, + {file = "greenlet-1.1.3.post0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:82a38d7d2077128a017094aff334e67e26194f46bd709f9dcdacbf3835d47ef5"}, + {file = "greenlet-1.1.3.post0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7d20c3267385236b4ce54575cc8e9f43e7673fc761b069c820097092e318e3b"}, + {file = "greenlet-1.1.3.post0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8ece5d1a99a2adcb38f69af2f07d96fb615415d32820108cd340361f590d128"}, + {file = "greenlet-1.1.3.post0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2794eef1b04b5ba8948c72cc606aab62ac4b0c538b14806d9c0d88afd0576d6b"}, + {file = "greenlet-1.1.3.post0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a8d24eb5cb67996fb84633fdc96dbc04f2d8b12bfcb20ab3222d6be271616b67"}, + {file = "greenlet-1.1.3.post0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0120a879aa2b1ac5118bce959ea2492ba18783f65ea15821680a256dfad04754"}, + {file = "greenlet-1.1.3.post0-cp37-cp37m-win32.whl", hash = "sha256:bef49c07fcb411c942da6ee7d7ea37430f830c482bf6e4b72d92fd506dd3a427"}, + {file = "greenlet-1.1.3.post0-cp37-cp37m-win_amd64.whl", hash = "sha256:62723e7eb85fa52e536e516ee2ac91433c7bb60d51099293671815ff49ed1c21"}, + {file = "greenlet-1.1.3.post0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d25cdedd72aa2271b984af54294e9527306966ec18963fd032cc851a725ddc1b"}, + {file = "greenlet-1.1.3.post0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:924df1e7e5db27d19b1359dc7d052a917529c95ba5b8b62f4af611176da7c8ad"}, + {file = "greenlet-1.1.3.post0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ec615d2912b9ad807afd3be80bf32711c0ff9c2b00aa004a45fd5d5dde7853d9"}, + {file = "greenlet-1.1.3.post0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0971d37ae0eaf42344e8610d340aa0ad3d06cd2eee381891a10fe771879791f9"}, + {file = "greenlet-1.1.3.post0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:325f272eb997916b4a3fc1fea7313a8adb760934c2140ce13a2117e1b0a8095d"}, + {file = "greenlet-1.1.3.post0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75afcbb214d429dacdf75e03a1d6d6c5bd1fa9c35e360df8ea5b6270fb2211c"}, + {file = "greenlet-1.1.3.post0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5c2d21c2b768d8c86ad935e404cc78c30d53dea009609c3ef3a9d49970c864b5"}, + {file = "greenlet-1.1.3.post0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:467b73ce5dcd89e381292fb4314aede9b12906c18fab903f995b86034d96d5c8"}, + {file = "greenlet-1.1.3.post0-cp38-cp38-win32.whl", hash = "sha256:8149a6865b14c33be7ae760bcdb73548bb01e8e47ae15e013bf7ef9290ca309a"}, + {file = "greenlet-1.1.3.post0-cp38-cp38-win_amd64.whl", hash = "sha256:104f29dd822be678ef6b16bf0035dcd43206a8a48668a6cae4d2fe9c7a7abdeb"}, + {file = "greenlet-1.1.3.post0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:c8c9301e3274276d3d20ab6335aa7c5d9e5da2009cccb01127bddb5c951f8870"}, + {file = "greenlet-1.1.3.post0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:8415239c68b2ec9de10a5adf1130ee9cb0ebd3e19573c55ba160ff0ca809e012"}, + {file = "greenlet-1.1.3.post0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:3c22998bfef3fcc1b15694818fc9b1b87c6cc8398198b96b6d355a7bcb8c934e"}, + {file = "greenlet-1.1.3.post0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0aa1845944e62f358d63fcc911ad3b415f585612946b8edc824825929b40e59e"}, + {file = "greenlet-1.1.3.post0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:890f633dc8cb307761ec566bc0b4e350a93ddd77dc172839be122be12bae3e10"}, + {file = "greenlet-1.1.3.post0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cf37343e43404699d58808e51f347f57efd3010cc7cee134cdb9141bd1ad9ea"}, + {file = "greenlet-1.1.3.post0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5edf75e7fcfa9725064ae0d8407c849456553a181ebefedb7606bac19aa1478b"}, + {file = "greenlet-1.1.3.post0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a954002064ee919b444b19c1185e8cce307a1f20600f47d6f4b6d336972c809"}, + {file = "greenlet-1.1.3.post0-cp39-cp39-win32.whl", hash = "sha256:2ccdc818cc106cc238ff7eba0d71b9c77be868fdca31d6c3b1347a54c9b187b2"}, + {file = "greenlet-1.1.3.post0-cp39-cp39-win_amd64.whl", hash = "sha256:91a84faf718e6f8b888ca63d0b2d6d185c8e2a198d2a7322d75c303e7097c8b7"}, + {file = "greenlet-1.1.3.post0.tar.gz", hash = "sha256:f5e09dc5c6e1796969fd4b775ea1417d70e49a5df29aaa8e5d10675d9e11872c"}, +] + +[package.extras] +docs = ["Sphinx"] [[package]] name = "griffe" -version = "0.15.0" +version = "0.30.1" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "griffe-0.30.1-py3-none-any.whl", hash = "sha256:b2f3df6952995a6bebe19f797189d67aba7c860755d3d21cc80f64d076d0154c"}, + {file = "griffe-0.30.1.tar.gz", hash = "sha256:007cc11acd20becf1bb8f826419a52b9d403bbad9d8c8535699f5440ddc0a109"}, +] -[package.extras] -async = ["aiofiles (>=0.7,<1.0)"] +[package.dependencies] +colorama = ">=0.4" [[package]] name = "gunicorn" version = "20.1.0" description = "WSGI HTTP Server for UNIX" -category = "main" optional = true python-versions = ">=3.5" +files = [ + {file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"}, + {file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"}, +] + +[package.dependencies] +setuptools = ">=3.0" [package.extras] eventlet = ["eventlet (>=0.24.1)"] @@ -860,136 +1361,160 @@ gevent = ["gevent (>=1.4.0)"] setproctitle = ["setproctitle"] tornado = ["tornado (>=0.2)"] -[[package]] -name = "heapdict" -version = "1.0.1" -description = "a heap with decrease-key and increase-key operations" -category = "main" -optional = false -python-versions = "*" - [[package]] name = "holoviews" -version = "1.14.8" +version = "1.16.2" description = "Stop plotting your data - annotate your data and let it visualize itself." -category = "main" optional = false -python-versions = ">=2.7" +python-versions = ">=3.7" +files = [ + {file = "holoviews-1.16.2-py2.py3-none-any.whl", hash = "sha256:866d431e3017e94e8a637dc5e113487c2ada2a113098b1bd3bcd39bb0edd087d"}, + {file = "holoviews-1.16.2.tar.gz", hash = "sha256:45c568ae57a43af73893a093e6fade96b7713cbb0fe6fff46426a6b613122746"}, +] [package.dependencies] colorcet = "*" numpy = ">=1.0" packaging = "*" pandas = ">=0.20.0" -panel = ">=0.8.0" -param = ">=1.9.3,<2.0" +panel = ">=0.13.1" +param = ">=1.12.0,<3.0" pyviz-comms = ">=0.7.4" [package.extras] -all = ["streamz (>=0.5.0)", "datashader (>=0.11.1)", "notebook", "nbsmoke (>=0.2.0)", "nbconvert", "xarray (>=0.10.4)", "netcdf4", "networkx", "path.py", "codecov", "numpy (<1.22)", "ffmpeg", "flake8", "scipy", "scikit-image", "dask", "nose", "ipython (>=5.4.0)", "matplotlib (>=3)", "dash (>=1.16)", "mock", "shapely", "cftime", "bokeh (>=1.1.0)", "pillow", "pyarrow", "plotly (>=4.0)", "deepdiff"] -basic_tests = ["nose", "mock", "flake8", "path.py", "matplotlib (>=3)", "nbsmoke (>=0.2.0)", "nbconvert", "codecov", "numpy (<1.22)", "bokeh (>=1.1.0)", "pandas", "ipython (>=5.4.0)", "notebook"] -build = ["param (>=1.7.0)", "setuptools (>=30.3.0)", "pyct (>=0.4.4)"] -doc = ["ipython (>=5.4.0)", "notebook", "matplotlib (>=3)", "bokeh (>=1.1.0)", "networkx", "pillow", "xarray (>=0.10.4)", "plotly (>=4.0)", "dash (>=1.16)", "streamz (>=0.5.0)", "datashader (>=0.11.1)", "ffmpeg", "cftime", "netcdf4", "dask", "scipy", "shapely", "scikit-image", "nbsite (>=0.7.1)", "sphinx", "mpl-sample-data (>=3.1.3)", "pscript", "graphviz", "bokeh (>2.2)", "pydata-sphinx-theme", "sphinx-copybutton", "pooch"] -examples = ["ipython (>=5.4.0)", "notebook", "matplotlib (>=3)", "bokeh (>=1.1.0)", "networkx", "pillow", "xarray (>=0.10.4)", "plotly (>=4.0)", "dash (>=1.16)", "streamz (>=0.5.0)", "datashader (>=0.11.1)", "ffmpeg", "cftime", "netcdf4", "dask", "scipy", "shapely", "scikit-image"] -extras = ["ipython (>=5.4.0)", "notebook", "matplotlib (>=3)", "bokeh (>=1.1.0)", "networkx", "pillow", "xarray (>=0.10.4)", "plotly (>=4.0)", "dash (>=1.16)", "streamz (>=0.5.0)", "datashader (>=0.11.1)", "ffmpeg", "cftime", "netcdf4", "dask", "scipy", "shapely", "scikit-image", "pscript (==0.7.1)"] -nbtests = ["ipython (>=5.4.0)", "notebook", "matplotlib (>=3)", "bokeh (>=1.1.0)", "nose", "deepdiff"] +all = ["bokeh", "bokeh (>2.2)", "bokeh (>=2.4.3)", "cftime", "codecov", "cudf", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "flaky", "graphviz", "ibis-framework", "ipython (>=5.4.0)", "matplotlib (>=3)", "mpl-sample-data (>=3.1.3)", "nbconvert", "nbsite (==0.8.0)", "nbval", "netcdf4", "networkx", "notebook", "pillow", "plotly (>=4.0)", "pooch", "pre-commit", "pscript", "pscript (==0.7.1)", "pyarrow", "pytest", "pytest-cov", "pytest-xdist", "ruff", "scikit-image", "scipy", "selenium", "shapely", "spatialpandas", "streamz (>=0.5.0)", "xarray (>=0.10.4)"] +bokeh2 = ["panel (==0.14.4)"] +bokeh3 = ["panel (>=1.0.0)"] +build = ["param (>=1.7.0)", "pyct (>=0.4.4)", "setuptools (>=30.3.0)"] +doc = ["bokeh (>2.2)", "bokeh (>=2.4.3)", "cftime", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "graphviz", "ipython (>=5.4.0)", "matplotlib (>=3)", "mpl-sample-data (>=3.1.3)", "nbsite (==0.8.0)", "netcdf4", "networkx", "notebook", "pillow", "plotly (>=4.0)", "pooch", "pscript", "pyarrow", "scikit-image", "scipy", "selenium", "shapely", "streamz (>=0.5.0)", "xarray (>=0.10.4)"] +examples = ["bokeh (>=2.4.3)", "cftime", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "ipython (>=5.4.0)", "matplotlib (>=3)", "netcdf4", "networkx", "notebook", "pillow", "plotly (>=4.0)", "pooch", "pyarrow", "scikit-image", "scipy", "shapely", "streamz (>=0.5.0)", "xarray (>=0.10.4)"] +examples-tests = ["bokeh (>=2.4.3)", "cftime", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "ipython (>=5.4.0)", "matplotlib (>=3)", "nbval", "netcdf4", "networkx", "notebook", "pillow", "plotly (>=4.0)", "pooch", "pyarrow", "scikit-image", "scipy", "shapely", "streamz (>=0.5.0)", "xarray (>=0.10.4)"] +extras = ["bokeh (>=2.4.3)", "cftime", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "ipython (>=5.4.0)", "matplotlib (>=3)", "netcdf4", "networkx", "notebook", "pillow", "plotly (>=4.0)", "pooch", "pscript (==0.7.1)", "pyarrow", "scikit-image", "scipy", "shapely", "streamz (>=0.5.0)", "xarray (>=0.10.4)"] +lint = ["pre-commit", "ruff"] notebook = ["ipython (>=5.4.0)", "notebook"] -recommended = ["ipython (>=5.4.0)", "notebook", "matplotlib (>=3)", "bokeh (>=1.1.0)"] -tests = ["nose", "mock", "flake8", "path.py", "matplotlib (>=3)", "nbsmoke (>=0.2.0)", "nbconvert", "codecov", "numpy (<1.22)"] -unit_tests = ["ipython (>=5.4.0)", "notebook", "matplotlib (>=3)", "bokeh (>=1.1.0)", "networkx", "pillow", "xarray (>=0.10.4)", "plotly (>=4.0)", "dash (>=1.16)", "streamz (>=0.5.0)", "datashader (>=0.11.1)", "ffmpeg", "cftime", "netcdf4", "dask", "scipy", "shapely", "scikit-image", "nose", "mock", "flake8", "path.py", "nbsmoke (>=0.2.0)", "nbconvert", "codecov", "numpy (<1.22)", "pyarrow"] +recommended = ["bokeh (>=2.4.3)", "ipython (>=5.4.0)", "matplotlib (>=3)", "notebook"] +tests = ["bokeh", "cftime", "codecov", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "flaky", "ibis-framework", "ipython (>=5.4.0)", "matplotlib (>=3)", "nbconvert", "networkx", "pillow", "plotly (>=4.0)", "pytest", "pytest-cov", "pytest-xdist", "scipy", "selenium", "shapely", "spatialpandas", "xarray (>=0.10.4)"] +tests-core = ["bokeh", "codecov", "dash (>=1.16)", "flaky", "ipython (>=5.4.0)", "matplotlib (>=3)", "nbconvert", "pillow", "plotly (>=4.0)", "pytest", "pytest-cov", "pytest-xdist"] +tests-gpu = ["bokeh", "cftime", "codecov", "cudf", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "flaky", "ibis-framework", "ipython (>=5.4.0)", "matplotlib (>=3)", "nbconvert", "networkx", "pillow", "plotly (>=4.0)", "pytest", "pytest-cov", "pytest-xdist", "scipy", "selenium", "shapely", "spatialpandas", "xarray (>=0.10.4)"] +tests-nb = ["nbval"] +unit-tests = ["bokeh", "bokeh (>=2.4.3)", "cftime", "codecov", "dash (>=1.16)", "dask", "datashader (>=0.11.1)", "ffmpeg", "flaky", "ibis-framework", "ipython (>=5.4.0)", "matplotlib (>=3)", "nbconvert", "netcdf4", "networkx", "notebook", "pillow", "plotly (>=4.0)", "pooch", "pre-commit", "pyarrow", "pytest", "pytest-cov", "pytest-xdist", "ruff", "scikit-image", "scipy", "selenium", "shapely", "spatialpandas", "streamz (>=0.5.0)", "xarray (>=0.10.4)"] [[package]] name = "html5lib" version = "1.1" description = "HTML parser based on the WHATWG HTML specification" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] [package.dependencies] six = ">=1.9" webencodings = "*" [package.extras] -all = ["genshi", "chardet (>=2.2)", "lxml"] +all = ["chardet (>=2.2)", "genshi", "lxml"] chardet = ["chardet (>=2.2)"] genshi = ["genshi"] lxml = ["lxml"] [[package]] -name = "htmlmin" -version = "0.1.12" +name = "htmlmin2" +version = "0.1.13" description = "An HTML Minifier" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "htmlmin2-0.1.13-py3-none-any.whl", hash = "sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2"}, +] [[package]] name = "hyperlink" version = "21.0.0" description = "A featureful, immutable, and correct URL for Python." -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4"}, + {file = "hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b"}, +] [package.dependencies] idna = ">=2.5" [[package]] name = "idna" -version = "3.3" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "importlib-metadata" -version = "4.11.3" +version = "6.7.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, + {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, +] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "incremental" -version = "21.3.0" -description = "A small library that versions your Python projects." -category = "main" +version = "22.10.0" +description = "\"A small library that versions your Python projects.\"" optional = false python-versions = "*" +files = [ + {file = "incremental-22.10.0-py2.py3-none-any.whl", hash = "sha256:b864a1f30885ee72c5ac2835a761b8fe8aa9c28b9395cacf27286602688d3e51"}, + {file = "incremental-22.10.0.tar.gz", hash = "sha256:912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0"}, +] [package.extras] +mypy = ["click (>=6.0)", "mypy (==0.812)", "twisted (>=16.4.0)"] scripts = ["click (>=6.0)", "twisted (>=16.4.0)"] [[package]] name = "ipdb" -version = "0.13.9" +version = "0.13.13" description = "IPython-enabled pdb" -category = "dev" optional = false -python-versions = ">=2.7" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "ipdb-0.13.13-py3-none-any.whl", hash = "sha256:45529994741c4ab6d2388bfa5d7b725c2cf7fe9deffabdb8a6113aa5ed449ed4"}, + {file = "ipdb-0.13.13.tar.gz", hash = "sha256:e3ac6018ef05126d442af680aad863006ec19d02290561ac88b8b1c0b0cfc726"}, +] [package.dependencies] decorator = {version = "*", markers = "python_version > \"3.6\""} -ipython = {version = ">=7.17.0", markers = "python_version > \"3.6\""} -toml = {version = ">=0.10.2", markers = "python_version > \"3.6\""} +ipython = {version = ">=7.31.1", markers = "python_version > \"3.6\""} +tomli = {version = "*", markers = "python_version > \"3.6\" and python_version < \"3.11\""} [[package]] name = "ipython" -version = "7.32.0" +version = "7.34.0" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "ipython-7.34.0-py3-none-any.whl", hash = "sha256:c175d2440a1caff76116eb719d40538fbb316e214eda85c5515c303aacbfb23e"}, + {file = "ipython-7.34.0.tar.gz", hash = "sha256:af3bdb46aa292bce5615b1b2ebc76c2080c5f77f54bda2ec72461317273e7cd6"}, +] [package.dependencies] appnope = {version = "*", markers = "sys_platform == \"darwin\""} @@ -1002,6 +1527,7 @@ pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} pickleshare = "*" prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" pygments = "*" +setuptools = ">=18.5" traitlets = ">=4.2" [package.extras] @@ -1010,45 +1536,73 @@ doc = ["Sphinx (>=1.3)"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] -notebook = ["notebook", "ipywidgets"] +notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"] +test = ["ipykernel", "nbformat", "nose (>=0.10.1)", "numpy (>=1.17)", "pygments", "requests", "testpath"] + +[[package]] +name = "jaraco-classes" +version = "3.2.3" +description = "Utility functions for Python class constructs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, + {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, +] + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "jedi" -version = "0.18.1" +version = "0.18.2" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, + {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, +] [package.dependencies] parso = ">=0.8.0,<0.9.0" [package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jeepney" version = "0.8.0" description = "Low-level, pure Python DBus protocol wrapper." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] [package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio (>=0.17)", "testpath", "trio", "async-timeout"] -trio = ["trio", "async-generator"] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator", "trio"] [[package]] name = "jinja2" -version = "3.1.1" +version = "3.1.2" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -1058,11 +1612,14 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jinxed" -version = "1.1.0" +version = "1.2.0" description = "Jinxed Terminal Library" -category = "main" optional = false python-versions = "*" +files = [ + {file = "jinxed-1.2.0-py2.py3-none-any.whl", hash = "sha256:cfc2b2e4e3b4326954d546ba6d6b9a7a796ddcb0aef8d03161d005177eb0d48b"}, + {file = "jinxed-1.2.0.tar.gz", hash = "sha256:032acda92d5c57cd216033cbbd53de731e6ed50deb63eb4781336ca55f72cda5"}, +] [package.dependencies] ansicon = {version = "*", markers = "platform_system == \"Windows\""} @@ -1071,111 +1628,314 @@ ansicon = {version = "*", markers = "platform_system == \"Windows\""} name = "jsmin" version = "3.0.1" description = "JavaScript minifier." -category = "dev" optional = false python-versions = "*" +files = [ + {file = "jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc"}, +] [[package]] name = "keyring" -version = "23.5.0" +version = "24.2.0" description = "Store and access your passwords safely." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "keyring-24.2.0-py3-none-any.whl", hash = "sha256:4901caaf597bfd3bbd78c9a0c7c4c29fcd8310dab2cffefe749e916b6527acd6"}, + {file = "keyring-24.2.0.tar.gz", hash = "sha256:ca0746a19ec421219f4d713f848fa297a661a8a8c1504867e55bfb5e09091509"}, +] [package.dependencies] -importlib-metadata = ">=3.6" +importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} +"jaraco.classes" = "*" jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} +pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] +completion = ["shtab"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] name = "kiwisolver" -version = "1.4.2" +version = "1.4.4" description = "A fast implementation of the Cassowary constraint solver" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, + {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, +] [[package]] name = "lightgallery" version = "0.5" description = "Markdown extension to wrap images in lightbox/lightgallery" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "lightgallery-0.5-py2.py3-none-any.whl", hash = "sha256:9f14d5986aff5c4e0ef17d85f85488b9f2295b904556c71f1db99e3378a6cbc6"}, + {file = "lightgallery-0.5.tar.gz", hash = "sha256:3063ba855fc96fe6b9c978845052d3e837095a55277fe1982be5748f7cb4085c"}, +] [package.dependencies] markdown = ">=3.0" [[package]] name = "llvmlite" -version = "0.34.0" +version = "0.40.1" description = "lightweight wrapper around basic LLVM functionality" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "llvmlite-0.40.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84ce9b1c7a59936382ffde7871978cddcda14098e5a76d961e204523e5c372fb"}, + {file = "llvmlite-0.40.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3673c53cb21c65d2ff3704962b5958e967c6fc0bd0cff772998face199e8d87b"}, + {file = "llvmlite-0.40.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bba2747cf5b4954e945c287fe310b3fcc484e2a9d1b0c273e99eb17d103bb0e6"}, + {file = "llvmlite-0.40.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbd5e82cc990e5a3e343a3bf855c26fdfe3bfae55225f00efd01c05bbda79918"}, + {file = "llvmlite-0.40.1-cp310-cp310-win32.whl", hash = "sha256:09f83ea7a54509c285f905d968184bba00fc31ebf12f2b6b1494d677bb7dde9b"}, + {file = "llvmlite-0.40.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b37297f3cbd68d14a97223a30620589d98ad1890e5040c9e5fc181063f4ed49"}, + {file = "llvmlite-0.40.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a66a5bd580951751b4268f4c3bddcef92682814d6bc72f3cd3bb67f335dd7097"}, + {file = "llvmlite-0.40.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:467b43836b388eaedc5a106d76761e388dbc4674b2f2237bc477c6895b15a634"}, + {file = "llvmlite-0.40.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c23edd196bd797dc3a7860799054ea3488d2824ecabc03f9135110c2e39fcbc"}, + {file = "llvmlite-0.40.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a36d9f244b6680cb90bbca66b146dabb2972f4180c64415c96f7c8a2d8b60a36"}, + {file = "llvmlite-0.40.1-cp311-cp311-win_amd64.whl", hash = "sha256:5b3076dc4e9c107d16dc15ecb7f2faf94f7736cd2d5e9f4dc06287fd672452c1"}, + {file = "llvmlite-0.40.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a7525db121f2e699809b539b5308228854ccab6693ecb01b52c44a2f5647e20"}, + {file = "llvmlite-0.40.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:84747289775d0874e506f907a4513db889471607db19b04de97d144047fec885"}, + {file = "llvmlite-0.40.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e35766e42acef0fe7d1c43169a8ffc327a47808fae6a067b049fe0e9bbf84dd5"}, + {file = "llvmlite-0.40.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cda71de10a1f48416309e408ea83dab5bf36058f83e13b86a2961defed265568"}, + {file = "llvmlite-0.40.1-cp38-cp38-win32.whl", hash = "sha256:96707ebad8b051bbb4fc40c65ef93b7eeee16643bd4d579a14d11578e4b7a647"}, + {file = "llvmlite-0.40.1-cp38-cp38-win_amd64.whl", hash = "sha256:e44f854dc11559795bcdeaf12303759e56213d42dabbf91a5897aa2d8b033810"}, + {file = "llvmlite-0.40.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f643d15aacd0b0b0dc8b74b693822ba3f9a53fa63bc6a178c2dba7cc88f42144"}, + {file = "llvmlite-0.40.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39a0b4d0088c01a469a5860d2e2d7a9b4e6a93c0f07eb26e71a9a872a8cadf8d"}, + {file = "llvmlite-0.40.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9329b930d699699846623054121ed105fd0823ed2180906d3b3235d361645490"}, + {file = "llvmlite-0.40.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2dbbb8424037ca287983b115a29adf37d806baf7e1bf4a67bd2cffb74e085ed"}, + {file = "llvmlite-0.40.1-cp39-cp39-win32.whl", hash = "sha256:e74e7bec3235a1e1c9ad97d897a620c5007d0ed80c32c84c1d787e7daa17e4ec"}, + {file = "llvmlite-0.40.1-cp39-cp39-win_amd64.whl", hash = "sha256:ff8f31111bb99d135ff296757dc81ab36c2dee54ed4bd429158a96da9807c316"}, + {file = "llvmlite-0.40.1.tar.gz", hash = "sha256:5cdb0d45df602099d833d50bd9e81353a5e036242d3c003c5b294fc61d1986b4"}, +] [[package]] name = "locket" -version = "0.2.1" -description = "File-based locks for Python for Linux and Windows" -category = "main" +version = "1.0.0" +description = "File-based locks for Python on Linux and Windows" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "locket-1.0.0-py2.py3-none-any.whl", hash = "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3"}, + {file = "locket-1.0.0.tar.gz", hash = "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632"}, +] [[package]] name = "markdown" -version = "3.3.6" +version = "3.3.7" description = "Python implementation of Markdown." -category = "main" optional = false python-versions = ">=3.6" - -[package.dependencies] -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} +files = [ + {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, + {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, +] [package.extras] testing = ["coverage", "pyyaml"] [[package]] name = "markupsafe" -version = "2.1.1" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] [[package]] name = "matplotlib" -version = "3.5.1" +version = "3.7.1" description = "Python plotting package" -category = "main" optional = false -python-versions = ">=3.7" - -[package.dependencies] +python-versions = ">=3.8" +files = [ + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556"}, + {file = "matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24"}, + {file = "matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0"}, + {file = "matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304"}, + {file = "matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa"}, + {file = "matplotlib-3.7.1-cp38-cp38-win32.whl", hash = "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0"}, + {file = "matplotlib-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb"}, + {file = "matplotlib-3.7.1-cp39-cp39-win32.whl", hash = "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b"}, + {file = "matplotlib-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, + {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" kiwisolver = ">=1.0.1" -numpy = ">=1.17" +numpy = ">=1.20" packaging = ">=20.0" pillow = ">=6.2.0" -pyparsing = ">=2.2.1" +pyparsing = ">=2.3.1" python-dateutil = ">=2.7" -setuptools_scm = ">=4" [[package]] name = "matplotlib-inline" -version = "0.1.3" +version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] [package.dependencies] traitlets = "*" @@ -1184,25 +1944,34 @@ traitlets = "*" name = "mccabe" version = "0.6.1" description = "McCabe checker, plugin for flake8" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] [[package]] name = "mergedeep" version = "1.3.4" description = "A deep merge function for 🐍." -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] [[package]] name = "mike" version = "1.1.2" description = "Manage multiple versions of your MkDocs-powered documentation" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "mike-1.1.2-py3-none-any.whl", hash = "sha256:4c307c28769834d78df10f834f57f810f04ca27d248f80a75f49c6fa2d1527ca"}, + {file = "mike-1.1.2.tar.gz", hash = "sha256:56c3f1794c2d0b5fdccfa9b9487beb013ca813de2e3ad0744724e9d34d40b77b"}, +] [package.dependencies] jinja2 = "*" @@ -1216,34 +1985,41 @@ test = ["coverage", "flake8 (>=3.0)", "shtab"] [[package]] name = "mkdocs" -version = "1.3.0" +version = "1.4.3" description = "Project documentation with Markdown." -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "mkdocs-1.4.3-py3-none-any.whl", hash = "sha256:6ee46d309bda331aac915cd24aab882c179a933bd9e77b80ce7d2eaaa3f689dd"}, + {file = "mkdocs-1.4.3.tar.gz", hash = "sha256:5955093bbd4dd2e9403c5afaf57324ad8b04f16886512a3ee6ef828956481c57"}, +] [package.dependencies] -click = ">=3.3" +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} ghp-import = ">=1.0" -importlib-metadata = ">=4.3" -Jinja2 = ">=2.10.2" -Markdown = ">=3.2.1" +jinja2 = ">=2.11.1" +markdown = ">=3.2.1,<3.4" mergedeep = ">=1.3.4" packaging = ">=20.5" -PyYAML = ">=3.10" +pyyaml = ">=5.1" pyyaml-env-tag = ">=0.1" watchdog = ">=2.0" [package.extras] i18n = ["babel (>=2.9.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] [[package]] name = "mkdocs-autorefs" version = "0.4.1" description = "Automatically link across pages in MkDocs." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"}, + {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"}, +] [package.dependencies] Markdown = ">=3.3" @@ -1251,22 +2027,28 @@ mkdocs = ">=1.1" [[package]] name = "mkdocs-gen-files" -version = "0.3.4" +version = "0.5.0" description = "MkDocs plugin to programmatically generate documentation pages during the build" -category = "dev" optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.7" +files = [ + {file = "mkdocs_gen_files-0.5.0-py3-none-any.whl", hash = "sha256:7ac060096f3f40bd19039e7277dd3050be9a453c8ac578645844d4d91d7978ea"}, + {file = "mkdocs_gen_files-0.5.0.tar.gz", hash = "sha256:4c7cf256b5d67062a788f6b1d035e157fc1a9498c2399be9af5257d4ff4d19bc"}, +] [package.dependencies] -mkdocs = ">=1.0.3,<2.0.0" +mkdocs = ">=1.0.3" [[package]] name = "mkdocs-git-revision-date-localized-plugin" version = "0.12.1" description = "Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file." -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "mkdocs-git-revision-date-localized-plugin-0.12.1.tar.gz", hash = "sha256:29a77224fdee0f125347e32ce18cc6bec0899b92f109399fcdb07ad962b9c2ea"}, + {file = "mkdocs_git_revision_date_localized_plugin-0.12.1-py3-none-any.whl", hash = "sha256:2b05dcaa0700119d92462ada141be1353b1bf90e5e11331ea32ef61a3009c958"}, +] [package.dependencies] babel = ">=2.7.0" @@ -1275,49 +2057,62 @@ mkdocs = ">=1.0" [[package]] name = "mkdocs-material" -version = "8.2.8" -description = "A Material Design theme for MkDocs" -category = "dev" +version = "8.5.11" +description = "Documentation that simply works" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "mkdocs_material-8.5.11-py3-none-any.whl", hash = "sha256:c907b4b052240a5778074a30a78f31a1f8ff82d7012356dc26898b97559f082e"}, + {file = "mkdocs_material-8.5.11.tar.gz", hash = "sha256:b0ea0513fd8cab323e8a825d6692ea07fa83e917bb5db042e523afecc7064ab7"}, +] [package.dependencies] -jinja2 = ">=2.11.1" +jinja2 = ">=3.0.2" markdown = ">=3.2" -mkdocs = ">=1.3.0" -mkdocs-material-extensions = ">=1.0.3" -pygments = ">=2.10" -pymdown-extensions = ">=9.0" +mkdocs = ">=1.4.0" +mkdocs-material-extensions = ">=1.1" +pygments = ">=2.12" +pymdown-extensions = ">=9.4" +requests = ">=2.26" [[package]] name = "mkdocs-material-extensions" -version = "1.0.3" -description = "Extension pack for Python Markdown." -category = "dev" +version = "1.1.1" +description = "Extension pack for Python Markdown and MkDocs Material." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "mkdocs_material_extensions-1.1.1-py3-none-any.whl", hash = "sha256:e41d9f38e4798b6617ad98ca8f7f1157b1e4385ac1459ca1e4ea219b556df945"}, + {file = "mkdocs_material_extensions-1.1.1.tar.gz", hash = "sha256:9c003da71e2cc2493d910237448c672e00cefc800d3d6ae93d2fc69979e3bd93"}, +] [[package]] name = "mkdocs-minify-plugin" -version = "0.5.0" +version = "0.6.4" description = "An MkDocs plugin to minify HTML, JS or CSS files prior to being written to disk" -category = "dev" optional = false -python-versions = ">=3.0" +python-versions = ">=3.7" +files = [ + {file = "mkdocs-minify-plugin-0.6.4.tar.gz", hash = "sha256:1906e9687c39ded7d1ca959c76c6e52da6a8d0765e3981ad9812d3a489f1ecdb"}, + {file = "mkdocs_minify_plugin-0.6.4-py3-none-any.whl", hash = "sha256:c0221053968a68418245228e04b0d5bc7e6b1a1940db721a52c7ec98d898242e"}, +] [package.dependencies] csscompressor = ">=0.9.5" -htmlmin = ">=0.1.4" -jsmin = ">=3.0.0" -mkdocs = ">=1.0.4" +htmlmin2 = ">=0.1.13" +jsmin = ">=3.0.1" +mkdocs = ">=1.4.1" [[package]] name = "mkdocstrings" version = "0.18.1" description = "Automatic documentation from sources, for MkDocs." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocstrings-0.18.1-py3-none-any.whl", hash = "sha256:4053929356df8cd69ed32eef71d8f676a472ef72980c9ffd4f933ead1debcdad"}, + {file = "mkdocstrings-0.18.1.tar.gz", hash = "sha256:fb7c91ce7e3ab70488d3fa6c073a4f827cdc319042f682ef8ea95459790d64fc"}, +] [package.dependencies] Jinja2 = ">=2.11.1" @@ -1338,9 +2133,12 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] name = "mkdocstrings-python" version = "0.6.6" description = "A Python handler for mkdocstrings." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocstrings-python-0.6.6.tar.gz", hash = "sha256:37281696b9f199624ae420e0625b6659b7fdfbea736618bce7fd978682dea3b1"}, + {file = "mkdocstrings_python-0.6.6-py3-none-any.whl", hash = "sha256:c118438d3cb4b14c492a51d109f4e5b27ab06ba19b099d624430dfd904926152"}, +] [package.dependencies] griffe = ">=0.11.1" @@ -1350,40 +2148,70 @@ mkdocstrings = ">=0.18" name = "mkdocstrings-python-legacy" version = "0.2.2" description = "A legacy Python handler for mkdocstrings." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocstrings-python-legacy-0.2.2.tar.gz", hash = "sha256:f0e7ec6a19750581b752acb38f6b32fcd1efe006f14f6703125d2c2c9a5c6f02"}, + {file = "mkdocstrings_python_legacy-0.2.2-py3-none-any.whl", hash = "sha256:379107a3a5b8db9b462efc4493c122efe21e825e3702425dbd404621302a563a"}, +] [package.dependencies] mkdocstrings = ">=0.18" pytkdocs = ">=0.14" [[package]] -name = "msgpack" -version = "1.0.3" -description = "MessagePack (de)serializer." -category = "main" +name = "more-itertools" +version = "9.1.0" +description = "More routines for operating on iterables, beyond itertools" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, + {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, +] [[package]] name = "multipledispatch" -version = "0.6.0" +version = "1.0.0" description = "Multiple dispatch" -category = "main" optional = false python-versions = "*" - -[package.dependencies] -six = "*" +files = [ + {file = "multipledispatch-1.0.0-py3-none-any.whl", hash = "sha256:0c53cd8b077546da4e48869f49b13164bebafd0c2a5afceb6bb6a316e7fb46e4"}, + {file = "multipledispatch-1.0.0.tar.gz", hash = "sha256:5c839915465c68206c3e9c473357908216c28383b425361e5d144594bf85a7e0"}, +] [[package]] name = "mypy" version = "0.910" description = "Optional static typing for Python" -category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"}, + {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"}, + {file = "mypy-0.910-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9"}, + {file = "mypy-0.910-cp35-cp35m-win_amd64.whl", hash = "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e"}, + {file = "mypy-0.910-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921"}, + {file = "mypy-0.910-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6"}, + {file = "mypy-0.910-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212"}, + {file = "mypy-0.910-cp36-cp36m-win_amd64.whl", hash = "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885"}, + {file = "mypy-0.910-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0"}, + {file = "mypy-0.910-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de"}, + {file = "mypy-0.910-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703"}, + {file = "mypy-0.910-cp37-cp37m-win_amd64.whl", hash = "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a"}, + {file = "mypy-0.910-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504"}, + {file = "mypy-0.910-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9"}, + {file = "mypy-0.910-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072"}, + {file = "mypy-0.910-cp38-cp38-win_amd64.whl", hash = "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811"}, + {file = "mypy-0.910-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e"}, + {file = "mypy-0.910-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b"}, + {file = "mypy-0.910-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2"}, + {file = "mypy-0.910-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97"}, + {file = "mypy-0.910-cp39-cp39-win_amd64.whl", hash = "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8"}, + {file = "mypy-0.910-py3-none-any.whl", hash = "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"}, + {file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"}, +] [package.dependencies] mypy-extensions = ">=0.4.3,<0.5.0" @@ -1396,54 +2224,116 @@ python2 = ["typed-ast (>=1.4.0,<1.5.0)"] [[package]] name = "mypy-extensions" -version = "0.4.3" +version = "0.4.4" description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" optional = false -python-versions = "*" +python-versions = ">=2.7" +files = [ + {file = "mypy_extensions-0.4.4.tar.gz", hash = "sha256:c8b707883a96efe9b4bb3aaf0dcc07e7e217d7d8368eec4db4049ee9e142f4fd"}, +] [[package]] name = "networkx" -version = "2.7.1" +version = "2.8.8" description = "Python package for creating and manipulating graphs and networks" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "networkx-2.8.8-py3-none-any.whl", hash = "sha256:e435dfa75b1d7195c7b8378c3859f0445cd88c6b0375c181ed66823a9ceb7524"}, + {file = "networkx-2.8.8.tar.gz", hash = "sha256:230d388117af870fce5647a3c52401fcf753e94720e6ea6b4197a5355648885e"}, +] [package.extras] -default = ["numpy (>=1.19)", "scipy (>=1.8)", "matplotlib (>=3.4)", "pandas (>=1.3)"] -developer = ["black (==22.1)", "pyupgrade (>=2.31)", "pre-commit (>=2.17)", "mypy (>=0.931)"] -doc = ["sphinx (>=4.4)", "pydata-sphinx-theme (>=0.8)", "sphinx-gallery (>=0.10)", "numpydoc (>=1.2)", "pillow (>=9.0)", "nb2plots (>=0.6)", "texext (>=0.6.6)"] -extra = ["lxml (>=4.6)", "pygraphviz (>=1.9)", "pydot (>=1.4.2)"] -test = ["pytest (>=7.0)", "pytest-cov (>=3.0)", "codecov (>=2.1)"] +default = ["matplotlib (>=3.4)", "numpy (>=1.19)", "pandas (>=1.3)", "scipy (>=1.8)"] +developer = ["mypy (>=0.982)", "pre-commit (>=2.20)"] +doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.2)", "pydata-sphinx-theme (>=0.11)", "sphinx (>=5.2)", "sphinx-gallery (>=0.11)", "texext (>=0.6.6)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.9)", "sympy (>=1.10)"] +test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "numba" -version = "0.51.2" +version = "0.57.1" description = "compiling Python code using LLVM" -category = "main" optional = false -python-versions = ">=3.6" - -[package.dependencies] -llvmlite = ">=0.34.0.dev0,<0.35" -numpy = ">=1.15" +python-versions = ">=3.8" +files = [ + {file = "numba-0.57.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db8268eb5093cae2288942a8cbd69c9352f6fe6e0bfa0a9a27679436f92e4248"}, + {file = "numba-0.57.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:643cb09a9ba9e1bd8b060e910aeca455e9442361e80fce97690795ff9840e681"}, + {file = "numba-0.57.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e9fab973d9e82c9f8449f75994a898daaaf821d84f06fbb0b9de2293dd9306"}, + {file = "numba-0.57.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c0602e4f896e6a6d844517c3ab434bc978e7698a22a733cc8124465898c28fa8"}, + {file = "numba-0.57.1-cp310-cp310-win32.whl", hash = "sha256:3d6483c27520d16cf5d122868b79cad79e48056ecb721b52d70c126bed65431e"}, + {file = "numba-0.57.1-cp310-cp310-win_amd64.whl", hash = "sha256:a32ee263649aa3c3587b833d6311305379529570e6c20deb0c6f4fb5bc7020db"}, + {file = "numba-0.57.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c078f84b5529a7fdb8413bb33d5100f11ec7b44aa705857d9eb4e54a54ff505"}, + {file = "numba-0.57.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e447c4634d1cc99ab50d4faa68f680f1d88b06a2a05acf134aa6fcc0342adeca"}, + {file = "numba-0.57.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4838edef2df5f056cb8974670f3d66562e751040c448eb0b67c7e2fec1726649"}, + {file = "numba-0.57.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9b17fbe4a69dcd9a7cd49916b6463cd9a82af5f84911feeb40793b8bce00dfa7"}, + {file = "numba-0.57.1-cp311-cp311-win_amd64.whl", hash = "sha256:93df62304ada9b351818ba19b1cfbddaf72cd89348e81474326ca0b23bf0bae1"}, + {file = "numba-0.57.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8e00ca63c5d0ad2beeb78d77f087b3a88c45ea9b97e7622ab2ec411a868420ee"}, + {file = "numba-0.57.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ff66d5b022af6c7d81ddbefa87768e78ed4f834ab2da6ca2fd0d60a9e69b94f5"}, + {file = "numba-0.57.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:60ec56386076e9eed106a87c96626d5686fbb16293b9834f0849cf78c9491779"}, + {file = "numba-0.57.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c057ccedca95df23802b6ccad86bb318be624af45b5a38bb8412882be57a681"}, + {file = "numba-0.57.1-cp38-cp38-win32.whl", hash = "sha256:5a82bf37444039c732485c072fda21a361790ed990f88db57fd6941cd5e5d307"}, + {file = "numba-0.57.1-cp38-cp38-win_amd64.whl", hash = "sha256:9bcc36478773ce838f38afd9a4dfafc328d4ffb1915381353d657da7f6473282"}, + {file = "numba-0.57.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae50c8c90c2ce8057f9618b589223e13faa8cbc037d8f15b4aad95a2c33a0582"}, + {file = "numba-0.57.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9a1b2b69448e510d672ff9a6b18d2db9355241d93c6a77677baa14bec67dc2a0"}, + {file = "numba-0.57.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3cf78d74ad9d289fbc1e5b1c9f2680fca7a788311eb620581893ab347ec37a7e"}, + {file = "numba-0.57.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f47dd214adc5dcd040fe9ad2adbd2192133c9075d2189ce1b3d5f9d72863ef05"}, + {file = "numba-0.57.1-cp39-cp39-win32.whl", hash = "sha256:a3eac19529956185677acb7f01864919761bfffbb9ae04bbbe5e84bbc06cfc2b"}, + {file = "numba-0.57.1-cp39-cp39-win_amd64.whl", hash = "sha256:9587ba1bf5f3035575e45562ada17737535c6d612df751e811d702693a72d95e"}, + {file = "numba-0.57.1.tar.gz", hash = "sha256:33c0500170d213e66d90558ad6aca57d3e03e97bb11da82e6d87ab793648cb17"}, +] + +[package.dependencies] +llvmlite = "==0.40.*" +numpy = ">=1.21,<1.25" [[package]] name = "numpy" -version = "1.22.3" -description = "NumPy is the fundamental package for array computing with Python." -category = "main" +version = "1.24.4" +description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.8" +files = [ + {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, + {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, + {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, + {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, + {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, + {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, + {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, + {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, + {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, + {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, + {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, +] [[package]] name = "oauthlib" -version = "3.2.0" +version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] [package.extras] rsa = ["cryptography (>=3.0.0)"] @@ -1452,82 +2342,139 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "packaging" -version = "21.3" +version = "23.1" description = "Core utilities for Python packages" -category = "main" optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] [[package]] name = "pandas" -version = "1.4.2" +version = "2.0.3" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, + {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, + {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, + {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, + {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, + {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, + {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, + {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, + {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, + {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, + {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, +] [package.dependencies] numpy = [ - {version = ">=1.18.5", markers = "platform_machine != \"aarch64\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, - {version = ">=1.19.2", markers = "platform_machine == \"aarch64\" and python_version < \"3.10\""}, - {version = ">=1.20.0", markers = "platform_machine == \"arm64\" and python_version < \"3.10\""}, {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, ] -python-dateutil = ">=2.8.1" +python-dateutil = ">=2.8.2" pytz = ">=2020.1" - -[package.extras] -test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +aws = ["s3fs (>=2021.08.0)"] +clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] +compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] +computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2021.07.0)"] +gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] +hdf5 = ["tables (>=3.6.1)"] +html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] +mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] +spss = ["pyreadstat (>=1.1.2)"] +sql-other = ["SQLAlchemy (>=1.4.16)"] +test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.6.3)"] [[package]] name = "panel" -version = "0.12.7" +version = "0.14.4" description = "A high level app and dashboarding solution for Python." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "panel-0.14.4-py2.py3-none-any.whl", hash = "sha256:dd4fcf2fc7276cd3f0df110ce7a6197ac4040d74c4efdc8c092b23771c1f514d"}, + {file = "panel-0.14.4.tar.gz", hash = "sha256:b853d2f53d7738ec6372525360c5bf9427a71ed990685ccac703bc9b442e9951"}, +] [package.dependencies] bleach = "*" bokeh = ">=2.4.0,<2.5.0" markdown = "*" -param = ">=1.10.0" +param = ">=1.12.0" pyct = ">=0.4.4" pyviz-comms = ">=0.7.4" requests = "*" +setuptools = ">=42" tqdm = ">=4.48.0" +typing-extensions = "*" [package.extras] -all = ["altair", "channels", "codecov", "datashader", "django (<4)", "flake8", "folium", "graphviz", "holoviews", "holoviews (>1.14.1)", "hvplot", "ipyleaflet", "ipympl", "ipython (>=7.0)", "ipyvolume", "ipywidgets", "ipywidgets-bokeh", "jupyter-bokeh (>=3.0.2)", "lxml", "matplotlib (<3.4)", "nbsite (>=0.7.0a4)", "nbsmoke (>=0.2.0)", "notebook (>=5.4)", "pandas (>=1.3)", "parameterized", "pillow", "plotly", "plotly (>=4.0)", "pytest", "pytest-cov", "pyvista (<0.33)", "scikit-learn", "scipy", "streamz", "twine", "vega-datasets", "vtk (==9.0.1)", "xarray"] -build = ["param (>=1.9.2)", "pyct (>=0.4.4)", "setuptools (>=42,<61)", "bokeh (>=2.4.0,<2.5.0)", "pyviz-comms (>=0.6.0)", "bleach", "tqdm"] -doc = ["notebook (>=5.4)", "holoviews (>1.14.1)", "matplotlib (<3.4)", "pillow", "plotly", "nbsite (>=0.7.0a4)", "graphviz", "lxml"] -examples = ["hvplot", "plotly (>=4.0)", "altair", "streamz", "vega-datasets", "vtk (==9.0.1)", "scikit-learn", "datashader", "jupyter-bokeh (>=3.0.2)", "django (<4)", "channels", "pyvista (<0.33)", "ipywidgets", "ipywidgets-bokeh", "ipyvolume", "ipyleaflet", "xarray"] -recommended = ["notebook (>=5.4)", "holoviews (>1.14.1)", "matplotlib (<3.4)", "pillow", "plotly"] -tests = ["flake8", "parameterized", "pytest", "scipy", "nbsmoke (>=0.2.0)", "pytest-cov", "codecov", "folium", "ipympl", "twine", "pandas (>=1.3)", "ipython (>=7.0)", "holoviews"] +all = ["aiohttp", "altair", "channels", "croniter", "datashader", "diskcache", "django (<4)", "flake8", "flaky", "folium", "graphviz", "holoviews", "holoviews (>1.14.1)", "hvplot", "ipyleaflet", "ipympl", "ipython (>=7.0)", "ipyvolume", "ipyvuetify", "ipywidgets", "ipywidgets-bokeh", "jupyter-bokeh (>=3.0.2)", "jupyterlab", "lxml", "markdown-it-py", "matplotlib", "nbsite (>=0.7.2rc2)", "nbval", "networkx (>=2.5)", "numpy (<1.24)", "pandas (>=1.3)", "parameterized", "pillow", "playwright", "plotly", "plotly (>=4.0)", "pre-commit", "psutil", "pydata-sphinx-theme (<=0.9.0)", "pydeck", "pygraphviz", "pyinstrument (>=4.0)", "pytest", "pytest-cov", "pytest-playwright", "pytest-xdist", "python-graphviz", "pyvista (<0.33)", "reacton", "scikit-image", "scikit-learn", "scipy", "seaborn", "sphinx-copybutton", "sphinx-design", "streamz", "twine", "vega-datasets", "vtk (==9.0.1)", "xarray", "xgboost"] +build = ["bleach", "bokeh (>=2.4.3,<2.5.0)", "packaging", "param (>=1.9.2)", "pyct (>=0.4.4)", "pyviz-comms (>=0.7.4)", "requests", "setuptools (>=42)", "tqdm (>=4.48.0)"] +doc = ["holoviews (>1.14.1)", "jupyterlab", "matplotlib", "nbsite (>=0.7.2rc2)", "pillow", "plotly", "pydata-sphinx-theme (<=0.9.0)", "sphinx-copybutton", "sphinx-design"] +examples = ["aiohttp", "altair", "channels", "croniter", "datashader", "django (<4)", "folium", "graphviz", "hvplot", "ipyleaflet", "ipympl", "ipyvolume", "ipyvuetify", "ipywidgets", "ipywidgets-bokeh", "jupyter-bokeh (>=3.0.2)", "lxml", "networkx (>=2.5)", "plotly (>=4.0)", "pydeck", "pygraphviz", "pyinstrument (>=4.0)", "python-graphviz", "pyvista (<0.33)", "reacton", "scikit-image", "scikit-learn", "seaborn", "streamz", "vega-datasets", "vtk (==9.0.1)", "xarray", "xgboost"] +recommended = ["holoviews (>1.14.1)", "jupyterlab", "matplotlib", "pillow", "plotly"] +tests = ["diskcache", "flake8", "flaky", "folium", "holoviews", "ipympl", "ipython (>=7.0)", "ipyvuetify", "lxml", "markdown-it-py", "nbval", "numpy (<1.24)", "pandas (>=1.3)", "parameterized", "pre-commit", "psutil", "pytest", "pytest-cov", "pytest-xdist", "reacton", "scipy", "twine"] +ui = ["playwright", "pytest-playwright"] [[package]] name = "param" -version = "1.12.1" +version = "1.13.0" description = "Make your Python code clearer and more reliable by declaring Parameters." -category = "main" optional = false python-versions = ">=2.7" +files = [ + {file = "param-1.13.0-py2.py3-none-any.whl", hash = "sha256:a2e3b7b07ca7dd1adaa4fb3020a3ef4fe434f27ede453a9d94194c5155677e30"}, + {file = "param-1.13.0.tar.gz", hash = "sha256:59d55048d42a85e148a69837df42bd11c3391d47fad15ba57d118e145f001ef2"}, +] [package.extras] -all = ["aiohttp", "flake8", "graphviz", "jinja2 (<3.1)", "myst-parser", "myst-nb (==0.12.2)", "nbconvert", "nbsite (>=0.7.1)", "pandas", "panel", "pydata-sphinx-theme", "pygraphviz", "pytest", "pytest-cov", "sphinx-copybutton"] -doc = ["pygraphviz", "nbsite (>=0.7.1)", "pydata-sphinx-theme", "jinja2 (<3.1)", "myst-parser", "nbconvert", "graphviz", "myst-nb (==0.12.2)", "sphinx-copybutton", "aiohttp", "panel", "pandas"] -tests = ["pytest", "pytest-cov", "flake8"] +all = ["aiohttp", "coverage", "flake8", "graphviz", "ipython (!=8.7.0)", "myst-nb (==0.12.2)", "myst-parser", "nbconvert", "nbsite (==0.8.0rc2)", "pandas", "panel", "pydata-sphinx-theme (<0.9.0)", "pygraphviz", "pytest", "sphinx-copybutton"] +doc = ["aiohttp", "graphviz", "ipython (!=8.7.0)", "myst-nb (==0.12.2)", "myst-parser", "nbconvert", "nbsite (==0.8.0rc2)", "pandas", "panel", "pydata-sphinx-theme (<0.9.0)", "pygraphviz", "sphinx-copybutton"] +tests = ["coverage", "flake8", "pytest"] [[package]] name = "parso" version = "0.8.3" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] [package.extras] qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] @@ -1535,34 +2482,43 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "partd" -version = "1.2.0" +version = "1.4.0" description = "Appendable key-value storage" -category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +files = [ + {file = "partd-1.4.0-py3-none-any.whl", hash = "sha256:7a63529348cf0dff14b986db641cd1b83c16b5cb9fc647c2851779db03282ef8"}, + {file = "partd-1.4.0.tar.gz", hash = "sha256:aa0ff35dbbcc807ae374db56332f4c1b39b46f67bf2975f5151e0b4186aed0d5"}, +] [package.dependencies] locket = "*" toolz = "*" [package.extras] -complete = ["numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq", "blosc"] +complete = ["blosc", "numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq"] [[package]] name = "pathspec" -version = "0.9.0" +version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] [[package]] name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "dev" optional = false python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] [package.dependencies] ptyprocess = ">=0.5" @@ -1571,32 +2527,105 @@ ptyprocess = ">=0.5" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] [[package]] name = "pillow" -version = "9.1.0" +version = "10.0.0" description = "Python Imaging Library (Fork)" -category = "main" optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinx-rtd-theme (>=1.0)", "sphinxext-opengraph"] +python-versions = ">=3.8" +files = [ + {file = "Pillow-10.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f62406a884ae75fb2f818694469519fb685cc7eaff05d3451a9ebe55c646891"}, + {file = "Pillow-10.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d5db32e2a6ccbb3d34d87c87b432959e0db29755727afb37290e10f6e8e62614"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf4392b77bdc81f36e92d3a07a5cd072f90253197f4a52a55a8cec48a12483b"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:520f2a520dc040512699f20fa1c363eed506e94248d71f85412b625026f6142c"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:8c11160913e3dd06c8ffdb5f233a4f254cb449f4dfc0f8f4549eda9e542c93d1"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a74ba0c356aaa3bb8e3eb79606a87669e7ec6444be352870623025d75a14a2bf"}, + {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d0dae4cfd56969d23d94dc8e89fb6a217be461c69090768227beb8ed28c0a3"}, + {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22c10cc517668d44b211717fd9775799ccec4124b9a7f7b3635fc5386e584992"}, + {file = "Pillow-10.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:dffe31a7f47b603318c609f378ebcd57f1554a3a6a8effbc59c3c69f804296de"}, + {file = "Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485"}, + {file = "Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629"}, + {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538"}, + {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d"}, + {file = "Pillow-10.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f"}, + {file = "Pillow-10.0.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883"}, + {file = "Pillow-10.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff"}, + {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551"}, + {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5"}, + {file = "Pillow-10.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199"}, + {file = "Pillow-10.0.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:349930d6e9c685c089284b013478d6f76e3a534e36ddfa912cde493f235372f3"}, + {file = "Pillow-10.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3a684105f7c32488f7153905a4e3015a3b6c7182e106fe3c37fbb5ef3e6994c3"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4f69b3700201b80bb82c3a97d5e9254084f6dd5fb5b16fc1a7b974260f89f43"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f07ea8d2f827d7d2a49ecf1639ec02d75ffd1b88dcc5b3a61bbb37a8759ad8d"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:040586f7d37b34547153fa383f7f9aed68b738992380ac911447bb78f2abe530"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f88a0b92277de8e3ca715a0d79d68dc82807457dae3ab8699c758f07c20b3c51"}, + {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c7cf14a27b0d6adfaebb3ae4153f1e516df54e47e42dcc073d7b3d76111a8d86"}, + {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3400aae60685b06bb96f99a21e1ada7bc7a413d5f49bce739828ecd9391bb8f7"}, + {file = "Pillow-10.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbc02381779d412145331789b40cc7b11fdf449e5d94f6bc0b080db0a56ea3f0"}, + {file = "Pillow-10.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9211e7ad69d7c9401cfc0e23d49b69ca65ddd898976d660a2fa5904e3d7a9baa"}, + {file = "Pillow-10.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:faaf07ea35355b01a35cb442dd950d8f1bb5b040a7787791a535de13db15ed90"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f72a021fbb792ce98306ffb0c348b3c9cb967dce0f12a49aa4c3d3fdefa967"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f7c16705f44e0504a3a2a14197c1f0b32a95731d251777dcb060aa83022cb2d"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:76edb0a1fa2b4745fb0c99fb9fb98f8b180a1bbceb8be49b087e0b21867e77d3"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:368ab3dfb5f49e312231b6f27b8820c823652b7cd29cfbd34090565a015e99ba"}, + {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:608bfdee0d57cf297d32bcbb3c728dc1da0907519d1784962c5f0c68bb93e5a3"}, + {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5c6e3df6bdd396749bafd45314871b3d0af81ff935b2d188385e970052091017"}, + {file = "Pillow-10.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:7be600823e4c8631b74e4a0d38384c73f680e6105a7d3c6824fcf226c178c7e6"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:92be919bbc9f7d09f7ae343c38f5bb21c973d2576c1d45600fce4b74bafa7ac0"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8182b523b2289f7c415f589118228d30ac8c355baa2f3194ced084dac2dbba"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:38250a349b6b390ee6047a62c086d3817ac69022c127f8a5dc058c31ccef17f3"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:88af2003543cc40c80f6fca01411892ec52b11021b3dc22ec3bc9d5afd1c5334"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c189af0545965fa8d3b9613cfdb0cd37f9d71349e0f7750e1fd704648d475ed2"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b031a6fc11365970e6a5686d7ba8c63e4c1cf1ea143811acbb524295eabed"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db24668940f82321e746773a4bc617bfac06ec831e5c88b643f91f122a785684"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:efe8c0681042536e0d06c11f48cebe759707c9e9abf880ee213541c5b46c5bf3"}, + {file = "Pillow-10.0.0.tar.gz", hash = "sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +[[package]] +name = "pip" +version = "23.1.2" +description = "The PyPA recommended tool for installing Python packages." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pip-23.1.2-py3-none-any.whl", hash = "sha256:3ef6ac33239e4027d9a5598a381b9d30880a1477e50039db2eac6e8a8f6d1b18"}, + {file = "pip-23.1.2.tar.gz", hash = "sha256:0e7c86f486935893c708287b30bd050a36ac827ec7fe5e43fe7cb198dd835fba"}, +] + [[package]] name = "pip-tools" version = "5.5.0" description = "pip-tools keeps your pinned dependencies fresh." -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "pip-tools-5.5.0.tar.gz", hash = "sha256:cb0108391366b3ef336185097b3c2c0f3fa115b15098dafbda5e78aef70ea114"}, + {file = "pip_tools-5.5.0-py2.py3-none-any.whl", hash = "sha256:10841c1e56c234d610d0466447685b9ea4ee4a2c274f858c0ef3c33d9bd0d985"}, +] [package.dependencies] click = ">=7" +pip = ">=20.1" [package.extras] coverage = ["pytest-cov"] @@ -1604,112 +2633,229 @@ testing = ["mock", "pytest", "pytest-rerunfailures"] [[package]] name = "prompt-toolkit" -version = "3.0.29" +version = "3.0.38" description = "Library for building powerful interactive command lines in Python" -category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, + {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, +] [package.dependencies] wcwidth = "*" [[package]] name = "psutil" -version = "5.9.0" +version = "5.9.5" description = "Cross-platform lib for process and system monitoring in Python." -category = "main" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, + {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, + {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, + {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, + {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, + {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, + {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, + {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, +] [package.extras] -test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "psycopg2" -version = "2.9.3" +version = "2.9.6" description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "psycopg2-2.9.6-cp310-cp310-win32.whl", hash = "sha256:f7a7a5ee78ba7dc74265ba69e010ae89dae635eea0e97b055fb641a01a31d2b1"}, + {file = "psycopg2-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:f75001a1cbbe523e00b0ef896a5a1ada2da93ccd752b7636db5a99bc57c44494"}, + {file = "psycopg2-2.9.6-cp311-cp311-win32.whl", hash = "sha256:53f4ad0a3988f983e9b49a5d9765d663bbe84f508ed655affdb810af9d0972ad"}, + {file = "psycopg2-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b81fcb9ecfc584f661b71c889edeae70bae30d3ef74fa0ca388ecda50b1222b7"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:11aca705ec888e4f4cea97289a0bf0f22a067a32614f6ef64fcf7b8bfbc53744"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:36c941a767341d11549c0fbdbb2bf5be2eda4caf87f65dfcd7d146828bd27f39"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:869776630c04f335d4124f120b7fb377fe44b0a7645ab3c34b4ba42516951889"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:a8ad4a47f42aa6aec8d061fdae21eaed8d864d4bb0f0cade5ad32ca16fcd6258"}, + {file = "psycopg2-2.9.6-cp38-cp38-win32.whl", hash = "sha256:2362ee4d07ac85ff0ad93e22c693d0f37ff63e28f0615a16b6635a645f4b9214"}, + {file = "psycopg2-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:d24ead3716a7d093b90b27b3d73459fe8cd90fd7065cf43b3c40966221d8c394"}, + {file = "psycopg2-2.9.6-cp39-cp39-win32.whl", hash = "sha256:1861a53a6a0fd248e42ea37c957d36950da00266378746588eab4f4b5649e95f"}, + {file = "psycopg2-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:ded2faa2e6dfb430af7713d87ab4abbfc764d8d7fb73eafe96a24155f906ebf5"}, + {file = "psycopg2-2.9.6.tar.gz", hash = "sha256:f15158418fd826831b28585e2ab48ed8df2d0d98f502a2b4fe619e7d5ca29011"}, +] [[package]] name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] [[package]] name = "pyarrow" -version = "7.0.0" +version = "12.0.1" description = "Python library for Apache Arrow" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pyarrow-12.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:6d288029a94a9bb5407ceebdd7110ba398a00412c5b0155ee9813a40d246c5df"}, + {file = "pyarrow-12.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345e1828efdbd9aa4d4de7d5676778aba384a2c3add896d995b23d368e60e5af"}, + {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d6009fdf8986332b2169314da482baed47ac053311c8934ac6651e614deacd6"}, + {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d3c4cbbf81e6dd23fe921bc91dc4619ea3b79bc58ef10bce0f49bdafb103daf"}, + {file = "pyarrow-12.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdacf515ec276709ac8042c7d9bd5be83b4f5f39c6c037a17a60d7ebfd92c890"}, + {file = "pyarrow-12.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:749be7fd2ff260683f9cc739cb862fb11be376de965a2a8ccbf2693b098db6c7"}, + {file = "pyarrow-12.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6895b5fb74289d055c43db3af0de6e16b07586c45763cb5e558d38b86a91e3a7"}, + {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1887bdae17ec3b4c046fcf19951e71b6a619f39fa674f9881216173566c8f718"}, + {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c9cb8eeabbadf5fcfc3d1ddea616c7ce893db2ce4dcef0ac13b099ad7ca082"}, + {file = "pyarrow-12.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ce4aebdf412bd0eeb800d8e47db854f9f9f7e2f5a0220440acf219ddfddd4f63"}, + {file = "pyarrow-12.0.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:e0d8730c7f6e893f6db5d5b86eda42c0a130842d101992b581e2138e4d5663d3"}, + {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43364daec02f69fec89d2315f7fbfbeec956e0d991cbbef471681bd77875c40f"}, + {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051f9f5ccf585f12d7de836e50965b3c235542cc896959320d9776ab93f3b33d"}, + {file = "pyarrow-12.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:be2757e9275875d2a9c6e6052ac7957fbbfc7bc7370e4a036a9b893e96fedaba"}, + {file = "pyarrow-12.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:cf812306d66f40f69e684300f7af5111c11f6e0d89d6b733e05a3de44961529d"}, + {file = "pyarrow-12.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:459a1c0ed2d68671188b2118c63bac91eaef6fc150c77ddd8a583e3c795737bf"}, + {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85e705e33eaf666bbe508a16fd5ba27ca061e177916b7a317ba5a51bee43384c"}, + {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9120c3eb2b1f6f516a3b7a9714ed860882d9ef98c4b17edcdc91d95b7528db60"}, + {file = "pyarrow-12.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c780f4dc40460015d80fcd6a6140de80b615349ed68ef9adb653fe351778c9b3"}, + {file = "pyarrow-12.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:a3c63124fc26bf5f95f508f5d04e1ece8cc23a8b0af2a1e6ab2b1ec3fdc91b24"}, + {file = "pyarrow-12.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b13329f79fa4472324f8d32dc1b1216616d09bd1e77cfb13104dec5463632c36"}, + {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb656150d3d12ec1396f6dde542db1675a95c0cc8366d507347b0beed96e87ca"}, + {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6251e38470da97a5b2e00de5c6a049149f7b2bd62f12fa5dbb9ac674119ba71a"}, + {file = "pyarrow-12.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:3de26da901216149ce086920547dfff5cd22818c9eab67ebc41e863a5883bac7"}, + {file = "pyarrow-12.0.1.tar.gz", hash = "sha256:cce317fc96e5b71107bf1f9f184d5e54e2bd14bbf3f9a3d62819961f0af86fec"}, +] [package.dependencies] numpy = ">=1.16.6" [[package]] name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" -category = "main" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, +] [[package]] name = "pyasn1-modules" -version = "0.2.8" -description = "A collection of ASN.1-based protocols modules." -category = "main" +version = "0.3.0" +description = "A collection of ASN.1-based protocols modules" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, + {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, +] [package.dependencies] -pyasn1 = ">=0.4.6,<0.5.0" +pyasn1 = ">=0.4.6,<0.6.0" [[package]] name = "pycodestyle" version = "2.7.0" description = "Python style guide checker" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, + {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, +] [[package]] name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] [[package]] name = "pyct" -version = "0.4.8" +version = "0.5.0" description = "Python package common tasks for users (e.g. copy examples, fetch data, ...)" -category = "main" optional = false -python-versions = ">=2.7" +python-versions = ">=3.7" +files = [ + {file = "pyct-0.5.0-py2.py3-none-any.whl", hash = "sha256:a4038a8885059ab8cac6f946ea30e0b5e6bdbe0b92b6723f06737035f9d65e8c"}, + {file = "pyct-0.5.0.tar.gz", hash = "sha256:dd9f4ac5cbd8e37c352c04036062d3c5f67efec76d404761ef16b0cbf26aa6a0"}, +] [package.dependencies] param = ">=1.7.0" [package.extras] -build = ["setuptools", "param (>=1.7.0)"] +build = ["param (>=1.7.0)", "setuptools"] cmd = ["pyyaml", "requests"] doc = ["nbsite", "sphinx-ioam-theme"] tests = ["flake8", "pytest"] [[package]] name = "pyerfa" -version = "2.0.0.1" +version = "2.0.0.3" description = "Python bindings for ERFA" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pyerfa-2.0.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:676515861ca3f0cb9d7e693389233e7126413a5ba93a0cc4d36b8ca933951e8d"}, + {file = "pyerfa-2.0.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a438865894d226247dcfcb60d683ae075a52716504537052371b2b73458fe4fc"}, + {file = "pyerfa-2.0.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73bf7d23f069d47632a2feeb1e73454b10392c4f3c16116017a6983f1f0e9b2b"}, + {file = "pyerfa-2.0.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:780b0f90adf500b8ba24e9d509a690576a7e8287e354cfb90227c5963690d3fc"}, + {file = "pyerfa-2.0.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5447bb45ddedde3052693c86b941a4908f5dbeb4a697bda45b5b89de92cfb74a"}, + {file = "pyerfa-2.0.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7c24e7960c6cdd3fa3f4dba5f3444a106ad48c94ff0b19eebaee06a142c18c52"}, + {file = "pyerfa-2.0.0.3-cp310-cp310-win32.whl", hash = "sha256:170a83bd0243da518119b846f296cf33fa03f1f884a88578c1a38560182cf64e"}, + {file = "pyerfa-2.0.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:51aa6e0faa4aa9ad8f0eef1c47fec76c5bebc0da7023a436089bdd6e5cfd625f"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fa9fceeb78057bfff7ae3aa6cdad3f1b193722de22bdbb75319256f4a9e2f76"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a8a2029fc62ff2369d01219f66a5ce6aed35ef33eddb06118b6c27e8573a9ed8"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da888da2c8db5a78273fbf0af4e74f04e2d312d371c3c021cf6c3b14fa60fe3b"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7354753addba5261ec1cbf1ba45784ed3a5c42da565ecc6e0aa36b7a17fa4689"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b55f7278c1dd362648d7956e1a5365ade5fed2fe5541b721b3ceb5271128892"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:23e5efcf96ed7161d74f79ca261d255e1f36988843d22cd97d8f60fe9c868d44"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-win32.whl", hash = "sha256:f0e9d0b122c454bcad5dbd0c3283b200783031d3f99ca9c550f49a7a7d4c41ea"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:09af83540e23a7d61a8368b0514b3daa4ed967e1e52d0add4f501f58c500dd7f"}, + {file = "pyerfa-2.0.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a07444fd53a5dd18d7955f86f8d9b1be9a68ceb143e1145c0019a310c913c04"}, + {file = "pyerfa-2.0.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf7364e475cff1f973e2fcf6962de9df9642c8802b010e29b2c592ae337e3c5"}, + {file = "pyerfa-2.0.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8458421166f6ffe2e259aaf4aaa6e802d6539649a40e3194a81d30dccdc167a"}, + {file = "pyerfa-2.0.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96ea688341176ae6220cc4743cda655549d71e3e3b60c5a99d02d5912d0ddf55"}, + {file = "pyerfa-2.0.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d56f6b5a0a3ed7b80d630041829463a872946df277259b5453298842d42a54a4"}, + {file = "pyerfa-2.0.0.3-cp37-cp37m-win32.whl", hash = "sha256:3ecb598924ddb4ea2b06efc6f1e55ca70897ed178a690e2eaa1e290448466c7c"}, + {file = "pyerfa-2.0.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:1033fdb890ec70d3a511e20a464afc8abbea2180108f27b14d8f1d1addc38cbe"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d8c0dbb17119e52def33f9d6dbf2deaf2113ed3e657b6ff692df9b6a3598397"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8a1edd2cbe4ead3bf9a51e578d5d83bdd7ab3b3ccb69e09b89a4c42aa5b35ffb"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a04c3b715c924b6f972dd440a94a701a16a07700bc8ba9e88b1df765bdc36ad0"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d01c341c45b860ee5c7585ef003118c8015e9d65c30668d2f5bf657e1dcdd68"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24d89ead30edc6038408336ad9b696683e74c4eef550708fca6afef3ecd5b010"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b8c5e74d48a505a014e855cd4c7be11604901d94fd6f34b685f6720b7b20ed8"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-win32.whl", hash = "sha256:2ccba04de166d81bdd3adcf10428d908ce2f3a56ed1c2767d740fec12680edbd"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3df87743e27588c5bd5e1f3a886629b3277fdd418059ca048420d33169376775"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88aa1acedf298d255cc4b0740ee11a3b303b71763dba2f039d48abf0a95cf9df"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06d4f08e96867b1fc3ae9a9e4b38693ed0806463288efc41473ad16e14774504"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1819e0d95ff8dead80614f8063919d82b2dbb55437b6c0109d3393c1ab55954"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61f1097ac2ee8c15a2a636cdfb99340d708574d66f4610456bd457d1e6b852f4"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36f42ee01a62c6cbba58103e6f8e600b21ad3a71262dccf03d476efb4a20ea71"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3ecd6167b48bb8f1922fae7b49554616f2e7382748a4320ad46ebd7e2cc62f3d"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-win32.whl", hash = "sha256:7f9eabfefa5317ce58fe22480102902f10f270fc64a5636c010f7c0b7e0fb032"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:4ea7ca03ecc440224c2bed8fb136fadf6cf8aea8ba67d717f635116f30c8cc8c"}, + {file = "pyerfa-2.0.0.3.tar.gz", hash = "sha256:d77fbbfa58350c194ccb99e5d93aa05d3c2b14d5aad8b662d93c6ad9fff41f39"}, +] [package.dependencies] numpy = ">=1.17" @@ -1722,73 +2868,97 @@ test = ["pytest", "pytest-doctestplus (>=0.7)"] name = "pyflakes" version = "2.3.1" description = "passive checker of Python programs" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, + {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, +] [[package]] name = "pygments" -version = "2.11.2" +version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] [[package]] name = "pygraphviz" -version = "1.9" +version = "1.11" description = "Python interface to Graphviz" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "pygraphviz-1.11.zip", hash = "sha256:a97eb5ced266f45053ebb1f2c6c6d29091690503e3a5c14be7f908b37b06f2d4"}, +] [[package]] name = "pyjwt" -version = "2.3.0" +version = "2.7.0" description = "JSON Web Token implementation in Python" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.7.0-py3-none-any.whl", hash = "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1"}, + {file = "PyJWT-2.7.0.tar.gz", hash = "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074"}, +] [package.extras] -crypto = ["cryptography (>=3.3.1)"] -dev = ["sphinx", "sphinx-rtd-theme", "zope.interface", "cryptography (>=3.3.1)", "pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)", "mypy", "pre-commit"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pymdown-extensions" -version = "9.3" +version = "10.0.1" description = "Extension pack for Python Markdown." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pymdown_extensions-10.0.1-py3-none-any.whl", hash = "sha256:ae66d84013c5d027ce055693e09a4628b67e9dec5bce05727e45b0918e36f274"}, + {file = "pymdown_extensions-10.0.1.tar.gz", hash = "sha256:b44e1093a43b8a975eae17b03c3a77aad4681b3b56fce60ce746dbef1944c8cb"}, +] [package.dependencies] -Markdown = ">=3.2" +markdown = ">=3.2" +pyyaml = "*" [[package]] name = "pyopenssl" -version = "22.0.0" +version = "23.2.0" description = "Python wrapper module around the OpenSSL library" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "pyOpenSSL-23.2.0-py3-none-any.whl", hash = "sha256:24f0dc5227396b3e831f4c7f602b950a5e9833d292c8e4a2e06b709292806ae2"}, + {file = "pyOpenSSL-23.2.0.tar.gz", hash = "sha256:276f931f55a452e7dea69c7173e984eb2a4407ce413c918aa34b55f82f9b8bac"}, +] [package.dependencies] -cryptography = ">=35.0" +cryptography = ">=38.0.0,<40.0.0 || >40.0.0,<40.0.1 || >40.0.1,<42" [package.extras] -docs = ["sphinx", "sphinx-rtd-theme"] +docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] test = ["flaky", "pretend", "pytest (>=3.0.1)"] [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" -category = "main" +version = "3.1.0" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.0-py3-none-any.whl", hash = "sha256:d554a96d1a7d3ddaf7183104485bc19fd80543ad6ac5bdb6426719d766fb06c1"}, + {file = "pyparsing-3.1.0.tar.gz", hash = "sha256:edb662d6fe322d6e990b1594b5feaeadf806803359e3d4d42f11e295e588f0ea"}, +] [package.extras] diagrams = ["jinja2", "railroad-diagrams"] @@ -1797,9 +2967,12 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] [package.dependencies] six = ">=1.5" @@ -1808,9 +2981,12 @@ six = ">=1.5" name = "python3-openid" version = "3.2.0" description = "OpenID support for modern servers and consumers." -category = "main" optional = false python-versions = "*" +files = [ + {file = "python3-openid-3.2.0.tar.gz", hash = "sha256:33fbf6928f401e0b790151ed2b5290b02545e8775f982485205a066f874aaeaf"}, + {file = "python3_openid-3.2.0-py3-none-any.whl", hash = "sha256:6626f771e0417486701e0b4daff762e7212e820ca5b29fcc0d05f6f8736dfa6b"}, +] [package.dependencies] defusedxml = "*" @@ -1823,128 +2999,282 @@ postgresql = ["psycopg2"] name = "pytkdocs" version = "0.16.1" description = "Load Python objects documentation." -category = "dev" optional = false python-versions = ">=3.7" - -[package.dependencies] -astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} +files = [ + {file = "pytkdocs-0.16.1-py3-none-any.whl", hash = "sha256:a8c3f46ecef0b92864cc598e9101e9c4cf832ebbf228f50c84aa5dd850aac379"}, + {file = "pytkdocs-0.16.1.tar.gz", hash = "sha256:e2ccf6dfe9dbbceb09818673f040f1a7c32ed0bffb2d709b06be6453c4026045"}, +] [package.extras] numpy-style = ["docstring_parser (>=0.7)"] [[package]] name = "pytz" -version = "2022.1" +version = "2023.3" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, +] [[package]] name = "pyviz-comms" -version = "2.2.0" +version = "2.3.2" description = "Bidirectional communication for the HoloViz ecosystem." -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "pyviz_comms-2.3.2-py2.py3-none-any.whl", hash = "sha256:2e9f6574409ef6c44331b41ff254cbde05fffca140aca8ac47ca13d9223b4499"}, + {file = "pyviz_comms-2.3.2.tar.gz", hash = "sha256:542a10fed8242d3a9d468ed0a14d6a2537e589c3f8a7986c79c374591254d6b4"}, +] [package.dependencies] param = "*" [package.extras] -all = ["flake8", "jupyter-packaging (>=0.7.9,<0.8.0)", "jupyterlab (>=3.0,<4.0)", "keyring", "nose", "rfc3986", "setuptools (>=40.8.0,<61)", "twine"] -build = ["setuptools (>=40.8.0,<61)", "jupyterlab (>=3.0,<4.0)", "jupyter-packaging (>=0.7.9,<0.8.0)", "twine", "rfc3986", "keyring"] -tests = ["flake8", "nose"] +all = ["flake8", "jupyter-packaging (>=0.7.9,<0.8.0)", "jupyterlab (>=3.0,<4.0)", "keyring", "pytest", "rfc3986", "setuptools (>=40.8.0)", "twine"] +build = ["jupyter-packaging (>=0.7.9,<0.8.0)", "jupyterlab (>=3.0,<4.0)", "keyring", "rfc3986", "setuptools (>=40.8.0)", "twine"] +tests = ["flake8", "pytest"] [[package]] name = "pyvo" -version = "1.3" +version = "1.4.1" description = "Astropy affiliated package for accessing Virtual Observatory data and services" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "pyvo-1.4.1-py3-none-any.whl", hash = "sha256:408ca0c06dc4e013ed0e0e236cb7c8362c958365746f762e7513b03c1d7e67dc"}, + {file = "pyvo-1.4.1.tar.gz", hash = "sha256:07a4e7ddfe4b995b271e44440277542b9a23de0ed996e152d759860f7dd84c9d"}, +] [package.dependencies] -astropy = ">=4.0" +astropy = ">=4.1" requests = "*" [package.extras] -all = ["mimeparse"] +all = ["pillow"] docs = ["sphinx-astropy"] -test = ["pytest-astropy"] +test = ["pytest-astropy", "requests-mock"] [[package]] name = "pywin32-ctypes" -version = "0.2.0" -description = "" -category = "main" +version = "0.2.2" +description = "A (partial) reimplementation of pywin32 using ctypes/cffi" optional = false -python-versions = "*" +python-versions = ">=3.6" +files = [ + {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, + {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, +] [[package]] name = "pyyaml" version = "6.0" description = "YAML parser and emitter for Python" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "pyyaml-env-tag" -version = "0.1" -description = "A custom YAML tag for referencing environment variables in YAML files. " -category = "dev" optional = false python-versions = ">=3.6" - -[package.dependencies] -pyyaml = "*" - -[[package]] -name = "redis" -version = "3.5.3" -description = "Python client for Redis key-value store" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.extras] -hiredis = ["hiredis (>=0.1.3)"] +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] + +[package.dependencies] +pyyaml = "*" + +[[package]] +name = "redis" +version = "3.5.3" +description = "Python client for Redis key-value store" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "redis-3.5.3-py2.py3-none-any.whl", hash = "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24"}, + {file = "redis-3.5.3.tar.gz", hash = "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2"}, +] + +[package.extras] +hiredis = ["hiredis (>=0.1.3)"] [[package]] name = "regex" -version = "2022.3.15" +version = "2023.6.3" description = "Alternative regular expression module, to replace re." -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "regex-2023.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd"}, + {file = "regex-2023.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568"}, + {file = "regex-2023.6.3-cp310-cp310-win32.whl", hash = "sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1"}, + {file = "regex-2023.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0"}, + {file = "regex-2023.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969"}, + {file = "regex-2023.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477"}, + {file = "regex-2023.6.3-cp311-cp311-win32.whl", hash = "sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9"}, + {file = "regex-2023.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af"}, + {file = "regex-2023.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787"}, + {file = "regex-2023.6.3-cp36-cp36m-win32.whl", hash = "sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54"}, + {file = "regex-2023.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27"}, + {file = "regex-2023.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb"}, + {file = "regex-2023.6.3-cp37-cp37m-win32.whl", hash = "sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7"}, + {file = "regex-2023.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23"}, + {file = "regex-2023.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07"}, + {file = "regex-2023.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9"}, + {file = "regex-2023.6.3-cp38-cp38-win32.whl", hash = "sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88"}, + {file = "regex-2023.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72"}, + {file = "regex-2023.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751"}, + {file = "regex-2023.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd"}, + {file = "regex-2023.6.3-cp39-cp39-win32.whl", hash = "sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f"}, + {file = "regex-2023.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a"}, + {file = "regex-2023.6.3.tar.gz", hash = "sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0"}, +] [[package]] name = "requests" -version = "2.27.1" +version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-oauthlib" version = "1.3.1" description = "OAuthlib authentication support for Requests." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, + {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, +] [package.dependencies] oauthlib = ">=3.0.0" @@ -1957,31 +3287,63 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] name = "rope" version = "0.18.0" description = "a python refactoring library..." -category = "dev" optional = false python-versions = "*" +files = [ + {file = "rope-0.18.0.tar.gz", hash = "sha256:786b5c38c530d4846aa68a42604f61b4e69a493390e3ca11b88df0fbfdc3ed04"}, +] [package.extras] dev = ["pytest"] [[package]] name = "scipy" -version = "1.8.0" -description = "SciPy: Scientific Library for Python" -category = "main" +version = "1.9.3" +description = "Fundamental algorithms for scientific computing in Python" optional = false -python-versions = ">=3.8,<3.11" - -[package.dependencies] -numpy = ">=1.17.3,<1.25.0" +python-versions = ">=3.8" +files = [ + {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, + {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, + {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, + {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, + {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, + {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, + {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, + {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, + {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, + {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, + {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, + {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, + {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, + {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, + {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, + {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, + {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, + {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, + {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, + {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, + {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, +] + +[package.dependencies] +numpy = ">=1.18.5,<1.26.0" + +[package.extras] +dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] +test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "secretstorage" -version = "3.3.1" +version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] [package.dependencies] cryptography = ">=2.0" @@ -1989,64 +3351,77 @@ jeepney = ">=0.6" [[package]] name = "service-identity" -version = "21.1.0" +version = "23.1.0" description = "Service identity verification for pyOpenSSL & cryptography." -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" +files = [ + {file = "service_identity-23.1.0-py3-none-any.whl", hash = "sha256:87415a691d52fcad954a500cb81f424d0273f8e7e3ee7d766128f4575080f383"}, + {file = "service_identity-23.1.0.tar.gz", hash = "sha256:ecb33cd96307755041e978ab14f8b14e13b40f1fbd525a4dc78f46d2b986431d"}, +] [package.dependencies] attrs = ">=19.1.0" cryptography = "*" pyasn1 = "*" pyasn1-modules = "*" -six = "*" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "pytest", "sphinx", "furo", "idna", "pyopenssl"] -docs = ["sphinx", "furo"] +dev = ["pyopenssl", "service-identity[docs,idna,mypy,tests]"] +docs = ["furo", "myst-parser", "pyopenssl", "sphinx", "sphinx-notfound-page"] idna = ["idna"] +mypy = ["idna", "mypy", "types-pyopenssl"] tests = ["coverage[toml] (>=5.0.2)", "pytest"] [[package]] -name = "setuptools-scm" -version = "6.4.2" -description = "the blessed package to manage your versions by scm tags" -category = "main" +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.6" - -[package.dependencies] -packaging = ">=20.0" -tomli = ">=1.0.0" +python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] [package.extras] -test = ["pytest (>=6.2)", "virtualenv (>20)"] -toml = ["setuptools (>=42)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "smmap" version = "5.0.0" description = "A pure Python implementation of a sliding window memory map manager" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] [[package]] name = "social-auth-app-django" version = "3.4.0" description = "Python Social Authentication, Django integration." -category = "main" optional = false python-versions = "*" +files = [ + {file = "social-auth-app-django-3.4.0.tar.gz", hash = "sha256:09575f5c7dd91465df3a898c58e7c4ae1e78f31edba36b8b7be47ab0aeef2789"}, + {file = "social_auth_app_django-3.4.0-py2-none-any.whl", hash = "sha256:02b561e175d4a93896e4436b591586b61e647bd8eeef14c99a26344eb3b48d0e"}, + {file = "social_auth_app_django-3.4.0-py3-none-any.whl", hash = "sha256:47d1720115a9eaad78a67e99987d556abaa01222b9c2b9538182bbdbb10304ba"}, +] [package.dependencies] six = "*" @@ -2056,9 +3431,13 @@ social-auth-core = ">=3.3.0" name = "social-auth-core" version = "3.4.0" description = "Python social authentication made simple." -category = "main" optional = false python-versions = "*" +files = [ + {file = "social-auth-core-3.4.0.tar.gz", hash = "sha256:aaec7f1e1a9bb61d0467d05c8cfe8dd55402f39229716b933e3dc29eb5f1e61a"}, + {file = "social_auth_core-3.4.0-py2-none-any.whl", hash = "sha256:a4b972b6250d7a32940aec2972e33ebc645de91b2153d18dcd3e38fb74271042"}, + {file = "social_auth_core-3.4.0-py3-none-any.whl", hash = "sha256:b3aa96be236e59842ae45a5a51fe75c97814087ab5ba3092e80b41cb3dcdd8af"}, +] [package.dependencies] cryptography = ">=1.4" @@ -2071,138 +3450,209 @@ requests-oauthlib = ">=0.6.1" six = ">=1.10.0" [package.extras] -all = ["python-jose (>=3.0.0)", "pyjwt (>=1.7.1)", "python-saml (>=2.2.0)", "cryptography (>=2.1.1)"] -allpy2 = ["python-jose (>=3.0.0)", "pyjwt (>=1.7.1)", "python-saml (>=2.2.0)", "cryptography (>=2.1.1)", "python-openid (>=2.2.5)"] -allpy3 = ["python-jose (>=3.0.0)", "pyjwt (>=1.7.1)", "python-saml (>=2.2.0)", "cryptography (>=2.1.1)", "defusedxml (>=0.5.0rc1)", "python3-openid (>=3.0.10)"] +all = ["cryptography (>=2.1.1)", "pyjwt (>=1.7.1)", "python-jose (>=3.0.0)", "python-saml (>=2.2.0)"] +allpy2 = ["cryptography (>=2.1.1)", "pyjwt (>=1.7.1)", "python-jose (>=3.0.0)", "python-openid (>=2.2.5)", "python-saml (>=2.2.0)"] +allpy3 = ["cryptography (>=2.1.1)", "defusedxml (>=0.5.0rc1)", "pyjwt (>=1.7.1)", "python-jose (>=3.0.0)", "python-saml (>=2.2.0)", "python3-openid (>=3.0.10)"] azuread = ["cryptography (>=2.1.1)"] -openidconnect = ["python-jose (>=3.0.0)", "pyjwt (>=1.7.1)"] +openidconnect = ["pyjwt (>=1.7.1)", "python-jose (>=3.0.0)"] saml = ["python-saml (>=2.2.0)"] -[[package]] -name = "sortedcontainers" -version = "2.4.0" -description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "main" -optional = false -python-versions = "*" - [[package]] name = "soupsieve" -version = "2.3.2" +version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, +] [[package]] name = "sqlalchemy" -version = "1.4.35" +version = "2.0.17" description = "Database Abstraction Library" -category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} - -[package.extras] -aiomysql = ["greenlet (!=0.4.17)", "aiomysql"] -aiosqlite = ["typing_extensions (!=3.10.0.1)", "greenlet (!=0.4.17)", "aiosqlite"] +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.17-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:04383f1e3452f6739084184e427e9d5cb4e68ddc765d52157bf5ef30d5eca14f"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:724355973297bbe547f3eb98b46ade65a67a3d5a6303f17ab59a2dc6fb938943"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf07ff9920cb3ca9d73525dfd4f36ddf9e1a83734ea8b4f724edfd9a2c6e82d9"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f389f77c68dc22cb51f026619291c4a38aeb4b7ecb5f998fd145b2d81ca513"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba03518e64d86f000dc24ab3d3a1aa876bcbaa8aa15662ac2df5e81537fa3394"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:218fb20c01e95004f50a3062bf4c447dcb360cab8274232f31947e254f118298"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-win32.whl", hash = "sha256:b47be4c6281a86670ea5cfbbbe6c3a65366a8742f5bc8b986f790533c60b5ddb"}, + {file = "SQLAlchemy-2.0.17-cp310-cp310-win_amd64.whl", hash = "sha256:74ddcafb6488f382854a7da851c404c394be3729bb3d91b02ad86c5458140eff"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:51736cfb607cf4e8fafb693906f9bc4e5ee55be0b096d44bd7f20cd8489b8571"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8741d3d401383e54b2aada37cbd10f55c5d444b360eae3a82f74a2be568a7710"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ead58cae2a089eee1b0569060999cb5f2b2462109498a0937cc230a7556945a1"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f40e3a7d0a464f1c8593f2991e5520b2f5b26da24e88000bbd4423f86103d4f"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:21583808d37f126a647652c90332ac1d3a102edf3c94bcc3319edcc0ea2300cc"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f593170fc09c5abb1205a738290b39532f7380094dc151805009a07ae0e85330"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-win32.whl", hash = "sha256:b0eaf82cc844f6b46defe15ad243ea00d1e39ed3859df61130c263dc7204da6e"}, + {file = "SQLAlchemy-2.0.17-cp311-cp311-win_amd64.whl", hash = "sha256:1822620c89779b85f7c23d535c8e04b79c517739ae07aaed48c81e591ed5498e"}, + {file = "SQLAlchemy-2.0.17-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2269b1f9b8be47e52b70936069a25a3771eff53367aa5cc59bb94f28a6412e13"}, + {file = "SQLAlchemy-2.0.17-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48111d56afea5699bab72c38ec95561796b81befff9e13d1dd5ce251ab25f51d"}, + {file = "SQLAlchemy-2.0.17-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28da17059ecde53e2d10ba813d38db942b9f6344360b2958b25872d5cb729d35"}, + {file = "SQLAlchemy-2.0.17-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:48b40dc2895841ea89d89df9eb3ac69e2950a659db20a369acf4259f68e6dc1f"}, + {file = "SQLAlchemy-2.0.17-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7f31d4e7ca1dd8ca5a27fd5eaa0f9e2732fe769ff7dd35bf7bba179597e4df07"}, + {file = "SQLAlchemy-2.0.17-cp37-cp37m-win32.whl", hash = "sha256:7830e01b02d440c27f2a5be68296e74ccb55e6a5b5962ffafd360b98930b2e5e"}, + {file = "SQLAlchemy-2.0.17-cp37-cp37m-win_amd64.whl", hash = "sha256:234678ed6576531b8e4be255b980f20368bf07241a2e67b84e6b0fe679edb9c4"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c6ff5767d954f6091113fedcaaf49cdec2197ae4c5301fe83d5ae4393c82f33"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa995b21f853864996e4056d9fde479bcecf8b7bff4beb3555eebbbba815f35d"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:125f9f7e62ddf8b590c069729080ffe18b68a20d9882eb0947f72e06274601d7"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b114a16bc03dfe20b625062e456affd7b9938286e05a3f904a025b9aacc29dd4"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cf175d26f6787cce30fe6c04303ca0aeeb0ad40eeb22e3391f24b32ec432a1e1"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e2d5c3596254cf1a96474b98e7ce20041c74c008b0f101c1cb4f8261cb77c6d3"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-win32.whl", hash = "sha256:513411d73503a6fc5804f01fae3b3d44f267c1b3a06cfeac02e9286a7330e857"}, + {file = "SQLAlchemy-2.0.17-cp38-cp38-win_amd64.whl", hash = "sha256:40a3dc52b2b16f08b5c16b9ee7646329e4b3411e9280e5e8d57b19eaa51cbef4"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e3189432db2f5753b4fde1aa90a61c69976f4e7e31d1cf4611bfe3514ed07478"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6150560fcffc6aee5ec9a97419ac768c7a9f56baf7a7eb59cb4b1b6a4d463ad9"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910d45bf3673f0e4ef13858674bd23cfdafdc8368b45b948bf511797dbbb401d"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0aeb3afaa19f187a70fa592fbe3c20a056b57662691fd3abf60f016aa5c1848"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:36a87e26fe8fa8c466fae461a8fcb780d0a1cbf8206900759fc6fe874475a3ce"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e3a6b2788f193756076061626679c5c5a6d600ddf8324f986bc72004c3e9d92e"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-win32.whl", hash = "sha256:af7e2ba75bf84b64adb331918188dda634689a2abb151bc1a583e488363fd2f8"}, + {file = "SQLAlchemy-2.0.17-cp39-cp39-win_amd64.whl", hash = "sha256:394ac3adf3676fad76d4b8fcecddf747627f17f0738dc94bac15f303d05b03d4"}, + {file = "SQLAlchemy-2.0.17-py3-none-any.whl", hash = "sha256:cc9c2630c423ac4973492821b2969f5fe99d9736f3025da670095668fbfcd4d5"}, + {file = "SQLAlchemy-2.0.17.tar.gz", hash = "sha256:e186e9e95fb5d993b075c33fe4f38a22105f7ce11cecb5c17b5618181e356702"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\""} +typing-extensions = ">=4.2.0" + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["greenlet (!=0.4.17)", "asyncmy (>=0.2.3,!=0.2.4)"] -mariadb_connector = ["mariadb (>=1.0.1)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] mssql = ["pyodbc"] -mssql_pymssql = ["pymssql"] -mssql_pyodbc = ["pyodbc"] -mypy = ["sqlalchemy2-stubs", "mypy (>=0.910)"] -mysql = ["mysqlclient (>=1.4.0,<2)", "mysqlclient (>=1.4.0)"] -mysql_connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=7,<8)", "cx_oracle (>=7)"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] -postgresql_asyncpg = ["greenlet (!=0.4.17)", "asyncpg"] -postgresql_pg8000 = ["pg8000 (>=1.16.6)"] -postgresql_psycopg2binary = ["psycopg2-binary"] -postgresql_psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql (<1)", "pymysql"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] sqlcipher = ["sqlcipher3-binary"] [[package]] name = "sqlparse" -version = "0.4.2" +version = "0.4.4" description = "A non-validating SQL parser." -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, + {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, +] + +[package.extras] +dev = ["build", "flake8"] +doc = ["sphinx"] +test = ["pytest", "pytest-cov"] [[package]] name = "strictyaml" -version = "1.6.1" +version = "1.7.3" description = "Strict, typed YAML parser" -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7.0" +files = [ + {file = "strictyaml-1.7.3-py3-none-any.whl", hash = "sha256:fb5c8a4edb43bebb765959e420f9b3978d7f1af88c80606c03fb420888f5d1c7"}, + {file = "strictyaml-1.7.3.tar.gz", hash = "sha256:22f854a5fcab42b5ddba8030a0e4be51ca89af0267961c8d6cfa86395586c407"}, +] [package.dependencies] python-dateutil = ">=2.6.0" [[package]] name = "tabulate" -version = "0.8.9" +version = "0.8.10" description = "Pretty-print tabular data" -category = "dev" optional = false -python-versions = "*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "tabulate-0.8.10-py3-none-any.whl", hash = "sha256:0ba055423dbaa164b9e456abe7920c5e8ed33fcc16f6d1b2f2d152c8e1e8b4fc"}, + {file = "tabulate-0.8.10.tar.gz", hash = "sha256:6c57f3f3dd7ac2782770155f3adb2db0b1a269637e42f27599925e64b114f519"}, +] [package.extras] widechars = ["wcwidth"] -[[package]] -name = "tblib" -version = "1.7.0" -description = "Traceback serialization library." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] [[package]] name = "toolz" -version = "0.11.2" +version = "0.12.0" description = "List processing tools and functional utilities" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "toolz-0.12.0-py3-none-any.whl", hash = "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f"}, + {file = "toolz-0.12.0.tar.gz", hash = "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194"}, +] [[package]] name = "tornado" -version = "6.1" +version = "6.3.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" optional = false -python-versions = ">= 3.5" +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, + {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, + {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, + {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, + {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, +] [[package]] name = "tqdm" -version = "4.64.0" +version = "4.65.0" description = "Fast, Extensible Progress Meter" -category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, + {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -2215,22 +3665,29 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.1.1" +version = "5.9.0" description = "Traitlets Python configuration system" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, + {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, +] [package.extras] -test = ["pytest"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] [[package]] name = "twisted" -version = "22.4.0" +version = "22.10.0" description = "An asynchronous networking framework written in Python" -category = "main" optional = false -python-versions = ">=3.6.7" +python-versions = ">=3.7.1" +files = [ + {file = "Twisted-22.10.0-py3-none-any.whl", hash = "sha256:86c55f712cc5ab6f6d64e02503352464f0400f66d4f079096d744080afcccbd0"}, + {file = "Twisted-22.10.0.tar.gz", hash = "sha256:32acbd40a94f5f46e7b42c109bfae2b302250945561783a8b7a059048f2d4d31"}, +] [package.dependencies] attrs = ">=19.2.0" @@ -2239,209 +3696,354 @@ constantly = ">=15.1" hyperlink = ">=17.1.1" idna = {version = ">=2.4", optional = true, markers = "extra == \"tls\""} incremental = ">=21.3.0" -pyopenssl = {version = ">=16.0.0", optional = true, markers = "extra == \"tls\""} +pyopenssl = {version = ">=21.0.0", optional = true, markers = "extra == \"tls\""} service-identity = {version = ">=18.1.0", optional = true, markers = "extra == \"tls\""} twisted-iocpsupport = {version = ">=1.0.2,<2", markers = "platform_system == \"Windows\""} typing-extensions = ">=3.6.5" "zope.interface" = ">=4.4.2" [package.extras] -all_non_platform = ["cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "pyopenssl (>=16.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] -conch = ["pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)"] -conch_nacl = ["pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pynacl"] +all-non-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] +conch = ["appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "cryptography (>=2.6)", "pyasn1"] +conch-nacl = ["PyNaCl", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "cryptography (>=2.6)", "pyasn1"] contextvars = ["contextvars (>=2.4,<3)"] -dev = ["towncrier (>=19.2,<20.0)", "sphinx-rtd-theme (>=0.5,<1.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=4.1.2,<6)", "pyflakes (>=2.2,<3.0)", "twistedchecker (>=0.7,<1.0)", "coverage (>=6b1,<7)", "python-subunit (>=1.4,<2.0)", "pydoctor (>=21.9.0,<21.10.0)"] -dev_release = ["towncrier (>=19.2,<20.0)", "sphinx-rtd-theme (>=0.5,<1.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=4.1.2,<6)", "pydoctor (>=21.9.0,<21.10.0)"] +dev = ["coverage (>=6b1,<7)", "pydoctor (>=22.9.0,<22.10.0)", "pyflakes (>=2.2,<3.0)", "python-subunit (>=1.4,<2.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)", "sphinx-rtd-theme (>=1.0,<2.0)", "towncrier (>=22.8,<23.0)", "twistedchecker (>=0.7,<1.0)"] +dev-release = ["pydoctor (>=22.9.0,<22.10.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)", "sphinx-rtd-theme (>=1.0,<2.0)", "towncrier (>=22.8,<23.0)"] +gtk-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pygobject", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] http2 = ["h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)"] -macos_platform = ["pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "pyopenssl (>=16.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] -mypy = ["mypy (==0.930)", "mypy-zope (==0.3.4)", "types-setuptools", "types-pyopenssl", "towncrier (>=19.2,<20.0)", "sphinx-rtd-theme (>=0.5,<1.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=4.1.2,<6)", "pyflakes (>=2.2,<3.0)", "twistedchecker (>=0.7,<1.0)", "coverage (>=6b1,<7)", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "pyopenssl (>=16.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pynacl", "pywin32 (!=226)", "python-subunit (>=1.4,<2.0)", "contextvars (>=2.4,<3)", "pydoctor (>=21.9.0,<21.10.0)"] -osx_platform = ["pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "pyopenssl (>=16.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] +macos-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyobjc-core", "pyobjc-framework-CFNetwork", "pyobjc-framework-Cocoa", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] +mypy = ["PyHamcrest (>=1.9.0)", "PyNaCl", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "coverage (>=6b1,<7)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "mypy (==0.930)", "mypy-zope (==0.3.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pydoctor (>=22.9.0,<22.10.0)", "pyflakes (>=2.2,<3.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "python-subunit (>=1.4,<2.0)", "pywin32 (!=226)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "service-identity (>=18.1.0)", "sphinx (>=5.0,<6)", "sphinx-rtd-theme (>=1.0,<2.0)", "towncrier (>=22.8,<23.0)", "twistedchecker (>=0.7,<1.0)", "types-pyOpenSSL", "types-setuptools"] +osx-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyobjc-core", "pyobjc-framework-CFNetwork", "pyobjc-framework-Cocoa", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] serial = ["pyserial (>=3.0)", "pywin32 (!=226)"] -test = ["cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)"] -tls = ["pyopenssl (>=16.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)"] -windows_platform = ["pywin32 (!=226)", "cython-test-exception-raiser (>=1.0.2,<2)", "PyHamcrest (>=1.9.0)", "pyopenssl (>=16.0.0)", "service-identity (>=18.1.0)", "idna (>=2.4)", "pyasn1", "cryptography (>=2.6)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "pyserial (>=3.0)", "h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)", "pywin32 (!=226)", "contextvars (>=2.4,<3)"] +test = ["PyHamcrest (>=1.9.0)", "cython-test-exception-raiser (>=1.0.2,<2)", "hypothesis (>=6.0,<7.0)"] +tls = ["idna (>=2.4)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)"] +windows-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] [[package]] name = "twisted-iocpsupport" -version = "1.0.2" +version = "1.0.3" description = "An extension for use in the twisted I/O Completion Ports reactor." -category = "main" optional = false python-versions = "*" +files = [ + {file = "twisted-iocpsupport-1.0.3.tar.gz", hash = "sha256:afb00801fdfbaccf0d0173a722626500023d4a19719ac9f129d1347a32e2fc66"}, + {file = "twisted_iocpsupport-1.0.3-cp310-cp310-win32.whl", hash = "sha256:a379ef56a576c8090889f74441bc3822ca31ac82253cc61e8d50631bcb0c26d0"}, + {file = "twisted_iocpsupport-1.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1ea2c3fbdb739c95cc8b3355305cd593d2c9ec56d709207aa1a05d4d98671e85"}, + {file = "twisted_iocpsupport-1.0.3-cp311-cp311-win32.whl", hash = "sha256:7efcdfafb377f32db90f42bd5fc5bb32cd1e3637ee936cdaf3aff4f4786ab3bf"}, + {file = "twisted_iocpsupport-1.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1dbfac706972bf9ec5ce1ddbc735d2ebba406ad363345df8751ffd5252aa1618"}, + {file = "twisted_iocpsupport-1.0.3-cp36-cp36m-win32.whl", hash = "sha256:1ddfc5fa22ec6f913464b736b3f46e642237f17ac41be47eed6fa9bd52f5d0e0"}, + {file = "twisted_iocpsupport-1.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:1bdccbb22199fc69fd7744d6d2dfd22d073c028c8611d994b41d2d2ad0e0f40d"}, + {file = "twisted_iocpsupport-1.0.3-cp37-cp37m-win32.whl", hash = "sha256:db11c80054b52dbdea44d63d5474a44c9a6531882f0e2960268b15123088641a"}, + {file = "twisted_iocpsupport-1.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:67bec1716eb8f466ef366bbf262e1467ecc9e20940111207663ac24049785bad"}, + {file = "twisted_iocpsupport-1.0.3-cp38-cp38-win32.whl", hash = "sha256:98a6f16ab215f8c1446e9fc60aaed0ab7c746d566aa2f3492a23cea334e6bebb"}, + {file = "twisted_iocpsupport-1.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:4f249d0baac836bb431d6fa0178be063a310136bc489465a831e3abd2d7acafd"}, + {file = "twisted_iocpsupport-1.0.3-cp39-cp39-win32.whl", hash = "sha256:aaca8f30c3b7c80d27a33fe9fe0d0bac42b1b012ddc60f677175c30e1becc1f3"}, + {file = "twisted_iocpsupport-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:dff43136c33665c2d117a73706aef6f7d6433e5c4560332a118fe066b16b8695"}, + {file = "twisted_iocpsupport-1.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8faceae553cfadc42ad791b1790e7cdecb7751102608c405217f6a26e877e0c5"}, + {file = "twisted_iocpsupport-1.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6f8c433faaad5d53d30d1da6968d5a3730df415e2efb6864847267a9b51290cd"}, + {file = "twisted_iocpsupport-1.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3f39c41c0213a81a9ce0961e30d0d7650f371ad80f8d261007d15a2deb6d5be3"}, +] [[package]] name = "txaio" -version = "22.2.1" +version = "23.1.1" description = "Compatibility API between asyncio/Twisted/Trollius" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "txaio-23.1.1-py2.py3-none-any.whl", hash = "sha256:aaea42f8aad50e0ecfb976130ada140797e9dcb85fad2cf72b0f37f8cefcb490"}, + {file = "txaio-23.1.1.tar.gz", hash = "sha256:f9a9216e976e5e3246dfd112ad7ad55ca915606b60b84a757ac769bd404ff704"}, +] [package.extras] -all = ["zope.interface (>=5.2.0)", "twisted (>=20.3.0)"] -dev = ["wheel", "pytest (>=2.6.4)", "pytest-cov (>=1.8.1)", "pep8 (>=1.6.2)", "sphinx (>=1.2.3)", "pyenchant (>=1.6.6)", "sphinxcontrib-spelling (>=2.1.2)", "sphinx-rtd-theme (>=0.1.9)", "tox (>=2.1.1)", "twine (>=1.6.5)", "tox-gh-actions (>=2.2.0)"] -twisted = ["zope.interface (>=5.2.0)", "twisted (>=20.3.0)"] +all = ["twisted (>=20.3.0)", "zope.interface (>=5.2.0)"] +dev = ["pep8 (>=1.6.2)", "pyenchant (>=1.6.6)", "pytest (>=2.6.4)", "pytest-cov (>=1.8.1)", "sphinx (>=1.2.3)", "sphinx-rtd-theme (>=0.1.9)", "sphinxcontrib-spelling (>=2.1.2)", "tox (>=2.1.1)", "tox-gh-actions (>=2.2.0)", "twine (>=1.6.5)", "wheel"] +twisted = ["twisted (>=20.3.0)", "zope.interface (>=5.2.0)"] [[package]] name = "typed-ast" -version = "1.5.2" +version = "1.5.4" description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, + {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, + {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, + {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, + {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, + {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, + {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, + {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, + {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, + {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, + {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, + {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, + {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, + {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, + {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, + {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, + {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, + {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, + {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, + {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, + {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, + {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, + {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, + {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, +] [[package]] name = "types-pytz" -version = "2021.3.6" +version = "2023.3.0.0" description = "Typing stubs for pytz" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "types-pytz-2023.3.0.0.tar.gz", hash = "sha256:ecdc70d543aaf3616a7e48631543a884f74205f284cefd6649ddf44c6a820aac"}, + {file = "types_pytz-2023.3.0.0-py3-none-any.whl", hash = "sha256:4fc2a7fbbc315f0b6630e0b899fd6c743705abe1094d007b0e612d10da15e0f3"}, +] [[package]] name = "types-pyyaml" -version = "6.0.5" +version = "6.0.12.10" description = "Typing stubs for PyYAML" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "types-PyYAML-6.0.12.10.tar.gz", hash = "sha256:ebab3d0700b946553724ae6ca636ea932c1b0868701d4af121630e78d695fc97"}, + {file = "types_PyYAML-6.0.12.10-py3-none-any.whl", hash = "sha256:662fa444963eff9b68120d70cda1af5a5f2aa57900003c2006d7626450eaae5f"}, +] [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" -category = "main" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] + +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] [[package]] name = "urllib3" -version = "1.26.9" +version = "2.0.3" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, + {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, +] [package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "verspec" version = "0.1.0" description = "Flexible version handling" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31"}, + {file = "verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e"}, +] [package.extras] test = ["coverage", "flake8 (>=3.7)", "mypy", "pretend", "pytest"] [[package]] name = "watchdog" -version = "2.1.7" +version = "3.0.0" description = "Filesystem events monitoring" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, + {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, + {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, + {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, + {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, + {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, + {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, + {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, + {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, +] [package.extras] watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcwidth" -version = "0.2.5" +version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" -category = "main" optional = false python-versions = "*" +files = [ + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, + {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, +] [[package]] name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "main" optional = false python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] [[package]] name = "whitenoise" version = "5.3.0" description = "Radically simplified static file serving for WSGI applications" -category = "main" optional = false python-versions = ">=3.5, <4" +files = [ + {file = "whitenoise-5.3.0-py2.py3-none-any.whl", hash = "sha256:d963ef25639d1417e8a247be36e6aedd8c7c6f0a08adcb5a89146980a96b577c"}, + {file = "whitenoise-5.3.0.tar.gz", hash = "sha256:d234b871b52271ae7ed6d9da47ffe857c76568f11dd30e28e18c5869dbd11e12"}, +] [package.extras] -brotli = ["brotli"] +brotli = ["Brotli"] [[package]] name = "xarray" -version = "2022.3.0" +version = "2023.6.0" description = "N-D labeled arrays and datasets in Python" -category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +files = [ + {file = "xarray-2023.6.0-py3-none-any.whl", hash = "sha256:bdd4c45511ab4e84f4249ea1030336db59b750968f25369d8e132d6d7ead7cc9"}, + {file = "xarray-2023.6.0.tar.gz", hash = "sha256:267a231ee4efc0341ebbffc6d4ec60e4a66e4849c16e0305c03fcefeca77698c"}, +] [package.dependencies] -numpy = ">=1.18" -packaging = ">=20.0" -pandas = ">=1.1" +numpy = ">=1.21" +packaging = ">=21.3" +pandas = ">=1.4" [package.extras] -accel = ["scipy", "bottleneck", "numbagg"] -complete = ["netcdf4", "h5netcdf", "scipy", "pydap", "zarr", "fsspec", "cftime", "rasterio", "cfgrib", "pooch", "bottleneck", "numbagg", "dask", "matplotlib", "seaborn", "nc-time-axis"] -docs = ["netcdf4", "h5netcdf", "scipy", "pydap", "zarr", "fsspec", "cftime", "rasterio", "cfgrib", "pooch", "bottleneck", "numbagg", "dask", "matplotlib", "seaborn", "nc-time-axis", "sphinx-autosummary-accessors", "sphinx-rtd-theme", "ipython", "ipykernel", "jupyter-client", "nbsphinx", "scanpydoc"] -io = ["netcdf4", "h5netcdf", "scipy", "pydap", "zarr", "fsspec", "cftime", "rasterio", "cfgrib", "pooch"] -parallel = ["dask"] -viz = ["matplotlib", "seaborn", "nc-time-axis"] - -[[package]] -name = "zict" -version = "2.1.0" -description = "Mutable mapping tools" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -heapdict = "*" +accel = ["bottleneck", "flox", "numbagg", "scipy"] +complete = ["bottleneck", "cftime", "dask[complete]", "flox", "fsspec", "h5netcdf", "matplotlib", "nc-time-axis", "netCDF4", "numbagg", "pooch", "pydap", "scipy", "seaborn", "zarr"] +docs = ["bottleneck", "cftime", "dask[complete]", "flox", "fsspec", "h5netcdf", "ipykernel", "ipython", "jupyter-client", "matplotlib", "nbsphinx", "nc-time-axis", "netCDF4", "numbagg", "pooch", "pydap", "scanpydoc", "scipy", "seaborn", "sphinx-autosummary-accessors", "sphinx-rtd-theme", "zarr"] +io = ["cftime", "fsspec", "h5netcdf", "netCDF4", "pooch", "pydap", "scipy", "zarr"] +parallel = ["dask[complete]"] +viz = ["matplotlib", "nc-time-axis", "seaborn"] [[package]] name = "zipp" -version = "3.8.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] -name = "zope.event" -version = "4.5.0" +name = "zope-event" +version = "5.0" description = "Very basic event publishing system" -category = "main" optional = true -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "zope.event-5.0-py3-none-any.whl", hash = "sha256:2832e95014f4db26c47a13fdaef84cef2f4df37e66b59d8f1f4a8f319a632c26"}, + {file = "zope.event-5.0.tar.gz", hash = "sha256:bac440d8d9891b4068e2b5a2c5e2c9765a9df762944bda6955f96bb9b91e67cd"}, +] + +[package.dependencies] +setuptools = "*" [package.extras] -docs = ["sphinx"] +docs = ["Sphinx"] test = ["zope.testrunner"] [[package]] -name = "zope.interface" -version = "5.4.0" +name = "zope-interface" +version = "6.0" description = "Interfaces for Python" -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.extras] -docs = ["sphinx", "repoze.sphinx.autointerface"] +python-versions = ">=3.7" +files = [ + {file = "zope.interface-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f299c020c6679cb389814a3b81200fe55d428012c5e76da7e722491f5d205990"}, + {file = "zope.interface-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee4b43f35f5dc15e1fec55ccb53c130adb1d11e8ad8263d68b1284b66a04190d"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a158846d0fca0a908c1afb281ddba88744d403f2550dc34405c3691769cdd85"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72f23bab1848edb7472309e9898603141644faec9fd57a823ea6b4d1c4c8995"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f4d38cf4b462e75fac78b6f11ad47b06b1c568eb59896db5b6ec1094eb467f"}, + {file = "zope.interface-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:87b690bbee9876163210fd3f500ee59f5803e4a6607d1b1238833b8885ebd410"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2363e5fd81afb650085c6686f2ee3706975c54f331b426800b53531191fdf28"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af169ba897692e9cd984a81cb0f02e46dacdc07d6cf9fd5c91e81f8efaf93d52"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa90bac61c9dc3e1a563e5babb3fd2c0c1c80567e815442ddbe561eadc803b30"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89086c9d3490a0f265a3c4b794037a84541ff5ffa28bb9c24cc9f66566968464"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809fe3bf1a91393abc7e92d607976bbb8586512913a79f2bf7d7ec15bd8ea518"}, + {file = "zope.interface-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:0ec9653825f837fbddc4e4b603d90269b501486c11800d7c761eee7ce46d1bbb"}, + {file = "zope.interface-6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:790c1d9d8f9c92819c31ea660cd43c3d5451df1df61e2e814a6f99cebb292788"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39b8711578dcfd45fc0140993403b8a81e879ec25d53189f3faa1f006087dca"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eba51599370c87088d8882ab74f637de0c4f04a6d08a312dce49368ba9ed5c2a"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee934f023f875ec2cfd2b05a937bd817efcc6c4c3f55c5778cbf78e58362ddc"}, + {file = "zope.interface-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:042f2381118b093714081fd82c98e3b189b68db38ee7d35b63c327c470ef8373"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dfbbbf0809a3606046a41f8561c3eada9db811be94138f42d9135a5c47e75f6f"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:424d23b97fa1542d7be882eae0c0fc3d6827784105264a8169a26ce16db260d8"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e538f2d4a6ffb6edfb303ce70ae7e88629ac6e5581870e66c306d9ad7b564a58"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12175ca6b4db7621aedd7c30aa7cfa0a2d65ea3a0105393e05482d7a2d367446"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3d7dfd897a588ec27e391edbe3dd320a03684457470415870254e714126b1f"}, + {file = "zope.interface-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b3f543ae9d3408549a9900720f18c0194ac0fe810cecda2a584fd4dca2eb3bb8"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0583b75f2e70ec93f100931660328965bb9ff65ae54695fb3fa0a1255daa6f2"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:23ac41d52fd15dd8be77e3257bc51bbb82469cf7f5e9a30b75e903e21439d16c"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99856d6c98a326abbcc2363827e16bd6044f70f2ef42f453c0bd5440c4ce24e5"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1592f68ae11e557b9ff2bc96ac8fc30b187e77c45a3c9cd876e3368c53dc5ba8"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4407b1435572e3e1610797c9203ad2753666c62883b921318c5403fb7139dec2"}, + {file = "zope.interface-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:5171eb073474a5038321409a630904fd61f12dd1856dd7e9d19cd6fe092cbbc5"}, + {file = "zope.interface-6.0.tar.gz", hash = "sha256:aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] @@ -2449,1598 +4051,6 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] prod = ["gevent", "gunicorn"] [metadata] -lock-version = "1.1" -python-versions = ">=3.8.0,<3.11" -content-hash = "08e4e2b96978a6d91e670229ddcd6ce6c17f10e4f12099de6b8741781695bcf8" - -[metadata.files] -ansicon = [ - {file = "ansicon-1.89.0-py2.py3-none-any.whl", hash = "sha256:f1def52d17f65c2c9682cf8370c03f541f410c1752d6a14029f97318e4b9dfec"}, - {file = "ansicon-1.89.0.tar.gz", hash = "sha256:e4d039def5768a47e4afec8e89e83ec3ae5a26bf00ad851f914d1240b444d2b1"}, -] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] -appnope = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, -] -arrow = [ - {file = "arrow-1.2.2-py3-none-any.whl", hash = "sha256:d622c46ca681b5b3e3574fcb60a04e5cc81b9625112d5fb2b44220c36c892177"}, - {file = "arrow-1.2.2.tar.gz", hash = "sha256:05caf1fd3d9a11a1135b2b6f09887421153b94558e5ef4d090b567b47173ac2b"}, -] -asgiref = [ - {file = "asgiref-3.5.0-py3-none-any.whl", hash = "sha256:88d59c13d634dcffe0510be048210188edd79aeccb6a6c9028cdad6f31d730a9"}, - {file = "asgiref-3.5.0.tar.gz", hash = "sha256:2f8abc20f7248433085eda803936d98992f1343ddb022065779f37c5da0181d0"}, -] -astropy = [ - {file = "astropy-5.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89690dc5a0b81be16cc2db2a565f9a5b01901cb29124e9c96a60b8115359d425"}, - {file = "astropy-5.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37f8a52a091f9f652e1389453eab727e1546153b6bfe29e88c3095ba2abc97e1"}, - {file = "astropy-5.0.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:64e6fbd475f7ddf79b8a11017c5ef06e8a067d0ceb1385f1bfb9c6b6f6d15734"}, - {file = "astropy-5.0.4-cp310-cp310-win32.whl", hash = "sha256:90be582e150b42a32ea166d3d622e42a489ec354890dcdefcbd6f1e6013f7fa5"}, - {file = "astropy-5.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:304e83dfb7235e2aa3d889b6b90a5b8032acaa887be01d77cd74a2856e6c5eef"}, - {file = "astropy-5.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:87416b21419f7718b6ceeaa5df31550ecd3b93937af77e5df1743f4cf4d5deba"}, - {file = "astropy-5.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:60dbda630ad1ba552c387f54898e733a09f0a8482eb1e855f222ec1e93445639"}, - {file = "astropy-5.0.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8ff2e6a3d58e26b9950d39a4496ab4092982a1c83b551c05309776eb585804f"}, - {file = "astropy-5.0.4-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3ba320708b175ff87d9bbaba43104a98dfd8f2764b5e0ae40a86e27f25046fad"}, - {file = "astropy-5.0.4-cp38-cp38-win32.whl", hash = "sha256:b3a97c8aec1b6e84f17710c004b9b3bc3dff8d036736c051b882f63e1c79fe25"}, - {file = "astropy-5.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:9c584d41a8bc3446aa7dc24102dfdf6247d488dbecd1f1dc433ed2c5f8101279"}, - {file = "astropy-5.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f69a07773d5114c83152aa6bd20d88858534960c45d211312e65f5e1ad14f60"}, - {file = "astropy-5.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:50d8c58a232b34cb969186418b4b6314a22f25dc8a7ac6ea306f115316b07932"}, - {file = "astropy-5.0.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdcf04de88946068a1abbb4ea8664dee8b7cd221ca547d00cf10fc9db76de3ce"}, - {file = "astropy-5.0.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:18c916417803273bfb6cfc56c7d9dca37fefa9d05c259d29346d3040e51184a6"}, - {file = "astropy-5.0.4-cp39-cp39-win32.whl", hash = "sha256:3a23ca012799969deebe1e64b72c3095c90e6861d8a2e8c989382b333d418aca"}, - {file = "astropy-5.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:d2b2e1f23f5cf91a9067028ec09d8d4daf67c2027707563c47e10ed9009fefd5"}, - {file = "astropy-5.0.4.tar.gz", hash = "sha256:001184f1a9c3f526a363883ce28efb9cbf076df3d151ca3e131509a248f0dfb9"}, -] -astroquery = [ - {file = "astroquery-0.4.6-py3-none-any.whl", hash = "sha256:e1bc4996af7500370837d31491bd4ee7f0c954c78d24cd54fb1cceb755469094"}, - {file = "astroquery-0.4.6.tar.gz", hash = "sha256:307ca554cb734a0ca9a22f86f5effe7e413af913ae65e1578972d847b1fe13ee"}, -] -astunparse = [ - {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, - {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, -] -attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, -] -autobahn = [ - {file = "autobahn-22.3.2.tar.gz", hash = "sha256:58a887c7a196bb08d8b6624cb3695f493a9e5c9f00fd350d8d6f829b47ff9036"}, -] -automat = [ - {file = "Automat-20.2.0-py2.py3-none-any.whl", hash = "sha256:b6feb6455337df834f6c9962d6ccf771515b7d939bca142b29c20c2376bc6111"}, - {file = "Automat-20.2.0.tar.gz", hash = "sha256:7979803c74610e11ef0c0d68a2942b152df52da55336e0c9d58daf1831cbdf33"}, -] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] -backcall = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.10.0-py3-none-any.whl", hash = "sha256:9a315ce70049920ea4572a4055bc4bd700c940521d36fc858205ad4fcde149bf"}, - {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"}, -] -black = [ - {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, -] -bleach = [ - {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, - {file = "bleach-5.0.0.tar.gz", hash = "sha256:c6d6cc054bdc9c83b48b8083e236e5f00f238428666d2ce2e083eaa5fd568565"}, -] -blessed = [ - {file = "blessed-1.19.1-py2.py3-none-any.whl", hash = "sha256:63b8554ae2e0e7f43749b6715c734cc8f3883010a809bf16790102563e6cf25b"}, - {file = "blessed-1.19.1.tar.gz", hash = "sha256:9a0d099695bf621d4680dd6c73f6ad547f6a3442fbdbe80c4b1daa1edbc492fc"}, -] -bokeh = [ - {file = "bokeh-2.4.2-py3-none-any.whl", hash = "sha256:2a842d717feeee802e668054277c09054b6f1561557a16dddaf5f7c452f2728c"}, - {file = "bokeh-2.4.2.tar.gz", hash = "sha256:f0a4b53364ed3b7eb936c5cb1a4f4132369e394c7ae0a8ef420459410958033d"}, -] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cffi = [ - {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, - {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, - {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, - {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, - {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, - {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, - {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, - {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, - {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, - {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, - {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, - {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, - {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, - {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, - {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, - {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, - {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, -] -channels = [ - {file = "channels-3.0.4-py3-none-any.whl", hash = "sha256:0ff0422b4224d10efac76e451575517f155fe7c97d369b5973b116f22eeaf86c"}, - {file = "channels-3.0.4.tar.gz", hash = "sha256:fdd9a94987a23d8d7ebd97498ed8b8cc83163f37e53fc6c85098aba7a3bb8b75"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, -] -click = [ - {file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"}, - {file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"}, -] -cloudpickle = [ - {file = "cloudpickle-1.6.0-py3-none-any.whl", hash = "sha256:3a32d0eb0bc6f4d0c57fbc4f3e3780f7a81e6fee0fa935072884d58ae8e1cc7c"}, - {file = "cloudpickle-1.6.0.tar.gz", hash = "sha256:9bc994f9e9447593bd0a45371f0e7ac7333710fcf64a4eb9834bf149f4ef2f32"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -colorcet = [ - {file = "colorcet-2.0.6-py2.py3-none-any.whl", hash = "sha256:4c203d31b50a1cdd2f5dcb2f59be8b6d459de1cf74a85611215ebc25994aa261"}, - {file = "colorcet-2.0.6.tar.gz", hash = "sha256:efa44b6f4078261e62d0039c76aba17ac8d3ebaf0bc2291a111aee3905313433"}, -] -constantly = [ - {file = "constantly-15.1.0-py2.py3-none-any.whl", hash = "sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d"}, - {file = "constantly-15.1.0.tar.gz", hash = "sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35"}, -] -cryptography = [ - {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6"}, - {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86"}, - {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2"}, - {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb"}, - {file = "cryptography-36.0.2-cp36-abi3-win32.whl", hash = "sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6"}, - {file = "cryptography-36.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3"}, - {file = "cryptography-36.0.2.tar.gz", hash = "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9"}, -] -csscompressor = [ - {file = "csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05"}, -] -cycler = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, -] -daphne = [ - {file = "daphne-3.0.2-py3-none-any.whl", hash = "sha256:a9af943c79717bc52fe64a3c236ae5d3adccc8b5be19c881b442d2c3db233393"}, - {file = "daphne-3.0.2.tar.gz", hash = "sha256:76ffae916ba3aa66b46996c14fa713e46004788167a4873d647544e750e0e99f"}, -] -dask = [ - {file = "dask-2022.4.0-py3-none-any.whl", hash = "sha256:b689cb0ab40c042c5445b886c2136f42966aa57bf6c86561916ab6449b5bad1a"}, - {file = "dask-2022.4.0.tar.gz", hash = "sha256:e8d0f5840c9df56c60a48b1b3ca326a7a9597a19175b7cd55e12709ccf13ac78"}, -] -datashader = [ - {file = "datashader-0.13.0-py2.py3-none-any.whl", hash = "sha256:7888740956213f4bc27816dfbb5bfc5d3f8fd92d583632d688ccbad167e657dc"}, - {file = "datashader-0.13.0.tar.gz", hash = "sha256:e89b1c1e6d508c399738b2daf37aa102f63fc70be53cce9db90d654b19c2555f"}, -] -datashape = [ - {file = "datashape-0.5.2.tar.gz", hash = "sha256:2356ea690c3cf003c1468a243a9063144235de45b080b3652de4f3d44e57d783"}, -] -decorator = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] -defusedxml = [ - {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, - {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, -] -dill = [ - {file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"}, - {file = "dill-0.3.4.zip", hash = "sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"}, -] -distributed = [ - {file = "distributed-2022.4.0-py3-none-any.whl", hash = "sha256:14fb2d2a789be0632a96e3c34647f008869c8b961c73d2ad76cd9b15c033e122"}, - {file = "distributed-2022.4.0.tar.gz", hash = "sha256:e59bb9061bbe496b017c4374d4e76bed0e22df22bbdbd93c1cc5d60642c20671"}, -] -django = [ - {file = "Django-3.2.13-py3-none-any.whl", hash = "sha256:b896ca61edc079eb6bbaa15cf6071eb69d6aac08cce5211583cfb41515644fdf"}, - {file = "Django-3.2.13.tar.gz", hash = "sha256:6d93497a0a9bf6ba0e0b1a29cccdc40efbfc76297255b1309b3a884a688ec4b6"}, -] -django-crispy-forms = [ - {file = "django-crispy-forms-1.14.0.tar.gz", hash = "sha256:35887b8851a931374dd697207a8f56c57a9c5cb9dbf0b9fa54314da5666cea5b"}, - {file = "django_crispy_forms-1.14.0-py3-none-any.whl", hash = "sha256:bc4d2037f6de602d39c0bc452ac3029d1f5d65e88458872cc4dbc01c3a400604"}, -] -django-debug-toolbar = [ - {file = "django-debug-toolbar-3.2.4.tar.gz", hash = "sha256:644bbd5c428d3283aa9115722471769cac1bec189edf3a0c855fd8ff870375a9"}, - {file = "django_debug_toolbar-3.2.4-py3-none-any.whl", hash = "sha256:6b633b6cfee24f232d73569870f19aa86c819d750e7f3e833f2344a9eb4b4409"}, -] -django-environ = [ - {file = "django-environ-0.4.5.tar.gz", hash = "sha256:6c9d87660142608f63ec7d5ce5564c49b603ea8ff25da595fd6098f6dc82afde"}, - {file = "django_environ-0.4.5-py2.py3-none-any.whl", hash = "sha256:c57b3c11ec1f319d9474e3e5a79134f40174b17c7cc024bbb2fad84646b120c4"}, -] -django-extensions = [ - {file = "django-extensions-3.1.5.tar.gz", hash = "sha256:28e1e1bf49f0e00307ba574d645b0af3564c981a6dfc87209d48cb98f77d0b1a"}, - {file = "django_extensions-3.1.5-py3-none-any.whl", hash = "sha256:9238b9e016bb0009d621e05cf56ea8ce5cce9b32e91ad2026996a7377ca28069"}, -] -django-picklefield = [ - {file = "django-picklefield-3.0.1.tar.gz", hash = "sha256:15ccba592ca953b9edf9532e64640329cd47b136b7f8f10f2939caa5f9ce4287"}, - {file = "django_picklefield-3.0.1-py3-none-any.whl", hash = "sha256:3c702a54fde2d322fe5b2f39b8f78d9f655b8f77944ab26f703be6c0ed335a35"}, -] -django-q = [ - {file = "django-q-1.3.9.tar.gz", hash = "sha256:5c6b4d530aa3aabf9c6aa57376da1ca2abf89a1562b77038b7a04e52a4a0a91b"}, - {file = "django_q-1.3.9-py3-none-any.whl", hash = "sha256:1b74ce3a8931990b136903e3a7bc9b07243282a2b5355117246f05ed5d076e68"}, -] -django-stubs = [ - {file = "django-stubs-1.9.0.tar.gz", hash = "sha256:664843091636a917faf5256d028476559dc360fdef9050b6df87ab61b21607bf"}, - {file = "django_stubs-1.9.0-py3-none-any.whl", hash = "sha256:59c9f81af64d214b1954eaf90f037778c8d2b9c2de946a3cda177fefcf588fbd"}, -] -django-stubs-ext = [ - {file = "django-stubs-ext-0.4.0.tar.gz", hash = "sha256:3104c4748c34bd741c310a3e6af90dffba46e41bccbe243896e38a708262876b"}, - {file = "django_stubs_ext-0.4.0-py3-none-any.whl", hash = "sha256:901fc77b6338ea29fa381300ff598dd57d461a4882b756404e2aa7724f76fd7d"}, -] -django-tagulous = [ - {file = "django-tagulous-1.3.3.tar.gz", hash = "sha256:d445590ae1b5cb9b8c5a425f97bf5f01148a33419c19edeb721ebd9fdd6792fe"}, - {file = "django_tagulous-1.3.3-py3-none-any.whl", hash = "sha256:ad3bb85f4cce83a47e4c0257143229cb92a294defa02fe661823b0442b35d478"}, -] -djangorestframework = [ - {file = "djangorestframework-3.13.1-py3-none-any.whl", hash = "sha256:24c4bf58ed7e85d1fe4ba250ab2da926d263cd57d64b03e8dcef0ac683f8b1aa"}, - {file = "djangorestframework-3.13.1.tar.gz", hash = "sha256:0c33407ce23acc68eca2a6e46424b008c9c02eceb8cf18581921d0092bc1f2ee"}, -] -djangorestframework-datatables = [ - {file = "djangorestframework-datatables-0.5.1.tar.gz", hash = "sha256:6eedec2ab10772bf435c82652def29f8b245f5ef217bd5218e9b441c7545bf31"}, - {file = "djangorestframework_datatables-0.5.1-py2.py3-none-any.whl", hash = "sha256:cd76fca59c9bb96f1dd92838a82649922ae0deaaa27c11b20d6b1dc60be7ef37"}, -] -flake8 = [ - {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, - {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, -] -fonttools = [ - {file = "fonttools-4.31.2-py3-none-any.whl", hash = "sha256:2df636a3f402ef14593c6811dac0609563b8c374bd7850e76919eb51ea205426"}, - {file = "fonttools-4.31.2.zip", hash = "sha256:236b29aee6b113e8f7bee28779c1230a86ad2aac9a74a31b0aedf57e7dfb62a4"}, -] -forced_phot = [] -fsspec = [ - {file = "fsspec-2022.3.0-py3-none-any.whl", hash = "sha256:a53491b003210fce6911dd8f2d37e20c41a27ce52a655eef11b885d1578ed4cf"}, - {file = "fsspec-2022.3.0.tar.gz", hash = "sha256:fd582cc4aa0db5968bad9317cae513450eddd08b2193c4428d9349265a995523"}, -] -gevent = [ - {file = "gevent-21.12.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:2afa3f3ad528155433f6ac8bd64fa5cc303855b97004416ec719a6b1ca179481"}, - {file = "gevent-21.12.0-cp27-cp27m-win32.whl", hash = "sha256:177f93a3a90f46a5009e0841fef561601e5c637ba4332ab8572edd96af650101"}, - {file = "gevent-21.12.0-cp27-cp27m-win_amd64.whl", hash = "sha256:a5ad4ed8afa0a71e1927623589f06a9b5e8b5e77810be3125cb4d93050d3fd1f"}, - {file = "gevent-21.12.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:eae3c46f9484eaacd67ffcdf4eaf6ca830f587edd543613b0f5c4eb3c11d052d"}, - {file = "gevent-21.12.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e1899b921219fc8959ff9afb94dae36be82e0769ed13d330a393594d478a0b3a"}, - {file = "gevent-21.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c21cb5c9f4e14d75b3fe0b143ec875d7dbd1495fad6d49704b00e57e781ee0f"}, - {file = "gevent-21.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:542ae891e2aa217d2cf6d8446538fcd2f3263a40eec123b970b899bac391c47a"}, - {file = "gevent-21.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:0082d8a5d23c35812ce0e716a91ede597f6dd2c5ff508a02a998f73598c59397"}, - {file = "gevent-21.12.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da8d2d51a49b2a5beb02ad619ca9ddbef806ef4870ba04e5ac7b8b41a5b61db3"}, - {file = "gevent-21.12.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfff82f05f14b7f5d9ed53ccb7a609ae8604df522bb05c971bca78ec9d8b2b9"}, - {file = "gevent-21.12.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7909780f0cf18a1fc32aafd8c8e130cdd93c6e285b11263f7f2d1a0f3678bc50"}, - {file = "gevent-21.12.0-cp36-cp36m-win32.whl", hash = "sha256:bb5cb8db753469c7a9a0b8a972d2660fe851aa06eee699a1ca42988afb0aaa02"}, - {file = "gevent-21.12.0-cp36-cp36m-win_amd64.whl", hash = "sha256:c43f081cbca41d27fd8fef9c6a32cf83cb979345b20abc07bf68df165cdadb24"}, - {file = "gevent-21.12.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:74fc1ef16b86616cfddcc74f7292642b0f72dde4dd95aebf4c45bb236744be54"}, - {file = "gevent-21.12.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc2fef0f98ee180704cf95ec84f2bc2d86c6c3711bb6b6740d74e0afe708b62c"}, - {file = "gevent-21.12.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08b4c17064e28f4eb85604486abc89f442c7407d2aed249cf54544ce5c9baee6"}, - {file = "gevent-21.12.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:973749bacb7bc4f4181a8fb2a7e0e2ff44038de56d08e856dd54a5ac1d7331b4"}, - {file = "gevent-21.12.0-cp37-cp37m-win32.whl", hash = "sha256:6a02a88723ed3f0fd92cbf1df3c4cd2fbd87d82b0a4bac3e36a8875923115214"}, - {file = "gevent-21.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f289fae643a3f1c3b909d6b033e6921b05234a4907e9c9c8c3f1fe403e6ac452"}, - {file = "gevent-21.12.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:3baeeccc4791ba3f8db27179dff11855a8f9210ddd754f6c9b48e0d2561c2aea"}, - {file = "gevent-21.12.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05c5e8a50cd6868dd36536c92fb4468d18090e801bd63611593c0717bab63692"}, - {file = "gevent-21.12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d86438ede1cbe0fde6ef4cc3f72bf2f1ecc9630d8b633ff344a3aeeca272cdd"}, - {file = "gevent-21.12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:01928770972181ad8866ee37ea3504f1824587b188fcab782ef1619ce7538766"}, - {file = "gevent-21.12.0-cp38-cp38-win32.whl", hash = "sha256:3c012c73e6c61f13c75e3a4869dbe6a2ffa025f103421a6de9c85e627e7477b1"}, - {file = "gevent-21.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:b7709c64afa8bb3000c28bb91ec42c79594a7cb0f322e20427d57f9762366a5b"}, - {file = "gevent-21.12.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:ec21f9eaaa6a7b1e62da786132d6788675b314f25f98d9541f1bf00584ed4749"}, - {file = "gevent-21.12.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:22ce1f38fdfe2149ffe8ec2131ca45281791c1e464db34b3b4321ae9d8d2efbb"}, - {file = "gevent-21.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ccffcf708094564e442ac6fde46f0ae9e40015cb69d995f4b39cc29a7643881"}, - {file = "gevent-21.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24d3550fbaeef5fddd794819c2853bca45a86c3d64a056a2c268d981518220d1"}, - {file = "gevent-21.12.0-cp39-cp39-win32.whl", hash = "sha256:2bcec9f80196c751fdcf389ca9f7141e7b0db960d8465ed79be5e685bfcad682"}, - {file = "gevent-21.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:3dad62f55fad839d498c801e139481348991cee6e1c7706041b5fe096cb6a279"}, - {file = "gevent-21.12.0-pp27-pypy_73-win_amd64.whl", hash = "sha256:9f9652d1e4062d4b5b5a0a49ff679fa890430b5f76969d35dccb2df114c55e0f"}, - {file = "gevent-21.12.0.tar.gz", hash = "sha256:f48b64578c367b91fa793bf8eaaaf4995cb93c8bc45860e473bf868070ad094e"}, -] -ghp-import = [ - {file = "ghp-import-2.0.2.tar.gz", hash = "sha256:947b3771f11be850c852c64b561c600fdddf794bab363060854c1ee7ad05e071"}, - {file = "ghp_import-2.0.2-py3-none-any.whl", hash = "sha256:5f8962b30b20652cdffa9c5a9812f7de6bcb56ec475acac579807719bf242c46"}, -] -gitdb = [ - {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, - {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, -] -gitpython = [ - {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, - {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, -] -greenlet = [ - {file = "greenlet-1.1.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:58df5c2a0e293bf665a51f8a100d3e9956febfbf1d9aaf8c0677cf70218910c6"}, - {file = "greenlet-1.1.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:aec52725173bd3a7b56fe91bc56eccb26fbdff1386ef123abb63c84c5b43b63a"}, - {file = "greenlet-1.1.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:833e1551925ed51e6b44c800e71e77dacd7e49181fdc9ac9a0bf3714d515785d"}, - {file = "greenlet-1.1.2-cp27-cp27m-win32.whl", hash = "sha256:aa5b467f15e78b82257319aebc78dd2915e4c1436c3c0d1ad6f53e47ba6e2713"}, - {file = "greenlet-1.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:40b951f601af999a8bf2ce8c71e8aaa4e8c6f78ff8afae7b808aae2dc50d4c40"}, - {file = "greenlet-1.1.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:95e69877983ea39b7303570fa6760f81a3eec23d0e3ab2021b7144b94d06202d"}, - {file = "greenlet-1.1.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:356b3576ad078c89a6107caa9c50cc14e98e3a6c4874a37c3e0273e4baf33de8"}, - {file = "greenlet-1.1.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8639cadfda96737427330a094476d4c7a56ac03de7265622fcf4cfe57c8ae18d"}, - {file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e5306482182170ade15c4b0d8386ded995a07d7cc2ca8f27958d34d6736497"}, - {file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6a36bb9474218c7a5b27ae476035497a6990e21d04c279884eb10d9b290f1b1"}, - {file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abb7a75ed8b968f3061327c433a0fbd17b729947b400747c334a9c29a9af6c58"}, - {file = "greenlet-1.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b336501a05e13b616ef81ce329c0e09ac5ed8c732d9ba7e3e983fcc1a9e86965"}, - {file = "greenlet-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:14d4f3cd4e8b524ae9b8aa567858beed70c392fdec26dbdb0a8a418392e71708"}, - {file = "greenlet-1.1.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:17ff94e7a83aa8671a25bf5b59326ec26da379ace2ebc4411d690d80a7fbcf23"}, - {file = "greenlet-1.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9f3cba480d3deb69f6ee2c1825060177a22c7826431458c697df88e6aeb3caee"}, - {file = "greenlet-1.1.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:fa877ca7f6b48054f847b61d6fa7bed5cebb663ebc55e018fda12db09dcc664c"}, - {file = "greenlet-1.1.2-cp35-cp35m-win32.whl", hash = "sha256:7cbd7574ce8e138bda9df4efc6bf2ab8572c9aff640d8ecfece1b006b68da963"}, - {file = "greenlet-1.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:903bbd302a2378f984aef528f76d4c9b1748f318fe1294961c072bdc7f2ffa3e"}, - {file = "greenlet-1.1.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:049fe7579230e44daef03a259faa24511d10ebfa44f69411d99e6a184fe68073"}, - {file = "greenlet-1.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:dd0b1e9e891f69e7675ba5c92e28b90eaa045f6ab134ffe70b52e948aa175b3c"}, - {file = "greenlet-1.1.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7418b6bfc7fe3331541b84bb2141c9baf1ec7132a7ecd9f375912eca810e714e"}, - {file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9d29ca8a77117315101425ec7ec2a47a22ccf59f5593378fc4077ac5b754fce"}, - {file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21915eb821a6b3d9d8eefdaf57d6c345b970ad722f856cd71739493ce003ad08"}, - {file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eff9d20417ff9dcb0d25e2defc2574d10b491bf2e693b4e491914738b7908168"}, - {file = "greenlet-1.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b8c008de9d0daba7b6666aa5bbfdc23dcd78cafc33997c9b7741ff6353bafb7f"}, - {file = "greenlet-1.1.2-cp36-cp36m-win32.whl", hash = "sha256:32ca72bbc673adbcfecb935bb3fb1b74e663d10a4b241aaa2f5a75fe1d1f90aa"}, - {file = "greenlet-1.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f0214eb2a23b85528310dad848ad2ac58e735612929c8072f6093f3585fd342d"}, - {file = "greenlet-1.1.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:b92e29e58bef6d9cfd340c72b04d74c4b4e9f70c9fa7c78b674d1fec18896dc4"}, - {file = "greenlet-1.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fdcec0b8399108577ec290f55551d926d9a1fa6cad45882093a7a07ac5ec147b"}, - {file = "greenlet-1.1.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:93f81b134a165cc17123626ab8da2e30c0455441d4ab5576eed73a64c025b25c"}, - {file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e12bdc622676ce47ae9abbf455c189e442afdde8818d9da983085df6312e7a1"}, - {file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c790abda465726cfb8bb08bd4ca9a5d0a7bd77c7ac1ca1b839ad823b948ea28"}, - {file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f276df9830dba7a333544bd41070e8175762a7ac20350786b322b714b0e654f5"}, - {file = "greenlet-1.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c5d5b35f789a030ebb95bff352f1d27a93d81069f2adb3182d99882e095cefe"}, - {file = "greenlet-1.1.2-cp37-cp37m-win32.whl", hash = "sha256:64e6175c2e53195278d7388c454e0b30997573f3f4bd63697f88d855f7a6a1fc"}, - {file = "greenlet-1.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b11548073a2213d950c3f671aa88e6f83cda6e2fb97a8b6317b1b5b33d850e06"}, - {file = "greenlet-1.1.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:9633b3034d3d901f0a46b7939f8c4d64427dfba6bbc5a36b1a67364cf148a1b0"}, - {file = "greenlet-1.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:eb6ea6da4c787111adf40f697b4e58732ee0942b5d3bd8f435277643329ba627"}, - {file = "greenlet-1.1.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:f3acda1924472472ddd60c29e5b9db0cec629fbe3c5c5accb74d6d6d14773478"}, - {file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e859fcb4cbe93504ea18008d1df98dee4f7766db66c435e4882ab35cf70cac43"}, - {file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e44c8afdbe5467e4f7b5851be223be68adb4272f44696ee71fe46b7036a711"}, - {file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec8c433b3ab0419100bd45b47c9c8551248a5aee30ca5e9d399a0b57ac04651b"}, - {file = "greenlet-1.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2bde6792f313f4e918caabc46532aa64aa27a0db05d75b20edfc5c6f46479de2"}, - {file = "greenlet-1.1.2-cp38-cp38-win32.whl", hash = "sha256:288c6a76705dc54fba69fbcb59904ae4ad768b4c768839b8ca5fdadec6dd8cfd"}, - {file = "greenlet-1.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:8d2f1fb53a421b410751887eb4ff21386d119ef9cde3797bf5e7ed49fb51a3b3"}, - {file = "greenlet-1.1.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:166eac03e48784a6a6e0e5f041cfebb1ab400b394db188c48b3a84737f505b67"}, - {file = "greenlet-1.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:572e1787d1460da79590bf44304abbc0a2da944ea64ec549188fa84d89bba7ab"}, - {file = "greenlet-1.1.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:be5f425ff1f5f4b3c1e33ad64ab994eed12fc284a6ea71c5243fd564502ecbe5"}, - {file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1692f7d6bc45e3200844be0dba153612103db241691088626a33ff1f24a0d88"}, - {file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7227b47e73dedaa513cdebb98469705ef0d66eb5a1250144468e9c3097d6b59b"}, - {file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff61ff178250f9bb3cd89752df0f1dd0e27316a8bd1465351652b1b4a4cdfd3"}, - {file = "greenlet-1.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0051c6f1f27cb756ffc0ffbac7d2cd48cb0362ac1736871399a739b2885134d3"}, - {file = "greenlet-1.1.2-cp39-cp39-win32.whl", hash = "sha256:f70a9e237bb792c7cc7e44c531fd48f5897961701cdaa06cf22fc14965c496cf"}, - {file = "greenlet-1.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:013d61294b6cd8fe3242932c1c5e36e5d1db2c8afb58606c5a67efce62c1f5fd"}, - {file = "greenlet-1.1.2.tar.gz", hash = "sha256:e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a"}, -] -griffe = [ - {file = "griffe-0.15.0-py3-none-any.whl", hash = "sha256:2f90687162110edfbd94d341eed569e450f60c9a96793a1b0ea38846ea18c289"}, - {file = "griffe-0.15.0.tar.gz", hash = "sha256:80dd57f694327e4dd534fa88a23b7aa784b3e15cd61351c628efd226c6247143"}, -] -gunicorn = [ - {file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"}, - {file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"}, -] -heapdict = [ - {file = "HeapDict-1.0.1-py3-none-any.whl", hash = "sha256:6065f90933ab1bb7e50db403b90cab653c853690c5992e69294c2de2b253fc92"}, - {file = "HeapDict-1.0.1.tar.gz", hash = "sha256:8495f57b3e03d8e46d5f1b2cc62ca881aca392fd5cc048dc0aa2e1a6d23ecdb6"}, -] -holoviews = [ - {file = "holoviews-1.14.8-py2.py3-none-any.whl", hash = "sha256:aa3838d0a81552a6c85b834fc7fae284472538ff4c67da8a44b2eeaa7d319ea5"}, - {file = "holoviews-1.14.8.tar.gz", hash = "sha256:6c365599a2cb16793bb627c9b5c5430982bb591c9de8885002ff91b539b61133"}, -] -html5lib = [ - {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, - {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, -] -htmlmin = [ - {file = "htmlmin-0.1.12.tar.gz", hash = "sha256:50c1ef4630374a5d723900096a961cff426dff46b48f34d194a81bbe14eca178"}, -] -hyperlink = [ - {file = "hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4"}, - {file = "hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, -] -incremental = [ - {file = "incremental-21.3.0-py2.py3-none-any.whl", hash = "sha256:92014aebc6a20b78a8084cdd5645eeaa7f74b8933f70fa3ada2cfbd1e3b54321"}, - {file = "incremental-21.3.0.tar.gz", hash = "sha256:02f5de5aff48f6b9f665d99d48bfc7ec03b6e3943210de7cfc88856d755d6f57"}, -] -ipdb = [ - {file = "ipdb-0.13.9.tar.gz", hash = "sha256:951bd9a64731c444fd907a5ce268543020086a697f6be08f7cc2c9a752a278c5"}, -] -ipython = [ - {file = "ipython-7.32.0-py3-none-any.whl", hash = "sha256:86df2cf291c6c70b5be6a7b608650420e89180c8ec74f376a34e2dc15c3400e7"}, - {file = "ipython-7.32.0.tar.gz", hash = "sha256:468abefc45c15419e3c8e8c0a6a5c115b2127bafa34d7c641b1d443658793909"}, -] -jedi = [ - {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"}, - {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"}, -] -jeepney = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, -] -jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, -] -jinxed = [ - {file = "jinxed-1.1.0-py2.py3-none-any.whl", hash = "sha256:6a61ccf963c16aa885304f27e6e5693783676897cea0c7f223270c8b8e78baf8"}, - {file = "jinxed-1.1.0.tar.gz", hash = "sha256:d8f1731f134e9e6b04d95095845ae6c10eb15cb223a5f0cabdea87d4a279c305"}, -] -jsmin = [ - {file = "jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc"}, -] -keyring = [ - {file = "keyring-23.5.0-py3-none-any.whl", hash = "sha256:b0d28928ac3ec8e42ef4cc227822647a19f1d544f21f96457965dc01cf555261"}, - {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, -] -kiwisolver = [ - {file = "kiwisolver-1.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e395ece147f0692ca7cdb05a028d31b83b72c369f7b4a2c1798f4b96af1e3d8"}, - {file = "kiwisolver-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b7f50a1a25361da3440f07c58cd1d79957c2244209e4f166990e770256b6b0b"}, - {file = "kiwisolver-1.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c032c41ae4c3a321b43a3650e6ecc7406b99ff3e5279f24c9b310f41bc98479"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dcade8f6fe12a2bb4efe2cbe22116556e3b6899728d3b2a0d3b367db323eacc"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e45e780a74416ef2f173189ef4387e44b5494f45e290bcb1f03735faa6779bf"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d2bb56309fb75a811d81ed55fbe2208aa77a3a09ff5f546ca95e7bb5fac6eff"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b2d6c12f2ad5f55104a36a356192cfb680c049fe5e7c1f6620fc37f119cdc2"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:262c248c60f22c2b547683ad521e8a3db5909c71f679b93876921549107a0c24"}, - {file = "kiwisolver-1.4.2-cp310-cp310-win32.whl", hash = "sha256:1008346a7741620ab9cc6c96e8ad9b46f7a74ce839dbb8805ddf6b119d5fc6c2"}, - {file = "kiwisolver-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:6ece2e12e4b57bc5646b354f436416cd2a6f090c1dadcd92b0ca4542190d7190"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b978afdb913ca953cf128d57181da2e8798e8b6153be866ae2a9c446c6162f40"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f88c4b8e449908eeddb3bbd4242bd4dc2c7a15a7aa44bb33df893203f02dc2d"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e348f1904a4fab4153407f7ccc27e43b2a139752e8acf12e6640ba683093dd96"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c839bf28e45d7ddad4ae8f986928dbf5a6d42ff79760d54ec8ada8fb263e097c"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8ae5a071185f1a93777c79a9a1e67ac46544d4607f18d07131eece08d415083a"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c222f91a45da9e01a9bc4f760727ae49050f8e8345c4ff6525495f7a164c8973"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:a4e8f072db1d6fb7a7cc05a6dbef8442c93001f4bb604f1081d8c2db3ca97159"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:be9a650890fb60393e60aacb65878c4a38bb334720aa5ecb1c13d0dac54dd73b"}, - {file = "kiwisolver-1.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ec2e55bf31b43aabe32089125dca3b46fdfe9f50afbf0756ae11e14c97b80ca"}, - {file = "kiwisolver-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d1078ba770d6165abed3d9a1be1f9e79b61515de1dd00d942fa53bba79f01ae"}, - {file = "kiwisolver-1.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cbb5eb4a2ea1ffec26268d49766cafa8f957fe5c1b41ad00733763fae77f9436"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e6cda72db409eefad6b021e8a4f964965a629f577812afc7860c69df7bdb84a"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1605c7c38cc6a85212dfd6a641f3905a33412e49f7c003f35f9ac6d71f67720"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81237957b15469ea9151ec8ca08ce05656090ffabc476a752ef5ad7e2644c526"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:240009fdf4fa87844f805e23f48995537a8cb8f8c361e35fda6b5ac97fcb906f"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:240c2d51d098395c012ddbcb9bd7b3ba5de412a1d11840698859f51d0e643c4f"}, - {file = "kiwisolver-1.4.2-cp38-cp38-win32.whl", hash = "sha256:8b6086aa6936865962b2cee0e7aaecf01ab6778ce099288354a7229b4d9f1408"}, - {file = "kiwisolver-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:0d98dca86f77b851350c250f0149aa5852b36572514d20feeadd3c6b1efe38d0"}, - {file = "kiwisolver-1.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:91eb4916271655dfe3a952249cb37a5c00b6ba68b4417ee15af9ba549b5ba61d"}, - {file = "kiwisolver-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa4d97d7d2b2c082e67907c0b8d9f31b85aa5d3ba0d33096b7116f03f8061261"}, - {file = "kiwisolver-1.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:71469b5845b9876b8d3d252e201bef6f47bf7456804d2fbe9a1d6e19e78a1e65"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8ff3033e43e7ca1389ee59fb7ecb8303abb8713c008a1da49b00869e92e3dd7c"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89b57c2984f4464840e4b768affeff6b6809c6150d1166938ade3e22fbe22db8"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffbdb9a96c536f0405895b5e21ee39ec579cb0ed97bdbd169ae2b55f41d73219"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a830a03970c462d1a2311c90e05679da56d3bd8e78a4ba9985cb78ef7836c9f"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f74f2a13af201559e3d32b9ddfc303c94ae63d63d7f4326d06ce6fe67e7a8255"}, - {file = "kiwisolver-1.4.2-cp39-cp39-win32.whl", hash = "sha256:e677cc3626287f343de751e11b1e8a5b915a6ac897e8aecdbc996cd34de753a0"}, - {file = "kiwisolver-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b3e251e5c38ac623c5d786adb21477f018712f8c6fa54781bd38aa1c60b60fc2"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c380bb5ae20d829c1a5473cfcae64267b73aaa4060adc091f6df1743784aae0"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:484f2a5f0307bc944bc79db235f41048bae4106ffa764168a068d88b644b305d"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8afdf533b613122e4bbaf3c1e42c2a5e9e2d1dd3a0a017749a7658757cb377"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42f6ef9b640deb6f7d438e0a371aedd8bef6ddfde30683491b2e6f568b4e884e"}, - {file = "kiwisolver-1.4.2.tar.gz", hash = "sha256:7f606d91b8a8816be476513a77fd30abe66227039bd6f8b406c348cb0247dcc9"}, -] -lightgallery = [ - {file = "lightgallery-0.5-py2.py3-none-any.whl", hash = "sha256:9f14d5986aff5c4e0ef17d85f85488b9f2295b904556c71f1db99e3378a6cbc6"}, - {file = "lightgallery-0.5.tar.gz", hash = "sha256:3063ba855fc96fe6b9c978845052d3e837095a55277fe1982be5748f7cb4085c"}, -] -llvmlite = [ - {file = "llvmlite-0.34.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:11342e5ac320c953590bdd9d0dec8c52f4b5252c4c6335ba25f1e7b9f91f9325"}, - {file = "llvmlite-0.34.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:5bdf0ce430adfaf938ced5844d12f80616eb8321b5b9edfc45ef84ada5c5242c"}, - {file = "llvmlite-0.34.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e08d9d2dc5a31636bfc6b516d2d7daba95632afa3419eb8730dc76a7951e9558"}, - {file = "llvmlite-0.34.0-cp36-cp36m-win32.whl", hash = "sha256:9ff1dcdad03be0cf953aca5fc8cffdca25ccee2ec9e8ec7e95571722cdc02d55"}, - {file = "llvmlite-0.34.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5acdc3c3c7ea0ef7a1a6b442272e05d695bc8492e5b07666135ed1cfbf4ab9d2"}, - {file = "llvmlite-0.34.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb96989bc57a1ccb131e7a0e061d07b68139b6f81a98912345d53d9239e231e1"}, - {file = "llvmlite-0.34.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6d3f81992f52a94077e7b9b16497029daf5b5eebb2cce56f3c8345bbc9c6308e"}, - {file = "llvmlite-0.34.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d841248d1c630426c93e3eb3f8c45bca0dab77c09faeb7553b1a500220e362ce"}, - {file = "llvmlite-0.34.0-cp37-cp37m-win32.whl", hash = "sha256:408b15ffec30696406e821c89da010f1bb1eb0aa572be4561c98eb2536d610ab"}, - {file = "llvmlite-0.34.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5d1f370bf150db7239204f09cf6a0603292ea28bac984e69b167e16fe160d803"}, - {file = "llvmlite-0.34.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:132322bc084abf336c80dd106f9357978c8c085911fb656898d3be0d9ff057ea"}, - {file = "llvmlite-0.34.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:8f344102745fceba6eb5bf03c228bb290e9bc79157e9506a4a72878d636f9b3c"}, - {file = "llvmlite-0.34.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:05253f3f44fab0148276335b2c1b2c4a78143dfa78e6bafd7f937d6248f297cc"}, - {file = "llvmlite-0.34.0-cp38-cp38-win32.whl", hash = "sha256:28264f9e2b3df4135cbcfca5a91c5b0b31dd3fc02fa623b4bb13327f0cd4fc80"}, - {file = "llvmlite-0.34.0-cp38-cp38-win_amd64.whl", hash = "sha256:964f8f7a2184963cb3617d057c2382575953e488b7bb061b632ee014cfef110a"}, - {file = "llvmlite-0.34.0.tar.gz", hash = "sha256:f03ee0d19bca8f2fe922bb424a909d05c28411983b0c2bc58b020032a0d11f63"}, -] -locket = [ - {file = "locket-0.2.1-py2.py3-none-any.whl", hash = "sha256:12b6ada59d1f50710bca9704dbadd3f447dbf8dac6664575c1281cadab8e6449"}, - {file = "locket-0.2.1.tar.gz", hash = "sha256:3e1faba403619fe201552f083f1ecbf23f550941bc51985ac6ed4d02d25056dd"}, -] -markdown = [ - {file = "Markdown-3.3.6-py3-none-any.whl", hash = "sha256:9923332318f843411e9932237530df53162e29dc7a4e2b91e35764583c46c9a3"}, - {file = "Markdown-3.3.6.tar.gz", hash = "sha256:76df8ae32294ec39dcf89340382882dfa12975f87f45c3ed1ecdb1e8cefc7006"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] -matplotlib = [ - {file = "matplotlib-3.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:456cc8334f6d1124e8ff856b42d2cc1c84335375a16448189999496549f7182b"}, - {file = "matplotlib-3.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8a77906dc2ef9b67407cec0bdbf08e3971141e535db888974a915be5e1e3efc6"}, - {file = "matplotlib-3.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e70ae6475cfd0fad3816dcbf6cac536dc6f100f7474be58d59fa306e6e768a4"}, - {file = "matplotlib-3.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53273c5487d1c19c3bc03b9eb82adaf8456f243b97ed79d09dded747abaf1235"}, - {file = "matplotlib-3.5.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3b6f3fd0d8ca37861c31e9a7cab71a0ef14c639b4c95654ea1dd153158bf0df"}, - {file = "matplotlib-3.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8c87cdaf06fd7b2477f68909838ff4176f105064a72ca9d24d3f2a29f73d393"}, - {file = "matplotlib-3.5.1-cp310-cp310-win32.whl", hash = "sha256:e2f28a07b4f82abb40267864ad7b3a4ed76f1b1663e81c7efc84a9b9248f672f"}, - {file = "matplotlib-3.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:d70a32ee1f8b55eed3fd4e892f0286df8cccc7e0475c11d33b5d0a148f5c7599"}, - {file = "matplotlib-3.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:68fa30cec89b6139dc559ed6ef226c53fd80396da1919a1b5ef672c911aaa767"}, - {file = "matplotlib-3.5.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e3484d8455af3fdb0424eae1789af61f6a79da0c80079125112fd5c1b604218"}, - {file = "matplotlib-3.5.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e293b16cf303fe82995e41700d172a58a15efc5331125d08246b520843ef21ee"}, - {file = "matplotlib-3.5.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e3520a274a0e054e919f5b3279ee5dbccf5311833819ccf3399dab7c83e90a25"}, - {file = "matplotlib-3.5.1-cp37-cp37m-win32.whl", hash = "sha256:2252bfac85cec7af4a67e494bfccf9080bcba8a0299701eab075f48847cca907"}, - {file = "matplotlib-3.5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf67e05a1b7f86583f6ebd01f69b693b9c535276f4e943292e444855870a1b8"}, - {file = "matplotlib-3.5.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6c094e4bfecd2fa7f9adffd03d8abceed7157c928c2976899de282f3600f0a3d"}, - {file = "matplotlib-3.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:506b210cc6e66a0d1c2bb765d055f4f6bc2745070fb1129203b67e85bbfa5c18"}, - {file = "matplotlib-3.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b04fc29bcef04d4e2d626af28d9d892be6aba94856cb46ed52bcb219ceac8943"}, - {file = "matplotlib-3.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:577ed20ec9a18d6bdedb4616f5e9e957b4c08563a9f985563a31fd5b10564d2a"}, - {file = "matplotlib-3.5.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e486f60db0cd1c8d68464d9484fd2a94011c1ac8593d765d0211f9daba2bd535"}, - {file = "matplotlib-3.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b71f3a7ca935fc759f2aed7cec06cfe10bc3100fadb5dbd9c435b04e557971e1"}, - {file = "matplotlib-3.5.1-cp38-cp38-win32.whl", hash = "sha256:d24e5bb8028541ce25e59390122f5e48c8506b7e35587e5135efcb6471b4ac6c"}, - {file = "matplotlib-3.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:778d398c4866d8e36ee3bf833779c940b5f57192fa0a549b3ad67bc4c822771b"}, - {file = "matplotlib-3.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bb1c613908f11bac270bc7494d68b1ef6e7c224b7a4204d5dacf3522a41e2bc3"}, - {file = "matplotlib-3.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:edf5e4e1d5fb22c18820e8586fb867455de3b109c309cb4fce3aaed85d9468d1"}, - {file = "matplotlib-3.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:40e0d7df05e8efe60397c69b467fc8f87a2affeb4d562fe92b72ff8937a2b511"}, - {file = "matplotlib-3.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a350ca685d9f594123f652ba796ee37219bf72c8e0fc4b471473d87121d6d34"}, - {file = "matplotlib-3.5.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3e66497cd990b1a130e21919b004da2f1dc112132c01ac78011a90a0f9229778"}, - {file = "matplotlib-3.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:87900c67c0f1728e6db17c6809ec05c025c6624dcf96a8020326ea15378fe8e7"}, - {file = "matplotlib-3.5.1-cp39-cp39-win32.whl", hash = "sha256:b8a4fb2a0c5afbe9604f8a91d7d0f27b1832c3e0b5e365f95a13015822b4cd65"}, - {file = "matplotlib-3.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:fe8d40c434a8e2c68d64c6d6a04e77f21791a93ff6afe0dce169597c110d3079"}, - {file = "matplotlib-3.5.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34a1fc29f8f96e78ec57a5eff5e8d8b53d3298c3be6df61e7aa9efba26929522"}, - {file = "matplotlib-3.5.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b19a761b948e939a9e20173aaae76070025f0024fc8f7ba08bef22a5c8573afc"}, - {file = "matplotlib-3.5.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6803299cbf4665eca14428d9e886de62e24f4223ac31ab9c5d6d5339a39782c7"}, - {file = "matplotlib-3.5.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:14334b9902ec776461c4b8c6516e26b450f7ebe0b3ef8703bf5cdfbbaecf774a"}, - {file = "matplotlib-3.5.1.tar.gz", hash = "sha256:b2e9810e09c3a47b73ce9cab5a72243a1258f61e7900969097a817232246ce1c"}, -] -matplotlib-inline = [ - {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"}, - {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"}, -] -mccabe = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, -] -mergedeep = [ - {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, - {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, -] -mike = [ - {file = "mike-1.1.2-py3-none-any.whl", hash = "sha256:4c307c28769834d78df10f834f57f810f04ca27d248f80a75f49c6fa2d1527ca"}, - {file = "mike-1.1.2.tar.gz", hash = "sha256:56c3f1794c2d0b5fdccfa9b9487beb013ca813de2e3ad0744724e9d34d40b77b"}, -] -mkdocs = [ - {file = "mkdocs-1.3.0-py3-none-any.whl", hash = "sha256:26bd2b03d739ac57a3e6eed0b7bcc86168703b719c27b99ad6ca91dc439aacde"}, - {file = "mkdocs-1.3.0.tar.gz", hash = "sha256:b504405b04da38795fec9b2e5e28f6aa3a73bb0960cb6d5d27ead28952bd35ea"}, -] -mkdocs-autorefs = [ - {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"}, - {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"}, -] -mkdocs-gen-files = [ - {file = "mkdocs-gen-files-0.3.4.tar.gz", hash = "sha256:c69188486bdc1e74bd2b9b7ebbde9f9eb21052ae7762f1b35420cfbfc6d7122e"}, - {file = "mkdocs_gen_files-0.3.4-py3-none-any.whl", hash = "sha256:07f43245c87a03cfb03884e767655c2a61def24d07e47fb3a8d26b1581524d6a"}, -] -mkdocs-git-revision-date-localized-plugin = [ - {file = "mkdocs-git-revision-date-localized-plugin-0.12.1.tar.gz", hash = "sha256:29a77224fdee0f125347e32ce18cc6bec0899b92f109399fcdb07ad962b9c2ea"}, - {file = "mkdocs_git_revision_date_localized_plugin-0.12.1-py3-none-any.whl", hash = "sha256:2b05dcaa0700119d92462ada141be1353b1bf90e5e11331ea32ef61a3009c958"}, -] -mkdocs-material = [ - {file = "mkdocs-material-8.2.8.tar.gz", hash = "sha256:f0696538929b3778b064f650589eb2027e4a2c0b3ab37afa8900de7924100901"}, - {file = "mkdocs_material-8.2.8-py2.py3-none-any.whl", hash = "sha256:16ccd382431d5148a4bdbc37c949d0ea5f80e3e9bcce3bd0d774716e5aad9dff"}, -] -mkdocs-material-extensions = [ - {file = "mkdocs-material-extensions-1.0.3.tar.gz", hash = "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2"}, - {file = "mkdocs_material_extensions-1.0.3-py3-none-any.whl", hash = "sha256:a82b70e533ce060b2a5d9eb2bc2e1be201cf61f901f93704b4acf6e3d5983a44"}, -] -mkdocs-minify-plugin = [ - {file = "mkdocs-minify-plugin-0.5.0.tar.gz", hash = "sha256:32d9e8fbd89327a0f4f648f517297aad344c1bad64cfde110d059bd2f2780a6d"}, - {file = "mkdocs_minify_plugin-0.5.0-py2-none-any.whl", hash = "sha256:487c31ae6b8b3230f56910ce6bcf5c7e6ad9a8c4f51c720a4b989f30c2b0233f"}, -] -mkdocstrings = [ - {file = "mkdocstrings-0.18.1-py3-none-any.whl", hash = "sha256:4053929356df8cd69ed32eef71d8f676a472ef72980c9ffd4f933ead1debcdad"}, - {file = "mkdocstrings-0.18.1.tar.gz", hash = "sha256:fb7c91ce7e3ab70488d3fa6c073a4f827cdc319042f682ef8ea95459790d64fc"}, -] -mkdocstrings-python = [ - {file = "mkdocstrings-python-0.6.6.tar.gz", hash = "sha256:37281696b9f199624ae420e0625b6659b7fdfbea736618bce7fd978682dea3b1"}, - {file = "mkdocstrings_python-0.6.6-py3-none-any.whl", hash = "sha256:c118438d3cb4b14c492a51d109f4e5b27ab06ba19b099d624430dfd904926152"}, -] -mkdocstrings-python-legacy = [ - {file = "mkdocstrings-python-legacy-0.2.2.tar.gz", hash = "sha256:f0e7ec6a19750581b752acb38f6b32fcd1efe006f14f6703125d2c2c9a5c6f02"}, - {file = "mkdocstrings_python_legacy-0.2.2-py3-none-any.whl", hash = "sha256:379107a3a5b8db9b462efc4493c122efe21e825e3702425dbd404621302a563a"}, -] -msgpack = [ - {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96acc674bb9c9be63fa8b6dabc3248fdc575c4adc005c440ad02f87ca7edd079"}, - {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c3ca57c96c8e69c1a0d2926a6acf2d9a522b41dc4253a8945c4c6cd4981a4e3"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0a792c091bac433dfe0a70ac17fc2087d4595ab835b47b89defc8bbabcf5c73"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c58cdec1cb5fcea8c2f1771d7b5fec79307d056874f746690bd2bdd609ab147"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f97c0f35b3b096a330bb4a1a9247d0bd7e1f3a2eba7ab69795501504b1c2c39"}, - {file = "msgpack-1.0.3-cp310-cp310-win32.whl", hash = "sha256:36a64a10b16c2ab31dcd5f32d9787ed41fe68ab23dd66957ca2826c7f10d0b85"}, - {file = "msgpack-1.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c1ba333b4024c17c7591f0f372e2daa3c31db495a9b2af3cf664aef3c14354f7"}, - {file = "msgpack-1.0.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c2140cf7a3ec475ef0938edb6eb363fa704159e0bf71dde15d953bacc1cf9d7d"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f4c22717c74d44bcd7af353024ce71c6b55346dad5e2cc1ddc17ce8c4507c6b"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d733a15ade190540c703de209ffbc42a3367600421b62ac0c09fde594da6ec"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7e03b06f2982aa98d4ddd082a210c3db200471da523f9ac197f2828e80e7770"}, - {file = "msgpack-1.0.3-cp36-cp36m-win32.whl", hash = "sha256:3d875631ecab42f65f9dce6f55ce6d736696ced240f2634633188de2f5f21af9"}, - {file = "msgpack-1.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:40fb89b4625d12d6027a19f4df18a4de5c64f6f3314325049f219683e07e678a"}, - {file = "msgpack-1.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6eef0cf8db3857b2b556213d97dd82de76e28a6524853a9beb3264983391dc1a"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d8c332f53ffff01953ad25131272506500b14750c1d0ce8614b17d098252fbc"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c0903bd93cbd34653dd63bbfcb99d7539c372795201f39d16fdfde4418de43a"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf1e6bfed4860d72106f4e0a1ab519546982b45689937b40257cfd820650b920"}, - {file = "msgpack-1.0.3-cp37-cp37m-win32.whl", hash = "sha256:d02cea2252abc3756b2ac31f781f7a98e89ff9759b2e7450a1c7a0d13302ff50"}, - {file = "msgpack-1.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f30dd0dc4dfe6231ad253b6f9f7128ac3202ae49edd3f10d311adc358772dba"}, - {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f201d34dc89342fabb2a10ed7c9a9aaaed9b7af0f16a5923f1ae562b31258dea"}, - {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bb87f23ae7d14b7b3c21009c4b1705ec107cb21ee71975992f6aca571fb4a42a"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a3a5c4b16e9d0edb823fe54b59b5660cc8d4782d7bf2c214cb4b91a1940a8ef"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74da1e5fcf20ade12c6bf1baa17a2dc3604958922de8dc83cbe3eff22e8b611"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73a80bd6eb6bcb338c1ec0da273f87420829c266379c8c82fa14c23fb586cfa1"}, - {file = "msgpack-1.0.3-cp38-cp38-win32.whl", hash = "sha256:9fce00156e79af37bb6db4e7587b30d11e7ac6a02cb5bac387f023808cd7d7f4"}, - {file = "msgpack-1.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:9b6f2d714c506e79cbead331de9aae6837c8dd36190d02da74cb409b36162e8a"}, - {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:89908aea5f46ee1474cc37fbc146677f8529ac99201bc2faf4ef8edc023c2bf3"}, - {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:973ad69fd7e31159eae8f580f3f707b718b61141838321c6fa4d891c4a2cca52"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da24375ab4c50e5b7486c115a3198d207954fe10aaa5708f7b65105df09109b2"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a598d0685e4ae07a0672b59792d2cc767d09d7a7f39fd9bd37ff84e060b1a996"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4c309a68cb5d6bbd0c50d5c71a25ae81f268c2dc675c6f4ea8ab2feec2ac4e2"}, - {file = "msgpack-1.0.3-cp39-cp39-win32.whl", hash = "sha256:494471d65b25a8751d19c83f1a482fd411d7ca7a3b9e17d25980a74075ba0e88"}, - {file = "msgpack-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:f01b26c2290cbd74316990ba84a14ac3d599af9cebefc543d241a66e785cf17d"}, - {file = "msgpack-1.0.3.tar.gz", hash = "sha256:51fdc7fb93615286428ee7758cecc2f374d5ff363bdd884c7ea622a7a327a81e"}, -] -multipledispatch = [ - {file = "multipledispatch-0.6.0-py2-none-any.whl", hash = "sha256:407e6d8c5fa27075968ba07c4db3ef5f02bea4e871e959570eeb69ee39a6565b"}, - {file = "multipledispatch-0.6.0-py3-none-any.whl", hash = "sha256:a55c512128fb3f7c2efd2533f2550accb93c35f1045242ef74645fc92a2c3cba"}, - {file = "multipledispatch-0.6.0.tar.gz", hash = "sha256:a7ab1451fd0bf9b92cab3edbd7b205622fb767aeefb4fb536c2e3de9e0a38bea"}, -] -mypy = [ - {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"}, - {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"}, - {file = "mypy-0.910-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9"}, - {file = "mypy-0.910-cp35-cp35m-win_amd64.whl", hash = "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e"}, - {file = "mypy-0.910-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921"}, - {file = "mypy-0.910-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6"}, - {file = "mypy-0.910-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212"}, - {file = "mypy-0.910-cp36-cp36m-win_amd64.whl", hash = "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885"}, - {file = "mypy-0.910-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0"}, - {file = "mypy-0.910-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de"}, - {file = "mypy-0.910-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703"}, - {file = "mypy-0.910-cp37-cp37m-win_amd64.whl", hash = "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a"}, - {file = "mypy-0.910-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504"}, - {file = "mypy-0.910-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9"}, - {file = "mypy-0.910-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072"}, - {file = "mypy-0.910-cp38-cp38-win_amd64.whl", hash = "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811"}, - {file = "mypy-0.910-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e"}, - {file = "mypy-0.910-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b"}, - {file = "mypy-0.910-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2"}, - {file = "mypy-0.910-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97"}, - {file = "mypy-0.910-cp39-cp39-win_amd64.whl", hash = "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8"}, - {file = "mypy-0.910-py3-none-any.whl", hash = "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"}, - {file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -networkx = [ - {file = "networkx-2.7.1-py3-none-any.whl", hash = "sha256:011e85d277c89681e8fa661cf5ff0743443445049b0b68789ad55ef09340c6e0"}, - {file = "networkx-2.7.1.tar.gz", hash = "sha256:d1194ba753e5eed07cdecd1d23c5cd7a3c772099bd8dbd2fea366788cf4de7ba"}, -] -numba = [ - {file = "numba-0.51.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:af798310eeb318c56cdb83254abbe9a938cc0182d08671d7f9f032dc817e064d"}, - {file = "numba-0.51.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:93e18350f2094e7432321c1275730a3143b94af012fb609cc180fa376c44867f"}, - {file = "numba-0.51.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9e2bb1f129bfadd757ad7a9c18ab79c3ab25ce6d6a68e58565d6c52ad07b3566"}, - {file = "numba-0.51.2-cp36-cp36m-win32.whl", hash = "sha256:31cdf6b6d1301d5fb6c4fcb8b4c711ba5c9f60ba2fca008b550da9b56185367c"}, - {file = "numba-0.51.2-cp36-cp36m-win_amd64.whl", hash = "sha256:df6edca13c04a31fdb5addf5205199478a7da372712829157ef491e8a6e7031f"}, - {file = "numba-0.51.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:a628122dacfcba9a3ea68a9e95578c6b6391016e34962c46550ea8e189e0412e"}, - {file = "numba-0.51.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:106736d5a8dab6bebce989d4ab1b3f169c264582598f172e6e5b736210d2e834"}, - {file = "numba-0.51.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:a12f16fdb4ca5edc94e2ef412e4e768c29217ef9b6fdfc237d064ebe30acfe14"}, - {file = "numba-0.51.2-cp37-cp37m-win32.whl", hash = "sha256:025b033fd31c44bba17802293c81270084b5454b5b055b8c10c394385c232f00"}, - {file = "numba-0.51.2-cp37-cp37m-win_amd64.whl", hash = "sha256:081788f584fa500339e9b74bf02e3c5029d408c114e555ada19cae0b92721416"}, - {file = "numba-0.51.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:5416b584183fd599afda11b947b64f89450fcf26a9c15b408167f412b98a3a94"}, - {file = "numba-0.51.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:05da65dca2ac28a192c9d8f20e9e477eb1237205cfc4d131c414f5f8092c6639"}, - {file = "numba-0.51.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:aee435e3b7e465dd49971f8ea76aa414532a87736916cb399534e017334d1138"}, - {file = "numba-0.51.2-cp38-cp38-win32.whl", hash = "sha256:bbbe2432433b11d3fadab0226a84c1a81918cb905ba1aeb022249e8d2ba8856c"}, - {file = "numba-0.51.2-cp38-cp38-win_amd64.whl", hash = "sha256:259e7c15b24feec4a99fb41eb8c47b5ad49b544d1a5ad40ad0252ef531ba06fd"}, - {file = "numba-0.51.2.tar.gz", hash = "sha256:16bd59572114adbf5f600ea383880d7b2071ae45477e84a24994e089ea390768"}, -] -numpy = [ - {file = "numpy-1.22.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75"}, - {file = "numpy-1.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab"}, - {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e"}, - {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4"}, - {file = "numpy-1.22.3-cp310-cp310-win32.whl", hash = "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430"}, - {file = "numpy-1.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4"}, - {file = "numpy-1.22.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce"}, - {file = "numpy-1.22.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe"}, - {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5"}, - {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1"}, - {file = "numpy-1.22.3-cp38-cp38-win32.whl", hash = "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62"}, - {file = "numpy-1.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676"}, - {file = "numpy-1.22.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123"}, - {file = "numpy-1.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802"}, - {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d"}, - {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168"}, - {file = "numpy-1.22.3-cp39-cp39-win32.whl", hash = "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa"}, - {file = "numpy-1.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a"}, - {file = "numpy-1.22.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f"}, - {file = "numpy-1.22.3.zip", hash = "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18"}, -] -oauthlib = [ - {file = "oauthlib-3.2.0-py3-none-any.whl", hash = "sha256:6db33440354787f9b7f3a6dbd4febf5d0f93758354060e802f6c06cb493022fe"}, - {file = "oauthlib-3.2.0.tar.gz", hash = "sha256:23a8208d75b902797ea29fd31fa80a15ed9dc2c6c16fe73f5d346f83f6fa27a2"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pandas = [ - {file = "pandas-1.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be67c782c4f1b1f24c2f16a157e12c2693fd510f8df18e3287c77f33d124ed07"}, - {file = "pandas-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5a206afa84ed20e07603f50d22b5f0db3fb556486d8c2462d8bc364831a4b417"}, - {file = "pandas-1.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0010771bd9223f7afe5f051eb47c4a49534345dfa144f2f5470b27189a4dd3b5"}, - {file = "pandas-1.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3228198333dd13c90b6434ddf61aa6d57deaca98cf7b654f4ad68a2db84f8cfe"}, - {file = "pandas-1.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b79af3a69e5175c6fa7b4e046b21a646c8b74e92c6581a9d825687d92071b51"}, - {file = "pandas-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:5586cc95692564b441f4747c47c8a9746792e87b40a4680a2feb7794defb1ce3"}, - {file = "pandas-1.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:061609334a8182ab500a90fe66d46f6f387de62d3a9cb9aa7e62e3146c712167"}, - {file = "pandas-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b8134651258bce418cb79c71adeff0a44090c98d955f6953168ba16cc285d9f7"}, - {file = "pandas-1.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:df82739e00bb6daf4bba4479a40f38c718b598a84654cbd8bb498fd6b0aa8c16"}, - {file = "pandas-1.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:385c52e85aaa8ea6a4c600a9b2821181a51f8be0aee3af6f2dcb41dafc4fc1d0"}, - {file = "pandas-1.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295872bf1a09758aba199992c3ecde455f01caf32266d50abc1a073e828a7b9d"}, - {file = "pandas-1.4.2-cp38-cp38-win32.whl", hash = "sha256:95c1e422ced0199cf4a34385ff124b69412c4bc912011ce895582bee620dfcaa"}, - {file = "pandas-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:5c54ea4ef3823108cd4ec7fb27ccba4c3a775e0f83e39c5e17f5094cb17748bc"}, - {file = "pandas-1.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c072c7f06b9242c855ed8021ff970c0e8f8b10b35e2640c657d2a541c5950f59"}, - {file = "pandas-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f549097993744ff8c41b5e8f2f0d3cbfaabe89b4ae32c8c08ead6cc535b80139"}, - {file = "pandas-1.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ff08a14ef21d94cdf18eef7c569d66f2e24e0bc89350bcd7d243dd804e3b5eb2"}, - {file = "pandas-1.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c5bf555b6b0075294b73965adaafb39cf71c312e38c5935c93d78f41c19828a"}, - {file = "pandas-1.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51649ef604a945f781105a6d2ecf88db7da0f4868ac5d45c51cb66081c4d9c73"}, - {file = "pandas-1.4.2-cp39-cp39-win32.whl", hash = "sha256:d0d4f13e4be7ce89d7057a786023c461dd9370040bdb5efa0a7fe76b556867a0"}, - {file = "pandas-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:09d8be7dd9e1c4c98224c4dfe8abd60d145d934e9fc1f5f411266308ae683e6a"}, - {file = "pandas-1.4.2.tar.gz", hash = "sha256:92bc1fc585f1463ca827b45535957815b7deb218c549b7c18402c322c7549a12"}, -] -panel = [ - {file = "panel-0.12.7-py2.py3-none-any.whl", hash = "sha256:55ca0c1984f8f1676ecaec9307fe0a2726d3fe904a574841d694a96466a001e0"}, - {file = "panel-0.12.7.tar.gz", hash = "sha256:119b525c954df0d630e7bc7ef2cb7e50b406cca73a4caa823c43e49d58b52ebb"}, -] -param = [ - {file = "param-1.12.1-py2.py3-none-any.whl", hash = "sha256:d3b8852815e4012803110cb44a8c9c77e15fc1a62895e2a9a215ef5f5a036933"}, - {file = "param-1.12.1.tar.gz", hash = "sha256:ca53f1837d3172f4c181159fbe009f71f034f8dd9ffaf9e56bf64bf6b4b84f8f"}, -] -parso = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, -] -partd = [ - {file = "partd-1.2.0-py3-none-any.whl", hash = "sha256:5c3a5d70da89485c27916328dc1e26232d0e270771bd4caef4a5124b6a457288"}, - {file = "partd-1.2.0.tar.gz", hash = "sha256:aa67897b84d522dcbc86a98b942afab8c6aa2f7f677d904a616b74ef5ddbc3eb"}, -] -pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, -] -pexpect = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] -pickleshare = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] -pillow = [ - {file = "Pillow-9.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af79d3fde1fc2e33561166d62e3b63f0cc3e47b5a3a2e5fea40d4917754734ea"}, - {file = "Pillow-9.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55dd1cf09a1fd7c7b78425967aacae9b0d70125f7d3ab973fadc7b5abc3de652"}, - {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66822d01e82506a19407d1afc104c3fcea3b81d5eb11485e593ad6b8492f995a"}, - {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5eaf3b42df2bcda61c53a742ee2c6e63f777d0e085bbc6b2ab7ed57deb13db7"}, - {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01ce45deec9df310cbbee11104bae1a2a43308dd9c317f99235b6d3080ddd66e"}, - {file = "Pillow-9.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aea7ce61328e15943d7b9eaca87e81f7c62ff90f669116f857262e9da4057ba3"}, - {file = "Pillow-9.1.0-cp310-cp310-win32.whl", hash = "sha256:7a053bd4d65a3294b153bdd7724dce864a1d548416a5ef61f6d03bf149205160"}, - {file = "Pillow-9.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:97bda660702a856c2c9e12ec26fc6d187631ddfd896ff685814ab21ef0597033"}, - {file = "Pillow-9.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21dee8466b42912335151d24c1665fcf44dc2ee47e021d233a40c3ca5adae59c"}, - {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b6d4050b208c8ff886fd3db6690bf04f9a48749d78b41b7a5bf24c236ab0165"}, - {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cfca31ab4c13552a0f354c87fbd7f162a4fafd25e6b521bba93a57fe6a3700a"}, - {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed742214068efa95e9844c2d9129e209ed63f61baa4d54dbf4cf8b5e2d30ccf2"}, - {file = "Pillow-9.1.0-cp37-cp37m-win32.whl", hash = "sha256:c9efef876c21788366ea1f50ecb39d5d6f65febe25ad1d4c0b8dff98843ac244"}, - {file = "Pillow-9.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:de344bcf6e2463bb25179d74d6e7989e375f906bcec8cb86edb8b12acbc7dfef"}, - {file = "Pillow-9.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:17869489de2fce6c36690a0c721bd3db176194af5f39249c1ac56d0bb0fcc512"}, - {file = "Pillow-9.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:25023a6209a4d7c42154073144608c9a71d3512b648a2f5d4465182cb93d3477"}, - {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8782189c796eff29dbb37dd87afa4ad4d40fc90b2742704f94812851b725964b"}, - {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:463acf531f5d0925ca55904fa668bb3461c3ef6bc779e1d6d8a488092bdee378"}, - {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f42364485bfdab19c1373b5cd62f7c5ab7cc052e19644862ec8f15bb8af289e"}, - {file = "Pillow-9.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3fddcdb619ba04491e8f771636583a7cc5a5051cd193ff1aa1ee8616d2a692c5"}, - {file = "Pillow-9.1.0-cp38-cp38-win32.whl", hash = "sha256:4fe29a070de394e449fd88ebe1624d1e2d7ddeed4c12e0b31624561b58948d9a"}, - {file = "Pillow-9.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c24f718f9dd73bb2b31a6201e6db5ea4a61fdd1d1c200f43ee585fc6dcd21b34"}, - {file = "Pillow-9.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fb89397013cf302f282f0fc998bb7abf11d49dcff72c8ecb320f76ea6e2c5717"}, - {file = "Pillow-9.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c870193cce4b76713a2b29be5d8327c8ccbe0d4a49bc22968aa1e680930f5581"}, - {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69e5ddc609230d4408277af135c5b5c8fe7a54b2bdb8ad7c5100b86b3aab04c6"}, - {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35be4a9f65441d9982240e6966c1eaa1c654c4e5e931eaf580130409e31804d4"}, - {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82283af99c1c3a5ba1da44c67296d5aad19f11c535b551a5ae55328a317ce331"}, - {file = "Pillow-9.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a325ac71914c5c043fa50441b36606e64a10cd262de12f7a179620f579752ff8"}, - {file = "Pillow-9.1.0-cp39-cp39-win32.whl", hash = "sha256:a598d8830f6ef5501002ae85c7dbfcd9c27cc4efc02a1989369303ba85573e58"}, - {file = "Pillow-9.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c51cb9edac8a5abd069fd0758ac0a8bfe52c261ee0e330f363548aca6893595"}, - {file = "Pillow-9.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a336a4f74baf67e26f3acc4d61c913e378e931817cd1e2ef4dfb79d3e051b481"}, - {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb1b89b11256b5b6cad5e7593f9061ac4624f7651f7a8eb4dfa37caa1dfaa4d0"}, - {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:255c9d69754a4c90b0ee484967fc8818c7ff8311c6dddcc43a4340e10cd1636a"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5a3ecc026ea0e14d0ad7cd990ea7f48bfcb3eb4271034657dc9d06933c6629a7"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5b0ff59785d93b3437c3703e3c64c178aabada51dea2a7f2c5eccf1bcf565a3"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7110ec1701b0bf8df569a7592a196c9d07c764a0a74f65471ea56816f10e2c8"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8d79c6f468215d1a8415aa53d9868a6b40c4682165b8cb62a221b1baa47db458"}, - {file = "Pillow-9.1.0.tar.gz", hash = "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97"}, -] -pip-tools = [ - {file = "pip-tools-5.5.0.tar.gz", hash = "sha256:cb0108391366b3ef336185097b3c2c0f3fa115b15098dafbda5e78aef70ea114"}, - {file = "pip_tools-5.5.0-py2.py3-none-any.whl", hash = "sha256:10841c1e56c234d610d0466447685b9ea4ee4a2c274f858c0ef3c33d9bd0d985"}, -] -prompt-toolkit = [ - {file = "prompt_toolkit-3.0.29-py3-none-any.whl", hash = "sha256:62291dad495e665fca0bda814e342c69952086afb0f4094d0893d357e5c78752"}, - {file = "prompt_toolkit-3.0.29.tar.gz", hash = "sha256:bd640f60e8cecd74f0dc249713d433ace2ddc62b65ee07f96d358e0b152b6ea7"}, -] -psutil = [ - {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b"}, - {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:7336292a13a80eb93c21f36bde4328aa748a04b68c13d01dfddd67fc13fd0618"}, - {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:cb8d10461c1ceee0c25a64f2dd54872b70b89c26419e147a05a10b753ad36ec2"}, - {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:7641300de73e4909e5d148e90cc3142fb890079e1525a840cf0dfd39195239fd"}, - {file = "psutil-5.9.0-cp27-none-win32.whl", hash = "sha256:ea42d747c5f71b5ccaa6897b216a7dadb9f52c72a0fe2b872ef7d3e1eacf3ba3"}, - {file = "psutil-5.9.0-cp27-none-win_amd64.whl", hash = "sha256:ef216cc9feb60634bda2f341a9559ac594e2eeaadd0ba187a4c2eb5b5d40b91c"}, - {file = "psutil-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90a58b9fcae2dbfe4ba852b57bd4a1dded6b990a33d6428c7614b7d48eccb492"}, - {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d41f8b3e9ebb6b6110057e40019a432e96aae2008951121ba4e56040b84f3"}, - {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:742c34fff804f34f62659279ed5c5b723bb0195e9d7bd9907591de9f8f6558e2"}, - {file = "psutil-5.9.0-cp310-cp310-win32.whl", hash = "sha256:8293942e4ce0c5689821f65ce6522ce4786d02af57f13c0195b40e1edb1db61d"}, - {file = "psutil-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:9b51917c1af3fa35a3f2dabd7ba96a2a4f19df3dec911da73875e1edaf22a40b"}, - {file = "psutil-5.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e9805fed4f2a81de98ae5fe38b75a74c6e6ad2df8a5c479594c7629a1fe35f56"}, - {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c51f1af02334e4b516ec221ee26b8fdf105032418ca5a5ab9737e8c87dafe203"}, - {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32acf55cb9a8cbfb29167cd005951df81b567099295291bcfd1027365b36591d"}, - {file = "psutil-5.9.0-cp36-cp36m-win32.whl", hash = "sha256:e5c783d0b1ad6ca8a5d3e7b680468c9c926b804be83a3a8e95141b05c39c9f64"}, - {file = "psutil-5.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d62a2796e08dd024b8179bd441cb714e0f81226c352c802fca0fd3f89eeacd94"}, - {file = "psutil-5.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3d00a664e31921009a84367266b35ba0aac04a2a6cad09c550a89041034d19a0"}, - {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7779be4025c540d1d65a2de3f30caeacc49ae7a2152108adeaf42c7534a115ce"}, - {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5"}, - {file = "psutil-5.9.0-cp37-cp37m-win32.whl", hash = "sha256:df2c8bd48fb83a8408c8390b143c6a6fa10cb1a674ca664954de193fdcab36a9"}, - {file = "psutil-5.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1d7b433519b9a38192dfda962dd8f44446668c009833e1429a52424624f408b4"}, - {file = "psutil-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3400cae15bdb449d518545cbd5b649117de54e3596ded84aacabfbb3297ead2"}, - {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2237f35c4bbae932ee98902a08050a27821f8f6dfa880a47195e5993af4702d"}, - {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a"}, - {file = "psutil-5.9.0-cp38-cp38-win32.whl", hash = "sha256:76cebf84aac1d6da5b63df11fe0d377b46b7b500d892284068bacccf12f20666"}, - {file = "psutil-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:3151a58f0fbd8942ba94f7c31c7e6b310d2989f4da74fcbf28b934374e9bf841"}, - {file = "psutil-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:539e429da49c5d27d5a58e3563886057f8fc3868a5547b4f1876d9c0f007bccf"}, - {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58c7d923dc209225600aec73aa2c4ae8ea33b1ab31bc11ef8a5933b027476f07"}, - {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3611e87eea393f779a35b192b46a164b1d01167c9d323dda9b1e527ea69d697d"}, - {file = "psutil-5.9.0-cp39-cp39-win32.whl", hash = "sha256:4e2fb92e3aeae3ec3b7b66c528981fd327fb93fd906a77215200404444ec1845"}, - {file = "psutil-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3"}, - {file = "psutil-5.9.0.tar.gz", hash = "sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25"}, -] -psycopg2 = [ - {file = "psycopg2-2.9.3-cp310-cp310-win32.whl", hash = "sha256:083707a696e5e1c330af2508d8fab36f9700b26621ccbcb538abe22e15485362"}, - {file = "psycopg2-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:d3ca6421b942f60c008f81a3541e8faf6865a28d5a9b48544b0ee4f40cac7fca"}, - {file = "psycopg2-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:9572e08b50aed176ef6d66f15a21d823bb6f6d23152d35e8451d7d2d18fdac56"}, - {file = "psycopg2-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:a81e3866f99382dfe8c15a151f1ca5fde5815fde879348fe5a9884a7c092a305"}, - {file = "psycopg2-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:cb10d44e6694d763fa1078a26f7f6137d69f555a78ec85dc2ef716c37447e4b2"}, - {file = "psycopg2-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4295093a6ae3434d33ec6baab4ca5512a5082cc43c0505293087b8a46d108461"}, - {file = "psycopg2-2.9.3-cp38-cp38-win32.whl", hash = "sha256:34b33e0162cfcaad151f249c2649fd1030010c16f4bbc40a604c1cb77173dcf7"}, - {file = "psycopg2-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:0762c27d018edbcb2d34d51596e4346c983bd27c330218c56c4dc25ef7e819bf"}, - {file = "psycopg2-2.9.3-cp39-cp39-win32.whl", hash = "sha256:8cf3878353cc04b053822896bc4922b194792df9df2f1ad8da01fb3043602126"}, - {file = "psycopg2-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:06f32425949bd5fe8f625c49f17ebb9784e1e4fe928b7cce72edc36fb68e4c0c"}, - {file = "psycopg2-2.9.3.tar.gz", hash = "sha256:8e841d1bf3434da985cc5ef13e6f75c8981ced601fd70cc6bf33351b91562981"}, -] -ptyprocess = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] -pyarrow = [ - {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:0f15213f380539c9640cb2413dc677b55e70f04c9e98cfc2e1d8b36c770e1036"}, - {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:29c4e3b3be0b94d07ff4921a5e410fc690a3a066a850a302fc504de5fc638495"}, - {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8a9bfc8a016bcb8f9a8536d2fa14a890b340bc7a236275cd60fd4fb8b93ff405"}, - {file = "pyarrow-7.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:49d431ed644a3e8f53ae2bbf4b514743570b495b5829548db51610534b6eeee7"}, - {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa6442a321c1e49480b3d436f7d631c895048a16df572cf71c23c6b53c45ed66"}, - {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b01a23cb401750092c6f7c4dcae67cd8fd6b99ae710e26f654f23508f25f25"}, - {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f10928745c6ff66e121552731409803bed86c66ac79c64c90438b053b5242c5"}, - {file = "pyarrow-7.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:759090caa1474cafb5e68c93a9bd6cb45d8bb8e4f2cad2f1a0cc9439bae8ae88"}, - {file = "pyarrow-7.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:e3fe34bcfc28d9c4a747adc3926d2307a04c5c50b89155946739515ccfe5eab0"}, - {file = "pyarrow-7.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:040dce5345603e4e621bcf4f3b21f18d557852e7b15307e559bb14c8951c8714"}, - {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed4b647c3345ae3463d341a9d28d0260cd302fb92ecf4e2e3e0f1656d6e0e55c"}, - {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7fecd5d5604f47e003f50887a42aee06cb8b7bf8e8bf7dc543a22331d9ba832"}, - {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f2d00b892fe865e43346acb78761ba268f8bb1cbdba588816590abcb780ee3d"}, - {file = "pyarrow-7.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f439f7d77201681fd31391d189aa6b1322d27c9311a8f2fce7d23972471b02b6"}, - {file = "pyarrow-7.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:3e06b0e29ce1e32f219c670c6b31c33d25a5b8e29c7828f873373aab78bf30a5"}, - {file = "pyarrow-7.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:13dc05bcf79dbc1bd2de1b05d26eb64824b85883d019d81ca3c2eca9b68b5a44"}, - {file = "pyarrow-7.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:06183a7ff2b0c030ec0413fc4dc98abad8cf336c78c280a0b7f4bcbebb78d125"}, - {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:702c5a9f960b56d03569eaaca2c1a05e8728f05ea1a2138ef64234aa53cd5884"}, - {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7313038203df77ec4092d6363dbc0945071caa72635f365f2b1ae0dd7469865"}, - {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e87d1f7dc7a0b2ecaeb0c7a883a85710f5b5626d4134454f905571c04bc73d5a"}, - {file = "pyarrow-7.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ba69488ae25c7fde1a2ae9ea29daf04d676de8960ffd6f82e1e13ca945bb5861"}, - {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:11a591f11d2697c751261c9d57e6e5b0d38fdc7f0cc57f4fd6edc657da7737df"}, - {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:6183c700877852dc0f8a76d4c0c2ffd803ba459e2b4a452e355c2d58d48cf39f"}, - {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1748154714b543e6ae8452a68d4af85caf5298296a7e5d4d00f1b3021838ac6"}, - {file = "pyarrow-7.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcc8f934c7847a88f13ec35feecffb61fe63bb7a3078bd98dd353762e969ce60"}, - {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:759f59ac77b84878dbd54d06cf6df74ff781b8e7cf9313eeffbb5ec97b94385c"}, - {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d3e3f93ac2993df9c5e1922eab7bdea047b9da918a74e52145399bc1f0099a3"}, - {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:306120af554e7e137895254a3b4741fad682875a5f6403509cd276de3fe5b844"}, - {file = "pyarrow-7.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:087769dac6e567d58d59b94c4f866b3356c00d3db5b261387ece47e7324c2150"}, - {file = "pyarrow-7.0.0.tar.gz", hash = "sha256:da656cad3c23a2ebb6a307ab01d35fce22f7850059cffafcb90d12590f8f4f38"}, -] -pyasn1 = [ - {file = "pyasn1-0.4.8-py2.4.egg", hash = "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3"}, - {file = "pyasn1-0.4.8-py2.5.egg", hash = "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf"}, - {file = "pyasn1-0.4.8-py2.6.egg", hash = "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00"}, - {file = "pyasn1-0.4.8-py2.7.egg", hash = "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8"}, - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8-py3.1.egg", hash = "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86"}, - {file = "pyasn1-0.4.8-py3.2.egg", hash = "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7"}, - {file = "pyasn1-0.4.8-py3.3.egg", hash = "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576"}, - {file = "pyasn1-0.4.8-py3.4.egg", hash = "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12"}, - {file = "pyasn1-0.4.8-py3.5.egg", hash = "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2"}, - {file = "pyasn1-0.4.8-py3.6.egg", hash = "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359"}, - {file = "pyasn1-0.4.8-py3.7.egg", hash = "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, -] -pyasn1-modules = [ - {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, - {file = "pyasn1_modules-0.2.8-py2.4.egg", hash = "sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199"}, - {file = "pyasn1_modules-0.2.8-py2.5.egg", hash = "sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405"}, - {file = "pyasn1_modules-0.2.8-py2.6.egg", hash = "sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb"}, - {file = "pyasn1_modules-0.2.8-py2.7.egg", hash = "sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8"}, - {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, - {file = "pyasn1_modules-0.2.8-py3.1.egg", hash = "sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d"}, - {file = "pyasn1_modules-0.2.8-py3.2.egg", hash = "sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45"}, - {file = "pyasn1_modules-0.2.8-py3.3.egg", hash = "sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4"}, - {file = "pyasn1_modules-0.2.8-py3.4.egg", hash = "sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811"}, - {file = "pyasn1_modules-0.2.8-py3.5.egg", hash = "sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed"}, - {file = "pyasn1_modules-0.2.8-py3.6.egg", hash = "sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0"}, - {file = "pyasn1_modules-0.2.8-py3.7.egg", hash = "sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd"}, -] -pycodestyle = [ - {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, - {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, -] -pycparser = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] -pyct = [ - {file = "pyct-0.4.8-py2.py3-none-any.whl", hash = "sha256:222e104d561b28cfdb56667d2ba10e5290b4466db66d0af38ab935577af85390"}, - {file = "pyct-0.4.8.tar.gz", hash = "sha256:23d7525b5a1567535c093aea4b9c33809415aa5f018dd77f6eb738b1226df6f7"}, -] -pyerfa = [ - {file = "pyerfa-2.0.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:278832de7803f2fb0ef4b14263200f98dfdb3eaa78dc63835d93796fd8fc42c6"}, - {file = "pyerfa-2.0.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:629248cebc8626a52e80f69d4e2f30cc6e751f57803f5ba7ec99edd09785d181"}, - {file = "pyerfa-2.0.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3285d95dfe398a931a633da961f6f1c0b8690f2a3b1c510a4efe639f784cd9c7"}, - {file = "pyerfa-2.0.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:177f50f0e8354f1a7115c2d4784668b365f1cc2f2c7d1e2f4ddf354160559b32"}, - {file = "pyerfa-2.0.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:041939a7554a98b72885904ffddd8882567191bee62358727679448480174c31"}, - {file = "pyerfa-2.0.0.1-cp310-cp310-win32.whl", hash = "sha256:f9e149bc3d423ae891f6587c1383fd471ae07744b88152e66b5e9f64a8bc9006"}, - {file = "pyerfa-2.0.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:f00dc4fc48a16eb39fd0121f2f06c03ee762b79a207cc5b0bc17d94191b51302"}, - {file = "pyerfa-2.0.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1ba3668e1e181a678ce788d23a4f8666aabd8518f77fdde5157ba4744bc73d4a"}, - {file = "pyerfa-2.0.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8f08f6e6d75a261bb92b707bea19eba2e46a8fcbfb499b789f3eb0d0352ea00"}, - {file = "pyerfa-2.0.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:da89304d6b25ac056e470f44f85770b04c9674eced07a7f93b5eb0ce1edaabd9"}, - {file = "pyerfa-2.0.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:36738ba75e7a69e0ea6a7e96a5d33a852816427e7e94e7089c188ef920b02669"}, - {file = "pyerfa-2.0.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5c077aed4ccd585c1fe2f96ada8edb66e9d27b4ae8ff13ea2783283b298ba0c6"}, - {file = "pyerfa-2.0.0.1-cp37-cp37m-win32.whl", hash = "sha256:0833f8ebba9f84a19a04ee5ca5aa90be75729abfbb8328e7a6d89ed1b04e058c"}, - {file = "pyerfa-2.0.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e86c08c9c0b75e448818473c6d709e3887a439c05a1aa34042d26774251422b7"}, - {file = "pyerfa-2.0.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b935fa9d10dfd7206760859236640c835aa652609c0ae8a6584593324eb6f318"}, - {file = "pyerfa-2.0.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67711a748821c5d91f7a8907b9125094dfc3e5ab6a6b7ad8e207fd6afbe6b37f"}, - {file = "pyerfa-2.0.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d2c10838241aaf17279468dcc731cb2c09bfb7dd7b340c0f527fd70c7c9e53d1"}, - {file = "pyerfa-2.0.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:37249e1e2b378d1f56e9379e4bb8f2cf87645c160a8a3e92166a1b7bb7ad7ea6"}, - {file = "pyerfa-2.0.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f76fb4b64a87da2af9d0b6b79cc25e1ecc5b4143b2b3c8c9f10b221748c5db4d"}, - {file = "pyerfa-2.0.0.1-cp38-cp38-win32.whl", hash = "sha256:486e672c52bf58eab61140968660ac7fb3b756116b53c26c334ae95dadd943ee"}, - {file = "pyerfa-2.0.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:d603f1e8123f98a0593433aa6dad4ba03f0b0ceef4cb3e96f9a69aa7ab8d5c61"}, - {file = "pyerfa-2.0.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef5590b2075c50395b958f102988e519e339d96509dfdca0360f26dde94c47e7"}, - {file = "pyerfa-2.0.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ca8c98842f1ae10c1fbcea0e03a41ddc13456da88da2dc9b8335a8c414d7a3"}, - {file = "pyerfa-2.0.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d3e7dedce1d7e4e044f6f81d192b1f6b373c8ad6716aa8721ec6d3cf4d36f5f3"}, - {file = "pyerfa-2.0.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:690116a6026ee84ce5fec794c9e21bdc8c0ac8345d6722323810181486745068"}, - {file = "pyerfa-2.0.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:da5ee24eaf5e5f841f36885ea16461800b7bea11df5b657bcff85d7a7f51d2d8"}, - {file = "pyerfa-2.0.0.1-cp39-cp39-win32.whl", hash = "sha256:7895b7e6f3bc36442d1969bf3bda5a4c3b661be7a5a468798369cbd5d81023d8"}, - {file = "pyerfa-2.0.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:63a83c35cea8c5d50d53c18089f1e625c0ffc59a7a5b8d44e0f1b3ec5288f183"}, - {file = "pyerfa-2.0.0.1.tar.gz", hash = "sha256:2fd4637ffe2c1e6ede7482c13f583ba7c73119d78bef90175448ce506a0ede30"}, -] -pyflakes = [ - {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, - {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, -] -pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, -] -pygraphviz = [ - {file = "pygraphviz-1.9.zip", hash = "sha256:fa18f7c6cea28341a4e466ed0cf05682b0a68288afe8dd7c9426782f7c1ae01c"}, -] -pyjwt = [ - {file = "PyJWT-2.3.0-py3-none-any.whl", hash = "sha256:e0c4bb8d9f0af0c7f5b1ec4c5036309617d03d56932877f2f7a0beeb5318322f"}, - {file = "PyJWT-2.3.0.tar.gz", hash = "sha256:b888b4d56f06f6dcd777210c334e69c737be74755d3e5e9ee3fe67dc18a0ee41"}, -] -pymdown-extensions = [ - {file = "pymdown-extensions-9.3.tar.gz", hash = "sha256:a80553b243d3ed2d6c27723bcd64ca9887e560e6f4808baa96f36e93061eaf90"}, - {file = "pymdown_extensions-9.3-py3-none-any.whl", hash = "sha256:b37461a181c1c8103cfe1660081726a0361a8294cbfda88e5b02cefe976f0546"}, -] -pyopenssl = [ - {file = "pyOpenSSL-22.0.0-py2.py3-none-any.whl", hash = "sha256:ea252b38c87425b64116f808355e8da644ef9b07e429398bfece610f893ee2e0"}, - {file = "pyOpenSSL-22.0.0.tar.gz", hash = "sha256:660b1b1425aac4a1bea1d94168a85d99f0b3144c869dd4390d27629d0087f1bf"}, -] -pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -python3-openid = [ - {file = "python3-openid-3.2.0.tar.gz", hash = "sha256:33fbf6928f401e0b790151ed2b5290b02545e8775f982485205a066f874aaeaf"}, - {file = "python3_openid-3.2.0-py3-none-any.whl", hash = "sha256:6626f771e0417486701e0b4daff762e7212e820ca5b29fcc0d05f6f8736dfa6b"}, -] -pytkdocs = [ - {file = "pytkdocs-0.16.1-py3-none-any.whl", hash = "sha256:a8c3f46ecef0b92864cc598e9101e9c4cf832ebbf228f50c84aa5dd850aac379"}, - {file = "pytkdocs-0.16.1.tar.gz", hash = "sha256:e2ccf6dfe9dbbceb09818673f040f1a7c32ed0bffb2d709b06be6453c4026045"}, -] -pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, -] -pyviz-comms = [ - {file = "pyviz_comms-2.2.0-py2.py3-none-any.whl", hash = "sha256:c11837635ae47d7001d001d87cf8bf3ae417b4bbf6f493c376114207b7efcd77"}, - {file = "pyviz_comms-2.2.0.tar.gz", hash = "sha256:b8c9dcbde01f3847843fb4d04c3b3f4de784920c71e44ced9dfbb560f6c92218"}, -] -pyvo = [ - {file = "pyvo-1.3-py3-none-any.whl", hash = "sha256:50bdc829db62772fc46ac5fc80823b1b91c8685ea59db713736b83aeeb779bb7"}, - {file = "pyvo-1.3.tar.gz", hash = "sha256:846a54a05a8ddb47a8c2cc3077434779b0e4ccc1b74a7a5408593cb673307d67"}, -] -pywin32-ctypes = [ - {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, - {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, -] -pyyaml = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -pyyaml-env-tag = [ - {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, - {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, -] -redis = [ - {file = "redis-3.5.3-py2.py3-none-any.whl", hash = "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24"}, - {file = "redis-3.5.3.tar.gz", hash = "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2"}, -] -regex = [ - {file = "regex-2022.3.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:42eb13b93765c6698a5ab3bcd318d8c39bb42e5fa8a7fcf7d8d98923f3babdb1"}, - {file = "regex-2022.3.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9beb03ff6fe509d6455971c2489dceb31687b38781206bcec8e68bdfcf5f1db2"}, - {file = "regex-2022.3.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0a5a1fdc9f148a8827d55b05425801acebeeefc9e86065c7ac8b8cc740a91ff"}, - {file = "regex-2022.3.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb374a2a4dba7c4be0b19dc7b1adc50e6c2c26c3369ac629f50f3c198f3743a4"}, - {file = "regex-2022.3.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c33ce0c665dd325200209340a88438ba7a470bd5f09f7424e520e1a3ff835b52"}, - {file = "regex-2022.3.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04c09b9651fa814eeeb38e029dc1ae83149203e4eeb94e52bb868fadf64852bc"}, - {file = "regex-2022.3.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab5d89cfaf71807da93c131bb7a19c3e19eaefd613d14f3bce4e97de830b15df"}, - {file = "regex-2022.3.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e2630ae470d6a9f8e4967388c1eda4762706f5750ecf387785e0df63a4cc5af"}, - {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:df037c01d68d1958dad3463e2881d3638a0d6693483f58ad41001aa53a83fcea"}, - {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:940570c1a305bac10e8b2bc934b85a7709c649317dd16520471e85660275083a"}, - {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7f63877c87552992894ea1444378b9c3a1d80819880ae226bb30b04789c0828c"}, - {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3e265b388cc80c7c9c01bb4f26c9e536c40b2c05b7231fbb347381a2e1c8bf43"}, - {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:058054c7a54428d5c3e3739ac1e363dc9347d15e64833817797dc4f01fb94bb8"}, - {file = "regex-2022.3.15-cp310-cp310-win32.whl", hash = "sha256:76435a92e444e5b8f346aed76801db1c1e5176c4c7e17daba074fbb46cb8d783"}, - {file = "regex-2022.3.15-cp310-cp310-win_amd64.whl", hash = "sha256:174d964bc683b1e8b0970e1325f75e6242786a92a22cedb2a6ec3e4ae25358bd"}, - {file = "regex-2022.3.15-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6e1d8ed9e61f37881c8db383a124829a6e8114a69bd3377a25aecaeb9b3538f8"}, - {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b52771f05cff7517f7067fef19ffe545b1f05959e440d42247a17cd9bddae11b"}, - {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:673f5a393d603c34477dbad70db30025ccd23996a2d0916e942aac91cc42b31a"}, - {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8923e1c5231549fee78ff9b2914fad25f2e3517572bb34bfaa3aea682a758683"}, - {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:764e66a0e382829f6ad3bbce0987153080a511c19eb3d2f8ead3f766d14433ac"}, - {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd00859291658fe1fda48a99559fb34da891c50385b0bfb35b808f98956ef1e7"}, - {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa2ce79f3889720b46e0aaba338148a1069aea55fda2c29e0626b4db20d9fcb7"}, - {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:34bb30c095342797608727baf5c8aa122406aa5edfa12107b8e08eb432d4c5d7"}, - {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:25ecb1dffc5e409ca42f01a2b2437f93024ff1612c1e7983bad9ee191a5e8828"}, - {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:aa5eedfc2461c16a092a2fabc5895f159915f25731740c9152a1b00f4bcf629a"}, - {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:7d1a6e403ac8f1d91d8f51c441c3f99367488ed822bda2b40836690d5d0059f5"}, - {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:3e4d710ff6539026e49f15a3797c6b1053573c2b65210373ef0eec24480b900b"}, - {file = "regex-2022.3.15-cp36-cp36m-win32.whl", hash = "sha256:0100f0ded953b6b17f18207907159ba9be3159649ad2d9b15535a74de70359d3"}, - {file = "regex-2022.3.15-cp36-cp36m-win_amd64.whl", hash = "sha256:f320c070dea3f20c11213e56dbbd7294c05743417cde01392148964b7bc2d31a"}, - {file = "regex-2022.3.15-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fc8c7958d14e8270171b3d72792b609c057ec0fa17d507729835b5cff6b7f69a"}, - {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ca6dcd17f537e9f3793cdde20ac6076af51b2bd8ad5fe69fa54373b17b48d3c"}, - {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0214ff6dff1b5a4b4740cfe6e47f2c4c92ba2938fca7abbea1359036305c132f"}, - {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a98ae493e4e80b3ded6503ff087a8492db058e9c68de371ac3df78e88360b374"}, - {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b1cc70e31aacc152a12b39245974c8fccf313187eead559ee5966d50e1b5817"}, - {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4829db3737480a9d5bfb1c0320c4ee13736f555f53a056aacc874f140e98f64"}, - {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:303b15a3d32bf5fe5a73288c316bac5807587f193ceee4eb6d96ee38663789fa"}, - {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:dc7b7c16a519d924c50876fb152af661a20749dcbf653c8759e715c1a7a95b18"}, - {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ce3057777a14a9a1399b81eca6a6bfc9612047811234398b84c54aeff6d536ea"}, - {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:48081b6bff550fe10bcc20c01cf6c83dbca2ccf74eeacbfac240264775fd7ecf"}, - {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dcbb7665a9db9f8d7642171152c45da60e16c4f706191d66a1dc47ec9f820aed"}, - {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c155a1a80c5e7a8fa1d9bb1bf3c8a953532b53ab1196092749bafb9d3a7cbb60"}, - {file = "regex-2022.3.15-cp37-cp37m-win32.whl", hash = "sha256:04b5ee2b6d29b4a99d38a6469aa1db65bb79d283186e8460542c517da195a8f6"}, - {file = "regex-2022.3.15-cp37-cp37m-win_amd64.whl", hash = "sha256:797437e6024dc1589163675ae82f303103063a0a580c6fd8d0b9a0a6708da29e"}, - {file = "regex-2022.3.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8afcd1c2297bc989dceaa0379ba15a6df16da69493635e53431d2d0c30356086"}, - {file = "regex-2022.3.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0066a6631c92774391f2ea0f90268f0d82fffe39cb946f0f9c6b382a1c61a5e5"}, - {file = "regex-2022.3.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8248f19a878c72d8c0a785a2cd45d69432e443c9f10ab924c29adda77b324ae"}, - {file = "regex-2022.3.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d1f3ea0d1924feb4cf6afb2699259f658a08ac6f8f3a4a806661c2dfcd66db1"}, - {file = "regex-2022.3.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:794a6bc66c43db8ed06698fc32aaeaac5c4812d9f825e9589e56f311da7becd9"}, - {file = "regex-2022.3.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d1445824944e642ffa54c4f512da17a953699c563a356d8b8cbdad26d3b7598"}, - {file = "regex-2022.3.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f553a1190ae6cd26e553a79f6b6cfba7b8f304da2071052fa33469da075ea625"}, - {file = "regex-2022.3.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:75a5e6ce18982f0713c4bac0704bf3f65eed9b277edd3fb9d2b0ff1815943327"}, - {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f16cf7e4e1bf88fecf7f41da4061f181a6170e179d956420f84e700fb8a3fd6b"}, - {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dad3991f0678facca1a0831ec1ddece2eb4d1dd0f5150acb9440f73a3b863907"}, - {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:491fc754428514750ab21c2d294486223ce7385446f2c2f5df87ddbed32979ae"}, - {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:6504c22c173bb74075d7479852356bb7ca80e28c8e548d4d630a104f231e04fb"}, - {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:01c913cf573d1da0b34c9001a94977273b5ee2fe4cb222a5d5b320f3a9d1a835"}, - {file = "regex-2022.3.15-cp38-cp38-win32.whl", hash = "sha256:029e9e7e0d4d7c3446aa92474cbb07dafb0b2ef1d5ca8365f059998c010600e6"}, - {file = "regex-2022.3.15-cp38-cp38-win_amd64.whl", hash = "sha256:947a8525c0a95ba8dc873191f9017d1b1e3024d4dc757f694e0af3026e34044a"}, - {file = "regex-2022.3.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:591d4fba554f24bfa0421ba040cd199210a24301f923ed4b628e1e15a1001ff4"}, - {file = "regex-2022.3.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9809404528a999cf02a400ee5677c81959bc5cb938fdc696b62eb40214e3632"}, - {file = "regex-2022.3.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f08a7e4d62ea2a45557f561eea87c907222575ca2134180b6974f8ac81e24f06"}, - {file = "regex-2022.3.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a86cac984da35377ca9ac5e2e0589bd11b3aebb61801204bd99c41fac516f0d"}, - {file = "regex-2022.3.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:286908cbe86b1a0240a867aecfe26a439b16a1f585d2de133540549831f8e774"}, - {file = "regex-2022.3.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b7494df3fdcc95a1f76cf134d00b54962dd83189520fd35b8fcd474c0aa616d"}, - {file = "regex-2022.3.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b1ceede92400b3acfebc1425937454aaf2c62cd5261a3fabd560c61e74f6da3"}, - {file = "regex-2022.3.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0317eb6331146c524751354ebef76a7a531853d7207a4d760dfb5f553137a2a4"}, - {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9c144405220c5ad3f5deab4c77f3e80d52e83804a6b48b6bed3d81a9a0238e4c"}, - {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5b2e24f3ae03af3d8e8e6d824c891fea0ca9035c5d06ac194a2700373861a15c"}, - {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f2c53f3af011393ab5ed9ab640fa0876757498aac188f782a0c620e33faa2a3d"}, - {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:060f9066d2177905203516c62c8ea0066c16c7342971d54204d4e51b13dfbe2e"}, - {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:530a3a16e57bd3ea0dff5ec2695c09632c9d6c549f5869d6cf639f5f7153fb9c"}, - {file = "regex-2022.3.15-cp39-cp39-win32.whl", hash = "sha256:78ce90c50d0ec970bd0002462430e00d1ecfd1255218d52d08b3a143fe4bde18"}, - {file = "regex-2022.3.15-cp39-cp39-win_amd64.whl", hash = "sha256:c5adc854764732dbd95a713f2e6c3e914e17f2ccdc331b9ecb777484c31f73b6"}, - {file = "regex-2022.3.15.tar.gz", hash = "sha256:0a7b75cc7bb4cc0334380053e4671c560e31272c9d2d5a6c4b8e9ae2c9bd0f82"}, -] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] -requests-oauthlib = [ - {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, - {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, -] -rope = [ - {file = "rope-0.18.0.tar.gz", hash = "sha256:786b5c38c530d4846aa68a42604f61b4e69a493390e3ca11b88df0fbfdc3ed04"}, -] -scipy = [ - {file = "scipy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:87b01c7d5761e8a266a0fbdb9d88dcba0910d63c1c671bdb4d99d29f469e9e03"}, - {file = "scipy-1.8.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ae3e327da323d82e918e593460e23babdce40d7ab21490ddf9fc06dec6b91a18"}, - {file = "scipy-1.8.0-cp310-cp310-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:16e09ef68b352d73befa8bcaf3ebe25d3941fe1a58c82909d5589856e6bc8174"}, - {file = "scipy-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c17a1878d00a5dd2797ccd73623ceca9d02375328f6218ee6d921e1325e61aff"}, - {file = "scipy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937d28722f13302febde29847bbe554b89073fbb924a30475e5ed7b028898b5f"}, - {file = "scipy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:8f4d059a97b29c91afad46b1737274cb282357a305a80bdd9e8adf3b0ca6a3f0"}, - {file = "scipy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:38aa39b6724cb65271e469013aeb6f2ce66fd44f093e241c28a9c6bc64fd79ed"}, - {file = "scipy-1.8.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:559a8a4c03a5ba9fe3232f39ed24f86457e4f3f6c0abbeae1fb945029f092720"}, - {file = "scipy-1.8.0-cp38-cp38-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:f4a6d3b9f9797eb2d43938ac2c5d96d02aed17ef170c8b38f11798717523ddba"}, - {file = "scipy-1.8.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b2c2af4183ed09afb595709a8ef5783b2baf7f41e26ece24e1329c109691a7"}, - {file = "scipy-1.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a279e27c7f4566ef18bab1b1e2c37d168e365080974758d107e7d237d3f0f484"}, - {file = "scipy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad5be4039147c808e64f99c0e8a9641eb5d2fa079ff5894dcd8240e94e347af4"}, - {file = "scipy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:3d9dd6c8b93a22bf9a3a52d1327aca7e092b1299fb3afc4f89e8eba381be7b59"}, - {file = "scipy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:5e73343c5e0d413c1f937302b2e04fb07872f5843041bcfd50699aef6e95e399"}, - {file = "scipy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:de2e80ee1d925984c2504812a310841c241791c5279352be4707cdcd7c255039"}, - {file = "scipy-1.8.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:c2bae431d127bf0b1da81fc24e4bba0a84d058e3a96b9dd6475dfcb3c5e8761e"}, - {file = "scipy-1.8.0-cp39-cp39-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:723b9f878095ed994756fa4ee3060c450e2db0139c5ba248ee3f9628bd64e735"}, - {file = "scipy-1.8.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:011d4386b53b933142f58a652aa0f149c9b9242abd4f900b9f4ea5fbafc86b89"}, - {file = "scipy-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6f0cd9c0bd374ef834ee1e0f0999678d49dcc400ea6209113d81528958f97c7"}, - {file = "scipy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3720d0124aced49f6f2198a6900304411dbbeed12f56951d7c66ebef05e3df6"}, - {file = "scipy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:3d573228c10a3a8c32b9037be982e6440e411b443a6267b067cac72f690b8d56"}, - {file = "scipy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb7088e89cd751acf66195d2f00cf009a1ea113f3019664032d9075b1e727b6c"}, - {file = "scipy-1.8.0.tar.gz", hash = "sha256:31d4f2d6b724bc9a98e527b5849b8a7e589bf1ea630c33aa563eda912c9ff0bd"}, -] -secretstorage = [ - {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, - {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, -] -service-identity = [ - {file = "service-identity-21.1.0.tar.gz", hash = "sha256:6e6c6086ca271dc11b033d17c3a8bea9f24ebff920c587da090afc9519419d34"}, - {file = "service_identity-21.1.0-py2.py3-none-any.whl", hash = "sha256:f0b0caac3d40627c3c04d7a51b6e06721857a0e10a8775f2d1d7e72901b3a7db"}, -] -setuptools-scm = [ - {file = "setuptools_scm-6.4.2-py3-none-any.whl", hash = "sha256:acea13255093849de7ccb11af9e1fb8bde7067783450cee9ef7a93139bddf6d4"}, - {file = "setuptools_scm-6.4.2.tar.gz", hash = "sha256:6833ac65c6ed9711a4d5d2266f8024cfa07c533a0e55f4c12f6eff280a5a9e30"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -smmap = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, -] -social-auth-app-django = [ - {file = "social-auth-app-django-3.4.0.tar.gz", hash = "sha256:09575f5c7dd91465df3a898c58e7c4ae1e78f31edba36b8b7be47ab0aeef2789"}, - {file = "social_auth_app_django-3.4.0-py2-none-any.whl", hash = "sha256:02b561e175d4a93896e4436b591586b61e647bd8eeef14c99a26344eb3b48d0e"}, - {file = "social_auth_app_django-3.4.0-py3-none-any.whl", hash = "sha256:47d1720115a9eaad78a67e99987d556abaa01222b9c2b9538182bbdbb10304ba"}, -] -social-auth-core = [ - {file = "social-auth-core-3.4.0.tar.gz", hash = "sha256:aaec7f1e1a9bb61d0467d05c8cfe8dd55402f39229716b933e3dc29eb5f1e61a"}, - {file = "social_auth_core-3.4.0-py2-none-any.whl", hash = "sha256:a4b972b6250d7a32940aec2972e33ebc645de91b2153d18dcd3e38fb74271042"}, - {file = "social_auth_core-3.4.0-py3-none-any.whl", hash = "sha256:b3aa96be236e59842ae45a5a51fe75c97814087ab5ba3092e80b41cb3dcdd8af"}, -] -sortedcontainers = [ - {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, - {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, -] -soupsieve = [ - {file = "soupsieve-2.3.2-py3-none-any.whl", hash = "sha256:a714129d3021ec17ce5be346b1007300558b378332c289a1a20e7d4de6ff18a5"}, - {file = "soupsieve-2.3.2.tar.gz", hash = "sha256:0bcc6d7432153063e3df09c3ac9442af3eba488715bfcad6a4c38ccb2a523124"}, -] -sqlalchemy = [ - {file = "SQLAlchemy-1.4.35-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:093b3109c2747d5dc0fa4314b1caf4c7ca336d5c8c831e3cfbec06a7e861e1e6"}, - {file = "SQLAlchemy-1.4.35-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6fb6b9ed1d0be7fa2c90be8ad2442c14cbf84eb0709dd1afeeff1e511550041"}, - {file = "SQLAlchemy-1.4.35-cp27-cp27m-win32.whl", hash = "sha256:d38a49aa75a5759d0d118e26701d70c70a37b896379115f8386e91b0444bfa70"}, - {file = "SQLAlchemy-1.4.35-cp27-cp27m-win_amd64.whl", hash = "sha256:70e571ae9ee0ff36ed37e2b2765445d54981e4d600eccdf6fe3838bc2538d157"}, - {file = "SQLAlchemy-1.4.35-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:48036698f20080462e981b18d77d574631a3d1fc2c33b416c6df299ec1d10b99"}, - {file = "SQLAlchemy-1.4.35-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:4ba2c1f368bcf8551cdaa27eac525022471015633d5bdafbc4297e0511f62f51"}, - {file = "SQLAlchemy-1.4.35-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17316100fcd0b6371ac9211351cb976fd0c2e12a859c1a57965e3ef7f3ed2bc"}, - {file = "SQLAlchemy-1.4.35-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9837133b89ad017e50a02a3b46419869cf4e9aa02743e911b2a9e25fa6b05403"}, - {file = "SQLAlchemy-1.4.35-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4efb70a62cbbbc052c67dc66b5448b0053b509732184af3e7859d05fdf6223c"}, - {file = "SQLAlchemy-1.4.35-cp310-cp310-win32.whl", hash = "sha256:1ff9f84b2098ef1b96255a80981ee10f4b5d49b6cfeeccf9632c2078cd86052e"}, - {file = "SQLAlchemy-1.4.35-cp310-cp310-win_amd64.whl", hash = "sha256:48f0eb5bcc87a9b2a95b345ed18d6400daaa86ca414f6840961ed85c342af8f4"}, - {file = "SQLAlchemy-1.4.35-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da25e75ba9f3fabc271673b6b413ca234994e6d3453424bea36bb5549c5bbaec"}, - {file = "SQLAlchemy-1.4.35-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeea6ace30603ca9a8869853bb4a04c7446856d7789e36694cd887967b7621f6"}, - {file = "SQLAlchemy-1.4.35-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a5dbdbb39c1b100df4d182c78949158073ca46ba2850c64fe02ffb1eb5b70903"}, - {file = "SQLAlchemy-1.4.35-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfd8e4c64c30a5219032e64404d468c425bdbc13b397da906fc9bee6591fc0dd"}, - {file = "SQLAlchemy-1.4.35-cp36-cp36m-win32.whl", hash = "sha256:9dac1924611698f8fe5b2e58601156c01da2b6c0758ba519003013a78280cf4d"}, - {file = "SQLAlchemy-1.4.35-cp36-cp36m-win_amd64.whl", hash = "sha256:e8b09e2d90267717d850f2e2323919ea32004f55c40e5d53b41267e382446044"}, - {file = "SQLAlchemy-1.4.35-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:63c82c9e8ccc2fb4bfd87c24ffbac320f70b7c93b78f206c1f9c441fa3013a5f"}, - {file = "SQLAlchemy-1.4.35-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:effadcda9a129cc56408dd5b2ea20ee9edcea24bd58e6a1489fa27672d733182"}, - {file = "SQLAlchemy-1.4.35-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2c6c411d8c59afba95abccd2b418f30ade674186660a2d310d364843049fb2c1"}, - {file = "SQLAlchemy-1.4.35-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2489e70bfa2356f2d421106794507daccf6cc8711753c442fc97272437fc606"}, - {file = "SQLAlchemy-1.4.35-cp37-cp37m-win32.whl", hash = "sha256:186cb3bd77abf2ddcf722f755659559bfb157647b3fd3f32ea1c70e8311e8f6b"}, - {file = "SQLAlchemy-1.4.35-cp37-cp37m-win_amd64.whl", hash = "sha256:babd63fb7cb6b0440abb6d16aca2be63342a6eea3dc7b613bb7a9357dc36920f"}, - {file = "SQLAlchemy-1.4.35-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:9e1a72197529ea00357640f21d92ffc7024e156ef9ac36edf271c8335facbc1a"}, - {file = "SQLAlchemy-1.4.35-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e255a8dd5572b0c66d6ee53597d36157ad6cf3bc1114f61c54a65189f996ab03"}, - {file = "SQLAlchemy-1.4.35-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9bec63b1e20ef69484f530fb4b4837e050450637ff9acd6dccc7003c5013abf8"}, - {file = "SQLAlchemy-1.4.35-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95411abc0e36d18f54fa5e24d42960ea3f144fb16caaa5a8c2e492b5424cc82c"}, - {file = "SQLAlchemy-1.4.35-cp38-cp38-win32.whl", hash = "sha256:28b17ebbaee6587013be2f78dc4f6e95115e1ec8dd7647c4e7be048da749e48b"}, - {file = "SQLAlchemy-1.4.35-cp38-cp38-win_amd64.whl", hash = "sha256:9e7094cf04e6042c4210a185fa7b9b8b3b789dd6d1de7b4f19452290838e48bd"}, - {file = "SQLAlchemy-1.4.35-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:1b4eac3933c335d7f375639885765722534bb4e52e51cdc01a667eea822af9b6"}, - {file = "SQLAlchemy-1.4.35-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d8edfb09ed2b865485530c13e269833dab62ab2d582fde21026c9039d4d0e62"}, - {file = "SQLAlchemy-1.4.35-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6204d06bfa85f87625e1831ca663f9dba91ac8aec24b8c65d02fb25cbaf4b4d7"}, - {file = "SQLAlchemy-1.4.35-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28aa2ef06c904729620cc735262192e622db9136c26d8587f71f29ec7715628a"}, - {file = "SQLAlchemy-1.4.35-cp39-cp39-win32.whl", hash = "sha256:ecc81336b46e31ae9c9bdfa220082079914e31a476d088d3337ecf531d861228"}, - {file = "SQLAlchemy-1.4.35-cp39-cp39-win_amd64.whl", hash = "sha256:53c7469b86a60fe2babca4f70111357e6e3d5150373bc85eb3b914356983e89a"}, - {file = "SQLAlchemy-1.4.35.tar.gz", hash = "sha256:2ffc813b01dc6473990f5e575f210ca5ac2f5465ace3908b78ffd6d20058aab5"}, -] -sqlparse = [ - {file = "sqlparse-0.4.2-py3-none-any.whl", hash = "sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d"}, - {file = "sqlparse-0.4.2.tar.gz", hash = "sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae"}, -] -strictyaml = [ - {file = "strictyaml-1.6.1.tar.gz", hash = "sha256:688be16ee5d1a2f94aa4abdc6d881e8e254d173d724ac88725955fe66bdb63d4"}, -] -tabulate = [ - {file = "tabulate-0.8.9-py3-none-any.whl", hash = "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4"}, - {file = "tabulate-0.8.9.tar.gz", hash = "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7"}, -] -tblib = [ - {file = "tblib-1.7.0-py2.py3-none-any.whl", hash = "sha256:289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23"}, - {file = "tblib-1.7.0.tar.gz", hash = "sha256:059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -toolz = [ - {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"}, - {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"}, -] -tornado = [ - {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, - {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, - {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, - {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, - {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, - {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, - {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, - {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, - {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, - {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, - {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, - {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, - {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, - {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, - {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, - {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, - {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, - {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, -] -tqdm = [ - {file = "tqdm-4.64.0-py2.py3-none-any.whl", hash = "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"}, - {file = "tqdm-4.64.0.tar.gz", hash = "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d"}, -] -traitlets = [ - {file = "traitlets-5.1.1-py3-none-any.whl", hash = "sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"}, - {file = "traitlets-5.1.1.tar.gz", hash = "sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7"}, -] -twisted = [ - {file = "Twisted-22.4.0-py3-none-any.whl", hash = "sha256:f9f7a91f94932477a9fc3b169d57f54f96c6e74a23d78d9ce54039a7f48928a2"}, - {file = "Twisted-22.4.0.tar.gz", hash = "sha256:a047990f57dfae1e0bd2b7df2526d4f16dcdc843774dc108b78c52f2a5f13680"}, -] -twisted-iocpsupport = [ - {file = "twisted-iocpsupport-1.0.2.tar.gz", hash = "sha256:72068b206ee809c9c596b57b5287259ea41ddb4774d86725b19f35bf56aa32a9"}, - {file = "twisted_iocpsupport-1.0.2-cp310-cp310-win32.whl", hash = "sha256:985c06a33f5c0dae92c71a036d1ea63872ee86a21dd9b01e1f287486f15524b4"}, - {file = "twisted_iocpsupport-1.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:81b3abe3527b367da0220482820cb12a16c661672b7bcfcde328902890d63323"}, - {file = "twisted_iocpsupport-1.0.2-cp36-cp36m-win32.whl", hash = "sha256:9dbb8823b49f06d4de52721b47de4d3b3026064ef4788ce62b1a21c57c3fff6f"}, - {file = "twisted_iocpsupport-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:b9fed67cf0f951573f06d560ac2f10f2a4bbdc6697770113a2fc396ea2cb2565"}, - {file = "twisted_iocpsupport-1.0.2-cp37-cp37m-win32.whl", hash = "sha256:b76b4eed9b27fd63ddb0877efdd2d15835fdcb6baa745cb85b66e5d016ac2878"}, - {file = "twisted_iocpsupport-1.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:851b3735ca7e8102e661872390e3bce88f8901bece95c25a0c8bb9ecb8a23d32"}, - {file = "twisted_iocpsupport-1.0.2-cp38-cp38-win32.whl", hash = "sha256:bf4133139d77fc706d8f572e6b7d82871d82ec7ef25d685c2351bdacfb701415"}, - {file = "twisted_iocpsupport-1.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:306becd6e22ab6e8e4f36b6bdafd9c92e867c98a5ce517b27fdd27760ee7ae41"}, - {file = "twisted_iocpsupport-1.0.2-cp39-cp39-win32.whl", hash = "sha256:3c61742cb0bc6c1ac117a7e5f422c129832f0c295af49e01d8a6066df8cfc04d"}, - {file = "twisted_iocpsupport-1.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:b435857b9efcbfc12f8c326ef0383f26416272260455bbca2cd8d8eca470c546"}, - {file = "twisted_iocpsupport-1.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7d972cfa8439bdcb35a7be78b7ef86d73b34b808c74be56dfa785c8a93b851bf"}, -] -txaio = [ - {file = "txaio-22.2.1-py2.py3-none-any.whl", hash = "sha256:41223af4a9d5726e645a8ee82480f413e5e300dd257db94bc38ae12ea48fb2e5"}, - {file = "txaio-22.2.1.tar.gz", hash = "sha256:2e4582b70f04b2345908254684a984206c0d9b50e3074a24a4c55aba21d24d01"}, -] -typed-ast = [ - {file = "typed_ast-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:183b183b7771a508395d2cbffd6db67d6ad52958a5fdc99f450d954003900266"}, - {file = "typed_ast-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596"}, - {file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc2542e83ac8399752bc16e0b35e038bdb659ba237f4222616b4e83fb9654985"}, - {file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74cac86cc586db8dfda0ce65d8bcd2bf17b58668dfcc3652762f3ef0e6677e76"}, - {file = "typed_ast-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:18fe320f354d6f9ad3147859b6e16649a0781425268c4dde596093177660e71a"}, - {file = "typed_ast-1.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:31d8c6b2df19a777bc8826770b872a45a1f30cfefcfd729491baa5237faae837"}, - {file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:963a0ccc9a4188524e6e6d39b12c9ca24cc2d45a71cfdd04a26d883c922b4b78"}, - {file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0eb77764ea470f14fcbb89d51bc6bbf5e7623446ac4ed06cbd9ca9495b62e36e"}, - {file = "typed_ast-1.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:294a6903a4d087db805a7656989f613371915fc45c8cc0ddc5c5a0a8ad9bea4d"}, - {file = "typed_ast-1.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26a432dc219c6b6f38be20a958cbe1abffcc5492821d7e27f08606ef99e0dffd"}, - {file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7407cfcad702f0b6c0e0f3e7ab876cd1d2c13b14ce770e412c0c4b9728a0f88"}, - {file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f30ddd110634c2d7534b2d4e0e22967e88366b0d356b24de87419cc4410c41b7"}, - {file = "typed_ast-1.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8c08d6625bb258179b6e512f55ad20f9dfef019bbfbe3095247401e053a3ea30"}, - {file = "typed_ast-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:90904d889ab8e81a956f2c0935a523cc4e077c7847a836abee832f868d5c26a4"}, - {file = "typed_ast-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bbebc31bf11762b63bf61aaae232becb41c5bf6b3461b80a4df7e791fabb3aca"}, - {file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29dd9a3a9d259c9fa19d19738d021632d673f6ed9b35a739f48e5f807f264fb"}, - {file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:58ae097a325e9bb7a684572d20eb3e1809802c5c9ec7108e85da1eb6c1a3331b"}, - {file = "typed_ast-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:da0a98d458010bf4fe535f2d1e367a2e2060e105978873c04c04212fb20543f7"}, - {file = "typed_ast-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:33b4a19ddc9fc551ebabca9765d54d04600c4a50eda13893dadf67ed81d9a098"}, - {file = "typed_ast-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1098df9a0592dd4c8c0ccfc2e98931278a6c6c53cb3a3e2cf7e9ee3b06153344"}, - {file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c47c3b43fe3a39ddf8de1d40dbbfca60ac8530a36c9b198ea5b9efac75c09e"}, - {file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f290617f74a610849bd8f5514e34ae3d09eafd521dceaa6cf68b3f4414266d4e"}, - {file = "typed_ast-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:df05aa5b241e2e8045f5f4367a9f6187b09c4cdf8578bb219861c4e27c443db5"}, - {file = "typed_ast-1.5.2.tar.gz", hash = "sha256:525a2d4088e70a9f75b08b3f87a51acc9cde640e19cc523c7e41aa355564ae27"}, -] -types-pytz = [ - {file = "types-pytz-2021.3.6.tar.gz", hash = "sha256:74547fd90d8d8ab4f1eedf3a344a7d186d97486973895f81221a712e1e2cd993"}, - {file = "types_pytz-2021.3.6-py3-none-any.whl", hash = "sha256:6805c72d51118923c5bf98633c39593d5b464d2ab49a803440e2d7ab6b8920df"}, -] -types-pyyaml = [ - {file = "types-PyYAML-6.0.5.tar.gz", hash = "sha256:464e050914f3d1d83a8c038e1cf46da5cb96b7cd02eaa096bcaa03675edd8a2e"}, - {file = "types_PyYAML-6.0.5-py3-none-any.whl", hash = "sha256:2fd21310870addfd51db621ad9f3b373f33ee3cbb81681d70ef578760bd22d35"}, -] -typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, -] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, -] -verspec = [ - {file = "verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31"}, - {file = "verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e"}, -] -watchdog = [ - {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:177bae28ca723bc00846466016d34f8c1d6a621383b6caca86745918d55c7383"}, - {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d1cf7dfd747dec519486a98ef16097e6c480934ef115b16f18adb341df747a4"}, - {file = "watchdog-2.1.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f14ce6adea2af1bba495acdde0e510aecaeb13b33f7bd2f6324e551b26688ca"}, - {file = "watchdog-2.1.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4d0e98ac2e8dd803a56f4e10438b33a2d40390a72750cff4939b4b274e7906fa"}, - {file = "watchdog-2.1.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:81982c7884aac75017a6ecc72f1a4fedbae04181a8665a34afce9539fc1b3fab"}, - {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0b4a1fe6201c6e5a1926f5767b8664b45f0fcb429b62564a41f490ff1ce1dc7a"}, - {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6e6ae29b72977f2e1ee3d0b760d7ee47896cb53e831cbeede3e64485e5633cc8"}, - {file = "watchdog-2.1.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b9777664848160449e5b4260e0b7bc1ae0f6f4992a8b285db4ec1ef119ffa0e2"}, - {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:19b36d436578eb437e029c6b838e732ed08054956366f6dd11875434a62d2b99"}, - {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b61acffaf5cd5d664af555c0850f9747cc5f2baf71e54bbac164c58398d6ca7b"}, - {file = "watchdog-2.1.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1e877c70245424b06c41ac258023ea4bd0c8e4ff15d7c1368f17cd0ae6e351dd"}, - {file = "watchdog-2.1.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d802d65262a560278cf1a65ef7cae4e2bc7ecfe19e5451349e4c67e23c9dc420"}, - {file = "watchdog-2.1.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b3750ee5399e6e9c69eae8b125092b871ee9e2fcbd657a92747aea28f9056a5c"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_aarch64.whl", hash = "sha256:ed6d9aad09a2a948572224663ab00f8975fae242aa540509737bb4507133fa2d"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_armv7l.whl", hash = "sha256:b26e13e8008dcaea6a909e91d39b629a39635d1a8a7239dd35327c74f4388601"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_i686.whl", hash = "sha256:0908bb50f6f7de54d5d31ec3da1654cb7287c6b87bce371954561e6de379d690"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64.whl", hash = "sha256:bdcbf75580bf4b960fb659bbccd00123d83119619195f42d721e002c1621602f"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:81a5861d0158a7e55fe149335fb2bbfa6f48cbcbd149b52dbe2cd9a544034bbd"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_s390x.whl", hash = "sha256:03b43d583df0f18782a0431b6e9e9965c5b3f7cf8ec36a00b930def67942c385"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ae934e34c11aa8296c18f70bf66ed60e9870fcdb4cc19129a04ca83ab23e7055"}, - {file = "watchdog-2.1.7-py3-none-win32.whl", hash = "sha256:49639865e3db4be032a96695c98ac09eed39bbb43fe876bb217da8f8101689a6"}, - {file = "watchdog-2.1.7-py3-none-win_amd64.whl", hash = "sha256:340b875aecf4b0e6672076a6f05cfce6686935559bb6d34cebedee04126a9566"}, - {file = "watchdog-2.1.7-py3-none-win_ia64.whl", hash = "sha256:351e09b6d9374d5bcb947e6ac47a608ec25b9d70583e9db00b2fcdb97b00b572"}, - {file = "watchdog-2.1.7.tar.gz", hash = "sha256:3fd47815353be9c44eebc94cc28fe26b2b0c5bd889dafc4a5a7cbdf924143480"}, -] -wcwidth = [ - {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, - {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, -] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] -whitenoise = [ - {file = "whitenoise-5.3.0-py2.py3-none-any.whl", hash = "sha256:d963ef25639d1417e8a247be36e6aedd8c7c6f0a08adcb5a89146980a96b577c"}, - {file = "whitenoise-5.3.0.tar.gz", hash = "sha256:d234b871b52271ae7ed6d9da47ffe857c76568f11dd30e28e18c5869dbd11e12"}, -] -xarray = [ - {file = "xarray-2022.3.0-py3-none-any.whl", hash = "sha256:560f36eaabe7a989d5583d37ec753dd737357aa6a6453e55c80bb4f92291a69e"}, - {file = "xarray-2022.3.0.tar.gz", hash = "sha256:398344bf7d170477aaceff70210e11ebd69af6b156fe13978054d25c48729440"}, -] -zict = [ - {file = "zict-2.1.0-py3-none-any.whl", hash = "sha256:3b7cf8ba91fb81fbe525e5aeb37e71cded215c99e44335eec86fea2e3c43ef41"}, - {file = "zict-2.1.0.tar.gz", hash = "sha256:15b2cc15f95a476fbe0623fd8f771e1e771310bf7a01f95412a0b605b6e47510"}, -] -zipp = [ - {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, - {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, -] -"zope.event" = [ - {file = "zope.event-4.5.0-py2.py3-none-any.whl", hash = "sha256:2666401939cdaa5f4e0c08cf7f20c9b21423b95e88f4675b1443973bdb080c42"}, - {file = "zope.event-4.5.0.tar.gz", hash = "sha256:5e76517f5b9b119acf37ca8819781db6c16ea433f7e2062c4afc2b6fbedb1330"}, -] -"zope.interface" = [ - {file = "zope.interface-5.4.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:7df1e1c05304f26faa49fa752a8c690126cf98b40b91d54e6e9cc3b7d6ffe8b7"}, - {file = "zope.interface-5.4.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2c98384b254b37ce50eddd55db8d381a5c53b4c10ee66e1e7fe749824f894021"}, - {file = "zope.interface-5.4.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:08f9636e99a9d5410181ba0729e0408d3d8748026ea938f3b970a0249daa8192"}, - {file = "zope.interface-5.4.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ea1d73b7c9dcbc5080bb8aaffb776f1c68e807767069b9ccdd06f27a161914a"}, - {file = "zope.interface-5.4.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:273f158fabc5ea33cbc936da0ab3d4ba80ede5351babc4f577d768e057651531"}, - {file = "zope.interface-5.4.0-cp27-cp27m-win32.whl", hash = "sha256:a1e6e96217a0f72e2b8629e271e1b280c6fa3fe6e59fa8f6701bec14e3354325"}, - {file = "zope.interface-5.4.0-cp27-cp27m-win_amd64.whl", hash = "sha256:877473e675fdcc113c138813a5dd440da0769a2d81f4d86614e5d62b69497155"}, - {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f7ee479e96f7ee350db1cf24afa5685a5899e2b34992fb99e1f7c1b0b758d263"}, - {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:b0297b1e05fd128d26cc2460c810d42e205d16d76799526dfa8c8ccd50e74959"}, - {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:af310ec8335016b5e52cae60cda4a4f2a60a788cbb949a4fbea13d441aa5a09e"}, - {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:9a9845c4c6bb56e508651f005c4aeb0404e518c6f000d5a1123ab077ab769f5c"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0b465ae0962d49c68aa9733ba92a001b2a0933c317780435f00be7ecb959c702"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:5dd9ca406499444f4c8299f803d4a14edf7890ecc595c8b1c7115c2342cadc5f"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:469e2407e0fe9880ac690a3666f03eb4c3c444411a5a5fddfdabc5d184a79f05"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:52de7fc6c21b419078008f697fd4103dbc763288b1406b4562554bd47514c004"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:3dd4952748521205697bc2802e4afac5ed4b02909bb799ba1fe239f77fd4e117"}, - {file = "zope.interface-5.4.0-cp35-cp35m-win32.whl", hash = "sha256:dd93ea5c0c7f3e25335ab7d22a507b1dc43976e1345508f845efc573d3d779d8"}, - {file = "zope.interface-5.4.0-cp35-cp35m-win_amd64.whl", hash = "sha256:3748fac0d0f6a304e674955ab1365d515993b3a0a865e16a11ec9d86fb307f63"}, - {file = "zope.interface-5.4.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:66c0061c91b3b9cf542131148ef7ecbecb2690d48d1612ec386de9d36766058f"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:d0c1bc2fa9a7285719e5678584f6b92572a5b639d0e471bb8d4b650a1a910920"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2876246527c91e101184f63ccd1d716ec9c46519cc5f3d5375a3351c46467c46"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:334701327f37c47fa628fc8b8d28c7d7730ce7daaf4bda1efb741679c2b087fc"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:71aace0c42d53abe6fc7f726c5d3b60d90f3c5c055a447950ad6ea9cec2e37d9"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:5bb3489b4558e49ad2c5118137cfeaf59434f9737fa9c5deefc72d22c23822e2"}, - {file = "zope.interface-5.4.0-cp36-cp36m-win32.whl", hash = "sha256:1c0e316c9add0db48a5b703833881351444398b04111188069a26a61cfb4df78"}, - {file = "zope.interface-5.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f0c02cbb9691b7c91d5009108f975f8ffeab5dff8f26d62e21c493060eff2a1"}, - {file = "zope.interface-5.4.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7d97a4306898b05404a0dcdc32d9709b7d8832c0c542b861d9a826301719794e"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:867a5ad16892bf20e6c4ea2aab1971f45645ff3102ad29bd84c86027fa99997b"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5f931a1c21dfa7a9c573ec1f50a31135ccce84e32507c54e1ea404894c5eb96f"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:194d0bcb1374ac3e1e023961610dc8f2c78a0f5f634d0c737691e215569e640d"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:8270252effc60b9642b423189a2fe90eb6b59e87cbee54549db3f5562ff8d1b8"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:15e7d1f7a6ee16572e21e3576d2012b2778cbacf75eb4b7400be37455f5ca8bf"}, - {file = "zope.interface-5.4.0-cp37-cp37m-win32.whl", hash = "sha256:8892f89999ffd992208754851e5a052f6b5db70a1e3f7d54b17c5211e37a98c7"}, - {file = "zope.interface-5.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2e5a26f16503be6c826abca904e45f1a44ff275fdb7e9d1b75c10671c26f8b94"}, - {file = "zope.interface-5.4.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4de4bc9b6d35c5af65b454d3e9bc98c50eb3960d5a3762c9438df57427134b8e"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bf68f4b2b6683e52bec69273562df15af352e5ed25d1b6641e7efddc5951d1a7"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:63b82bb63de7c821428d513607e84c6d97d58afd1fe2eb645030bdc185440120"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:db1fa631737dab9fa0b37f3979d8d2631e348c3b4e8325d6873c2541d0ae5a48"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f44e517131a98f7a76696a7b21b164bcb85291cee106a23beccce454e1f433a4"}, - {file = "zope.interface-5.4.0-cp38-cp38-win32.whl", hash = "sha256:a9506a7e80bcf6eacfff7f804c0ad5350c8c95b9010e4356a4b36f5322f09abb"}, - {file = "zope.interface-5.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54"}, - {file = "zope.interface-5.4.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:0cee5187b60ed26d56eb2960136288ce91bcf61e2a9405660d271d1f122a69a4"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a8156e6a7f5e2a0ff0c5b21d6bcb45145efece1909efcbbbf48c56f8da68221d"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:205e40ccde0f37496904572035deea747390a8b7dc65146d30b96e2dd1359a83"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:3f24df7124c323fceb53ff6168da70dbfbae1442b4f3da439cd441681f54fe25"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:5208ebd5152e040640518a77827bdfcc73773a15a33d6644015b763b9c9febc1"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:17776ecd3a1fdd2b2cd5373e5ef8b307162f581c693575ec62e7c5399d80794c"}, - {file = "zope.interface-5.4.0-cp39-cp39-win32.whl", hash = "sha256:d4d9d6c1a455d4babd320203b918ccc7fcbefe308615c521062bc2ba1aa4d26e"}, - {file = "zope.interface-5.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:0cba8477e300d64a11a9789ed40ee8932b59f9ee05f85276dbb4b59acee5dd09"}, - {file = "zope.interface-5.4.0.tar.gz", hash = "sha256:5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e"}, -] +lock-version = "2.0" +python-versions = ">=3.10.0,<4" +content-hash = "22df3a849dc73f8f54b83899b2b5f20601789a1d6b69334aafccee3aea75555c" diff --git a/pyproject.toml b/pyproject.toml index 610810c74..45839bc75 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,13 +6,13 @@ authors = ["The VAST Development Team"] license = "MIT" [tool.poetry.dependencies] -python = ">=3.8.0,<3.10" +python = ">=3.10.0,<4" astropy = "^5.0" astroquery = "^0.4.4" bokeh = "2.4.2" # must align with @bokeh/bokehjs version in package.json cloudpickle = "^1.5.0" -dask = {extras = ["dataframe"], version = "^2022.1.0"} -dill = "^0.3.3" +dask = {extras = ["dataframe"], version = "^2023.1.0"} +dill = "^0" Django = "^3.2.13" django-crispy-forms = "^1.9.2" django-environ = "^0.4.5" @@ -23,14 +23,14 @@ django-tagulous = "^1.1.0" Jinja2 = "^3.0.3" networkx = "^2.4" numpy = "^1.18.1" -pandas = "^1.2.0" +pandas = "^2.0.3" psutil = "^5.7.0" psycopg2 = "^2.8.4" -pyarrow = "^7.0" +pyarrow = "12.0.1" scipy = "^1.6.0" social-auth-app-django = "^3.1.0" social-auth-core = "^3.3.3" -sqlalchemy = "^1.3.11" +sqlalchemy = "^2.0.17" whitenoise = "^5.2.0" gevent = { version = "^21.1.2", optional = true } gunicorn = { version = "^20.0.4", optional = true } @@ -39,8 +39,10 @@ strictyaml = "^1.3.2" colorcet = "^2.0.6" matplotlib = "^3.5.0" holoviews = "^1.14.7" -datashader = "^0.13.0" +datashader = "^0" channels = "^3.0.4" +numba = "^0.57.1" +llvmlite = "^0.40.1" [tool.poetry.dev-dependencies] mkdocs-material = "^8.2.4" diff --git a/static/js/datatables-pipeline.js b/static/js/datatables-pipeline.js index 23b01a4fc..a7727483e 100644 --- a/static/js/datatables-pipeline.js +++ b/static/js/datatables-pipeline.js @@ -1,7 +1,7 @@ let DEFAULT_DATATABLE_BUTTONS = [ - {extend: 'colvis', className: 'btn-info btn-sm'}, - {extend: 'csv', className: 'btn-info btn-sm'}, - {extend: 'excel', className: 'btn-info btn-sm'}, + { extend: 'colvis', className: 'btn-info btn-sm' }, + { extend: 'csv', className: 'btn-info btn-sm' }, + { extend: 'excel', className: 'btn-info btn-sm' }, ] // Formatting function for API @@ -10,7 +10,7 @@ function obj_formatter(obj) { let hrefValue = null; if (obj.render.url.hasOwnProperty('nested')) { let [prefix, col] = [obj.render.url.prefix, obj.render.url.col]; - hrefValue = function(data, type, row, meta) { + hrefValue = function (data, type, row, meta) { // split the col on the . for nested JSON and build the selection let sel = row; col.split('.').forEach(item => sel = sel[item]); @@ -18,7 +18,7 @@ function obj_formatter(obj) { }; } else { let [prefix, col] = [obj.render.url.prefix, obj.render.url.col]; - hrefValue = function(data, type, row, meta) { + hrefValue = function (data, type, row, meta) { return '' + row[col] + ''; }; } @@ -30,14 +30,14 @@ function obj_formatter(obj) { obj.render.float.scale, obj.render.float.col ]; - let floatFormat = function(data, type, row, meta) { - return (row[col] * scale).toFixed(precision); + let floatFormat = function (data, type, row, meta) { + return (row[col] * scale).toFixed(precision); }; obj.render = floatFormat; return obj; } else if (obj.render.hasOwnProperty('contains_sibl')) { let col = obj.render.contains_sibl.col; - let sibl_bool = function(data, type, row, meta) { + let sibl_bool = function (data, type, row, meta) { if (row[col] > 0) { return true; } else { @@ -66,7 +66,7 @@ function drawExternalResultsTable(id, buttons = DEFAULT_DATATABLE_BUTTONS) { "columnDefs": [ { "targets": 0, - "render": function( data, type, row, meta) { + "render": function (data, type, row, meta) { if (row["database"] === "SIMBAD") { return '' + row['object_name'] + ' (' + row['database'] + ')' } else if (row["database"] == "NED") { @@ -80,13 +80,13 @@ function drawExternalResultsTable(id, buttons = DEFAULT_DATATABLE_BUTTONS) { }, { "targets": 1, - "render": function ( data, type, row, meta ) { + "render": function (data, type, row, meta) { return row['separation_arcsec'].toFixed(2); } }, { "targets": 2, - "render": function ( data, type, row, meta ) { + "render": function (data, type, row, meta) { if (row['otype_long'] !== "" && row['otype'] !== row['otype_long']) { return '' + row['otype'] + ''; } else { @@ -101,7 +101,7 @@ function drawExternalResultsTable(id, buttons = DEFAULT_DATATABLE_BUTTONS) { // Call the dataTables jQuery plugin -$(document).ready(function() { +$(document).ready(function () { $('[data-toggle="tooltip"]').tooltip(); let dom = ( @@ -116,12 +116,12 @@ $(document).ready(function() { dataConfParsed = JSON.parse(dataConfElement.textContent); dataConfList = (Array.isArray(dataConfParsed)) ? dataConfParsed : [dataConfParsed]; } - for (let dataConf of dataConfList){ + for (let dataConf of dataConfList) { let table_id = (dataConfList.length == 1) ? '#dataTable' : '#' + dataConf.table_id; if (dataConf.hasOwnProperty('api')) { // build conf for server side datatable let testFields = dataConf.colsFields; - testFields.forEach( function(obj) { + testFields.forEach(function (obj) { if (obj.hasOwnProperty('render')) { obj = obj_formatter(obj) } @@ -134,7 +134,7 @@ $(document).ready(function() { language: { processing: ( '
' + - 'Loading...' + + 'Loading...' + '
' ) }, @@ -151,14 +151,14 @@ $(document).ready(function() { columns: dataConf.colsFields, order: dataConf.order, searchDelay: 2000, - dom : dom, + dom: dom, buttons: DEFAULT_DATATABLE_BUTTONS }; // apply deferLoading config, if supplied if (dataConf.hasOwnProperty('deferLoading')) { dataTableConf.deferLoading = dataConf.deferLoading; // change the message printed in the empty table if deferLoading active - dataTableConf.initComplete = function(settings, json) { + dataTableConf.initComplete = function (settings, json) { $("td.dataTables_empty").text("Submit a query to view results"); } } @@ -171,9 +171,9 @@ $(document).ready(function() { // ... // ]; let dataSet = []; - dataConf.dataQuery.forEach( function(obj) { + dataConf.dataQuery.forEach(function (obj) { let row = []; - dataConf.colsFields.forEach(function(elem) { + dataConf.colsFields.forEach(function (elem) { row.push(obj[elem]) }) dataSet.push(row) @@ -201,106 +201,106 @@ $(document).ready(function() { { "targets": 1, "data": "name", - "render": function ( data, type, row, meta ) { + "render": function (data, type, row, meta) { return '' + row[1] + ''; } }, { "targets": 3, "data": "image", - "render": function ( data, type, row, meta ) { + "render": function (data, type, row, meta) { return '' + row[3] + ''; } }, { "targets": 4, "data": "frequency", - "render": function ( data, type, row, meta ) { + "render": function (data, type, row, meta) { return row[4].toFixed(2); } }, { "targets": 5, "data": "ra", - "render": function ( data, type, row, meta ) { + "render": function (data, type, row, meta) { return row[5].toFixed(4); } }, { "targets": 6, "data": "ra_err", - "render": function ( data, type, row, meta ) { - return (row[6] * 3600.).toFixed(4); + "render": function (data, type, row, meta) { + return (row[6] * 3600.).toFixed(4); } }, { "targets": 7, "data": "dec", - "render": function ( data, type, row, meta ) { - return row[7].toFixed(4); + "render": function (data, type, row, meta) { + return row[7].toFixed(4); } }, { "targets": 8, "data": "dec_err", - "render": function ( data, type, row, meta ) { - return (row[8] * 3600.).toFixed(4); + "render": function (data, type, row, meta) { + return (row[8] * 3600.).toFixed(4); } }, { "targets": 9, "data": "flux_peak", - "render": function ( data, type, row, meta ) { - return (row[9]).toFixed(3); + "render": function (data, type, row, meta) { + return (row[9]).toFixed(3); } }, { "targets": 10, "data": "flux_peak_err", - "render": function ( data, type, row, meta ) { - return (row[10]).toFixed(3); + "render": function (data, type, row, meta) { + return (row[10]).toFixed(3); } }, { "targets": 11, "data": "flux_peak_isl_ratio", - "render": function ( data, type, row, meta ) { - return (row[11]).toFixed(2); + "render": function (data, type, row, meta) { + return (row[11]).toFixed(2); } }, { "targets": 12, "data": "flux_int", - "render": function ( data, type, row, meta ) { - return (row[12]).toFixed(3); + "render": function (data, type, row, meta) { + return (row[12]).toFixed(3); } }, { "targets": 13, "data": "flux_int_err", - "render": function ( data, type, row, meta ) { - return (row[13]).toFixed(3); + "render": function (data, type, row, meta) { + return (row[13]).toFixed(3); } }, { "targets": 14, "data": "flux_int_isl_ratio", - "render": function ( data, type, row, meta ) { - return (row[14]).toFixed(2); + "render": function (data, type, row, meta) { + return (row[14]).toFixed(2); } }, { "targets": 15, "data": "local_rms", - "render": function ( data, type, row, meta ) { - return (row[15]).toFixed(2); + "render": function (data, type, row, meta) { + return (row[15]).toFixed(2); } }, { "targets": 16, "data": "snr", - "render": function ( data, type, row, meta ) { - return (row[16]).toFixed(2); + "render": function (data, type, row, meta) { + return (row[16]).toFixed(2); } }, { @@ -318,7 +318,7 @@ $(document).ready(function() { drawExternalResultsTable('#externalResultsTable'); // Trigger the update search on the datatable - $("#catalogSearch").on('click', function(e) { + $("#catalogSearch").on('click', function (e) { let PipeRun = document.getElementById("runSelect"); let qry_url = dataConfParsed.api; if (PipeRun.value != '') { @@ -338,7 +338,7 @@ $(document).ready(function() { qry_url = qry_url + "&coord=" + encodeURIComponent(coord.value); }; if (unit.value) { - qry_url = qry_url + "&radiusunit=" + unit.value + qry_url = qry_url + "&radiusunit=" + unit.value } let avg_flux_type = document.getElementById("aveFluxSelect"); let avg_flux_min = document.getElementById("avgFluxMinSelect"); @@ -510,7 +510,7 @@ $(document).ready(function() { qry_url = qry_url + "&source_selection=" + source_selection.value; }; if (source_selection_type.value) { - qry_url = qry_url + "&source_selection_type=" +source_selection_type.value; + qry_url = qry_url + "&source_selection_type=" + source_selection_type.value; }; table.ajax.url(qry_url); table.ajax.reload(); @@ -522,8 +522,8 @@ $(document).ready(function() { }); // Trigger the search reset on the datatable - $("#resetSearch").on('click', function(e) { - $('#runSelect option').prop('selected', function() { + $("#resetSearch").on('click', function (e) { + $('#runSelect option').prop('selected', function () { return this.defaultSelected }); let inputs = [ @@ -536,7 +536,7 @@ $(document).ready(function() { 'compactnessMinSelect', 'compactnessMaxSelect', 'objectNameInput', 'MinSnrMinSelect', 'MinSnrMaxSelect', 'MaxSnrMinSelect', 'MaxSnrMaxSelect', 'fluxMaxMinSelect', 'fluxMaxMaxSelect', 'sourceSelectionSelect', - ]; + ]; var input; for (input of inputs) { document.getElementById(input).value = ''; diff --git a/templates/sources_etav_plot.html b/templates/sources_etav_plot.html index 6432efe87..8b16f79d1 100644 --- a/templates/sources_etav_plot.html +++ b/templates/sources_etav_plot.html @@ -149,7 +149,7 @@
Selected Source Light C function update_card(id) { $('#cardsUpdate').html('').load( - "{% url 'vast_pipeline:source_etav_plot_update' 0 %}".replace('0', id), + "{% url 'vast_pipeline:source_etav_plot_update' 'e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813' %}".replace('e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813', id), function() { // redraw the external results table, function is defined in datatables-pipeline.js drawExternalResultsTable('#externalResultsTable'); diff --git a/vast_pipeline/image/main.py b/vast_pipeline/image/main.py index 2a8edaf5b..98d5d0d48 100644 --- a/vast_pipeline/image/main.py +++ b/vast_pipeline/image/main.py @@ -4,6 +4,7 @@ import os import logging +import uuid import numpy as np import pandas as pd @@ -124,34 +125,31 @@ def __get_header(self, hdu_index: int) -> fits.Header: hdu = hdulist[hdu_index] except Exception: raise IOError(( - 'Could not read FITS file: ' - f'{self.path}' + f"Could not read FITS file: {self.path}" )) return hdu.header.copy() def __set_img_attr_for_telescope(self, header): - ''' + """ Set the image attributes depending on the telescope type - ''' - self.polarisation = header.get('STOKES', 'I') - self.duration = float(header.get('DURATION', 0.)) - self.beam_bmaj = 0. - self.beam_bmin = 0. - self.beam_bpa = 0. + """ + self.polarisation = header.get("STOKES", "I") + self.duration = float(header.get("DURATION", 0.0)) + self.beam_bmaj = 0.0 + self.beam_bmin = 0.0 + self.beam_bpa = 0.0 self.ra = None self.dec = None self.fov_bmaj = None self.fov_bmin = None - if header.get('TELESCOP', None) == 'ASKAP': + if header.get("TELESCOP", None) == "ASKAP": try: - self.datetime = pd.Timestamp( - header['DATE-OBS'], tz=header['TIMESYS'] - ) - self.beam_bmaj = header['BMAJ'] - self.beam_bmin = header['BMIN'] - self.beam_bpa = header['BPA'] + self.datetime = pd.Timestamp(header["DATE-OBS"], tz=header["TIMESYS"]) + self.beam_bmaj = header["BMAJ"] + self.beam_bmin = header["BMIN"] + self.beam_bpa = header["BPA"] except KeyError as e: logger.exception( "Image %s does not contain expected FITS header keywords.", @@ -160,9 +158,9 @@ def __set_img_attr_for_telescope(self, header): raise e params = { - 'header': header, - 'fits_naxis1': 'NAXIS1', - 'fits_naxis2': 'NAXIS2', + "header": header, + "fits_naxis1": "NAXIS1", + "fits_naxis2": "NAXIS2", } # set the coordinate attributes @@ -187,17 +185,17 @@ def __get_img_coordinates( None """ wcs = WCS(header, naxis=2) - pix_centre = [[header[fits_naxis1] / 2., header[fits_naxis2] / 2.]] + pix_centre = [[header[fits_naxis1] / 2.0, header[fits_naxis2] / 2.0]] self.ra, self.dec = wcs.wcs_pix2world(pix_centre, 1)[0] # The field-of-view (in pixels) is assumed to be a circle in the centre # of the image. This may be an ellipse on the sky, eg MOST images. # We leave a pixel margin at the edge that we don't use. # TODO: move unused pixel as argument - unusedpix = 0. - usable_radius_pix = self.__get_radius_pixels( - header, fits_naxis1, fits_naxis2 - ) - unusedpix + unusedpix = 0.0 + usable_radius_pix = ( + self.__get_radius_pixels(header, fits_naxis1, fits_naxis2) - unusedpix + ) cdelt1, cdelt2 = proj_plane_pixel_scales(WCS(header).celestial) self.fov_bmin = usable_radius_pix * abs(cdelt1) self.fov_bmaj = usable_radius_pix * abs(cdelt2) @@ -232,7 +230,7 @@ def __get_radius_pixels( else: # We simply place the largest circle we can in the centre. diameter = min(header[fits_naxis1], header[fits_naxis2]) - return diameter / 2. + return diameter / 2.0 def __get_frequency(self, header: fits.Header) -> None: """ @@ -248,16 +246,16 @@ def __get_frequency(self, header: fits.Header) -> None: self.freq_eff = None self.freq_bw = None try: - freq_keys = ('FREQ', 'VOPT') - if ('ctype3' in header) and (header['ctype3'] in freq_keys): - self.freq_eff = header['crval3'] - self.freq_bw = header['cdelt3'] if 'cdelt3' in header else 0.0 - elif ('ctype4' in header) and (header['ctype4'] in freq_keys): - self.freq_eff = header['crval4'] - self.freq_bw = header['cdelt4'] if 'cdelt4' in header else 0.0 + freq_keys = ("FREQ", "VOPT") + if ("ctype3" in header) and (header["ctype3"] in freq_keys): + self.freq_eff = header["crval3"] + self.freq_bw = header["cdelt3"] if "cdelt3" in header else 0.0 + elif ("ctype4" in header) and (header["ctype4"] in freq_keys): + self.freq_eff = header["crval4"] + self.freq_bw = header["cdelt4"] if "cdelt4" in header else 0.0 else: - self.freq_eff = header['restfreq'] - self.freq_bw = header['restbw'] if 'restbw' in header else 0.0 + self.freq_eff = header["restfreq"] + self.freq_bw = header["restbw"] if "restbw" in header else 0.0 except Exception: msg = f"Frequency not specified in headers for {self.name}" logger.error(msg) @@ -300,9 +298,9 @@ def __init__( None. """ # inherit from parent - self.selavy_path = paths['selavy'][path] - self.noise_path = paths['noise'].get(path, '') - self.background_path = paths['background'].get(path, '') + self.selavy_path = paths["selavy"][path] + self.noise_path = paths["noise"].get(path, "") + self.background_path = paths["background"].get(path, "") self.config: Dict = config super().__init__(path, hdu_index) @@ -340,20 +338,23 @@ def read_selavy(self, dj_image: models.Image) -> pd.DataFrame: # fix dtype of columns for ky in tr_selavy: key = tr_selavy[ky] - if df[key['name']].dtype != key['dtype']: - df[key['name']] = df[key['name']].astype(key['dtype']) + if df[key["name"]].dtype != key["dtype"]: + df[key["name"]] = df[key["name"]].astype(key["dtype"]) + + # Add id column + df["id"] = df.apply(lambda _: str(uuid.uuid4()), axis=1) # do checks and fill in missing field for uploading sources # in DB (see fields in models.py -> Source model) - if df['component_id'].duplicated().any(): - raise Exception('Found duplicated names in sources') + if df["component_id"].duplicated().any(): + raise Exception("Found duplicated names in sources") # drop unrealistic sources cols_to_check = [ - 'bmaj', - 'bmin', - 'flux_peak', - 'flux_int', + "bmaj", + "bmin", + "flux_peak", + "flux_int", ] bad_sources = df[(df[cols_to_check] == 0).any(axis=1)] @@ -364,117 +365,117 @@ def read_selavy(self, dj_image: models.Image) -> pd.DataFrame: # dropping tiny sources nr_sources_old = df.shape[0] df = df.loc[ - (df['bmaj'] > dj_image.beam_bmaj * 500) & - (df['bmin'] > dj_image.beam_bmin * 500) + (df["bmaj"] > dj_image.beam_bmaj * 500) + & (df["bmin"] > dj_image.beam_bmin * 500) ] if df.shape[0] != nr_sources_old: - logger.info( - 'Dropped %i tiny sources.', nr_sources_old - df.shape[0] - ) + logger.info("Dropped %i tiny sources.", nr_sources_old - df.shape[0]) # add fields from image and fix name column - df['image_id'] = dj_image.id - df['time'] = dj_image.datetime + df["image_id"] = str(dj_image.id) + df["time"] = dj_image.datetime # append img prefix to source name - img_prefix = dj_image.name.split('.i.', 1)[-1].split('.', 1)[0] + '_' - df['name'] = img_prefix + df['component_id'] + img_prefix = dj_image.name.split(".i.", 1)[-1].split(".", 1)[0] + "_" + df["name"] = img_prefix + df["component_id"] # # fix error fluxes - for col in ['flux_int_err', 'flux_peak_err']: + for col in ["flux_int_err", "flux_peak_err"]: sel = df[col] < settings.FLUX_DEFAULT_MIN_ERROR if sel.any(): df.loc[sel, col] = settings.FLUX_DEFAULT_MIN_ERROR # # fix error ra dec - for col in ['ra_err', 'dec_err']: + for col in ["ra_err", "dec_err"]: sel = df[col] < settings.POS_DEFAULT_MIN_ERROR if sel.any(): df.loc[sel, col] = settings.POS_DEFAULT_MIN_ERROR - df[col] = df[col] / 3600. + df[col] = df[col] / 3600.0 # replace 0 local_rms values using user config value - df.loc[ - df['local_rms'] == 0., 'local_rms' - ] = self.config["selavy_local_rms_fill_value"] + df.loc[df["local_rms"] == 0.0, "local_rms"] = self.config[ + "selavy_local_rms_fill_value" + ] - df['snr'] = df['flux_peak'].values / df['local_rms'].values - df['compactness'] = df['flux_int'].values / df['flux_peak'].values + df["snr"] = df["flux_peak"].values / df["local_rms"].values + df["compactness"] = df["flux_int"].values / df["flux_peak"].values if self.config["condon_errors"]: logger.debug("Calculating Condon '97 errors...") theta_B = dj_image.beam_bmaj theta_b = dj_image.beam_bmin - df[[ - 'flux_peak_err', - 'flux_int_err', - 'err_bmaj', - 'err_bmin', - 'err_pa', - 'ra_err', - 'dec_err', - ]] = df[[ - 'flux_peak', - 'flux_int', - 'bmaj', - 'bmin', - 'pa', - 'snr', - 'local_rms', - ]].apply( + df[ + [ + "flux_peak_err", + "flux_int_err", + "err_bmaj", + "err_bmin", + "err_pa", + "ra_err", + "dec_err", + ] + ] = df[ + [ + "flux_peak", + "flux_int", + "bmaj", + "bmin", + "pa", + "snr", + "local_rms", + ] + ].apply( calc_condon_flux_errors, args=(theta_B, theta_b), axis=1, - result_type='expand' + result_type="expand", ) logger.debug("Condon errors done.") logger.debug("Calculating positional errors...") # TODO: avoid extra column given that it is a single value - df['ew_sys_err'] = self.config["ra_uncertainty"] / 3600. - df['ns_sys_err'] = self.config["dec_uncertainty"] / 3600. - - df['error_radius'] = calc_error_radius( - df['ra'].values, - df['ra_err'].values, - df['dec'].values, - df['dec_err'].values, + df["ew_sys_err"] = self.config["ra_uncertainty"] / 3600.0 + df["ns_sys_err"] = self.config["dec_uncertainty"] / 3600.0 + + df["error_radius"] = calc_error_radius( + df["ra"].values, + df["ra_err"].values, + df["dec"].values, + df["dec_err"].values, ) - df['uncertainty_ew'] = np.hypot( - df['ew_sys_err'].values, df['error_radius'].values + df["uncertainty_ew"] = np.hypot( + df["ew_sys_err"].values, df["error_radius"].values ) - df['uncertainty_ns'] = np.hypot( - df['ns_sys_err'].values, df['error_radius'].values + df["uncertainty_ns"] = np.hypot( + df["ns_sys_err"].values, df["error_radius"].values ) # weight calculations to use later - df['weight_ew'] = 1. / df['uncertainty_ew'].values**2 - df['weight_ns'] = 1. / df['uncertainty_ns'].values**2 + df["weight_ew"] = 1.0 / df["uncertainty_ew"].values ** 2 + df["weight_ns"] = 1.0 / df["uncertainty_ns"].values ** 2 - logger.debug('Positional errors done.') + logger.debug("Positional errors done.") # Initialise the forced column as False - df['forced'] = False + df["forced"] = False # Calculate island flux fractions island_flux_totals = ( - df[['island_id', 'flux_int', 'flux_peak']] - .groupby('island_id') - .agg('sum') + df[["island_id", "flux_int", "flux_peak"]].groupby("island_id").agg("sum") ) - df['flux_int_isl_ratio'] = ( - df['flux_int'].values - / island_flux_totals.loc[df['island_id']]['flux_int'].values + df["flux_int_isl_ratio"] = ( + df["flux_int"].values + / island_flux_totals.loc[df["island_id"]]["flux_int"].values ) - df['flux_peak_isl_ratio'] = ( - df['flux_peak'].values - / island_flux_totals.loc[df['island_id']]['flux_peak'].values + df["flux_peak_isl_ratio"] = ( + df["flux_peak"].values + / island_flux_totals.loc[df["island_id"]]["flux_peak"].values ) return df diff --git a/vast_pipeline/migrations/0001_initial.py b/vast_pipeline/migrations/0001_initial.py index 6b8377bdc..5d710c2a6 100644 --- a/vast_pipeline/migrations/0001_initial.py +++ b/vast_pipeline/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.0.7 on 2021-01-18 05:54 +# Generated by Django 3.2.19 on 2023-07-10 11:05 from django.conf import settings import django.core.validators @@ -6,6 +6,7 @@ import django.db.models.deletion import tagulous.models.fields import tagulous.models.models +import uuid class Migration(migrations.Migration): @@ -13,15 +14,15 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('contenttypes', '0002_remove_content_type_name'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('contenttypes', '0002_remove_content_type_name'), ] operations = [ migrations.CreateModel( name='Association', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('d2d', models.FloatField(default=0.0, help_text='astronomical distance calculated by Astropy, arcsec.')), ('dr', models.FloatField(default=0.0, help_text='De Ruiter radius calculated in advanced association.')), ], @@ -29,7 +30,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Band', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('name', models.CharField(max_length=12, unique=True)), ('frequency', models.FloatField(help_text='central frequency of band (integer MHz)')), ('bandwidth', models.FloatField(help_text='bandwidth (MHz)')), @@ -38,20 +39,10 @@ class Migration(migrations.Migration): 'ordering': ['frequency'], }, ), - migrations.CreateModel( - name='CrossMatch', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('manual', models.BooleanField()), - ('distance', models.FloatField()), - ('probability', models.FloatField()), - ('comment', models.TextField(blank=True, default='', max_length=1000)), - ], - ), migrations.CreateModel( name='Image', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('measurements_path', models.FilePathField(db_column='meas_path', help_text='the path to the measurements parquet that belongs to this image', max_length=200)), ('polarisation', models.CharField(choices=[('I', 'I'), ('XX', 'XX'), ('YY', 'YY'), ('Q', 'Q'), ('U', 'U'), ('V', 'V')], help_text='Polarisation of the image one of I,XX,YY,Q,U,V.', max_length=2)), ('name', models.CharField(help_text='Name of the image.', max_length=200, unique=True)), @@ -74,74 +65,32 @@ class Migration(migrations.Migration): ('rms_median', models.FloatField(help_text='Background average RMS from the provided RMS map (mJy).')), ('rms_min', models.FloatField(help_text='Background minimum RMS from the provided RMS map (mJy).')), ('rms_max', models.FloatField(help_text='Background maximum RMS from the provided RMS map (mJy).')), - ('band', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.Band')), + ('band', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.band')), ], options={ 'ordering': ['datetime'], }, ), - migrations.CreateModel( - name='Measurement', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=64, unique=True)), - ('ra', models.FloatField(help_text='RA of the source (Deg).')), - ('ra_err', models.FloatField(help_text='RA error of the source (Deg).')), - ('dec', models.FloatField(help_text='DEC of the source (Deg).')), - ('dec_err', models.FloatField(help_text='DEC error of the source (Deg).')), - ('bmaj', models.FloatField(help_text='The major axis of the Gaussian fit to the source (Deg).')), - ('err_bmaj', models.FloatField(help_text='Error major axis (Deg).')), - ('bmin', models.FloatField(help_text='The minor axis of the Gaussian fit to the source (Deg).')), - ('err_bmin', models.FloatField(help_text='Error minor axis (Deg).')), - ('pa', models.FloatField(help_text='Position angle of Gaussian fit east of north to bmaj (Deg).')), - ('err_pa', models.FloatField(help_text='Error position angle (Deg).')), - ('ew_sys_err', models.FloatField(help_text='Systematic error in east-west (RA) direction (Deg).')), - ('ns_sys_err', models.FloatField(help_text='Systematic error in north-south (dec) direction (Deg).')), - ('error_radius', models.FloatField(help_text='Estimate of maximum error radius using ra_err and dec_err (Deg).')), - ('uncertainty_ew', models.FloatField(help_text='Total east-west (RA) uncertainty, quadratic sum of error_radius and ew_sys_err (Deg).')), - ('uncertainty_ns', models.FloatField(help_text='Total north-south (Dec) uncertainty, quadratic sum of error_radius and ns_sys_err (Deg).')), - ('flux_int', models.FloatField()), - ('flux_int_err', models.FloatField()), - ('flux_int_isl_ratio', models.FloatField(help_text='Ratio of the component integrated flux to the total island integrated flux.')), - ('flux_peak', models.FloatField()), - ('flux_peak_err', models.FloatField()), - ('flux_peak_isl_ratio', models.FloatField(help_text='Ratio of the component peak flux to the total island peak flux.')), - ('chi_squared_fit', models.FloatField(db_column='chi2_fit', help_text='Chi-squared of the Guassian fit to the source.')), - ('spectral_index', models.FloatField(db_column='spectr_idx', help_text='In-band Selavy spectral index.')), - ('spectral_index_from_TT', models.BooleanField(db_column='spectr_idx_tt', default=False, help_text='True/False if the spectral index came from the taylor term.')), - ('local_rms', models.FloatField(help_text='Local rms in mJy from Selavy.')), - ('snr', models.FloatField(help_text='Signal-to-noise ratio of the measurement.')), - ('flag_c4', models.BooleanField(default=False, help_text='Fit flag from Selavy.')), - ('compactness', models.FloatField(help_text='Int flux over peak flux.')), - ('has_siblings', models.BooleanField(default=False, help_text='True if the fit comes from an island that has more than 1 component.')), - ('component_id', models.CharField(help_text='The ID of the component from which the source comes from.', max_length=64)), - ('island_id', models.CharField(help_text='The ID of the island from which the source comes from.', max_length=64)), - ('forced', models.BooleanField(default=False, help_text='True: the measurement is forced extracted.')), - ('image', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.Image')), - ], - options={ - 'ordering': ['ra'], - }, - ), migrations.CreateModel( name='RelatedSource', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ], ), migrations.CreateModel( name='Run', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('name', models.CharField(help_text='name of the pipeline run', max_length=64, unique=True, validators=[django.core.validators.RegexValidator(inverse_match=True, message='Name contains not allowed characters!', regex='[\\[@!#$%^&*()<>?/\\|}{~:\\] ]')])), ('description', models.CharField(blank=True, help_text='A short description of the pipeline run.', max_length=240)), ('time', models.DateTimeField(auto_now=True, help_text='Datetime of a pipeline run.')), ('path', models.FilePathField(help_text='path to the pipeline run', max_length=200)), - ('status', models.CharField(choices=[('INI', 'Initialised'), ('QUE', 'Queued'), ('RUN', 'Running'), ('END', 'Completed'), ('ERR', 'Error'), ('RES', 'Restoring')], default='INI', help_text='Status of the pipeline run.', max_length=3)), + ('status', models.CharField(choices=[('INI', 'Initialised'), ('QUE', 'Queued'), ('RUN', 'Running'), ('END', 'Completed'), ('ERR', 'Error'), ('RES', 'Restoring'), ('DEL', 'Deleting')], default='INI', help_text='Status of the pipeline run.', max_length=3)), ('n_images', models.IntegerField(default=0, help_text='number of images processed in this run')), ('n_sources', models.IntegerField(default=0, help_text='number of sources extracted in this run')), ('n_selavy_measurements', models.IntegerField(default=0, help_text='number of selavy measurements in this run')), ('n_forced_measurements', models.IntegerField(default=0, help_text='number of forced measurements in this run')), + ('n_new_sources', models.IntegerField(default=0, help_text='number of new sources in this run')), ('epoch_based', models.BooleanField(default=False, help_text='Whether the run was processed using epoch based association, i.e. the user passed in groups of images defining epochs rather than every image being treated individually.')), ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), ], @@ -152,7 +101,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Source', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('name', models.CharField(max_length=100)), ('new', models.BooleanField(default=False, help_text='New Source.')), ('wavg_ra', models.FloatField(help_text='The weighted average right ascension (Deg).')), @@ -176,32 +125,22 @@ class Migration(migrations.Migration): ('eta_peak', models.FloatField(help_text='Eta metric for peak flux.')), ('new_high_sigma', models.FloatField(help_text='The largest sigma value for the new source if it was placed in previous image.')), ('n_neighbour_dist', models.FloatField(help_text='Distance to the nearest neighbour (deg)')), - ('vs_abs_significant_max_int', models.FloatField(default=0.0, help_text='Maximum value of all measurement pair variability t-statistics for int flux that exceed SOURCE_AGGREGATE_PAIR_METRICS_MIN_ABS_VS in the pipeline run configuration.')), - ('m_abs_significant_max_int', models.FloatField(default=0.0, help_text='Maximum absolute value of all measurement pair modulation indices for int flux that exceed SOURCE_AGGREGATE_PAIR_METRICS_MIN_ABS_VS in the pipeline run configuration.')), - ('vs_abs_significant_max_peak', models.FloatField(default=0.0, help_text='Maximum absolute value of all measurement pair variability t-statistics for peak flux that exceed SOURCE_AGGREGATE_PAIR_METRICS_MIN_ABS_VS in the pipeline run configuration.')), - ('m_abs_significant_max_peak', models.FloatField(default=0.0, help_text='Maximum absolute value of all measurement pair modulation indices for peak flux that exceed SOURCE_AGGREGATE_PAIR_METRICS_MIN_ABS_VS in the pipeline run configuration.')), + ('vs_abs_significant_max_int', models.FloatField(default=0.0, help_text='Maximum value of all measurement pair variability t-statistics for int flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs in the pipeline run configuration.')), + ('m_abs_significant_max_int', models.FloatField(default=0.0, help_text='Maximum absolute value of all measurement pair modulation indices for int flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs in the pipeline run configuration.')), + ('vs_abs_significant_max_peak', models.FloatField(default=0.0, help_text='Maximum absolute value of all measurement pair variability t-statistics for peak flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs in the pipeline run configuration.')), + ('m_abs_significant_max_peak', models.FloatField(default=0.0, help_text='Maximum absolute value of all measurement pair modulation indices for peak flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs in the pipeline run configuration.')), ('n_meas', models.IntegerField(help_text='total measurements of the source')), ('n_meas_sel', models.IntegerField(help_text='total selavy extracted measurements of the source')), ('n_meas_forced', models.IntegerField(help_text='total force extracted measurements of the source')), ('n_rel', models.IntegerField(help_text='total relations of the source with other sources')), ('n_sibl', models.IntegerField(help_text='total siblings of the source')), + ('related', models.ManyToManyField(through='vast_pipeline.RelatedSource', to='vast_pipeline.Source')), + ('run', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.run')), ], options={ 'abstract': False, }, ), - migrations.CreateModel( - name='Survey', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(help_text='Name of the Survey e.g. NVSS.', max_length=32, unique=True)), - ('comment', models.TextField(blank=True, default='', max_length=1000)), - ('frequency', models.IntegerField(help_text='Frequency of the survey.')), - ], - options={ - 'ordering': ['name'], - }, - ), migrations.CreateModel( name='Tagulous_Source_tags', fields=[ @@ -218,51 +157,15 @@ class Migration(migrations.Migration): }, bases=(tagulous.models.models.BaseTagModel, models.Model), ), - migrations.CreateModel( - name='SurveySource', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(help_text='Name of the survey source.', max_length=100)), - ('ra', models.FloatField(help_text='RA of the survey source (Deg).')), - ('ra_err', models.FloatField(help_text='RA error of the survey source (Deg).')), - ('dec', models.FloatField(help_text='DEC of the survey source (Deg).')), - ('dec_err', models.FloatField(help_text='DEC error of the survey source (Deg).')), - ('bmaj', models.FloatField(help_text='The major axis of the Gaussian fit to the survey source (arcsecs).')), - ('bmin', models.FloatField(help_text='The minor axis of the Gaussian fit to the survey source (arcsecs).')), - ('pa', models.FloatField(help_text='Position angle of Gaussian fit east of north to bmaj (Deg).')), - ('flux_peak', models.FloatField(help_text='Peak flux of the Guassian fit (Jy).')), - ('flux_peak_err', models.FloatField(help_text='Peak flux error of the Gaussian fit (Jy).')), - ('flux_int', models.FloatField(help_text='Integrated flux of the Guassian fit (Jy).')), - ('flux_int_err', models.FloatField(help_text='Integrated flux of the Guassian fit (Jy).')), - ('alpha', models.FloatField(default=0, help_text='Spectral index of the survey source.')), - ('image_name', models.CharField(blank=True, help_text='Name of survey image where measurement was made.', max_length=100)), - ('survey', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.Survey')), - ], - ), migrations.CreateModel( name='SourceFav', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('comment', models.TextField(blank=True, default='', help_text='Why did you include this as favourite', max_length=500)), - ('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.Source')), + ('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.source')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), - migrations.AddField( - model_name='source', - name='cross_match_sources', - field=models.ManyToManyField(through='vast_pipeline.CrossMatch', to='vast_pipeline.SurveySource'), - ), - migrations.AddField( - model_name='source', - name='related', - field=models.ManyToManyField(through='vast_pipeline.RelatedSource', to='vast_pipeline.Source'), - ), - migrations.AddField( - model_name='source', - name='run', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.Run'), - ), migrations.AddField( model_name='source', name='tags', @@ -271,7 +174,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='SkyRegion', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('centre_ra', models.FloatField()), ('centre_dec', models.FloatField()), ('width_ra', models.FloatField()), @@ -286,30 +189,56 @@ class Migration(migrations.Migration): migrations.AddField( model_name='relatedsource', name='from_source', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.Source'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.source'), ), migrations.AddField( model_name='relatedsource', name='to_source', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='related_sources', to='vast_pipeline.Source'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='related_sources', to='vast_pipeline.source'), ), migrations.CreateModel( - name='MeasurementPair', + name='Measurement', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('vs_peak', models.FloatField(help_text='Variability metric: t-statistic for peak fluxes.')), - ('m_peak', models.FloatField(help_text='Variability metric: modulation index for peak fluxes.')), - ('vs_int', models.FloatField(help_text='Variability metric: t-statistic for integrated fluxes.')), - ('m_int', models.FloatField(help_text='Variability metric: modulation index for integrated fluxes.')), - ('measurement_a', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='measurement_pairs_a', to='vast_pipeline.Measurement')), - ('measurement_b', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='measurement_pairs_b', to='vast_pipeline.Measurement')), - ('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.Source')), + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('name', models.CharField(max_length=64)), + ('ra', models.FloatField(help_text='RA of the source (Deg).')), + ('ra_err', models.FloatField(help_text='RA error of the source (Deg).')), + ('dec', models.FloatField(help_text='DEC of the source (Deg).')), + ('dec_err', models.FloatField(help_text='DEC error of the source (Deg).')), + ('bmaj', models.FloatField(help_text='The major axis of the Gaussian fit to the source (Deg).')), + ('err_bmaj', models.FloatField(help_text='Error major axis (Deg).')), + ('bmin', models.FloatField(help_text='The minor axis of the Gaussian fit to the source (Deg).')), + ('err_bmin', models.FloatField(help_text='Error minor axis (Deg).')), + ('pa', models.FloatField(help_text='Position angle of Gaussian fit east of north to bmaj (Deg).')), + ('err_pa', models.FloatField(help_text='Error position angle (Deg).')), + ('ew_sys_err', models.FloatField(help_text='Systematic error in east-west (RA) direction (Deg).')), + ('ns_sys_err', models.FloatField(help_text='Systematic error in north-south (dec) direction (Deg).')), + ('error_radius', models.FloatField(help_text='Estimate of maximum error radius using ra_err and dec_err (Deg).')), + ('uncertainty_ew', models.FloatField(help_text='Total east-west (RA) uncertainty, quadratic sum of error_radius and ew_sys_err (Deg).')), + ('uncertainty_ns', models.FloatField(help_text='Total north-south (Dec) uncertainty, quadratic sum of error_radius and ns_sys_err (Deg).')), + ('flux_int', models.FloatField()), + ('flux_int_err', models.FloatField()), + ('flux_int_isl_ratio', models.FloatField(help_text='Ratio of the component integrated flux to the total island integrated flux.')), + ('flux_peak', models.FloatField()), + ('flux_peak_err', models.FloatField()), + ('flux_peak_isl_ratio', models.FloatField(help_text='Ratio of the component peak flux to the total island peak flux.')), + ('chi_squared_fit', models.FloatField(db_column='chi2_fit', help_text='Chi-squared of the Guassian fit to the source.')), + ('spectral_index', models.FloatField(db_column='spectr_idx', help_text='In-band Selavy spectral index.')), + ('spectral_index_from_TT', models.BooleanField(db_column='spectr_idx_tt', default=False, help_text='True/False if the spectral index came from the taylor term.')), + ('local_rms', models.FloatField(help_text='Local rms in mJy from Selavy.')), + ('snr', models.FloatField(help_text='Signal-to-noise ratio of the measurement.')), + ('flag_c4', models.BooleanField(default=False, help_text='Fit flag from Selavy.')), + ('compactness', models.FloatField(help_text='Int flux over peak flux.')), + ('has_siblings', models.BooleanField(default=False, help_text='True if the fit comes from an island that has more than 1 component.')), + ('component_id', models.CharField(help_text='The ID of the component from which the source comes from.', max_length=64)), + ('island_id', models.CharField(help_text='The ID of the island from which the source comes from.', max_length=64)), + ('forced', models.BooleanField(default=False, help_text='True: the measurement is forced extracted.')), + ('image', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.image')), + ('source', models.ManyToManyField(through='vast_pipeline.Association', to='vast_pipeline.Source')), ], - ), - migrations.AddField( - model_name='measurement', - name='source', - field=models.ManyToManyField(through='vast_pipeline.Association', to='vast_pipeline.Source'), + options={ + 'ordering': ['ra'], + }, ), migrations.AddField( model_name='image', @@ -319,45 +248,31 @@ class Migration(migrations.Migration): migrations.AddField( model_name='image', name='skyreg', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.SkyRegion'), - ), - migrations.AddField( - model_name='crossmatch', - name='source', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.Source'), - ), - migrations.AddField( - model_name='crossmatch', - name='survey_source', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.SurveySource'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.skyregion'), ), migrations.CreateModel( name='Comment', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('datetime', models.DateTimeField(auto_now_add=True)), ('comment', models.TextField()), ('object_id', models.PositiveIntegerField()), ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), ], ), migrations.AddField( model_name='association', name='meas', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.Measurement'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.measurement'), ), migrations.AddField( model_name='association', name='source', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.Source'), + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vast_pipeline.source'), ), migrations.AddConstraint( model_name='relatedsource', constraint=models.UniqueConstraint(fields=('from_source', 'to_source'), name='vast_pipeline_relatedsource_unique_pair'), ), - migrations.AddConstraint( - model_name='measurementpair', - constraint=models.UniqueConstraint(fields=('source', 'measurement_a', 'measurement_b'), name='vast_pipeline_measurementpair_unique_pair'), - ), ] diff --git a/vast_pipeline/migrations/0002_q3c.py b/vast_pipeline/migrations/0002_q3c.py deleted file mode 100644 index 54908b619..000000000 --- a/vast_pipeline/migrations/0002_q3c.py +++ /dev/null @@ -1,43 +0,0 @@ -# Generated by Django 2.2.5 on 2020-02-19 10:46 - -from django.db import migrations - - -class Migration(migrations.Migration): - - initial = False - - dependencies = [ - ('vast_pipeline', '0001_initial') - ] - - operations = [ - migrations.RunSQL( - ["CREATE EXTENSION IF NOT EXISTS q3c;"],#upgrade - ["DROP EXTENSION IF EXISTS q3c;"],#downgrade - ), - migrations.RunSQL( - ["CREATE INDEX ON vast_pipeline_measurement (q3c_ang2ipix(ra, dec));"], - ["DROP INDEX vast_pipeline_measurement_q3c_ang2ipix_idx;"], - ), - migrations.RunSQL( - ["CLUSTER vast_pipeline_measurement_q3c_ang2ipix_idx ON vast_pipeline_measurement;"], - [], - ), - migrations.RunSQL( - ["ANALYZE vast_pipeline_measurement;"], - [], - ), - migrations.RunSQL( - ["CREATE INDEX ON vast_pipeline_source (q3c_ang2ipix(wavg_ra, wavg_dec));"], - ["DROP INDEX vast_pipeline_source_q3c_ang2ipix_idx;"], - ), - migrations.RunSQL( - ["CLUSTER vast_pipeline_source_q3c_ang2ipix_idx ON vast_pipeline_source;"], - [], - ), - migrations.RunSQL( - ["ANALYZE vast_pipeline_source;"], - [], - ), - ] diff --git a/vast_pipeline/migrations/0003_auto_20210402_2136.py b/vast_pipeline/migrations/0003_auto_20210402_2136.py deleted file mode 100644 index a8d4c3013..000000000 --- a/vast_pipeline/migrations/0003_auto_20210402_2136.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 3.1.7 on 2021-04-02 21:36 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('vast_pipeline', '0002_q3c'), - ] - - operations = [ - migrations.AlterField( - model_name='source', - name='m_abs_significant_max_int', - field=models.FloatField(default=0.0, help_text='Maximum absolute value of all measurement pair modulation indices for int flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs in the pipeline run configuration.'), - ), - migrations.AlterField( - model_name='source', - name='m_abs_significant_max_peak', - field=models.FloatField(default=0.0, help_text='Maximum absolute value of all measurement pair modulation indices for peak flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs in the pipeline run configuration.'), - ), - migrations.AlterField( - model_name='source', - name='vs_abs_significant_max_int', - field=models.FloatField(default=0.0, help_text='Maximum value of all measurement pair variability t-statistics for int flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs in the pipeline run configuration.'), - ), - migrations.AlterField( - model_name='source', - name='vs_abs_significant_max_peak', - field=models.FloatField(default=0.0, help_text='Maximum absolute value of all measurement pair variability t-statistics for peak flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs in the pipeline run configuration.'), - ), - ] diff --git a/vast_pipeline/migrations/0004_auto_20210521_1339.py b/vast_pipeline/migrations/0004_auto_20210521_1339.py deleted file mode 100644 index 01619928d..000000000 --- a/vast_pipeline/migrations/0004_auto_20210521_1339.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 3.2.2 on 2021-05-21 13:39 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('vast_pipeline', '0003_auto_20210402_2136'), - ] - - operations = [ - migrations.RemoveField( - model_name='surveysource', - name='survey', - ), - migrations.RemoveField( - model_name='source', - name='cross_match_sources', - ), - migrations.DeleteModel( - name='CrossMatch', - ), - migrations.DeleteModel( - name='Survey', - ), - migrations.DeleteModel( - name='SurveySource', - ), - ] diff --git a/vast_pipeline/migrations/0004_source_name_change.py b/vast_pipeline/migrations/0004_source_name_change.py deleted file mode 100644 index 56477a451..000000000 --- a/vast_pipeline/migrations/0004_source_name_change.py +++ /dev/null @@ -1,44 +0,0 @@ -from django.db import migrations, transaction -from vast_pipeline.utils.utils import deg2hms, deg2dms - - -def update_source_names(apps, schema_editor): - """Update source names from the v0.2.0 ASKAP_... convention to J...""" - Source = apps.get_model("vast_pipeline", "Source") - while Source.objects.filter(name__startswith="ASKAP_").exists(): - # do the updates in transaction batches of 1000 in case the source table is large - with transaction.atomic(): - for source in Source.objects.filter(name__startswith="ASKAP_")[:1000]: - source.name = ( - f"J{deg2hms(source.wavg_ra, precision=1)}" - f"{deg2dms(source.wavg_dec, precision=0)}" - ).replace(":", "") - source.save() - - -def reverse_update_source_names(apps, schema_editor): - """Update source names from J... to the v0.2.0 ASKAP_... convention""" - Source = apps.get_model("vast_pipeline", "Source") - while Source.objects.filter(name__startswith="J").exists(): - # do the updates in transaction batches of 1000 in case the source table is large - with transaction.atomic(): - for source in Source.objects.filter(name__startswith="J")[:1000]: - source.name = ( - f"ASKAP_{deg2hms(source.wavg_ra, precision=2)}" - f"{deg2dms(source.wavg_dec, precision=2)}" - ).replace(":", "") - source.save() - - -class Migration(migrations.Migration): - atomic = False # disable transactions, the source table may be large - - dependencies = [ - ("vast_pipeline", "0003_auto_20210402_2136"), - ] - - operations = [ - migrations.RunPython( - update_source_names, reverse_code=reverse_update_source_names - ), - ] diff --git a/vast_pipeline/migrations/0005_merge_0004_auto_20210521_1339_0004_source_name_change.py b/vast_pipeline/migrations/0005_merge_0004_auto_20210521_1339_0004_source_name_change.py deleted file mode 100644 index 4c318c4c9..000000000 --- a/vast_pipeline/migrations/0005_merge_0004_auto_20210521_1339_0004_source_name_change.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 3.2.2 on 2021-05-21 17:31 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('vast_pipeline', '0004_auto_20210521_1339'), - ('vast_pipeline', '0004_source_name_change'), - ] - - operations = [ - ] diff --git a/vast_pipeline/migrations/0006_alter_run_status.py b/vast_pipeline/migrations/0006_alter_run_status.py deleted file mode 100644 index 957f5faf0..000000000 --- a/vast_pipeline/migrations/0006_alter_run_status.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.2 on 2021-09-09 11:20 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('vast_pipeline', '0005_merge_0004_auto_20210521_1339_0004_source_name_change'), - ] - - operations = [ - migrations.AlterField( - model_name='run', - name='status', - field=models.CharField(choices=[('INI', 'Initialised'), ('QUE', 'Queued'), ('RUN', 'Running'), ('END', 'Completed'), ('ERR', 'Error'), ('RES', 'Restoring'), ('DEL', 'Deleting')], default='INI', help_text='Status of the pipeline run.', max_length=3), - ), - ] diff --git a/vast_pipeline/migrations/0007_alter_measurement_name.py b/vast_pipeline/migrations/0007_alter_measurement_name.py deleted file mode 100644 index b9f54e7b9..000000000 --- a/vast_pipeline/migrations/0007_alter_measurement_name.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.2 on 2021-10-11 20:07 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('vast_pipeline', '0006_alter_run_status'), - ] - - operations = [ - migrations.AlterField( - model_name='measurement', - name='name', - field=models.CharField(max_length=64), - ), - ] diff --git a/vast_pipeline/migrations/0008_delete_measurementpair.py b/vast_pipeline/migrations/0008_delete_measurementpair.py deleted file mode 100644 index f103feb54..000000000 --- a/vast_pipeline/migrations/0008_delete_measurementpair.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 3.2.9 on 2021-12-03 20:25 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('vast_pipeline', '0007_alter_measurement_name'), - ] - - operations = [ - migrations.DeleteModel( - name='MeasurementPair', - ), - ] diff --git a/vast_pipeline/migrations/0009_add_log_file_timestamps.py b/vast_pipeline/migrations/0009_add_log_file_timestamps.py deleted file mode 100644 index e086674b0..000000000 --- a/vast_pipeline/migrations/0009_add_log_file_timestamps.py +++ /dev/null @@ -1,108 +0,0 @@ -# Generated by Django 3.2.9 on 2022-01-14 13:30 - -# This is a migration to rename the log files of old runs prior to when -# they were timestamped. No DB changes occur in this migration. - -import shutil -import warnings - -from django.db import migrations -from pathlib import Path - - -def get_timestamp(log_path: Path) -> str: - """ - Opens the provided log file and extracts the timestamp from the - first line. - - Args: - log_path: The Path object for the log file. - - Returns: - The string representation of the timestamp in the format of - YYYY-MM-DD-HH-MM-SS. - """ - with log_path.open() as f: - line = f.readline() - - timestamp = ( - line.split(',')[0] - .replace(' ', '-') - .replace(':', '-') - ) - - return timestamp - - -def add_timestamp_and_copy(log_path: Path) -> None: - """ - Creates a new log file with the timestamp added to the name. - - Args: - log_path: The Path object for the log file. - - Returns: - None - """ - timestamp = get_timestamp(log_path) - - new_log_name = f"{timestamp}_{log_path.name}" - new_log_path = log_path.parent / new_log_name - - # check if already exists, pretty much impossible - if new_log_path.exists(): - warnings.warn( - f"Log file '{log_path}' not migrated as log file with timestamp" - f" '{new_log_name}' already exists!" - ) - return - - else: - try: - shutil.copy(log_path, new_log_path) - except Exception as e: - warnings.warn( - f"Log file '{log_path}' could not be migrated as the copy" - " operation failed. Please migrate this log file manually." - f"Copy error: {e}." - ) - return - - # a final check before deletion. - if new_log_path.exists(): - log_path.unlink() - else: - warnings.warn( - "While the copy operation was apparently successful the" - f" new log file '{new_log_path}' does not exist. Please" - f" migrate the old log file '{log_path}' manually." - ) - - -def rename_logs(apps, schema_editor) -> None: - """ - Loops through the existing runs and adds timestamps to the log files - where required. - """ - Run = apps.get_model('vast_pipeline', 'Run') - - # old names of logs before timestamping was introduced. - logs_to_check = ['log.txt', 'restore_log.txt', 'gen_arrow_log.txt'] - - for run in Run.objects.all(): - run_path = Path(run.path) - for log in logs_to_check: - log_path = run_path / log - if log_path.exists(): - add_timestamp_and_copy(log_path) - - -class Migration(migrations.Migration): - - dependencies = [ - ('vast_pipeline', '0008_delete_measurementpair'), - ] - - operations = [ - migrations.RunPython(rename_logs), - ] diff --git a/vast_pipeline/migrations/0010_update_source_names_iau_compliant.py b/vast_pipeline/migrations/0010_update_source_names_iau_compliant.py deleted file mode 100644 index d3aefdfb5..000000000 --- a/vast_pipeline/migrations/0010_update_source_names_iau_compliant.py +++ /dev/null @@ -1,68 +0,0 @@ -from django.db import migrations, transaction -from vast_pipeline.utils.utils import deg2hms, deg2dms - - -def _make_source_name(ra: float, dec: float, iau: bool = True) -> str: - return ( - f"J{deg2hms(ra, precision=1, truncate=iau)}" - f"{deg2dms(dec, precision=0, truncate=iau)}" - ).replace(":", "") - - -def update_source_names(apps, schema_editor): - """Update source names that were generated by rounding coordinates instead of - truncating. Truncating is required by IAU convention.""" - Source = apps.get_model("vast_pipeline", "Source") - - BATCH_SIZE = 1000 - sources = Source.objects.filter(name__startswith="J") - start = 0 - end = start + BATCH_SIZE - sources_batch = sources[start:end] - while sources_batch.exists(): - with transaction.atomic(): - sources_batch_list = list(sources_batch) - for source in sources_batch_list: - source.name = _make_source_name( - source.wavg_ra, source.wavg_dec, iau=True - ) - _ = Source.objects.bulk_update(sources_batch_list, ["name"]) - start = end - end = start + BATCH_SIZE - sources_batch = sources[start:end] - - -def reverse_update_source_names(apps, schema_editor): - """Undo the above update source names by rounding coordinates instead of truncating.""" - Source = apps.get_model("vast_pipeline", "Source") - - BATCH_SIZE = 1000 - sources = Source.objects.filter(name__startswith="J") - start = 0 - end = start + BATCH_SIZE - sources_batch = sources[start:end] - while sources_batch.exists(): - with transaction.atomic(): - sources_batch_list = list(sources_batch) - for source in sources_batch_list: - source.name = _make_source_name( - source.wavg_ra, source.wavg_dec, iau=False - ) - _ = Source.objects.bulk_update(sources_batch_list, ["name"]) - start = end - end = start + BATCH_SIZE - sources_batch = sources[start:end] - - -class Migration(migrations.Migration): - atomic = False - - dependencies = [ - ("vast_pipeline", "0009_add_log_file_timestamps"), - ] - - operations = [ - migrations.RunPython( - update_source_names, reverse_code=reverse_update_source_names, atomic=False - ), - ] diff --git a/vast_pipeline/migrations/0011_run_n_new_sources.py b/vast_pipeline/migrations/0011_run_n_new_sources.py deleted file mode 100644 index 44a42cd26..000000000 --- a/vast_pipeline/migrations/0011_run_n_new_sources.py +++ /dev/null @@ -1,32 +0,0 @@ -# Generated by Django 3.2.13 on 2023-01-25 18:13 - -from django.db import migrations, models, transaction - - -class Migration(migrations.Migration): - - dependencies = [ - ('vast_pipeline', '0010_update_source_names_iau_compliant'), - ] - - def fill_new_source_counts(apps, schema_editor): - """Loop over Run objects and count the number of new sources and save to new column.""" - Run = apps.get_model("vast_pipeline", "Run") - Source = apps.get_model("vast_pipeline", "Source") - - runs = Run.objects.all() - - for run in runs: - with transaction.atomic(): - n_new_sources = Source.objects.filter(run=run, new=True).count() - run.n_new_sources = n_new_sources - run.save() - - operations = [ - migrations.AddField( - model_name='run', - name='n_new_sources', - field=models.IntegerField(default=0, help_text='number of new sources in this run'), - ), - migrations.RunPython(fill_new_source_counts, atomic=False) - ] diff --git a/vast_pipeline/models.py b/vast_pipeline/models.py index 127a036b2..a4a52b8ae 100644 --- a/vast_pipeline/models.py +++ b/vast_pipeline/models.py @@ -1,3 +1,5 @@ +import uuid + from dataclasses import dataclass from itertools import combinations from pathlib import Path @@ -31,12 +33,14 @@ class Comment(models.Model): """ The model object for a comment. """ + + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) author = models.ForeignKey(User, on_delete=models.CASCADE) datetime = models.DateTimeField(auto_now_add=True) comment = models.TextField() content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() - content_object = GenericForeignKey('content_type', 'object_id') + content_object = GenericForeignKey("content_type", "object_id") def get_avatar_url(self) -> str: """Get the URL for the user's avatar from GitHub. If the user has @@ -57,6 +61,7 @@ class CommentableModel(models.Model): """ A class to provide a commentable model. """ + comment = GenericRelation( Comment, content_type_field="content_type", @@ -69,7 +74,6 @@ class Meta: class RunQuerySet(models.QuerySet): - def check_max_runs(self, max_runs: int = 5) -> int: """ Check if number of running pipeline runs is above threshold. @@ -80,7 +84,7 @@ def check_max_runs(self, max_runs: int = 5) -> int: Returns: The count of the current pipeline runs with a status of `RUN`. """ - return self.filter(status='RUN').count() >= max_runs + return self.filter(status="RUN").count() >= max_runs RunManager = models.Manager.from_queryset(RunQuerySet) @@ -91,86 +95,73 @@ class Run(CommentableModel): A Run is essentially a pipeline run/processing istance over a set of images """ + + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) user = models.ForeignKey( - User, - on_delete=models.SET_NULL, - null=True, - blank=True + User, on_delete=models.SET_NULL, null=True, blank=True, to_field="id" ) - name = models.CharField( max_length=64, unique=True, validators=[ RegexValidator( - regex=r'[\[@!#$%^&*()<>?/\|}{~:\] ]', - message='Name contains not allowed characters!', - inverse_match=True + regex=r"[\[@!#$%^&*()<>?/\|}{~:\] ]", + message="Name contains not allowed characters!", + inverse_match=True, ), ], - help_text='name of the pipeline run' + help_text="name of the pipeline run", ) description = models.CharField( - max_length=240, - blank=True, - help_text="A short description of the pipeline run." - ) - time = models.DateTimeField( - auto_now=True, - help_text='Datetime of a pipeline run.' - ) - path = models.FilePathField( - max_length=200, - help_text='path to the pipeline run' + max_length=240, blank=True, help_text="A short description of the pipeline run." ) + time = models.DateTimeField(auto_now=True, help_text="Datetime of a pipeline run.") + path = models.FilePathField(max_length=200, help_text="path to the pipeline run") STATUS_CHOICES = [ - ('INI', 'Initialised'), - ('QUE', 'Queued'), - ('RUN', 'Running'), - ('END', 'Completed'), - ('ERR', 'Error'), - ('RES', 'Restoring'), - ('DEL', 'Deleting'), + ("INI", "Initialised"), + ("QUE", "Queued"), + ("RUN", "Running"), + ("END", "Completed"), + ("ERR", "Error"), + ("RES", "Restoring"), + ("DEL", "Deleting"), ] status = models.CharField( max_length=3, choices=STATUS_CHOICES, - default='INI', - help_text='Status of the pipeline run.' + default="INI", + help_text="Status of the pipeline run.", ) n_images = models.IntegerField( - default=0, - help_text='number of images processed in this run' + default=0, help_text="number of images processed in this run" ) n_sources = models.IntegerField( - default=0, - help_text='number of sources extracted in this run' + default=0, help_text="number of sources extracted in this run" ) n_selavy_measurements = models.IntegerField( - default=0, - help_text='number of selavy measurements in this run' + default=0, help_text="number of selavy measurements in this run" ) n_forced_measurements = models.IntegerField( - default=0, - help_text='number of forced measurements in this run' + default=0, help_text="number of forced measurements in this run" ) n_new_sources = models.IntegerField( - default=0, - help_text='number of new sources in this run' + default=0, help_text="number of new sources in this run" ) epoch_based = models.BooleanField( default=False, help_text=( - 'Whether the run was processed using epoch based association' - ', i.e. the user passed in groups of images defining epochs' - ' rather than every image being treated individually.' - ) + "Whether the run was processed using epoch based association" + ", i.e. the user passed in groups of images defining epochs" + " rather than every image being treated individually." + ), ) - objects = RunManager() # used instead of RunQuerySet.as_manager() so mypy checks work + objects = ( + RunManager() + ) # used instead of RunQuerySet.as_manager() so mypy checks work class Meta: - ordering = ['name'] + ordering = ["name"] def __str__(self): return self.name @@ -211,22 +202,21 @@ class Band(models.Model): A band on the frequency spectrum used for imaging. Each image is associated with one band. """ + + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) name = models.CharField(max_length=12, unique=True) - frequency = models.FloatField( - help_text='central frequency of band (integer MHz)' - ) - bandwidth = models.FloatField( - help_text='bandwidth (MHz)' - ) + frequency = models.FloatField(help_text="central frequency of band (integer MHz)") + bandwidth = models.FloatField(help_text="bandwidth (MHz)") class Meta: - ordering = ['frequency'] + ordering = ["frequency"] def __str__(self): return self.name class SkyRegion(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) run = models.ManyToManyField(Run) centre_ra = models.FloatField() @@ -239,14 +229,11 @@ class SkyRegion(models.Model): z = models.FloatField() def __str__(self): - return f'{round(self.centre_ra, 3)}, {round(self.centre_dec, 3)}' + return f"{round(self.centre_ra, 3)}, {round(self.centre_dec, 3)}" class SourceQuerySet(models.QuerySet): - - def cone_search( - self, ra: float, dec: float, radius_deg: float - ) -> models.QuerySet: + def cone_search(self, ra: float, dec: float, radius_deg: float) -> models.QuerySet: """ Return all the Sources withing radius_deg of (ra,dec). Returns a QuerySet of Sources, ordered by distance from @@ -261,131 +248,101 @@ def cone_search( Returns: Sources found withing the cone search area. """ - return ( - self.extra( - select={ - "distance": "q3c_dist(wavg_ra, wavg_dec, %s, %s) * 3600" - }, - select_params=[ra, dec], - where=["q3c_radial_query(wavg_ra, wavg_dec, %s, %s, %s)"], - params=[ra, dec, radius_deg], - ) - .order_by("distance") - ) + return self.extra( + select={"distance": "q3c_dist(wavg_ra, wavg_dec, %s, %s) * 3600"}, + select_params=[ra, dec], + where=["q3c_radial_query(wavg_ra, wavg_dec, %s, %s, %s)"], + params=[ra, dec, radius_deg], + ).order_by("distance") class Image(CommentableModel): """An image is a 2D radio image from a cube""" - band = models.ForeignKey(Band, on_delete=models.CASCADE) + + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + band = models.ForeignKey(Band, on_delete=models.CASCADE, to_field="id") run = models.ManyToManyField(Run) - skyreg = models.ForeignKey(SkyRegion, on_delete=models.CASCADE) + skyreg = models.ForeignKey(SkyRegion, on_delete=models.CASCADE, to_field="id") measurements_path = models.FilePathField( max_length=200, - db_column='meas_path', - help_text=( - 'the path to the measurements parquet that belongs to this image' - ) + db_column="meas_path", + help_text=("the path to the measurements parquet that belongs to this image"), ) POLARISATION_CHOICES = [ - ('I', 'I'), - ('XX', 'XX'), - ('YY', 'YY'), - ('Q', 'Q'), - ('U', 'U'), - ('V', 'V'), + ("I", "I"), + ("XX", "XX"), + ("YY", "YY"), + ("Q", "Q"), + ("U", "U"), + ("V", "V"), ] polarisation = models.CharField( max_length=2, choices=POLARISATION_CHOICES, - help_text='Polarisation of the image one of I,XX,YY,Q,U,V.' - ) - name = models.CharField( - unique=True, - max_length=200, - help_text='Name of the image.' + help_text="Polarisation of the image one of I,XX,YY,Q,U,V.", ) + name = models.CharField(unique=True, max_length=200, help_text="Name of the image.") path = models.FilePathField( - max_length=500, - help_text='Path to the file containing the image.' + max_length=500, help_text="Path to the file containing the image." ) noise_path = models.FilePathField( max_length=300, blank=True, - default='', - help_text='Path to the file containing the RMS image.' + default="", + help_text="Path to the file containing the RMS image.", ) background_path = models.FilePathField( max_length=300, blank=True, - default='', - help_text='Path to the file containing the background image.' + default="", + help_text="Path to the file containing the background image.", ) - datetime = models.DateTimeField( - help_text='Date/time of observation or epoch.' - ) - jd = models.FloatField( - help_text='Julian date of the observation (days).' - ) - duration = models.FloatField( - default=0., - help_text='Duration of the observation.' - ) + datetime = models.DateTimeField(help_text="Date/time of observation or epoch.") + jd = models.FloatField(help_text="Julian date of the observation (days).") + duration = models.FloatField(default=0.0, help_text="Duration of the observation.") - ra = models.FloatField( - help_text='RA of the image centre (Deg).' - ) - dec = models.FloatField( - help_text='DEC of the image centre (Deg).' - ) + ra = models.FloatField(help_text="RA of the image centre (Deg).") + dec = models.FloatField(help_text="DEC of the image centre (Deg).") fov_bmaj = models.FloatField( - help_text='Field of view major axis (Deg).' + help_text="Field of view major axis (Deg)." ) # Major (Dec) radius of image (degrees) fov_bmin = models.FloatField( - help_text='Field of view minor axis (Deg).' + help_text="Field of view minor axis (Deg)." ) # Minor (RA) radius of image (degrees) physical_bmaj = models.FloatField( - help_text='The actual size of the image major axis (Deg).' + help_text="The actual size of the image major axis (Deg)." ) # Major (Dec) radius of image (degrees) physical_bmin = models.FloatField( - help_text='The actual size of the image minor axis (Deg).' + help_text="The actual size of the image minor axis (Deg)." ) # Minor (RA) radius of image (degrees) radius_pixels = models.FloatField( - help_text='Radius of the useable region of the image (pixels).' + help_text="Radius of the useable region of the image (pixels)." ) - beam_bmaj = models.FloatField( - help_text='Major axis of image restoring beam (Deg).' - ) - beam_bmin = models.FloatField( - help_text='Minor axis of image restoring beam (Deg).' - ) - beam_bpa = models.FloatField( - help_text='Beam position angle (Deg).' - ) + beam_bmaj = models.FloatField(help_text="Major axis of image restoring beam (Deg).") + beam_bmin = models.FloatField(help_text="Minor axis of image restoring beam (Deg).") + beam_bpa = models.FloatField(help_text="Beam position angle (Deg).") rms_median = models.FloatField( - help_text='Background average RMS from the provided RMS map (mJy).' + help_text="Background average RMS from the provided RMS map (mJy)." ) rms_min = models.FloatField( - help_text='Background minimum RMS from the provided RMS map (mJy).' + help_text="Background minimum RMS from the provided RMS map (mJy)." ) rms_max = models.FloatField( - help_text='Background maximum RMS from the provided RMS map (mJy).' + help_text="Background maximum RMS from the provided RMS map (mJy)." ) class Meta: - ordering = ['datetime'] + ordering = ["datetime"] def __str__(self): return self.name class MeasurementQuerySet(models.QuerySet): - - def cone_search( - self, ra: float, dec: float, radius_deg: float - ) -> models.QuerySet: + def cone_search(self, ra: float, dec: float, radius_deg: float) -> models.QuerySet: """ Return all the Sources withing radius_deg of (ra,dec). Returns a QuerySet of Sources, ordered by distance from @@ -400,17 +357,12 @@ def cone_search( Returns: Measurements found withing the cone search area. """ - return ( - self.extra( - select={ - "distance": "q3c_dist(ra, dec, %s, %s) * 3600" - }, - select_params=[ra, dec], - where=["q3c_radial_query(ra, dec, %s, %s, %s)"], - params=[ra, dec, radius_deg], - ) - .order_by("distance") - ) + return self.extra( + select={"distance": "q3c_dist(ra, dec, %s, %s) * 3600"}, + select_params=[ra, dec], + where=["q3c_radial_query(ra, dec, %s, %s, %s)"], + params=[ra, dec, radius_deg], + ).order_by("distance") class Measurement(CommentableModel): @@ -418,78 +370,64 @@ class Measurement(CommentableModel): A Measurement is an object in the sky that has been detected at least once. Essentially a source single measurement in time. """ + + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) image = models.ForeignKey( - Image, - null=True, - on_delete=models.CASCADE + Image, null=True, on_delete=models.CASCADE, to_field="id" ) # first image seen in source = models.ManyToManyField( - 'Source', - through='Association', - through_fields=('meas', 'source') + "Source", through="Association", through_fields=("meas", "source") ) name = models.CharField(max_length=64) - ra = models.FloatField(help_text='RA of the source (Deg).') # degrees - ra_err = models.FloatField( - help_text='RA error of the source (Deg).' - ) - dec = models.FloatField(help_text='DEC of the source (Deg).') # degrees - dec_err = models.FloatField( - help_text='DEC error of the source (Deg).' - ) + ra = models.FloatField(help_text="RA of the source (Deg).") # degrees + ra_err = models.FloatField(help_text="RA error of the source (Deg).") + dec = models.FloatField(help_text="DEC of the source (Deg).") # degrees + dec_err = models.FloatField(help_text="DEC error of the source (Deg).") bmaj = models.FloatField( - help_text=( - 'The major axis of the Gaussian fit to the source (Deg).' - ) + help_text=("The major axis of the Gaussian fit to the source (Deg).") ) - err_bmaj = models.FloatField(help_text='Error major axis (Deg).') + err_bmaj = models.FloatField(help_text="Error major axis (Deg).") bmin = models.FloatField( - help_text=( - 'The minor axis of the Gaussian fit to the source (Deg).' - ) + help_text=("The minor axis of the Gaussian fit to the source (Deg).") ) - err_bmin = models.FloatField(help_text='Error minor axis (Deg).') + err_bmin = models.FloatField(help_text="Error minor axis (Deg).") pa = models.FloatField( - help_text=( - 'Position angle of Gaussian fit east of north to bmaj ' - '(Deg).' - ) + help_text=("Position angle of Gaussian fit east of north to bmaj " "(Deg).") ) - err_pa = models.FloatField(help_text='Error position angle (Deg).') + err_pa = models.FloatField(help_text="Error position angle (Deg).") # supplied by user via config ew_sys_err = models.FloatField( - help_text='Systematic error in east-west (RA) direction (Deg).' + help_text="Systematic error in east-west (RA) direction (Deg)." ) # supplied by user via config ns_sys_err = models.FloatField( - help_text='Systematic error in north-south (dec) direction (Deg).' + help_text="Systematic error in north-south (dec) direction (Deg)." ) # estimate of maximum error radius (from ra_err and dec_err) # Used in advanced association. error_radius = models.FloatField( help_text=( - 'Estimate of maximum error radius using ra_err' - ' and dec_err (Deg).' + "Estimate of maximum error radius using ra_err" " and dec_err (Deg)." ) ) # quadratic sum of error_radius and ew_sys_err uncertainty_ew = models.FloatField( help_text=( - 'Total east-west (RA) uncertainty, quadratic sum of' - ' error_radius and ew_sys_err (Deg).' + "Total east-west (RA) uncertainty, quadratic sum of" + " error_radius and ew_sys_err (Deg)." ) ) # quadratic sum of error_radius and ns_sys_err uncertainty_ns = models.FloatField( help_text=( - 'Total north-south (Dec) uncertainty, quadratic sum of ' - 'error_radius and ns_sys_err (Deg).' + "Total north-south (Dec) uncertainty, quadratic sum of " + "error_radius and ns_sys_err (Deg)." ) ) @@ -497,94 +435,73 @@ class Measurement(CommentableModel): flux_int_err = models.FloatField() # mJy/beam flux_int_isl_ratio = models.FloatField( help_text=( - 'Ratio of the component integrated flux to the total' - ' island integrated flux.' + "Ratio of the component integrated flux to the total" + " island integrated flux." ) ) flux_peak = models.FloatField() # mJy/beam flux_peak_err = models.FloatField() # mJy/beam flux_peak_isl_ratio = models.FloatField( - help_text=( - 'Ratio of the component peak flux to the total' - ' island peak flux.' - ) + help_text=("Ratio of the component peak flux to the total" " island peak flux.") ) chi_squared_fit = models.FloatField( - db_column='chi2_fit', - help_text='Chi-squared of the Guassian fit to the source.' + db_column="chi2_fit", help_text="Chi-squared of the Guassian fit to the source." ) spectral_index = models.FloatField( - db_column='spectr_idx', - help_text='In-band Selavy spectral index.' + db_column="spectr_idx", help_text="In-band Selavy spectral index." ) spectral_index_from_TT = models.BooleanField( default=False, - db_column='spectr_idx_tt', - help_text=( - 'True/False if the spectral index came from the taylor ' - 'term.' - ) + db_column="spectr_idx_tt", + help_text=("True/False if the spectral index came from the taylor " "term."), ) - local_rms = models.FloatField( - help_text='Local rms in mJy from Selavy.' - ) # mJy/beam + local_rms = models.FloatField(help_text="Local rms in mJy from Selavy.") # mJy/beam - snr = models.FloatField( - help_text='Signal-to-noise ratio of the measurement.' - ) + snr = models.FloatField(help_text="Signal-to-noise ratio of the measurement.") - flag_c4 = models.BooleanField( - default=False, - help_text='Fit flag from Selavy.' - ) + flag_c4 = models.BooleanField(default=False, help_text="Fit flag from Selavy.") - compactness = models.FloatField( - help_text='Int flux over peak flux.' - ) + compactness = models.FloatField(help_text="Int flux over peak flux.") has_siblings = models.BooleanField( default=False, - help_text='True if the fit comes from an island that has more than 1 component.' + help_text="True if the fit comes from an island that has more than 1 component.", ) component_id = models.CharField( max_length=64, - help_text=( - 'The ID of the component from which the source comes from.' - ) + help_text=("The ID of the component from which the source comes from."), ) island_id = models.CharField( max_length=64, - help_text=( - 'The ID of the island from which the source comes from.' - ) + help_text=("The ID of the island from which the source comes from."), ) forced = models.BooleanField( - default=False, - help_text='True: the measurement is forced extracted.' + default=False, help_text="True: the measurement is forced extracted." ) objects = MeasurementQuerySet.as_manager() class Meta: - ordering = ['ra'] + ordering = ["ra"] def __str__(self): return self.name class Source(CommentableModel): - run = models.ForeignKey(Run, on_delete=models.CASCADE, null=True,) + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + run = models.ForeignKey(Run, on_delete=models.CASCADE, null=True, to_field="id") related = models.ManyToManyField( - 'self', - through='RelatedSource', + "self", + through="RelatedSource", symmetrical=False, - through_fields=('from_source', 'to_source') + through_fields=("from_source", "to_source"), ) name = models.CharField(max_length=100) - new = models.BooleanField(default=False, help_text='New Source.') + new = models.BooleanField(default=False, help_text="New Source.") tags = TagField( space_delimiter=False, autocomplete_view="vast_pipeline:source_tags_autocomplete", @@ -592,129 +509,98 @@ class Source(CommentableModel): ) # average fields calculated from the source measurements - wavg_ra = models.FloatField( - help_text='The weighted average right ascension (Deg).' - ) - wavg_dec = models.FloatField( - help_text='The weighted average declination (Deg).' - ) + wavg_ra = models.FloatField(help_text="The weighted average right ascension (Deg).") + wavg_dec = models.FloatField(help_text="The weighted average declination (Deg).") wavg_uncertainty_ew = models.FloatField( help_text=( - 'The weighted average uncertainty in the east-' - 'west (RA) direction (Deg).' + "The weighted average uncertainty in the east-" "west (RA) direction (Deg)." ) ) wavg_uncertainty_ns = models.FloatField( help_text=( - 'The weighted average uncertainty in the north-' - 'south (Dec) direction (Deg).' + "The weighted average uncertainty in the north-" + "south (Dec) direction (Deg)." ) ) - avg_flux_int = models.FloatField( - help_text='The average integrated flux value.' - ) - avg_flux_peak = models.FloatField( - help_text='The average peak flux value.' - ) - max_flux_peak = models.FloatField( - help_text='The maximum peak flux value.' - ) - min_flux_peak = models.FloatField( - help_text='The minimum peak flux value.' - ) - max_flux_int = models.FloatField( - help_text='The maximum integrated flux value.' - ) - min_flux_int = models.FloatField( - help_text='The minimum integrated flux value.' - ) + avg_flux_int = models.FloatField(help_text="The average integrated flux value.") + avg_flux_peak = models.FloatField(help_text="The average peak flux value.") + max_flux_peak = models.FloatField(help_text="The maximum peak flux value.") + min_flux_peak = models.FloatField(help_text="The minimum peak flux value.") + max_flux_int = models.FloatField(help_text="The maximum integrated flux value.") + min_flux_int = models.FloatField(help_text="The minimum integrated flux value.") min_flux_int_isl_ratio = models.FloatField( - help_text='The minimum integrated island flux ratio value.' + help_text="The minimum integrated island flux ratio value." ) min_flux_peak_isl_ratio = models.FloatField( - help_text='The minimum peak island flux ratio value.' - ) - avg_compactness = models.FloatField( - help_text='The average compactness.' + help_text="The minimum peak island flux ratio value." ) + avg_compactness = models.FloatField(help_text="The average compactness.") min_snr = models.FloatField( - help_text='The minimum signal-to-noise ratio value of the detections.' + help_text="The minimum signal-to-noise ratio value of the detections." ) max_snr = models.FloatField( - help_text='The maximum signal-to-noise ratio value of the detections.' + help_text="The maximum signal-to-noise ratio value of the detections." ) # metrics - v_int = models.FloatField( - help_text='V metric for int flux.' - ) - v_peak = models.FloatField( - help_text='V metric for peak flux.' - ) - eta_int = models.FloatField( - help_text='Eta metric for int flux.' - ) - eta_peak = models.FloatField( - help_text='Eta metric for peak flux.' - ) + v_int = models.FloatField(help_text="V metric for int flux.") + v_peak = models.FloatField(help_text="V metric for peak flux.") + eta_int = models.FloatField(help_text="Eta metric for int flux.") + eta_peak = models.FloatField(help_text="Eta metric for peak flux.") new_high_sigma = models.FloatField( help_text=( - 'The largest sigma value for the new source' - ' if it was placed in previous image.' + "The largest sigma value for the new source" + " if it was placed in previous image." ) ) n_neighbour_dist = models.FloatField( - help_text='Distance to the nearest neighbour (deg)' + help_text="Distance to the nearest neighbour (deg)" ) vs_abs_significant_max_int = models.FloatField( default=0.0, help_text=( - 'Maximum value of all measurement pair variability t-statistics for int' - ' flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs in' - ' the pipeline run configuration.' - ) + "Maximum value of all measurement pair variability t-statistics for int" + " flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs in" + " the pipeline run configuration." + ), ) m_abs_significant_max_int = models.FloatField( default=0.0, help_text=( - 'Maximum absolute value of all measurement pair modulation indices for int' - ' flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs in' - ' the pipeline run configuration.' - ) + "Maximum absolute value of all measurement pair modulation indices for int" + " flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs in" + " the pipeline run configuration." + ), ) vs_abs_significant_max_peak = models.FloatField( default=0.0, help_text=( - 'Maximum absolute value of all measurement pair variability t-statistics for' - ' peak flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs' - ' in the pipeline run configuration.' - ) + "Maximum absolute value of all measurement pair variability t-statistics for" + " peak flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs" + " in the pipeline run configuration." + ), ) m_abs_significant_max_peak = models.FloatField( default=0.0, help_text=( - 'Maximum absolute value of all measurement pair modulation indices for ' - ' peak flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs' - ' in the pipeline run configuration.' - ) + "Maximum absolute value of all measurement pair modulation indices for " + " peak flux that exceed variability.source_aggregate_pair_metrics_min_abs_vs" + " in the pipeline run configuration." + ), ) # total metrics to report in UI - n_meas = models.IntegerField( - help_text='total measurements of the source' - ) + n_meas = models.IntegerField(help_text="total measurements of the source") n_meas_sel = models.IntegerField( - help_text='total selavy extracted measurements of the source' + help_text="total selavy extracted measurements of the source" ) n_meas_forced = models.IntegerField( - help_text='total force extracted measurements of the source' + help_text="total force extracted measurements of the source" ) n_rel = models.IntegerField( - help_text='total relations of the source with other sources' - ) - n_sibl = models.IntegerField( - help_text='total siblings of the source' + help_text="total relations of the source with other sources" ) + n_sibl = models.IntegerField(help_text="total siblings of the source") objects = SourceQuerySet.as_manager() @@ -749,15 +635,23 @@ def get_measurement_pairs(self) -> List[MeasurementPair]: meas_a, meas_b = meas_b, meas_a # calculate metrics vs_peak = calculate_vs_metric( - meas_a.flux_peak, meas_b.flux_peak, meas_a.flux_peak_err, meas_b.flux_peak_err + meas_a.flux_peak, + meas_b.flux_peak, + meas_a.flux_peak_err, + meas_b.flux_peak_err, ) m_int = calculate_m_metric(meas_a.flux_int, meas_b.flux_int) vs_int = calculate_vs_metric( - meas_a.flux_int, meas_b.flux_int, meas_a.flux_int_err, meas_b.flux_int_err + meas_a.flux_int, + meas_b.flux_int, + meas_a.flux_int_err, + meas_b.flux_int_err, ) m_peak = calculate_m_metric(meas_a.flux_peak, meas_b.flux_peak) measurement_pairs.append( - MeasurementPair(self.id, meas_a.id, meas_b.id, vs_peak, m_peak, vs_int, m_int) + MeasurementPair( + self.id, meas_a.id, meas_b.id, vs_peak, m_peak, vs_int, m_int + ) ) return measurement_pairs @@ -767,54 +661,54 @@ class Association(models.Model): model association between sources and measurements based on some parameters """ - source = models.ForeignKey(Source, on_delete=models.CASCADE) - meas = models.ForeignKey(Measurement, on_delete=models.CASCADE) + + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + source = models.ForeignKey(Source, on_delete=models.CASCADE, to_field="id") + meas = models.ForeignKey(Measurement, on_delete=models.CASCADE, to_field="id") d2d = models.FloatField( - default=0., - help_text='astronomical distance calculated by Astropy, arcsec.' + default=0.0, help_text="astronomical distance calculated by Astropy, arcsec." ) dr = models.FloatField( - default=0., - help_text='De Ruiter radius calculated in advanced association.' + default=0.0, help_text="De Ruiter radius calculated in advanced association." ) def __str__(self): return ( - f'distance: {self.d2d:.2f}' if self.dr == 0 else - f'distance: {self.dr:.2f}' + f"distance: {self.d2d:.2f}" if self.dr == 0 else f"distance: {self.dr:.2f}" ) class RelatedSource(models.Model): - ''' + """ Association table for the many to many Source relationship with itself Django doc https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.ManyToManyField.through - ''' - from_source = models.ForeignKey(Source, on_delete=models.CASCADE) + """ + + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + from_source = models.ForeignKey(Source, on_delete=models.CASCADE, to_field="id") to_source = models.ForeignKey( - Source, - on_delete=models.CASCADE, - related_name='related_sources' + Source, on_delete=models.CASCADE, related_name="related_sources", to_field="id" ) class Meta: constraints = [ models.UniqueConstraint( - name='%(app_label)s_%(class)s_unique_pair', - fields=['from_source', 'to_source'] + name="%(app_label)s_%(class)s_unique_pair", + fields=["from_source", "to_source"], ) ] class SourceFav(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) user = models.ForeignKey(User, on_delete=models.CASCADE) - source = models.ForeignKey(Source, on_delete=models.CASCADE) + source = models.ForeignKey(Source, on_delete=models.CASCADE, to_field="id") comment = models.TextField( max_length=500, - default='', + default="", blank=True, - help_text='Why did you include this as favourite' + help_text="Why did you include this as favourite", ) diff --git a/vast_pipeline/pipeline/association.py b/vast_pipeline/pipeline/association.py index b66940ce7..f86b73be9 100644 --- a/vast_pipeline/pipeline/association.py +++ b/vast_pipeline/pipeline/association.py @@ -1,8 +1,8 @@ """ This module contains all the functions required to perform source association. """ - import logging +import uuid import numpy as np import pandas as pd from typing import Tuple, Dict, List @@ -17,7 +17,7 @@ prep_skysrc_df, add_new_one_to_many_relations, add_new_many_to_one_relations, - reconstruct_associtaion_dfs + reconstruct_associtaion_dfs, ) from vast_pipeline.pipeline.config import PipelineConfig from vast_pipeline.utils.utils import StopWatch @@ -43,29 +43,29 @@ def calc_de_ruiter(df: pd.DataFrame) -> np.ndarray: Returns: Array containing the de Ruiter radius for all rows in the df. """ - ra_1 = df['ra_skyc1'].values - ra_2 = df['ra_skyc2'].values + ra_1 = df["ra_skyc1"].values + ra_2 = df["ra_skyc2"].values # avoid wrapping issues - ra_1[ra_1 > 270.] -= 180. - ra_2[ra_2 > 270.] -= 180. - ra_1[ra_1 < 90.] += 180. - ra_2[ra_2 < 90.] += 180. + ra_1[ra_1 > 270.0] -= 180.0 + ra_2[ra_2 > 270.0] -= 180.0 + ra_1[ra_1 < 90.0] += 180.0 + ra_2[ra_2 < 90.0] += 180.0 ra_1 = np.deg2rad(ra_1) ra_2 = np.deg2rad(ra_2) - ra_1_err = np.deg2rad(df['uncertainty_ew_skyc1'].values) - ra_2_err = np.deg2rad(df['uncertainty_ew_skyc2'].values) + ra_1_err = np.deg2rad(df["uncertainty_ew_skyc1"].values) + ra_2_err = np.deg2rad(df["uncertainty_ew_skyc2"].values) - dec_1 = np.deg2rad(df['dec_skyc1'].values) - dec_2 = np.deg2rad(df['dec_skyc2'].values) + dec_1 = np.deg2rad(df["dec_skyc1"].values) + dec_2 = np.deg2rad(df["dec_skyc2"].values) - dec_1_err = np.deg2rad(df['uncertainty_ns_skyc1'].values) - dec_2_err = np.deg2rad(df['uncertainty_ns_skyc2'].values) + dec_1_err = np.deg2rad(df["uncertainty_ns_skyc1"].values) + dec_2_err = np.deg2rad(df["uncertainty_ns_skyc2"].values) dr1 = (ra_1 - ra_2) * (ra_1 - ra_2) - dr1_1 = np.cos((dec_1 + dec_2) / 2.) + dr1_1 = np.cos((dec_1 + dec_2) / 2.0) dr1 *= dr1_1 * dr1_1 dr1 /= ra_1_err * ra_1_err + ra_2_err * ra_2_err @@ -78,9 +78,7 @@ def calc_de_ruiter(df: pd.DataFrame) -> np.ndarray: def one_to_many_basic( - skyc2_srcs: pd.DataFrame, - sources_df: pd.DataFrame, - id_incr_par_assoc: int = 0 + skyc2_srcs: pd.DataFrame, sources_df: pd.DataFrame ) -> Tuple[pd.DataFrame, pd.DataFrame]: """ Finds and processes the one-to-many associations in the basic @@ -98,9 +96,6 @@ def one_to_many_basic( associated to the base) used during basic association. sources_df: The sources_df produced by each step of association holding the current 'sources'. - id_incr_par_assoc: An increment value to add to new source ids - when creating them. Mainly useful for add mode with parallel - association Returns: Updated 'skyc2_srcs' with all the one_to_many relation information @@ -110,9 +105,8 @@ def one_to_many_basic( """ # select duplicated in 'source' field in skyc2_srcs, excluding -1 duplicated_skyc2 = skyc2_srcs.loc[ - (skyc2_srcs['source'] != -1) & - skyc2_srcs['source'].duplicated(keep=False), - ['source', 'related', 'd2d'] + (skyc2_srcs["source"].notnull()) & skyc2_srcs["source"].duplicated(keep=False), + ["source", "related", "d2d"], ] # duplicated_skyc2 @@ -127,13 +121,10 @@ def one_to_many_basic( # +-----+----------+-----------+---------+ if duplicated_skyc2.empty: - logger.debug('No one-to-many associations.') + logger.debug("No one-to-many associations.") return skyc2_srcs, sources_df - logger.info( - 'Detected #%i double matches, cleaning...', - duplicated_skyc2.shape[0] - ) + logger.info("Detected #%i double matches, cleaning...", duplicated_skyc2.shape[0]) # now we have the src values which are doubled. # make the nearest match have the "original" src id @@ -141,27 +132,20 @@ def one_to_many_basic( # and make sure to copy the other previously # matched sources. # Get the duplicated, sort by the distance column - duplicated_skyc2 = duplicated_skyc2.sort_values(by=['source', 'd2d']) + duplicated_skyc2 = duplicated_skyc2.sort_values(by=["source", "d2d"]) - # Get those that need to be given a new ID number (i.e. not the min dist_col) - idx_to_change = duplicated_skyc2.index.values[ - duplicated_skyc2.duplicated('source') + # Get those that need to be given a new ID (i.e. not the min dist_col) + idx_to_change = duplicated_skyc2.index.to_numpy()[ + duplicated_skyc2.duplicated("source") ] # Create a new `new_source_id` column to store the 'correct' IDs - duplicated_skyc2['new_source_id'] = duplicated_skyc2['source'] - - # Define the range of new source ids - start_new_src_id = sources_df['source'].values.max() + 1 + id_incr_par_assoc + duplicated_skyc2["new_source_id"] = duplicated_skyc2["source"] - new_source_ids = np.arange( - start_new_src_id, - start_new_src_id + idx_to_change.shape[0], - dtype=int - ) + new_source_ids = [str(uuid.uuid4()) for _ in range(idx_to_change.shape[0])] # Assign the new IDs - duplicated_skyc2.loc[idx_to_change, 'new_source_id'] = new_source_ids + duplicated_skyc2.loc[idx_to_change, "new_source_id"] = new_source_ids # duplicated_skyc2 # +-----+----------+-----------+---------+-----------------+ @@ -180,20 +164,14 @@ def one_to_many_basic( # related column. # The not_original ones need just the original ID appended. # copy() is used here to avoid chained indexing (set with copy warnings) - not_original = duplicated_skyc2.loc[ - idx_to_change - ].copy() + not_original = duplicated_skyc2.loc[idx_to_change].copy() - original = duplicated_skyc2.drop_duplicates( - 'source' - ).copy() + original = duplicated_skyc2.drop_duplicates("source").copy() new_original_related = pd.DataFrame( - not_original[ - ['source', 'new_source_id'] - ].groupby('source').apply( - lambda grp: grp['new_source_id'].tolist() - ) + not_original[["source", "new_source_id"]] + .groupby("source") + .apply(lambda grp: grp["new_source_id"].tolist()) ) # new_original_related @@ -210,19 +188,12 @@ def one_to_many_basic( # Append the relations in each case, using the above 'new_original_related' # for the original ones. # The not original only require the appending of the original index. - original['related'] = ( - original[['related', 'source']] - .apply( - add_new_one_to_many_relations, - args=(False, new_original_related), - axis=1 - ) + original["related"] = original[["related", "source"]].apply( + add_new_one_to_many_relations, args=(False, new_original_related), axis=1 ) - not_original['related'] = not_original.apply( - add_new_one_to_many_relations, - args=(False,), - axis=1 + not_original["related"] = not_original.apply( + add_new_one_to_many_relations, args=(False,), axis=1 ) duplicated_skyc2 = pd.concat([original, not_original]) @@ -241,31 +212,23 @@ def one_to_many_basic( del original, not_original # Apply the updates to the actual temp_srcs. - skyc2_srcs.loc[idx_to_change, 'source'] = new_source_ids - skyc2_srcs.loc[ - duplicated_skyc2.index.values, - 'related' - ] = duplicated_skyc2.loc[ - duplicated_skyc2.index.values, - 'related' + skyc2_srcs.loc[idx_to_change, "source"] = new_source_ids + skyc2_srcs.loc[duplicated_skyc2.index.values, "related"] = duplicated_skyc2.loc[ + duplicated_skyc2.index.values, "related" ].values # Finally we need to copy copies of the previous sources in the # sources_df to complete the new sources. # To do this we get only the non-original sources - duplicated_skyc2 = duplicated_skyc2.loc[ - duplicated_skyc2.duplicated('source') - ] + duplicated_skyc2 = duplicated_skyc2.loc[duplicated_skyc2.duplicated("source")] # Get all the indexes required for each original # `source_skyc1` value source_df_index_to_copy = pd.DataFrame( - duplicated_skyc2.groupby( - 'source' - ).apply( + duplicated_skyc2.groupby("source").apply( lambda grp: sources_df[ - sources_df['source'] == grp.name + sources_df["source"] == grp.name ].index.values.tolist() ) ) @@ -283,33 +246,23 @@ def one_to_many_basic( # merge these so it's easy to explode and copy the index values. duplicated_skyc2 = ( - duplicated_skyc2[['source', 'new_source_id']] - .merge( - source_df_index_to_copy, - left_on='source', - right_index=True, - how='left' - ) - .rename(columns={0: 'source_index'}) - .explode('source_index') + duplicated_skyc2[["source", "new_source_id"]] + .merge(source_df_index_to_copy, left_on="source", right_index=True, how="left") + .rename(columns={0: "source_index"}) + .explode("source_index") ) # Get the sources - all columns from the sources_df table - sources_to_copy = sources_df.loc[ - duplicated_skyc2['source_index'].values - ] + sources_to_copy = sources_df.loc[duplicated_skyc2["source_index"].values] # Apply the new_source_id - sources_to_copy['source'] = duplicated_skyc2['new_source_id'].values + sources_to_copy["source"] = duplicated_skyc2["new_source_id"].values # Reset the related column to avoid rogue relations - sources_to_copy['related'] = None + sources_to_copy["related"] = None # and finally concatenate. - sources_df = pd.concat( - [sources_df, sources_to_copy], - ignore_index=True - ) + sources_df = pd.concat([sources_df, sources_to_copy], ignore_index=True) return skyc2_srcs, sources_df @@ -318,9 +271,8 @@ def one_to_many_advanced( temp_srcs: pd.DataFrame, sources_df: pd.DataFrame, method: str, - id_incr_par_assoc: int = 0 ) -> Tuple[pd.DataFrame, pd.DataFrame]: - ''' + """ Finds and processes the one-to-many associations in the advanced association. For each one-to-many association, the nearest associated source is assigned the original source id, where as @@ -341,24 +293,27 @@ def one_to_many_advanced( method: Can be either 'advanced' or 'deruiter' to represent the advanced association method being used. - id_incr_par_assoc: - An increment value to add to new source ids when creating them. - Mainly useful for add mode with parallel association Returns: Updated `temp_srcs` dataframe with all the one_to_many relation information added. Updated `sources_df` dataframe with all the one_to_many relation information added. - ''' + """ # use only these columns for easy debugging of the dataframe cols = [ - 'index_old_skyc1', 'id_skyc1', 'source_skyc1', - 'related_skyc1', 'index_old_skyc2', 'id_skyc2', 'source_skyc2', - 'd2d', 'dr' + "index_old_skyc1", + "id_skyc1", + "source_skyc1", + "related_skyc1", + "index_old_skyc2", + "id_skyc2", + "source_skyc2", + "d2d", + "dr", ] duplicated_skyc1 = temp_srcs.loc[ - temp_srcs['source_skyc1'].duplicated(keep=False), cols + temp_srcs["source_skyc1"].duplicated(keep=False), cols ].copy() # duplicated_skyc1 @@ -392,18 +347,17 @@ def one_to_many_advanced( # If no relations then no action is required if duplicated_skyc1.empty: - logger.debug('No one-to-many associations.') + logger.debug("No one-to-many associations.") return temp_srcs, sources_df logger.debug( - 'Detected #%i one-to-many assocations, cleaning...', - duplicated_skyc1.shape[0] + "Detected #%i one-to-many assocations, cleaning...", duplicated_skyc1.shape[0] ) # Get the column to check for the minimum depending on the method # set the column names needed for filtering the 'to-many' # associations depending on the method (advanced or deruiter) - dist_col = 'd2d' if method == 'advanced' else 'dr' + dist_col = "d2d" if method == "advanced" else "dr" # go through the doubles and # 1. Keep the closest d2d or de ruiter as the primary id @@ -413,17 +367,15 @@ def one_to_many_advanced( # multi_srcs = duplicated_skyc1['source_skyc1'].unique() # Get the duplicated, sort by the distance column - duplicated_skyc1 = duplicated_skyc1.sort_values( - by=['source_skyc1', dist_col] - ) + duplicated_skyc1 = duplicated_skyc1.sort_values(by=["source_skyc1", dist_col]) # Get those that need to be given a new ID number (i.e. not the min dist_col) idx_to_change = duplicated_skyc1.index.values[ - duplicated_skyc1.duplicated('source_skyc1') + duplicated_skyc1.duplicated("source_skyc1") ] # Create a new `new_source_id` column to store the 'correct' IDs - duplicated_skyc1['new_source_id'] = duplicated_skyc1['source_skyc1'] + duplicated_skyc1["new_source_id"] = duplicated_skyc1["source_skyc1"] # +-----------------+ # | new_source_id | @@ -435,47 +387,34 @@ def one_to_many_advanced( # | 262 | # +-----------------+ - # Define the range of new source ids - start_new_src_id = sources_df['source'].values.max() + 1 + id_incr_par_assoc - # Create an arange to use to change the ones that need to be changed. - new_source_ids = np.arange( - start_new_src_id, - start_new_src_id + idx_to_change.shape[0], - dtype=int - ) + new_source_ids = [str(uuid.uuid4()) for _ in range(idx_to_change.shape[0])] # Assign the new IDs to those that need to be changed. - duplicated_skyc1.loc[idx_to_change, 'new_source_id'] = new_source_ids + duplicated_skyc1.loc[idx_to_change, "new_source_id"] = new_source_ids # We also need to clear the relations for these 'new' sources # otherwise it will inherit rogue relations from the original relation - duplicated_skyc1.loc[idx_to_change, 'related_skyc1'] = None + duplicated_skyc1.loc[idx_to_change, "related_skyc1"] = None # Now we need to sort out the related, essentially here the 'original' # and 'non original' need to be treated differently. - # The original source need all the assoicated new ids appended to the + # The original source need all the associated new ids appended to the # related column. # The not_original ones need just the original ID appended. - not_original = duplicated_skyc1.loc[ - idx_to_change - ].copy() + not_original = duplicated_skyc1.loc[idx_to_change].copy() - original = duplicated_skyc1.drop_duplicates( - 'source_skyc1' - ).copy() + original = duplicated_skyc1.drop_duplicates("source_skyc1").copy() # This gathers all the new ids that need to be appended # to the original related column. new_original_related = pd.DataFrame( - not_original[ - ['source_skyc1', 'new_source_id'] - ].groupby('source_skyc1').apply( - lambda grp: grp['new_source_id'].tolist() - ) + not_original[["source_skyc1", "new_source_id"]] + .groupby("source_skyc1") + .apply(lambda grp: grp["new_source_id"].tolist()) ) - #new_original_related + # new_original_related # +----------------+--------+ # | source_skyc1 | 0 | # |----------------+--------| @@ -489,13 +428,8 @@ def one_to_many_advanced( # Append the relations in each case, using the above 'new_original_related' # for the original ones. # The not original only require the appending of the original index. - original['related_skyc1'] = ( - original[['related_skyc1', 'source_skyc1']] - .apply( - add_new_one_to_many_relations, - args=(True, new_original_related), - axis=1 - ) + original["related_skyc1"] = original[["related_skyc1", "source_skyc1"]].apply( + add_new_one_to_many_relations, args=(True, new_original_related), axis=1 ) # what the column looks like after the above @@ -509,10 +443,8 @@ def one_to_many_advanced( # | [5546] | # +-----------------+ - not_original.loc[:, 'related_skyc1'] = not_original.apply( - add_new_one_to_many_relations, - args=(True,), - axis=1 + not_original.loc[:, "related_skyc1"] = not_original.apply( + add_new_one_to_many_relations, args=(True,), axis=1 ) # Merge them back together @@ -521,31 +453,23 @@ def one_to_many_advanced( del original, not_original # Apply the updates to the actual temp_srcs. - temp_srcs.loc[idx_to_change, 'source_skyc1'] = new_source_ids + temp_srcs.loc[idx_to_change, "source_skyc1"] = new_source_ids temp_srcs.loc[ - duplicated_skyc1.index.values, - 'related_skyc1' - ] = duplicated_skyc1.loc[ - duplicated_skyc1.index.values, - 'related_skyc1' - ].values + duplicated_skyc1.index.values, "related_skyc1" + ] = duplicated_skyc1.loc[duplicated_skyc1.index.values, "related_skyc1"].values # Finally we need to create copies of the previous sources in the # sources_df to complete the new sources. # To do this we get only the non-original sources - duplicated_skyc1 = duplicated_skyc1.loc[ - duplicated_skyc1.duplicated('source_skyc1') - ] + duplicated_skyc1 = duplicated_skyc1.loc[duplicated_skyc1.duplicated("source_skyc1")] # Get all the indexes required for each original # `source_skyc1` value source_df_index_to_copy = pd.DataFrame( - duplicated_skyc1.groupby( - 'source_skyc1' - ).apply( + duplicated_skyc1.groupby("source_skyc1").apply( lambda grp: sources_df[ - sources_df['source'] == grp.name + sources_df["source"] == grp.name ].index.values.tolist() ) ) @@ -563,15 +487,15 @@ def one_to_many_advanced( # merge these so it's easy to explode and copy the index values. duplicated_skyc1 = ( - duplicated_skyc1.loc[:,['source_skyc1', 'new_source_id']] + duplicated_skyc1.loc[:, ["source_skyc1", "new_source_id"]] .merge( source_df_index_to_copy, - left_on='source_skyc1', + left_on="source_skyc1", right_index=True, - how='left' + how="left", ) - .rename(columns={0: 'source_index'}) - .explode('source_index') + .rename(columns={0: "source_index"}) + .explode("source_index") ) # duplicated_skyc1 @@ -586,15 +510,13 @@ def one_to_many_advanced( # +-----+----------------+-----------------+----------------+ # Get the sources - sources_to_copy = sources_df.loc[ - duplicated_skyc1['source_index'].values - ] + sources_to_copy = sources_df.loc[duplicated_skyc1["source_index"].values] # Apply the new_source_id - sources_to_copy['source'] = duplicated_skyc1['new_source_id'].values + sources_to_copy["source"] = duplicated_skyc1["new_source_id"].values # Reset the related column to avoid rogue relations - sources_to_copy['related'] = None + sources_to_copy["related"] = None # and finally concatenate. sources_df = pd.concat([sources_df, sources_to_copy], ignore_index=True) @@ -603,7 +525,7 @@ def one_to_many_advanced( def many_to_many_advanced(temp_srcs: pd.DataFrame, method: str) -> pd.DataFrame: - ''' + """ Finds and processes the many-to-many associations in the advanced association. We do not want to build many-to-many associations as this will make the database get very large (see TraP documentation). @@ -625,33 +547,29 @@ def many_to_many_advanced(temp_srcs: pd.DataFrame, method: str) -> pd.DataFrame: Returns: Updated temp_srcs with the many_to_many relations dropped. - ''' + """ # Select those where the extracted source is listed more than once # (e.g. index_old_skyc2 duplicated values) and of these get those that # have a source id that is listed more than once (e.g. source_skyc1 # duplicated values) in the temps_srcs df - m_to_m = temp_srcs[( - temp_srcs['index_old_skyc2'].duplicated(keep=False) & - temp_srcs['source_skyc1'].duplicated(keep=False) - )].copy() + m_to_m = temp_srcs[ + ( + temp_srcs["index_old_skyc2"].duplicated(keep=False) + & temp_srcs["source_skyc1"].duplicated(keep=False) + ) + ].copy() if m_to_m.empty: - logger.debug('No many-to-many assocations.') + logger.debug("No many-to-many assocations.") return temp_srcs - logger.debug( - 'Detected #%i many-to-many assocations, cleaning...', - m_to_m.shape[0] - ) + logger.debug("Detected #%i many-to-many assocations, cleaning...", m_to_m.shape[0]) - dist_col = 'd2d' if method == 'advanced' else 'dr' - min_col = 'min_' + dist_col + dist_col = "d2d" if method == "advanced" else "dr" + min_col = "min_" + dist_col # get the minimum de ruiter value for each extracted source - m_to_m[min_col] = ( - m_to_m.groupby('index_old_skyc2')[dist_col] - .transform('min') - ) + m_to_m[min_col] = m_to_m.groupby("index_old_skyc2")[dist_col].transform("min") # get the ids of those crossmatches that are larger than the minimum m_to_m_to_drop = m_to_m[m_to_m[dist_col] != m_to_m[min_col]].index.values # and drop these from the temp_srcs @@ -661,7 +579,7 @@ def many_to_many_advanced(temp_srcs: pd.DataFrame, method: str) -> pd.DataFrame: def many_to_one_advanced(temp_srcs: pd.DataFrame) -> pd.DataFrame: - ''' + """ Finds and processes the many-to-one associations in the advanced association. In this case in the related column of the 'many' sources we need to append the ids of all the other 'many' (expect for itself). @@ -673,19 +591,24 @@ def many_to_one_advanced(temp_srcs: pd.DataFrame) -> pd.DataFrame: Returns: Updated temp_srcs with all many_to_one relation information added. - ''' + """ # use only these columns for easy debugging of the dataframe cols = [ - 'index_old_skyc1', 'id_skyc1', 'source_skyc1', - 'related_skyc1', 'index_old_skyc2', 'id_skyc2', 'source_skyc2', - 'd2d', 'dr' + "index_old_skyc1", + "id_skyc1", + "source_skyc1", + "related_skyc1", + "index_old_skyc2", + "id_skyc2", + "source_skyc2", + "d2d", + "dr", ] # select those sources which have been matched to the same measurement # in the sky catalogue 2. duplicated_skyc2 = temp_srcs.loc[ - temp_srcs['index_old_skyc2'].duplicated(keep=False), - cols + temp_srcs["index_old_skyc2"].duplicated(keep=False), cols ] # duplicated_skyc2 @@ -719,23 +642,20 @@ def many_to_one_advanced(temp_srcs: pd.DataFrame) -> pd.DataFrame: # if there are none no action is required. if duplicated_skyc2.empty: - logger.debug('No many-to-one associations.') + logger.debug("No many-to-one associations.") return temp_srcs - logger.debug( - 'Detected #%i many-to-one associations', - duplicated_skyc2.shape[0] - ) + logger.debug("Detected #%i many-to-one associations", duplicated_skyc2.shape[0]) # The new relations become that for each 'many' source we need to append # the ids of the other 'many' sources that have been associationed with the # 'one'. Below for each 'one' group we gather all the ids of the many # sources. new_relations = pd.DataFrame( - duplicated_skyc2 - .groupby('index_old_skyc2') - .apply(lambda grp: grp['source_skyc1'].tolist()) - ).rename(columns={0: 'new_relations'}) + duplicated_skyc2.groupby("index_old_skyc2").apply( + lambda grp: grp["source_skyc1"].tolist() + ) + ).rename(columns={0: "new_relations"}) # new_relations # +-------------------+-----------------+ @@ -751,52 +671,40 @@ def many_to_one_advanced(temp_srcs: pd.DataFrame) -> pd.DataFrame: # these new relations are then added to the duplciated dataframe so # they can easily be used by the next function. duplicated_skyc2 = duplicated_skyc2.merge( - new_relations, - left_on='index_old_skyc2', - right_index=True, - how='left' + new_relations, left_on="index_old_skyc2", right_index=True, how="left" ) # Remove the 'self' relations. The 'x['source_skyc1']' is an integer so it # is placed within a list notation, [], to be able to be easily subtracted # from the new_relations. - duplicated_skyc2['new_relations'] = ( - duplicated_skyc2.apply( - lambda x: list(set(x['new_relations']) - set([x['source_skyc1']])), - axis=1 - ) + duplicated_skyc2["new_relations"] = duplicated_skyc2.apply( + lambda x: list(set(x["new_relations"]) - set([x["source_skyc1"]])), axis=1 ) # Use the 'add_new_many_to_one_relations' method to add tthe new relatitons # to the actual `related_skyc1' column. - duplicated_skyc2['related_skyc1'] = ( - duplicated_skyc2.apply( - add_new_many_to_one_relations, - axis=1 - ) + duplicated_skyc2["related_skyc1"] = duplicated_skyc2.apply( + add_new_many_to_one_relations, axis=1 ) # Transfer the new relations from the duplicated df to the temp_srcs. The # index is explicitly declared to avoid any mixups. temp_srcs.loc[ - duplicated_skyc2.index.values, 'related_skyc1' - ] = duplicated_skyc2.loc[ - duplicated_skyc2.index.values, 'related_skyc1' - ].values + duplicated_skyc2.index.values, "related_skyc1" + ] = duplicated_skyc2.loc[duplicated_skyc2.index.values, "related_skyc1"].values return temp_srcs def basic_association( - sources_df: pd.DataFrame, - skyc1_srcs: pd.DataFrame, - skyc1: SkyCoord, - skyc2_srcs: pd.DataFrame, - skyc2: SkyCoord, - limit: Angle, - id_incr_par_assoc: int = 0 - ) -> Tuple[pd.DataFrame, pd.DataFrame]: - ''' + sources_df: pd.DataFrame, + skyc1_srcs: pd.DataFrame, + skyc1: SkyCoord, + skyc2_srcs: pd.DataFrame, + skyc2: SkyCoord, + limit: Angle, +) -> Tuple[pd.DataFrame, pd.DataFrame]: + """ The loop for basic source association that uses the astropy 'match_to_catalog_sky' function (i.e. only the nearest match between the catalogs). A direct on sky separation is used to define the association. @@ -819,81 +727,63 @@ def basic_association( A SkyCoord object with the sky positions from skyc2_srcs. limit: The association limit to use (applies to basic and advanced only). - id_incr_par_assoc: - An increment value to be applied to source numbering when adding - new sources to the associations (applies when parallel and add - image are being used). Defaults to 0. Returns: The output `sources_df` containing all input measurements along with the association and relation information. The output `skyc1_srcs` with updated with new sources from the association. - ''' + """ # match the new sources to the base # idx gives the index of the closest match in the base for skyc2 - idx, d2d, d3d = skyc2.match_to_catalog_sky(skyc1) + idx, d2d, _ = skyc2.match_to_catalog_sky(skyc1) # acceptable selection sel = d2d <= limit # The good matches can be assinged the src id from base - skyc2_srcs.loc[sel, 'source'] = skyc1_srcs.loc[idx[sel], 'source'].values + skyc2_srcs.loc[sel, "source"] = skyc1_srcs.loc[idx[sel], "source"].values # Need the d2d to make analysing doubles easier. - skyc2_srcs.loc[sel, 'd2d'] = d2d[sel].arcsec + skyc2_srcs.loc[sel, "d2d"] = d2d[sel].arcsec # must check for double matches in the acceptable matches just made # this would mean that multiple sources in skyc2 have been matched # to the same base source we want to keep closest match and move # the other match(es) back to having a -1 src id - skyc2_srcs, sources_df = one_to_many_basic( - skyc2_srcs, sources_df, id_incr_par_assoc) + skyc2_srcs, sources_df = one_to_many_basic(skyc2_srcs, sources_df) - logger.info('Updating sources catalogue with new sources...') + logger.info("Updating sources catalogue with new sources...") # update the src numbers for those sources in skyc2 with no match - # using the max current src as the start and incrementing by one - start_elem = sources_df['source'].values.max() + 1 + id_incr_par_assoc - nan_sel = (skyc2_srcs['source'] == -1).values - skyc2_srcs.loc[nan_sel, 'source'] = ( - np.arange( - start_elem, - start_elem + skyc2_srcs.loc[nan_sel].shape[0], - dtype=int - ) - ) + nan_sel = (skyc2_srcs["source"].isnull()).to_numpy() + skyc2_srcs.loc[nan_sel, "source"] = [ + str(uuid.uuid4()) for _ in range(nan_sel.sum()) + ] # and skyc2 is now ready to be concatenated with the new sources - sources_df = pd.concat( - [sources_df, skyc2_srcs], - ignore_index=True - ).reset_index(drop=True) + sources_df = pd.concat([sources_df, skyc2_srcs], ignore_index=True).reset_index( + drop=True + ) # and update skyc1 with the sources that were created from the one # to many relations and any new sources. skyc1_srcs = pd.concat( - [ - skyc1_srcs, - skyc2_srcs[ - ~skyc2_srcs['source'].isin(skyc1_srcs['source']) - ] - ], - ignore_index=True + [skyc1_srcs, skyc2_srcs[~skyc2_srcs["source"].isin(skyc1_srcs["source"])]], + ignore_index=True, ).reset_index(drop=True) return sources_df, skyc1_srcs def advanced_association( - method: str, - sources_df: pd.DataFrame, - skyc1_srcs: pd.DataFrame, - skyc1: SkyCoord, - skyc2_srcs: pd.DataFrame, - skyc2: SkyCoord, - dr_limit: float, - bw_max: float, - id_incr_par_assoc: int = 0 - ) -> Tuple[pd.DataFrame, pd.DataFrame]: - ''' + method: str, + sources_df: pd.DataFrame, + skyc1_srcs: pd.DataFrame, + skyc1: SkyCoord, + skyc2_srcs: pd.DataFrame, + skyc2: SkyCoord, + dr_limit: float, + bw_max: float, +) -> Tuple[pd.DataFrame, pd.DataFrame]: + """ The loop for advanced source association that uses the astropy 'search_around_sky' function (i.e. all matching sources are found). The BMAJ of the image * the user supplied beamwidth @@ -922,48 +812,36 @@ def advanced_association( The de Ruiter radius limit to use (applies to de ruiter only). bw_max: The beamwidth limit to use (applies to de ruiter only). - id_incr_par_assoc: - An increment value to be applied to source numbering when adding - new sources to the associations (applies when parallel and add - image are being used). Defaults to 0. Returns: The output `sources_df` containing all input measurements along with the association and relation information. The output `skyc1_srcs` with updated with new sources from the association. - ''' + """ # read the needed sources fields # Step 1: get matches within semimajor axis of image. - idx_skyc1, idx_skyc2, d2d, d3d = skyc2.search_around_sky( - skyc1, bw_max - ) + idx_skyc1, idx_skyc2, d2d, d3d = skyc2.search_around_sky(skyc1, bw_max) # Step 2: merge the candidates so the de ruiter can be calculated temp_skyc1_srcs = ( - skyc1_srcs.loc[idx_skyc1] - .reset_index() - .rename(columns={'index': 'index_old'}) + skyc1_srcs.loc[idx_skyc1].reset_index().rename(columns={"index": "index_old"}) ) temp_skyc2_srcs = ( - skyc2_srcs.loc[idx_skyc2] - .reset_index() - .rename(columns={'index': 'index_old'}) + skyc2_srcs.loc[idx_skyc2].reset_index().rename(columns={"index": "index_old"}) ) - temp_skyc2_srcs['d2d'] = d2d.arcsec + temp_skyc2_srcs["d2d"] = d2d.arcsec temp_srcs = temp_skyc1_srcs.merge( temp_skyc2_srcs, left_index=True, right_index=True, - suffixes=('_skyc1', '_skyc2') + suffixes=("_skyc1", "_skyc2"), ) # drop the double d2d column and keep the d2d_skyc2 as assigned above - temp_srcs = ( - temp_srcs - .drop(['d2d_skyc1', 'dr_skyc1', 'dr_skyc2'], axis=1) - .rename(columns={'d2d_skyc2': 'd2d'}) + temp_srcs = temp_srcs.drop(["d2d_skyc1", "dr_skyc1", "dr_skyc2"], axis=1).rename( + columns={"d2d_skyc2": "d2d"} ) del temp_skyc1_srcs, temp_skyc2_srcs @@ -972,11 +850,11 @@ def advanced_association( temp_srcs = temp_srcs[d2d <= bw_max].copy() # Step 4: Calculate and perform De Ruiter radius cut - if method == 'deruiter': - temp_srcs['dr'] = calc_de_ruiter(temp_srcs) - temp_srcs = temp_srcs[temp_srcs['dr'] <= dr_limit] + if method == "deruiter": + temp_srcs["dr"] = calc_de_ruiter(temp_srcs) + temp_srcs = temp_srcs[temp_srcs["dr"] <= dr_limit] else: - temp_srcs['dr'] = 0. + temp_srcs["dr"] = 0.0 # Now have the 'good' matches # Step 5: Check for one-to-many, many-to-one and many-to-many @@ -986,7 +864,7 @@ def advanced_association( # Next one-to-many # Get the sources which are doubled temp_srcs, sources_df = one_to_many_advanced( - temp_srcs, sources_df, method, id_incr_par_assoc + temp_srcs, sources_df, method ) # Finally many-to-one associations, the opposite of above but we @@ -999,47 +877,35 @@ def advanced_association( # This is created from the temp_srcs df. # This will take care of the extra skyc2 sources needed. skyc2_srcs_toappend = skyc2_srcs.loc[ - temp_srcs['index_old_skyc2'].values + temp_srcs["index_old_skyc2"].values ].reset_index(drop=True) - skyc2_srcs_toappend['source'] = temp_srcs['source_skyc1'].values - skyc2_srcs_toappend['related'] = temp_srcs['related_skyc1'].values - skyc2_srcs_toappend['d2d'] = temp_srcs['d2d'].values - skyc2_srcs_toappend['dr'] = temp_srcs['dr'].values + skyc2_srcs_toappend["source"] = temp_srcs["source_skyc1"].values + skyc2_srcs_toappend["related"] = temp_srcs["related_skyc1"].values + skyc2_srcs_toappend["d2d"] = temp_srcs["d2d"].values + skyc2_srcs_toappend["dr"] = temp_srcs["dr"].values # and get the skyc2 sources with no match - logger.info( - 'Updating sources catalogue with new sources...' - ) + logger.info("Updating sources catalogue with new sources...") new_sources = skyc2_srcs.loc[ - skyc2_srcs.index.difference( - temp_srcs['index_old_skyc2'].values - ) + skyc2_srcs.index.difference(temp_srcs["index_old_skyc2"].values) ].reset_index(drop=True) # update the src numbers for those sources in skyc2 with no match # using the max current src as the start and incrementing by one - start_elem = sources_df['source'].values.max() + 1 + id_incr_par_assoc - new_sources['source'] = np.arange( - start_elem, - start_elem + new_sources.shape[0], - dtype=int - ) + new_sources["source"] = new_sources.apply(lambda _: str(uuid.uuid4()), axis=1) skyc2_srcs_toappend = pd.concat( - [skyc2_srcs_toappend, new_sources], - ignore_index=True + [skyc2_srcs_toappend, new_sources], ignore_index=True ) # and skyc2 is now ready to be concatenated with source_df sources_df = pd.concat( - [sources_df, skyc2_srcs_toappend], - ignore_index=True + [sources_df, skyc2_srcs_toappend], ignore_index=True ).reset_index(drop=True) # update skyc1 and df for next association iteration # calculate average angles for skyc1 - skyc1_srcs = pd.concat( - [skyc1_srcs, new_sources], - ignore_index=True - ).reset_index(drop=True) + skyc1_srcs = pd.concat([skyc1_srcs, new_sources], ignore_index=True).reset_index( + drop=True + ) # also need to append any related sources that created a new # source, we can use the skyc2_srcs_toappend to get these @@ -1048,7 +914,7 @@ def advanced_association( skyc1_srcs, skyc2_srcs_toappend.loc[ ~skyc2_srcs_toappend.source.isin(skyc1_srcs.source) - ] + ], ] ) @@ -1065,10 +931,9 @@ def association( add_mode: bool, previous_parquets: Dict[str, str], done_images_df: pd.DataFrame, - id_incr_par_assoc: int = 0, - parallel: bool = False + parallel: bool = False, ) -> pd.DataFrame: - ''' + """ The main association function that does the common tasks between basic and advanced modes. @@ -1094,10 +959,6 @@ def association( done_images_df: Datafraame containing the images of the previous successful run (used in add image mode). - id_incr_par_assoc: - An increment value to be applied to source numbering when adding - new sources to the associations (applies when parallel and add - image are being used). Defaults to 0. parallel: Whether parallel association is being used. @@ -1107,7 +968,7 @@ def association( Raises: Exception: Raised if association method is not valid. - ''' + """ timer = StopWatch() if parallel: @@ -1116,13 +977,12 @@ def association( if len(images_df) == 0: return images_df - images_df = ( - images_df.sort_values(by='image_datetime') - .drop('image_datetime', axis=1) + images_df = images_df.sort_values(by="image_datetime").drop( + "image_datetime", axis=1 ) - if 'skyreg_group' in images_df.columns: - skyreg_group = images_df['skyreg_group'].iloc[0] + if "skyreg_group" in images_df.columns: + skyreg_group = images_df["skyreg_group"].iloc[0] skyreg_tag = " (sky region group %s)" % skyreg_group else: skyreg_group = -1 @@ -1130,15 +990,15 @@ def association( method = config["source_association"]["method"] - logger.info('Starting association%s.', skyreg_tag) - logger.info('Association mode selected: %s.', method) + logger.info("Starting association%s.", skyreg_tag) + logger.info("Association mode selected: %s.", method) - unique_epochs = np.sort(images_df['epoch'].unique()) + unique_epochs = np.sort(images_df["epoch"].unique()) if add_mode: # Here the skyc1_srcs and sources_df are recreated and the done images # are filtered out. - image_mask = images_df['image_name'].isin(done_images_df['name']) + image_mask = images_df["image_name"].isin(done_images_df["name"]) images_df_done = images_df[image_mask].copy() sources_df, skyc1_srcs = reconstruct_associtaion_dfs( images_df_done, @@ -1146,42 +1006,35 @@ def association( ) images_df = images_df.loc[~image_mask] if images_df.empty: - logger.info( - 'No new images found, stopping association%s.', skyreg_tag - ) - sources_df['interim_ew'] = ( - sources_df['ra_source'].values * sources_df['weight_ew'].values + logger.info("No new images found, stopping association%s.", skyreg_tag) + sources_df["interim_ew"] = ( + sources_df["ra_source"].values * sources_df["weight_ew"].values ) - sources_df['interim_ns'] = ( - sources_df['dec_source'].values * sources_df['weight_ns'].values + sources_df["interim_ns"] = ( + sources_df["dec_source"].values * sources_df["weight_ns"].values ) - return ( - sources_df - .drop(['ra', 'dec'], axis=1) - .rename(columns={'ra_source': 'ra', 'dec_source': 'dec'}) + return sources_df.drop(["ra", "dec"], axis=1).rename( + columns={"ra_source": "ra", "dec_source": "dec"} ) - logger.info( - f'Found {images_df.shape[0]} images to add to the run{skyreg_tag}.') + logger.info(f"Found {images_df.shape[0]} images to add to the run{skyreg_tag}.") # re-get the unique epochs - unique_epochs = np.sort(images_df['epoch'].unique()) + unique_epochs = np.sort(images_df["epoch"].unique()) start_epoch = 0 else: # Do full set up for a new run. - first_images = ( - images_df - .loc[images_df['epoch'] == unique_epochs[0], 'image_dj'] - .to_list() - ) + first_images = images_df.loc[ + images_df["epoch"] == unique_epochs[0], "image_dj" + ].to_list() # initialise sky source dataframe skyc1_srcs = prep_skysrc_df( first_images, config["measurements"]["flux_fractional_error"], duplicate_limit, - ini_df=True + ini_df=True, ) - skyc1_srcs['epoch'] = unique_epochs[0] + skyc1_srcs["epoch"] = unique_epochs[0] # create base catalogue # initialise the sources dataframe using first image as base sources_df = skyc1_srcs.copy() @@ -1193,60 +1046,71 @@ def association( # images to be added, the interim needs to be calculated and skyc1_srcs # can just be returned as sources_df. ra_source and dec_source can just # be dropped as the ra and dec are already the average values. - logger.warning( - 'No images to associate with!%s.', skyreg_tag - ) - logger.info( - 'Returning base sources only%s.', skyreg_tag - ) + logger.warning("No images to associate with!%s.", skyreg_tag) + logger.info("Returning base sources only%s.", skyreg_tag) # reorder the columns to match Dask expectations (parallel) - skyc1_srcs = skyc1_srcs[[ - 'id', 'uncertainty_ew', 'weight_ew', 'uncertainty_ns', 'weight_ns', - 'flux_int', 'flux_int_err', 'flux_int_isl_ratio', 'flux_peak', - 'flux_peak_err', 'flux_peak_isl_ratio', 'forced', 'compactness', - 'has_siblings', 'snr', 'image', 'datetime', 'source', 'ra', 'dec', - 'ra_source', 'dec_source', 'd2d', 'dr', 'related', 'epoch', - ]] - skyc1_srcs['interim_ew'] = ( - skyc1_srcs['ra'].values * skyc1_srcs['weight_ew'].values + skyc1_srcs = skyc1_srcs[ + [ + "id", + "uncertainty_ew", + "weight_ew", + "uncertainty_ns", + "weight_ns", + "flux_int", + "flux_int_err", + "flux_int_isl_ratio", + "flux_peak", + "flux_peak_err", + "flux_peak_isl_ratio", + "forced", + "compactness", + "has_siblings", + "snr", + "image", + "datetime", + "source", + "ra", + "dec", + "ra_source", + "dec_source", + "d2d", + "dr", + "related", + "epoch", + ] + ] + skyc1_srcs["interim_ew"] = ( + skyc1_srcs["ra"].values * skyc1_srcs["weight_ew"].values ) - skyc1_srcs['interim_ns'] = ( - skyc1_srcs['dec'].values * skyc1_srcs['weight_ns'].values + skyc1_srcs["interim_ns"] = ( + skyc1_srcs["dec"].values * skyc1_srcs["weight_ns"].values ) - return skyc1_srcs.drop(['ra_source', 'dec_source'], axis=1) + return skyc1_srcs.drop(["ra_source", "dec_source"], axis=1) skyc1 = SkyCoord( - skyc1_srcs['ra'].values, - skyc1_srcs['dec'].values, - unit=(u.deg, u.deg) + skyc1_srcs["ra"].values, skyc1_srcs["dec"].values, unit=(u.deg, u.deg) ) for it, epoch in enumerate(unique_epochs[start_epoch:]): - logger.info('Association iteration: #%i%s', it + 1, skyreg_tag) + logger.info("Association iteration: #%i%s", it + 1, skyreg_tag) # load skyc2 source measurements and create SkyCoord - images = ( - images_df.loc[images_df['epoch'] == epoch, 'image_dj'].to_list() - ) + images = images_df.loc[images_df["epoch"] == epoch, "image_dj"].to_list() max_beam_maj = ( - images_df.loc[images_df['epoch'] == epoch, 'image_dj'] + images_df.loc[images_df["epoch"] == epoch, "image_dj"] .apply(lambda x: x.beam_bmaj) .max() ) skyc2_srcs = prep_skysrc_df( - images, - config["measurements"]["flux_fractional_error"], - duplicate_limit + images, config["measurements"]["flux_fractional_error"], duplicate_limit ) - skyc2_srcs['epoch'] = epoch + skyc2_srcs["epoch"] = epoch skyc2 = SkyCoord( - skyc2_srcs['ra'].values, - skyc2_srcs['dec'].values, - unit=(u.deg, u.deg) + skyc2_srcs["ra"].values, skyc2_srcs["dec"].values, unit=(u.deg, u.deg) ) - if method == 'basic': + if method == "basic": sources_df, skyc1_srcs = basic_association( sources_df, skyc1_srcs, @@ -1254,14 +1118,11 @@ def association( skyc2_srcs, skyc2, limit, - id_incr_par_assoc ) - elif method in ['advanced', 'deruiter']: - if method == 'deruiter': - bw_max = Angle( - bw_limit * (max_beam_maj * 3600. / 2.) * u.arcsec - ) + elif method in ["advanced", "deruiter"]: + if method == "deruiter": + bw_max = Angle(bw_limit * (max_beam_maj * 3600.0 / 2.0) * u.arcsec) else: bw_max = limit sources_df, skyc1_srcs = advanced_association( @@ -1273,250 +1134,133 @@ def association( skyc2, dr_limit, bw_max, - id_incr_par_assoc ) else: - raise Exception('association method not implemented!') + raise Exception("association method not implemented!") logger.info( - 'Calculating weighted average RA and Dec for sources%s...', - skyreg_tag + "Calculating weighted average RA and Dec for sources%s...", skyreg_tag ) # account for RA wrapping ra_wrap_mask = sources_df.ra <= 0.1 - sources_df['ra_wrap'] = sources_df.ra.values - sources_df.loc[ - ra_wrap_mask, 'ra_wrap' - ] = sources_df[ra_wrap_mask].ra.values + 360. + sources_df["ra_wrap"] = sources_df.ra.values + sources_df.loc[ra_wrap_mask, "ra_wrap"] = ( + sources_df[ra_wrap_mask].ra.values + 360.0 + ) - sources_df['interim_ew'] = ( - sources_df['ra_wrap'].values * sources_df['weight_ew'].values + sources_df["interim_ew"] = ( + sources_df["ra_wrap"].values * sources_df["weight_ew"].values ) - sources_df['interim_ns'] = ( - sources_df['dec'].values * sources_df['weight_ns'].values + sources_df["interim_ns"] = ( + sources_df["dec"].values * sources_df["weight_ns"].values ) - sources_df = sources_df.drop(['ra_wrap'], axis=1) + sources_df = sources_df.drop(["ra_wrap"], axis=1) - tmp_srcs_df = ( - sources_df.loc[ - (sources_df['source'] != -1) & (sources_df['forced'] == False), - [ - 'ra', 'dec', 'uncertainty_ew', 'uncertainty_ns', - 'source', 'interim_ew', 'interim_ns', 'weight_ew', - 'weight_ns' - ] - ] - .groupby('source') - ) + tmp_srcs_df = sources_df.loc[ + (sources_df["source"].notnull()) & (sources_df["forced"] == False), + [ + "ra", + "dec", + "uncertainty_ew", + "uncertainty_ns", + "source", + "interim_ew", + "interim_ns", + "weight_ew", + "weight_ns", + ], + ].groupby("source") stats = StopWatch() - wm_ra = tmp_srcs_df['interim_ew'].sum() / tmp_srcs_df['weight_ew'].sum() - wm_uncertainty_ew = 1. / np.sqrt(tmp_srcs_df['weight_ew'].sum()) + wm_ra = tmp_srcs_df["interim_ew"].sum() / tmp_srcs_df["weight_ew"].sum() + wm_uncertainty_ew = 1.0 / np.sqrt(tmp_srcs_df["weight_ew"].sum()) - wm_dec = tmp_srcs_df['interim_ns'].sum() / tmp_srcs_df['weight_ns'].sum() - wm_uncertainty_ns = 1. / np.sqrt(tmp_srcs_df['weight_ns'].sum()) + wm_dec = tmp_srcs_df["interim_ns"].sum() / tmp_srcs_df["weight_ns"].sum() + wm_uncertainty_ns = 1.0 / np.sqrt(tmp_srcs_df["weight_ns"].sum()) weighted_df = ( pd.concat( [wm_ra, wm_uncertainty_ew, wm_dec, wm_uncertainty_ns], axis=1, - sort=False + sort=False, ) .reset_index() .rename( columns={ - 0: 'ra', - 'weight_ew': 'uncertainty_ew', - 1: 'dec', - 'weight_ns': 'uncertainty_ns' - }) + 0: "ra", + "weight_ew": "uncertainty_ew", + 1: "dec", + "weight_ns": "uncertainty_ns", + } + ) ) # correct the RA wrapping - ra_wrap_mask = weighted_df.ra >= 360. - weighted_df.loc[ - ra_wrap_mask, 'ra' - ] = weighted_df[ra_wrap_mask].ra.values - 360. + ra_wrap_mask = weighted_df.ra >= 360.0 + weighted_df.loc[ra_wrap_mask, "ra"] = ( + weighted_df[ra_wrap_mask].ra.values - 360.0 + ) - logger.debug('Groupby concat time %f', stats.reset()) + logger.debug("Groupby concat time %f", stats.reset()) logger.info( - 'Finalising base sources catalogue ready for next iteration%s...', - skyreg_tag + "Finalising base sources catalogue ready for next iteration%s...", + skyreg_tag, ) # merge the weighted ra and dec and replace the values skyc1_srcs = skyc1_srcs.merge( - weighted_df, - on='source', - how='left', - suffixes=('', '_skyc2') + weighted_df, on="source", how="left", suffixes=("", "_skyc2") ) del tmp_srcs_df, weighted_df - skyc1_srcs['ra'] = skyc1_srcs['ra_skyc2'] - skyc1_srcs['dec'] = skyc1_srcs['dec_skyc2'] - skyc1_srcs['uncertainty_ew'] = skyc1_srcs['uncertainty_ew_skyc2'] - skyc1_srcs['uncertainty_ns'] = skyc1_srcs['uncertainty_ns_skyc2'] + skyc1_srcs["ra"] = skyc1_srcs["ra_skyc2"] + skyc1_srcs["dec"] = skyc1_srcs["dec_skyc2"] + skyc1_srcs["uncertainty_ew"] = skyc1_srcs["uncertainty_ew_skyc2"] + skyc1_srcs["uncertainty_ns"] = skyc1_srcs["uncertainty_ns_skyc2"] skyc1_srcs = skyc1_srcs.drop( - [ - 'ra_skyc2', - 'dec_skyc2', - 'uncertainty_ew_skyc2', - 'uncertainty_ns_skyc2' - ], axis=1 + ["ra_skyc2", "dec_skyc2", "uncertainty_ew_skyc2", "uncertainty_ns_skyc2"], + axis=1, ) # generate new sky coord ready for next iteration skyc1 = SkyCoord( - skyc1_srcs['ra'].values, - skyc1_srcs['dec'].values, - unit=(u.deg, u.deg) + skyc1_srcs["ra"].values, skyc1_srcs["dec"].values, unit=(u.deg, u.deg) ) # and update relations in skyc1 - skyc1_srcs = skyc1_srcs.drop('related', axis=1) + skyc1_srcs = skyc1_srcs.drop("related", axis=1) relations_unique = pd.DataFrame( - sources_df[sources_df['related'].notna()] - .explode('related') - .groupby('source')['related'] + sources_df[sources_df["related"].notna()] + .explode("related") + .groupby("source")["related"] .apply(lambda x: x.unique().tolist()) ) skyc1_srcs = skyc1_srcs.merge( - relations_unique, how='left', left_on='source', right_index=True + relations_unique, how="left", left_on="source", right_index=True ) - logger.info( - 'Association iteration #%i complete%s.', it + 1, skyreg_tag - ) + logger.info("Association iteration #%i complete%s.", it + 1, skyreg_tag) # End of iteration over images, ra and dec columns are actually the # average over each iteration so remove ave ra and ave dec used for # calculation and use ra_source and dec_source columns - sources_df = ( - sources_df.drop(['ra', 'dec'], axis=1) - .rename(columns={'ra_source': 'ra', 'dec_source': 'dec'}) + sources_df = sources_df.drop(["ra", "dec"], axis=1).rename( + columns={"ra_source": "ra", "dec_source": "dec"} ) del skyc1_srcs, skyc2_srcs logger.info( - 'Total association time: %.2f seconds%s.', - timer.reset_init(), - skyreg_tag + "Total association time: %.2f seconds%s.", timer.reset_init(), skyreg_tag ) return sources_df -def _correct_parallel_source_ids( - df: pd.DataFrame, correction: int) -> pd.DataFrame: - """ - This function is to correct the source ids after the combination of - the associaiton dataframes produced by parallel association - as source - ids will be duplicated if left. - - Args: - df: - Holds the measurements associated into sources. The output of - of the association step (sources_df). - correction: - The value to add to the source ids. - - Returns: - The input df with corrected source ids and relations. - """ - df['source'] = df['source'].values + correction - related_mask = df['related'].notna() - - new_relations = df.loc[ - related_mask, 'related' - ].explode() + correction - - df.loc[ - df[related_mask].index.values, 'related' - ] = new_relations.groupby(level=0).apply( - lambda x: x.values.tolist() - ) - - return df - - -def _correct_parallel_source_ids_add_mode( - df: pd.DataFrame, done_source_ids: List[int], - start_elem: int) -> Tuple[pd.DataFrame, int]: - """ - This function is to correct the source ids after the combination of - the associaiton dataframes produced by parallel association - as source - ids will be duplicated if left - specifically for add mode. - - When add mode is being used the 'old' sources require the ID to remain - the same with only the new ones being changed. The next start elem also - needs to be dynamically updated with every skyreg_group loop. - - Args: - df: - Holds the measurements associated into sources. The output of of - the association step (sources_df). - done_source_ids: - A list of the 'old' source ids that need to remain the same. - start_elem: - The start elem number for the new source ids. - - Returns: - The input dataframe with corrected source ids and relations. - The new start elem for the next group. - """ - # When using add_mode the correction becomes easier with the increment - # as there's a clear difference between old and new. - # old ones do not need to be corrected - - # get a mask of those that need to be corrected - to_correct_mask = ~df['source'].isin(done_source_ids) - - # check that there are any to correct - if not np.any(to_correct_mask): - # there are no ids to correct we can just return the input - # next start elem is just the same as the input as well - return df[['source', 'related']], start_elem - - # create a new column for the new id - df['new_source'] = df['source'] - # how many unique new sources - to_correct_source_ids = df.loc[to_correct_mask, 'source'].unique() - # create the range of new ids - new_ids = list( - range(start_elem, start_elem + to_correct_source_ids.shape[0])) - # create a map of old source to new source - source_id_map = dict(zip(to_correct_source_ids, new_ids)) - # get and apply the new ids to the new column - df.loc[to_correct_mask, 'new_source'] = ( - df.loc[to_correct_mask, 'new_source'].map(source_id_map) - ) - # regenrate the map - source_id_map = dict(zip(df.source.values, df.new_source.values)) - # get mask of non-nan relations - related_mask = df['related'].notna() - # get the relations - new_relations = df.loc[related_mask, 'related'].explode() - # map the new values - new_relations = new_relations.map(source_id_map) - # group them back and form lists again - new_relations = new_relations.groupby(level=0).apply( - lambda x: x.values.tolist()) - # apply corrected relations to results - df.loc[df[related_mask].index.values, 'related'] = new_relations - # drop the old sources and replace - df = df.drop('source', axis=1).rename(columns={'new_source': 'source'}) - # define what the next start elem will be - next_start_elem = new_ids[-1] + 1 - - return df[['source', 'related']], next_start_elem - - def parallel_association( images_df: pd.DataFrame, limit: Angle, @@ -1528,7 +1272,7 @@ def parallel_association( add_mode: bool, previous_parquets: Dict[str, str], done_images_df: pd.DataFrame, - done_source_ids: List[int] + done_source_ids: List[int], ) -> pd.DataFrame: """ Launches association on different sky region groups in parallel using Dask. @@ -1548,51 +1292,46 @@ def parallel_association( association with corrected source ids. """ logger.info( - "Running parallel association for %i sky region groups.", - n_skyregion_groups + "Running parallel association for %i sky region groups.", n_skyregion_groups ) timer = StopWatch() meta = { - 'id': 'i', - 'uncertainty_ew': 'f', - 'weight_ew': 'f', - 'uncertainty_ns': 'f', - 'weight_ns': 'f', - 'flux_int': 'f', - 'flux_int_err': 'f', - 'flux_int_isl_ratio': 'f', - 'flux_peak': 'f', - 'flux_peak_err': 'f', - 'flux_peak_isl_ratio': 'f', - 'forced': '?', - 'compactness': 'f', - 'has_siblings': '?', - 'snr': 'f', - 'image': 'U', - 'datetime': 'datetime64[ns]', - 'source': 'i', - 'ra': 'f', - 'dec': 'f', - 'd2d': 'f', - 'dr': 'f', - 'related': 'O', - 'epoch': 'i', - 'interim_ew': 'f', - 'interim_ns': 'f', + "id": "U36", + "uncertainty_ew": "f", + "weight_ew": "f", + "uncertainty_ns": "f", + "weight_ns": "f", + "flux_int": "f", + "flux_int_err": "f", + "flux_int_isl_ratio": "f", + "flux_peak": "f", + "flux_peak_err": "f", + "flux_peak_isl_ratio": "f", + "forced": "?", + "compactness": "f", + "has_siblings": "?", + "snr": "f", + "image": "U36", + "datetime": "datetime64[ns]", + "source": "U36", + "ra": "f", + "dec": "f", + "d2d": "f", + "dr": "f", + "related": "O", + "epoch": "i", + "interim_ew": "f", + "interim_ns": "f", } - # Add an increment to any new source values when using add_mode to avoid - # getting duplicates in the result laater - id_incr_par_assoc = max(done_source_ids) if add_mode else 0 - n_cpu = cpu_count() - 1 # pass each skyreg_group through the normal association process. results = ( dd.from_pandas(images_df, n_cpu) - .groupby('skyreg_group') + .groupby("skyreg_group") .apply( association, limit=limit, @@ -1603,10 +1342,10 @@ def parallel_association( add_mode=add_mode, previous_parquets=previous_parquets, done_images_df=done_images_df, - id_incr_par_assoc=id_incr_par_assoc, parallel=True, - meta=meta - ).compute(n_workers=n_cpu, scheduler='processes') + meta=meta, + ) + .compute(n_workers=n_cpu, scheduler="processes") ) # results are the normal dataframe of results with the columns: @@ -1618,11 +1357,10 @@ def parallel_association( # The index however is now a multi index with the skyregion group and # a general result index. Hence the general result index is repeated for - # each skyreg_group along with the source_ids. This needs to be collapsed - # and the source id's corrected. + # each skyreg_group along with the source_ids. This needs to be collapsed. # Index example: - # id + # id (now UUIDs) # skyreg_group # -------------------------- # 2 0 15640 @@ -1637,51 +1375,9 @@ def parallel_association( # 46978 54161 # 46979 54164 - # Get the indexes (skyreg_groups) to loop over for source id correction - indexes = results.index.levels[0].values - - if add_mode: - # Need to correct all skyreg_groups. - # First get the starting id for new sources. - new_id = max(done_source_ids) + 1 - for i in indexes: - corr_df, new_id = _correct_parallel_source_ids_add_mode( - results.loc[i, ['source', 'related']], - done_source_ids, - new_id - ) - results.loc[ - (i, slice(None)), ['source', 'related'] - ] = corr_df.values - else: - # The first index acts as the base, so the others are looped over and - # corrected. - for i, val in enumerate(indexes): - # skip first one, makes the enumerate easier to deal with - if i == 0: - continue - # Get the maximum source ID from the previous group. - max_id = results.loc[indexes[i - 1]].source.max() - # Run through the correction function, only the 'source' and - # 'related' - # columns are passed and returned (corrected). - corr_df = _correct_parallel_source_ids( - results.loc[val, ['source', 'related']], - max_id - ) - # replace the values in the results with the corrected source and - # related values - results.loc[ - (val, slice(None)), ['source', 'related'] - ] = corr_df.values - - del corr_df - # reset the indeex of the final corrected and collapsed result results = results.reset_index(drop=True) - logger.info( - 'Total parallel association time: %.2f seconds', timer.reset_init() - ) + logger.info("Total parallel association time: %.2f seconds", timer.reset_init()) return results diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index b02a27d49..ed23c9694 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -10,8 +10,10 @@ from vast_pipeline.models import Run from vast_pipeline.utils.utils import StopWatch, optimize_floats, optimize_ints from vast_pipeline.pipeline.loading import ( - make_upload_associations, make_upload_sources, make_upload_related_sources, - update_sources + make_upload_associations, + make_upload_sources, + make_upload_related_sources, + update_sources, ) from vast_pipeline.pipeline.pairs import calculate_measurement_pair_metrics from vast_pipeline.pipeline.utils import parallel_groupby @@ -64,17 +66,27 @@ def calculate_measurement_pair_aggregate_metrics( ) else: pair_agg_metrics = measurement_pairs_df.iloc[ - check_df - .groupby("source") - .agg(m_abs_max_idx=(f"m_{flux_type}", lambda x: x.abs().idxmax()),) - .astype(np.int32)["m_abs_max_idx"] # cast row indices to int and select them + check_df.groupby("source") + .agg( + m_abs_max_idx=(f"m_{flux_type}", lambda x: x.abs().idxmax()), + ) + .astype(np.int32)[ + "m_abs_max_idx" + ] # cast row indices to int and select them .reset_index(drop=True) # keep only the row indices ][[f"vs_{flux_type}", f"m_{flux_type}", "source"]] - pair_agg_metrics = pair_agg_metrics.abs().rename(columns={ - f"vs_{flux_type}": f"vs_abs_significant_max_{flux_type}", - f"m_{flux_type}": f"m_abs_significant_max_{flux_type}", - }).set_index('source') + pair_agg_metrics = ( + pair_agg_metrics.set_index("source") + .abs() + .rename( + columns={ + f"vs_{flux_type}": f"vs_abs_significant_max_{flux_type}", + f"m_{flux_type}": f"m_abs_significant_max_{flux_type}", + } + ) + ) + return pair_agg_metrics @@ -86,7 +98,7 @@ def final_operations( source_aggregate_pair_metrics_min_abs_vs: float, add_mode: bool, done_source_ids: List[int], - previous_parquets: Dict[str, str] + previous_parquets: Dict[str, str], ) -> Tuple[int, int]: """ Performs the final operations of the pipeline: @@ -129,11 +141,10 @@ def final_operations( # calculate source fields logger.info( - 'Calculating statistics for %i sources...', - sources_df.source.unique().shape[0] + "Calculating statistics for %i sources...", sources_df.source.unique().shape[0] ) srcs_df = parallel_groupby(sources_df) - logger.info('Groupby-apply time: %.2f seconds', timer.reset()) + logger.info("Groupby-apply time: %.2f seconds", timer.reset()) # add new sources srcs_df["new"] = srcs_df.index.isin(new_sources_df.index) @@ -148,32 +159,31 @@ def final_operations( # calculate nearest neighbour srcs_skycoord = SkyCoord( - srcs_df['wavg_ra'].values, - srcs_df['wavg_dec'].values, - unit=(u.deg, u.deg) - ) - idx, d2d, _ = srcs_skycoord.match_to_catalog_sky( - srcs_skycoord, - nthneighbor=2 + srcs_df["wavg_ra"].values, srcs_df["wavg_dec"].values, unit=(u.deg, u.deg) ) + _, d2d, _ = srcs_skycoord.match_to_catalog_sky(srcs_skycoord, nthneighbor=2) # add the separation distance in degrees - srcs_df['n_neighbour_dist'] = d2d.deg + srcs_df["n_neighbour_dist"] = d2d.deg # create measurement pairs, aka 2-epoch metrics if calculate_pairs: timer.reset() measurement_pairs_df = calculate_measurement_pair_metrics(sources_df) - logger.info('Measurement pair metrics time: %.2f seconds', timer.reset()) + logger.info("Measurement pair metrics time: %.2f seconds", timer.reset()) # calculate measurement pair metric aggregates for sources by finding the row indices # of the aggregate max of the abs(m) metric for each flux type. pair_agg_metrics = pd.merge( calculate_measurement_pair_aggregate_metrics( - measurement_pairs_df, source_aggregate_pair_metrics_min_abs_vs, flux_type="peak", + measurement_pairs_df, + source_aggregate_pair_metrics_min_abs_vs, + flux_type="peak", ), calculate_measurement_pair_aggregate_metrics( - measurement_pairs_df, source_aggregate_pair_metrics_min_abs_vs, flux_type="int", + measurement_pairs_df, + source_aggregate_pair_metrics_min_abs_vs, + flux_type="int", ), how="outer", left_index=True, @@ -182,13 +192,17 @@ def final_operations( # join with sources and replace agg metrics NaNs with 0 as the DataTables API JSON # serialization doesn't like them - srcs_df = srcs_df.join(pair_agg_metrics).fillna(value={ - "vs_abs_significant_max_peak": 0.0, - "m_abs_significant_max_peak": 0.0, - "vs_abs_significant_max_int": 0.0, - "m_abs_significant_max_int": 0.0, - }) - logger.info("Measurement pair aggregate metrics time: %.2f seconds", timer.reset()) + srcs_df = srcs_df.join(pair_agg_metrics).fillna( + value={ + "vs_abs_significant_max_peak": 0.0, + "m_abs_significant_max_peak": 0.0, + "vs_abs_significant_max_int": 0.0, + "m_abs_significant_max_int": 0.0, + } + ) + logger.info( + "Measurement pair aggregate metrics time: %.2f seconds", timer.reset() + ) else: logger.info( "Skipping measurement pair metric calculation as specified in the run configuration." @@ -198,118 +212,109 @@ def final_operations( if add_mode: # if add mode is being used some sources need to updated where as some # need to be newly uploaded. - # upload new ones first (new id's are fetched) + # upload new ones first src_done_mask = srcs_df.index.isin(done_source_ids) srcs_df_upload = srcs_df.loc[~src_done_mask].copy() - srcs_df_upload = make_upload_sources(srcs_df_upload, p_run, add_mode) + make_upload_sources(srcs_df_upload, p_run, add_mode) # And now update srcs_df_update = srcs_df.loc[src_done_mask].copy() - logger.info( - f"Updating {srcs_df_update.shape[0]} sources with new metrics.") + logger.info(f"Updating {srcs_df_update.shape[0]} sources with new metrics.") srcs_df = update_sources(srcs_df_update, batch_size=1000) # Add back together if not srcs_df_upload.empty: srcs_df = pd.concat([srcs_df, srcs_df_upload]) else: - srcs_df = make_upload_sources(srcs_df, p_run, add_mode) + make_upload_sources(srcs_df, p_run, add_mode) # gather the related df, upload to db and save to parquet file # the df will look like # # from_source_id to_source_id - # source - # 714 60 14396 - # 1211 94 12961 - # - # the index ('source') has the initial id generated by the pipeline to - # identify unique sources, the 'from_source_id' column has the django - # model id (in db), the 'to_source_id' has the pipeline index + # index + # 0 60 14396 + # 1 94 12961 related_df = ( - srcs_df.loc[srcs_df["related_list"] != -1, ["id", "related_list"]] + srcs_df.loc[srcs_df["related_list"] != -1, ["related_list"]] .explode("related_list") - .rename(columns={"id": "from_source_id", "related_list": "to_source_id"}) + .reset_index() + .rename(columns={"source": "from_source_id", "related_list": "to_source_id"}) ) - # for the column 'from_source_id', replace relation source ids with db id - related_df["to_source_id"] = related_df["to_source_id"].map(srcs_df["id"].to_dict()) # drop relationships with the same source - related_df = related_df[related_df["from_source_id"] != related_df["to_source_id"]] + related_df = related_df.loc[ + related_df["from_source_id"] != related_df["to_source_id"] + ] # write symmetrical relations to parquet - related_df.to_parquet( - os.path.join(p_run.path, 'relations.parquet'), - index=False - ) + related_df.to_parquet(os.path.join(p_run.path, "relations.parquet"), index=False) # upload the relations to DB # check for add_mode first if add_mode: # Load old relations so the already uploaded ones can be removed - old_relations = ( - pd.read_parquet(previous_parquets['relations']) - ) + old_relations = pd.read_parquet(previous_parquets["relations"]) - related_df = ( - pd.concat([related_df, old_relations], ignore_index=True) - .drop_duplicates(keep=False) - ) - logger.debug(f'Add mode: #{related_df.shape[0]} relations to upload.') + related_df = pd.concat( + [related_df, old_relations], ignore_index=True + ).drop_duplicates(keep=False) + logger.debug(f"Add mode: #{related_df.shape[0]} relations to upload.") make_upload_related_sources(related_df) del related_df # write sources to parquet file - srcs_df = srcs_df.drop(["related_list", "img_list"], axis=1) + cols_to_drop = ["related_list", "img_list"] + + if add_mode: + cols_to_drop.append("id") + + srcs_df = srcs_df.drop(cols_to_drop, axis=1) + ( - srcs_df.set_index('id') # set the index to db ids, dropping the source idx - .to_parquet(os.path.join(p_run.path, 'sources.parquet')) + srcs_df.to_parquet( # set the index to db ids, dropping the source idx + os.path.join(p_run.path, "sources.parquet") + ) ) - # update measurments with sources to get associations - sources_df = ( - sources_df.drop('related', axis=1) - .merge(srcs_df.rename(columns={'id': 'source_id'}), on='source') - ) + # update measurements with sources to get associations + sources_df = sources_df.drop("related", axis=1) if add_mode: # Load old associations so the already uploaded ones can be removed - old_assoications = ( - pd.read_parquet(previous_parquets['associations']) - .rename(columns={'meas_id': 'id'}) + old_associations = pd.read_parquet(previous_parquets["associations"]).rename( + columns={"meas_id": "id", "source_id": "source"} ) sources_df_upload = pd.concat( - [sources_df, old_assoications], + [sources_df, old_associations], ignore_index=True ) sources_df_upload = sources_df_upload.drop_duplicates( - ['source_id', 'id', 'd2d', 'dr'], keep=False + ["source", "id", "d2d", "dr"], keep=False ) - logger.debug( - f'Add mode: #{sources_df_upload.shape[0]} associations to upload.') + logger.debug(f"Add mode: #{sources_df_upload.shape[0]} associations to upload.") else: sources_df_upload = sources_df # upload associations into DB - make_upload_associations(sources_df_upload) + make_upload_associations(sources_df_upload[["id", "source", "d2d", "dr"]]) # write associations to parquet file - sources_df.rename(columns={'id': 'meas_id'})[ - ['source_id', 'meas_id', 'd2d', 'dr'] - ].to_parquet(os.path.join(p_run.path, 'associations.parquet')) + sources_df.rename(columns={"id": "meas_id", "source": "source_id"})[ + ["source_id", "meas_id", "d2d", "dr"] + ].to_parquet(os.path.join(p_run.path, "associations.parquet")) if calculate_pairs: - # get the Source object primary keys for the measurement pairs - measurement_pairs_df = measurement_pairs_df.join( - srcs_df.id.rename("source_id"), on="source" - ) - # optimize measurement pair DataFrame and save to parquet file measurement_pairs_df = optimize_ints( optimize_floats( - measurement_pairs_df.drop(columns=["source"]).rename( - columns={"id_a": "meas_id_a", "id_b": "meas_id_b"} + measurement_pairs_df.rename( + columns={ + "id_a": "meas_id_a", + "id_b": "meas_id_b", + "source": "source_id", + } ) ) ) @@ -319,8 +324,8 @@ def final_operations( logger.info("Total final operations time: %.2f seconds", timer.reset_init()) - nr_sources = srcs_df["id"].count() - nr_new_sources = srcs_df['new'].sum() + nr_sources = srcs_df.shape[0] + nr_new_sources = srcs_df["new"].sum() # calculate and return total number of extracted sources return (nr_sources, nr_new_sources) diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index eef7a3ed8..112710b9f 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -1,6 +1,7 @@ import os import logging import datetime +import uuid import numpy as np import pandas as pd import dask.dataframe as dd @@ -27,7 +28,7 @@ def remove_forced_meas(run_path: str) -> None: - ''' + """ Remove forced measurements from the database if forced parquet files are found. @@ -37,34 +38,29 @@ def remove_forced_meas(run_path: str) -> None: Returns: None - ''' - path_glob = glob( - os.path.join(run_path, 'forced_measurements_*.parquet') - ) + """ + path_glob = glob(os.path.join(run_path, "forced_measurements_*.parquet")) if path_glob: - ids = ( - dd.read_parquet(path_glob, columns='id') - .values - .compute() - .tolist() - ) + ids = dd.read_parquet(path_glob, columns="id").values.compute().tolist() obj_to_delete = Measurement.objects.filter(id__in=ids) del ids if obj_to_delete.exists(): with transaction.atomic(): n_del, detail_del = obj_to_delete.delete() logger.info( - ('Deleting all previous forced measurement and association' - ' objects for this run. Total objects deleted: %i'), + ( + "Deleting all previous forced measurement and association" + " objects for this run. Total objects deleted: %i" + ), n_del, ) - logger.debug('(type, #deleted): %s', detail_del) + logger.debug("(type, #deleted): %s", detail_del) def get_data_from_parquet( file_and_image_id: Tuple[str, int], p_run_path: str, add_mode: bool = False ) -> Dict: - ''' + """ Get the prefix, max id and image id from the measurements parquets Args: @@ -80,30 +76,27 @@ def get_data_from_parquet( Returns: Dictionary with prefix string, an interger max_id and a string with the id of the image. - ''' + """ file, image_id = file_and_image_id if add_mode: image_name = file.split("/")[-2] forced_parquet = os.path.join( - p_run_path, - f"forced_measurements_{image_name}.parquet" + p_run_path, f"forced_measurements_{image_name}.parquet" ) if os.path.isfile(forced_parquet): file = forced_parquet # get max component id from parquet file - df = pd.read_parquet(file, columns=['island_id', 'image_id']) + df = pd.read_parquet(file, columns=["island_id", "image_id"]) if len(df) > 0: - prefix = df['island_id'].iloc[0].rsplit('_', maxsplit=1)[0] + '_' + prefix = df["island_id"].iloc[0].rsplit("_", maxsplit=1)[0] + "_" max_id = ( - df['island_id'].str.rsplit('_', n=1) - .str.get(-1) - .astype(int) - .values.max() + 1 + df["island_id"].str.rsplit("_", n=1).str.get(-1).astype(int).values.max() + + 1 ) else: prefix = "island_" max_id = 1 - return {'prefix': prefix, 'max_id': max_id, 'id': image_id} + return {"prefix": prefix, "max_id": max_id, "id": image_id} def _forcedphot_preload(image: str, @@ -169,9 +162,7 @@ def extract_from_image( # create the skycoord obj to pass to the forced extraction # see usage https://github.com/dlakaplan/forced_phot P_islands = SkyCoord( - df['wavg_ra'].values, - df['wavg_dec'].values, - unit=(u.deg, u.deg) + df["wavg_ra"].values, df["wavg_dec"].values, unit=(u.deg, u.deg) ) # load the image, background and noisemaps into memory # a dedicated function may seem unneccesary, but will be useful if we @@ -187,19 +178,25 @@ def extract_from_image( P_islands, cluster_threshold=cluster_threshold, allow_nan=allow_nan, - edge_buffer=edge_buffer + edge_buffer=edge_buffer, ) - df['flux_int'] = flux * 1.e3 - df['flux_int_err'] = flux_err * 1.e3 - df['chi_squared_fit'] = chisq + df["flux_int"] = flux * 1.0e3 + df["flux_int_err"] = flux_err * 1.0e3 + df["chi_squared_fit"] = chisq - return {'df': df, 'image': df['image_name'].iloc[0]} + return {"df": df, "image": df["image_name"].iloc[0]} def finalise_forced_dfs( - df: pd.DataFrame, prefix: str, max_id: int, beam_bmaj: float, - beam_bmin: float, beam_bpa: float, id: int, datetime: datetime.datetime, - image: str + df: pd.DataFrame, + prefix: str, + max_id: int, + beam_bmaj: float, + beam_bmin: float, + beam_bpa: float, + id: int, + datetime: datetime.datetime, + image: str, ) -> pd.DataFrame: """ Compute populate leftover columns for the dataframe with forced @@ -231,32 +228,35 @@ def finalise_forced_dfs( name, bmaj, bmin, pa, image_id, time. """ # make up the measurements name from the image island_id and component_id - df['island_id'] = np.char.add( - prefix, - np.arange(max_id, max_id + df.shape[0]).astype(str) + df["island_id"] = np.char.add( + prefix, np.arange(max_id, max_id + df.shape[0]).astype(str) ) - df['component_id'] = df['island_id'].str.replace( - 'island', 'component' - ) + 'a' - img_prefix = image.split('.')[0] + '_' - df['name'] = img_prefix + df['component_id'] + df["component_id"] = df["island_id"].str.replace("island", "component") + "a" + img_prefix = image.split(".")[0] + "_" + df["name"] = img_prefix + df["component_id"] # assign all the other columns # convert fluxes to mJy # store source bmaj and bmin in arcsec - df['bmaj'] = beam_bmaj * 3600. - df['bmin'] = beam_bmin * 3600. - df['pa'] = beam_bpa + df["bmaj"] = beam_bmaj * 3600.0 + df["bmin"] = beam_bmin * 3600.0 + df["pa"] = beam_bpa # add image id and time - df['image_id'] = id - df['time'] = datetime + df["image_id"] = id + df["time"] = datetime return df def parallel_extraction( - df: pd.DataFrame, df_images: pd.DataFrame, df_sources: pd.DataFrame, - min_sigma: float, edge_buffer: float, cluster_threshold: float, - allow_nan: bool, add_mode: bool, p_run_path: str + df: pd.DataFrame, + df_images: pd.DataFrame, + df_sources: pd.DataFrame, + min_sigma: float, + edge_buffer: float, + cluster_threshold: float, + allow_nan: bool, + add_mode: bool, + p_run_path: str, ) -> pd.DataFrame: """ Parallelize forced extraction with Dask @@ -294,33 +294,26 @@ def parallel_extraction( """ # explode the lists in 'img_diff' column (this will make a copy of the df) out = ( - df.rename(columns={'img_diff': 'image', 'source': 'source_tmp_id'}) + df.rename(columns={"img_diff": "image", "source": "source_tmp_id"}) # merge the rms_min column from df_images - .merge( - df_images[['rms_min']], - left_on='image', - right_on='name', - how='left' - ) - .rename(columns={'rms_min': 'image_rms_min'}) + .merge(df_images[["rms_min"]], left_on="image", right_on="name", how="left") + .rename(columns={"rms_min": "image_rms_min"}) # merge the measurements columns 'source', 'image', 'flux_peak' .merge( df_sources, - left_on=['source_tmp_id', 'detection'], - right_on=['source', 'image'], - how='left' + left_on=["source_tmp_id", "detection"], + right_on=["source", "image"], + how="left", ) - .drop(columns=['image_y', 'source']) - .rename(columns={'image_x': 'image'}) + .drop(columns=["image_y", "source"]) + .rename(columns={"image_x": "image"}) ) # drop the source for which we would have no hope of detecting predrop_shape = out.shape[0] - out['max_snr'] = out['flux_peak'].values / out['image_rms_min'].values - out = out[out['max_snr'] > min_sigma].reset_index(drop=True) - logger.debug("Min forced sigma dropped %i sources", - predrop_shape - out.shape[0] - ) + out["max_snr"] = out["flux_peak"].values / out["image_rms_min"].values + out = out[out["max_snr"] > min_sigma].reset_index(drop=True) + logger.debug("Min forced sigma dropped %i sources", predrop_shape - out.shape[0]) # drop some columns that are no longer needed and the df should look like # out @@ -332,13 +325,12 @@ def parallel_extraction( # | 3 | 1353 | 322.094 | -4.44977 | VAST_2118-06A... | 1.879 | # | 4 | 1387 | 321.734 | -6.82934 | VAST_2118-06A... | 1.61 | - out = ( - out.drop(['max_snr', 'image_rms_min', 'detection'], axis=1) - .rename(columns={'image': 'image_name'}) + out = out.drop(["max_snr", "image_rms_min", "detection"], axis=1).rename( + columns={"image": "image_name"} ) # get the unique images to extract from - unique_images_to_extract = out['image_name'].unique().tolist() + unique_images_to_extract = out["image_name"].unique().tolist() # create a list of dictionaries with image file paths and dataframes # with data related to each images @@ -346,68 +338,66 @@ def image_data_func(image_name: str) -> Dict[str, Any]: # `out` refers to the `out` declared in nearest enclosing scope nonlocal out return { - 'image_id': df_images.at[image_name, 'id'], - 'image': df_images.at[image_name, 'path'], - 'background': df_images.at[image_name, 'background_path'], - 'noise': df_images.at[image_name, 'noise_path'], - 'df': out[out['image_name'] == image_name] + "image_id": df_images.at[image_name, "id"], + "image": df_images.at[image_name, "path"], + "background": df_images.at[image_name, "background_path"], + "noise": df_images.at[image_name, "noise_path"], + "df": out[out["image_name"] == image_name], } + list_to_map = list(map(image_data_func, unique_images_to_extract)) # create a list of all the measurements parquet files to extract data from, # such as prefix and max_id - list_meas_parquets = list(map( - lambda image_name: ( - df_images.at[image_name, 'measurements_path'], - df_images.at[image_name, 'id'], - ), - unique_images_to_extract - )) + list_meas_parquets = list( + map( + lambda image_name: ( + df_images.at[image_name, "measurements_path"], + df_images.at[image_name, "id"], + ), + unique_images_to_extract, + ) + ) del out, unique_images_to_extract, image_data_func # get a map of the columns that have a fixed value mapping = ( - db.from_sequence( - list_meas_parquets, - npartitions=len(list_meas_parquets) - ) + db.from_sequence(list_meas_parquets, npartitions=len(list_meas_parquets)) .map(get_data_from_parquet, p_run_path, add_mode) .compute() ) mapping = pd.DataFrame(mapping) # remove not used columns from images_df and merge into mapping - col_to_drop = list(filter( - lambda x: ('path' in x) or ('skyreg' in x), - df_images.columns.values.tolist() - )) + col_to_drop = list( + filter( + lambda x: ("path" in x) or ("skyreg" in x), + df_images.columns.values.tolist(), + ) + ) mapping = ( mapping.merge( - df_images.drop(col_to_drop, axis=1).reset_index(), - on='id', - how='left' + df_images.drop(col_to_drop, axis=1).reset_index(), on="id", how="left" ) - .drop('rms_min', axis=1) - .set_index('name') + .drop("rms_min", axis=1) + .set_index("name") ) del col_to_drop n_cpu = cpu_count() - 1 bags = db.from_sequence(list_to_map, npartitions=len(list_to_map)) - forced_dfs = ( - bags.map(lambda x: extract_from_image( + forced_dfs = bags.map( + lambda x: extract_from_image( edge_buffer=edge_buffer, cluster_threshold=cluster_threshold, allow_nan=allow_nan, - **x - )) - .compute() - ) + **x, + ) + ).compute(scheduler="processes", num_workers=n_cpu) del bags # create intermediates dfs combining the mapping data and the forced # extracted data from the images - intermediate_df = list(map( - lambda x: {**(mapping.loc[x['image'], :].to_dict()), **x}, - forced_dfs - )) + intermediate_df = list( + map(lambda x: {**(mapping.loc[x["image"], :].to_dict()), **x}, forced_dfs) + ) # compute the rest of the columns intermediate_df = ( @@ -415,21 +405,17 @@ def image_data_func(image_name: str) -> Dict[str, Any]: .map(lambda x: finalise_forced_dfs(**x)) .compute() ) - df_out = ( - pd.concat(intermediate_df, axis=0, sort=False) - .rename( - columns={ - 'wavg_ra': 'ra', 'wavg_dec': 'dec', 'image_name': 'image' - } - ) + df_out = pd.concat(intermediate_df, axis=0, sort=False).rename( + columns={"wavg_ra": "ra", "wavg_dec": "dec", "image_name": "image"} ) + df_out["id"] = df_out.apply(lambda _: str(uuid.uuid4()), axis=1) + return df_out -def write_group_to_parquet( - df: pd.DataFrame, fname: str, add_mode: bool) -> None: - ''' +def write_group_to_parquet(df: pd.DataFrame, fname: str, add_mode: bool) -> None: + """ Write a dataframe correpondent to a single group/image to a parquet file. @@ -443,8 +429,8 @@ def write_group_to_parquet( Returns: None - ''' - out_df = df.drop(['d2d', 'dr', 'source', 'image'], axis=1) + """ + out_df = df.drop(["d2d", "dr", "source", "image"], axis=1) if os.path.isfile(fname) and add_mode: exist_df = pd.read_parquet(fname) out_df = pd.concat([exist_df, out_df]) @@ -455,8 +441,9 @@ def write_group_to_parquet( def parallel_write_parquet( - df: pd.DataFrame, run_path: str, add_mode: bool = False) -> None: - ''' + df: pd.DataFrame, run_path: str, add_mode: bool = False +) -> None: + """ Parallelize writing parquet files for forced measurements. Args: @@ -469,30 +456,35 @@ def parallel_write_parquet( Returns: None - ''' - images = df['image'].unique().tolist() - - def get_fname(n): return os.path.join( - run_path, - 'forced_measurements_' + n.replace('.', '_') + '.parquet' + """ + images = df["image"].unique().tolist() + get_fname = lambda n: os.path.join( + run_path, "forced_measurements_" + n.replace(".", "_") + ".parquet" ) - dfs = list(map(lambda x: (df[df['image'] == x], get_fname(x)), images)) + dfs = list(map(lambda x: (df[df["image"] == x], get_fname(x)), images)) n_cpu = cpu_count() - 1 # writing parquets using Dask bag bags = db.from_sequence(dfs) - bags = bags.starmap( - lambda df, fname: write_group_to_parquet(df, fname, add_mode)) + bags = bags.starmap(lambda df, fname: write_group_to_parquet(df, fname, add_mode)) bags.compute(num_workers=n_cpu) pass def forced_extraction( - sources_df: pd.DataFrame, cfg_err_ra: float, cfg_err_dec: float, - p_run: Run, extr_df: pd.DataFrame, min_sigma: float, edge_buffer: float, - cluster_threshold: float, allow_nan: bool, add_mode: bool, - done_images_df: pd.DataFrame, done_source_ids: List[int] + sources_df: pd.DataFrame, + cfg_err_ra: float, + cfg_err_dec: float, + p_run: Run, + extr_df: pd.DataFrame, + min_sigma: float, + edge_buffer: float, + cluster_threshold: float, + allow_nan: bool, + add_mode: bool, + done_images_df: pd.DataFrame, + done_source_ids: List[int], ) -> Tuple[pd.DataFrame, int]: """ Check and extract expected measurements, and associated them with the @@ -533,45 +525,59 @@ def forced_extraction( The `sources_df` with the extracted sources added. The total number of forced measurements present in the run. """ - logger.info( - 'Starting force extraction step.' - ) + logger.info("Starting force extraction step.") timer = StopWatch() # get all the skyregions and related images cols = [ - 'id', 'name', 'measurements_path', 'path', 'noise_path', - 'beam_bmaj', 'beam_bmin', 'beam_bpa', 'background_path', - 'rms_min', 'datetime', 'skyreg__centre_ra', - 'skyreg__centre_dec', 'skyreg__xtr_radius' + "id", + "name", + "measurements_path", + "path", + "noise_path", + "beam_bmaj", + "beam_bmin", + "beam_bpa", + "background_path", + "rms_min", + "datetime", + "skyreg__centre_ra", + "skyreg__centre_dec", + "skyreg__xtr_radius", ] - images_df = pd.DataFrame(list( - Image.objects.filter( - run=p_run - ).select_related('skyreg').order_by('datetime').values(*tuple(cols)) - )).set_index('name') -# | name | id | measurements_path | path | noise_path | -# |:------------------------------|-----:|:--------------------|:-------------|:-------------| -# | VAST_2118-06A.EPOCH01.I.fits | 1 | path/to/file | path/to/file | path/to/file | -# | VAST_2118-06A.EPOCH03x.I.fits | 3 | path/to/file | path/to/file | path/to/file | -# | VAST_2118-06A.EPOCH02.I.fits | 2 | path/to/file | path/to/file | path/to/file | - -# | name | beam_bmaj | beam_bmin | beam_bpa | background_path | -# |:------------------------------|------------:|------------:|-----------:|:------------------| -# | VAST_2118-06A.EPOCH01.I.fits | 0.00589921 | 0.00326088 | -70.4032 | path/to/file | -# | VAST_2118-06A.EPOCH03x.I.fits | 0.00470991 | 0.00300502 | -83.1128 | path/to/file | -# | VAST_2118-06A.EPOCH02.I.fits | 0.00351331 | 0.00308565 | 77.2395 | path/to/file | - -# | name | rms_min | datetime | skyreg__centre_ra | skyreg__centre_dec | skyreg__xtr_radius | -# |:------------------------------|----------:|:---------------------------------|--------------------:|---------------------:|---------------------:| -# | VAST_2118-06A.EPOCH01.I.fits | 0.173946 | 2019-08-27 18:12:16.700000+00:00 | 319.652 | -6.2989 | 6.7401 | -# | VAST_2118-06A.EPOCH03x.I.fits | 0.165395 | 2019-10-29 10:01:20.500000+00:00 | 319.652 | -6.2989 | 6.7401 | -# | VAST_2118-06A.EPOCH02.I.fits | 0.16323 | 2019-10-30 08:31:20.200000+00:00 | 319.652 | -6.2989 | 6.7401 | + images_df = pd.DataFrame( + list( + Image.objects.filter(run=p_run) + .select_related("skyreg") + .order_by("datetime") + .values(*tuple(cols)) + ) + ).set_index("name") + + # Also set id to str + images_df["id"] = images_df["id"].astype(str) + # | name | id | measurements_path | path | noise_path | + # |:------------------------------|-----:|:--------------------|:-------------|:-------------| + # | VAST_2118-06A.EPOCH01.I.fits | 1 | path/to/file | path/to/file | path/to/file | + # | VAST_2118-06A.EPOCH03x.I.fits | 3 | path/to/file | path/to/file | path/to/file | + # | VAST_2118-06A.EPOCH02.I.fits | 2 | path/to/file | path/to/file | path/to/file | + + # | name | beam_bmaj | beam_bmin | beam_bpa | background_path | + # |:------------------------------|------------:|------------:|-----------:|:------------------| + # | VAST_2118-06A.EPOCH01.I.fits | 0.00589921 | 0.00326088 | -70.4032 | path/to/file | + # | VAST_2118-06A.EPOCH03x.I.fits | 0.00470991 | 0.00300502 | -83.1128 | path/to/file | + # | VAST_2118-06A.EPOCH02.I.fits | 0.00351331 | 0.00308565 | 77.2395 | path/to/file | + + # | name | rms_min | datetime | skyreg__centre_ra | skyreg__centre_dec | skyreg__xtr_radius | + # |:------------------------------|----------:|:---------------------------------|--------------------:|---------------------:|---------------------:| + # | VAST_2118-06A.EPOCH01.I.fits | 0.173946 | 2019-08-27 18:12:16.700000+00:00 | 319.652 | -6.2989 | 6.7401 | + # | VAST_2118-06A.EPOCH03x.I.fits | 0.165395 | 2019-10-29 10:01:20.500000+00:00 | 319.652 | -6.2989 | 6.7401 | + # | VAST_2118-06A.EPOCH02.I.fits | 0.16323 | 2019-10-30 08:31:20.200000+00:00 | 319.652 | -6.2989 | 6.7401 | # Explode out the img_diff column. - extr_df = extr_df.explode('img_diff').reset_index() + extr_df = extr_df.explode("img_diff").reset_index() total_to_extract = extr_df.shape[0] if add_mode: @@ -586,11 +592,11 @@ def forced_extraction( extr_df = pd.concat( [ - extr_df[~extr_df['img_diff'].isin(done_images_df['name'])], + extr_df[~extr_df["img_diff"].isin(done_images_df["name"])], extr_df[ - (~extr_df['source'].isin(done_source_ids)) - & (extr_df['img_diff'].isin(done_images_df.name)) - ] + (~extr_df["source"].isin(done_source_ids)) + & (extr_df["img_diff"].isin(done_images_df.name)) + ], ] ).sort_index() @@ -601,119 +607,97 @@ def forced_extraction( timer.reset() extr_df = parallel_extraction( - extr_df, images_df, sources_df[['source', 'image', 'flux_peak']], - min_sigma, edge_buffer, cluster_threshold, allow_nan, add_mode, - p_run.path - ) - logger.info( - 'Force extraction step time: %.2f seconds', timer.reset() + extr_df, + images_df, + sources_df[["source", "image", "flux_peak"]], + min_sigma, + edge_buffer, + cluster_threshold, + allow_nan, + add_mode, + p_run.path, ) + logger.info("Force extraction step time: %.2f seconds", timer.reset()) # make measurement names unique for db constraint - extr_df['name'] = extr_df['name'] + f'_f_run{p_run.id:06d}' + extr_df["name"] = extr_df["name"] + f"_f_{str(p_run.id).split('-')[0]}" # select sensible flux values and set the columns with fix values - values = { - 'flux_int': 0, - 'flux_int_err': 0 - } + values = {"flux_int": 0, "flux_int_err": 0} extr_df = extr_df.fillna(value=values) extr_df = extr_df[ - (extr_df['flux_int'] != 0) - & (extr_df['flux_int_err'] != 0) - & (extr_df['chi_squared_fit'] != np.inf) - & (extr_df['chi_squared_fit'] != np.nan) + (extr_df["flux_int"] != 0) + & (extr_df["flux_int_err"] != 0) + & (extr_df["chi_squared_fit"] != np.inf) + & (extr_df["chi_squared_fit"] != np.nan) ] - default_pos_err = settings.POS_DEFAULT_MIN_ERROR / 3600. - extr_df['ra_err'] = default_pos_err - extr_df['dec_err'] = default_pos_err - extr_df['err_bmaj'] = 0. - extr_df['err_bmin'] = 0. - extr_df['err_pa'] = 0. - extr_df['ew_sys_err'] = cfg_err_ra - extr_df['ns_sys_err'] = cfg_err_dec - extr_df['error_radius'] = 0. - - extr_df['uncertainty_ew'] = np.hypot( - cfg_err_ra, - default_pos_err - ) - extr_df['weight_ew'] = 1. / extr_df['uncertainty_ew'].values**2 - extr_df['uncertainty_ns'] = np.hypot( - cfg_err_dec, - default_pos_err - ) - extr_df['weight_ns'] = 1. / extr_df['uncertainty_ns'].values**2 - - extr_df['flux_peak'] = extr_df['flux_int'] - extr_df['flux_peak_err'] = extr_df['flux_int_err'] - extr_df['local_rms'] = extr_df['flux_int_err'] - extr_df['snr'] = ( - extr_df['flux_peak'].values - / extr_df['local_rms'].values - ) - extr_df['spectral_index'] = 0. - extr_df['dr'] = 0. - extr_df['d2d'] = 0. - extr_df['forced'] = True - extr_df['compactness'] = 1. - extr_df['psf_bmaj'] = extr_df['bmaj'] - extr_df['psf_bmin'] = extr_df['bmin'] - extr_df['psf_pa'] = extr_df['pa'] - extr_df['flag_c4'] = False - extr_df['spectral_index_from_TT'] = False - extr_df['has_siblings'] = False - extr_df['flux_int_isl_ratio'] = 1.0 - extr_df['flux_peak_isl_ratio'] = 1.0 - - col_order = read_schema( - images_df.iloc[0]['measurements_path'] - ).names - col_order.remove('id') + default_pos_err = settings.POS_DEFAULT_MIN_ERROR / 3600.0 + extr_df["ra_err"] = default_pos_err + extr_df["dec_err"] = default_pos_err + extr_df["err_bmaj"] = 0.0 + extr_df["err_bmin"] = 0.0 + extr_df["err_pa"] = 0.0 + extr_df["ew_sys_err"] = cfg_err_ra + extr_df["ns_sys_err"] = cfg_err_dec + extr_df["error_radius"] = 0.0 + + extr_df["uncertainty_ew"] = np.hypot(cfg_err_ra, default_pos_err) + extr_df["weight_ew"] = 1.0 / extr_df["uncertainty_ew"].values ** 2 + extr_df["uncertainty_ns"] = np.hypot(cfg_err_dec, default_pos_err) + extr_df["weight_ns"] = 1.0 / extr_df["uncertainty_ns"].values ** 2 + + extr_df["flux_peak"] = extr_df["flux_int"] + extr_df["flux_peak_err"] = extr_df["flux_int_err"] + extr_df["local_rms"] = extr_df["flux_int_err"] + extr_df["snr"] = extr_df["flux_peak"].values / extr_df["local_rms"].values + extr_df["spectral_index"] = 0.0 + extr_df["dr"] = 0.0 + extr_df["d2d"] = 0.0 + extr_df["forced"] = True + extr_df["compactness"] = 1.0 + extr_df["psf_bmaj"] = extr_df["bmaj"] + extr_df["psf_bmin"] = extr_df["bmin"] + extr_df["psf_pa"] = extr_df["pa"] + extr_df["flag_c4"] = False + extr_df["spectral_index_from_TT"] = False + extr_df["has_siblings"] = False + extr_df["flux_int_isl_ratio"] = 1.0 + extr_df["flux_peak_isl_ratio"] = 1.0 + + col_order = read_schema(images_df.iloc[0]["measurements_path"]).names remaining = list(set(extr_df.columns) - set(col_order)) extr_df = extr_df[col_order + remaining] - # upload the measurements, a column 'id' is returned with the DB id - extr_df = make_upload_measurements(extr_df) + # upload the measurements + make_upload_measurements(extr_df) - extr_df = extr_df.rename(columns={'source_tmp_id': 'source'}) + extr_df = extr_df.rename(columns={"source_tmp_id": "source"}) # write forced measurements to specific parquet - logger.info( - 'Saving forced measurements to specific parquet file...' - ) + logger.info("Saving forced measurements to specific parquet file...") parallel_write_parquet(extr_df, p_run.path, add_mode) # Required to rename this column for the image add mode. - extr_df = extr_df.rename(columns={'time': 'datetime'}) + extr_df = extr_df.rename(columns={"time": "datetime"}) # append new meas into main df and proceed with source groupby etc sources_df = pd.concat( - [ - sources_df, - extr_df.loc[:, extr_df.columns.isin(sources_df.columns)] - ], - ignore_index=True + [sources_df, extr_df.loc[:, extr_df.columns.isin(sources_df.columns)]], + ignore_index=True, ) # get the number of forced extractions for the run - forced_parquets = glob( - os.path.join(p_run.path, "forced_measurements*.parquet")) + forced_parquets = glob(os.path.join(p_run.path, "forced_measurements*.parquet")) if forced_parquets: n_forced = ( - dd.read_parquet(forced_parquets, columns=['id']) - .count() - .compute() - .values[0] + dd.read_parquet(forced_parquets, columns=["id"]).count().compute().values[0] ) else: n_forced = 0 - logger.info( - 'Total forced extraction time: %.2f seconds', timer.reset_init() - ) + logger.info("Total forced extraction time: %.2f seconds", timer.reset_init()) return sources_df, n_forced diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index a7d8f459e..c36568d15 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -15,8 +15,14 @@ association_models_generator, ) from vast_pipeline.models import ( - Association, Band, Measurement, SkyRegion, Source, RelatedSource, - Run, Image + Association, + Band, + Measurement, + SkyRegion, + Source, + RelatedSource, + Run, + Image, ) from vast_pipeline.pipeline.utils import get_create_img, get_create_img_band from vast_pipeline.utils.utils import StopWatch @@ -29,9 +35,9 @@ def bulk_upload_model( djmodel: models.Model, generator: Iterable[Generator[models.Model, None, None]], - batch_size: int=10_000, return_ids: bool=False + batch_size: int = 10_000, ) -> List[int]: - ''' + """ Bulk upload a list of generator objects of django models to db. Args: @@ -41,33 +47,23 @@ def bulk_upload_model( The generator objects of the model to upload. batch_size: How many records to upload at once. - return_ids: - When set to True, the database IDs of the uploaded objects are - returned. Returns: None or a list of the database IDs of the uploaded objects. - ''' - bulk_ids = [] + """ while True: items = list(islice(generator, batch_size)) if not items: break out_bulk = djmodel.objects.bulk_create(items) - logger.info('Bulk created #%i %s', len(out_bulk), djmodel.__name__) - # save the DB ids to return - if return_ids: - bulk_ids.extend(list(map(lambda i: i.id, out_bulk))) - - if return_ids: - return bulk_ids + logger.info("Bulk created #%i %s", len(out_bulk), djmodel.__name__) def make_upload_images( paths: Dict[str, Dict[str, str]], image_config: Dict ) -> Tuple[List[Image], List[SkyRegion], List[Band]]: - ''' + """ Carry the first part of the pipeline, by uploading all the images to the image table and populated band and skyregion objects. @@ -84,20 +80,16 @@ def make_upload_images( A list of Image objects that have been uploaded. A list of SkyRegion objects that have been uploaded. A list of Band objects that have been uploaded. - ''' + """ timer = StopWatch() images = [] skyregions = [] bands = [] - for path in paths['selavy']: + for path in paths["selavy"]: # STEP #1: Load image and measurements - image = SelavyImage( - path, - paths, - image_config - ) - logger.info('Reading image %s ...', image.name) + image = SelavyImage(path, paths, image_config) + logger.info("Reading image %s ...", image.name) # 1.1 get/create the frequency band with transaction.atomic(): @@ -128,7 +120,7 @@ def make_upload_images( ) # upload measurements, a column with the db is added to the df - measurements = make_upload_measurements(measurements) + make_upload_measurements(measurements) # save measurements to parquet file in pipeline run folder base_folder = os.path.dirname(img.measurements_path) @@ -138,10 +130,7 @@ def make_upload_images( measurements.to_parquet(img.measurements_path, index=False) del measurements, image, band, img - logger.info( - 'Total images upload/loading time: %.2f seconds', - timer.reset_init() - ) + logger.info("Total images upload/loading time: %.2f seconds", timer.reset_init()) return images, skyregions, bands @@ -149,7 +138,7 @@ def make_upload_images( def make_upload_sources( sources_df: pd.DataFrame, pipeline_run: Run, add_mode: bool = False ) -> pd.DataFrame: - ''' + """ Delete previous sources for given pipeline run and bulk upload new found sources as well as related sources. @@ -164,30 +153,26 @@ def make_upload_sources( Returns: The input dataframe with the 'id' column added. - ''' + """ # create sources in DB with transaction.atomic(): - if (add_mode is False and - Source.objects.filter(run=pipeline_run).exists()): - logger.info('Removing objects from previous pipeline run') - n_del, detail_del = ( - Source.objects.filter(run=pipeline_run).delete() - ) + if add_mode is False and Source.objects.filter(run=pipeline_run).exists(): + logger.info("Removing objects from previous pipeline run") + n_del, detail_del = Source.objects.filter(run=pipeline_run).delete() logger.info( - ('Deleting all sources and related objects for this run. ' - 'Total objects deleted: %i'), + ( + "Deleting all sources and related objects for this run. " + "Total objects deleted: %i" + ), n_del, ) - logger.debug('(type, #deleted): %s', detail_del) + logger.debug("(type, #deleted): %s", detail_del) - src_dj_ids = bulk_upload_model( + bulk_upload_model( Source, source_models_generator(sources_df, pipeline_run=pipeline_run), - return_ids=True ) - sources_df['id'] = src_dj_ids - return sources_df @@ -219,13 +204,11 @@ def make_upload_associations(associations_df: pd.DataFrame) -> None: Returns: None. """ - logger.info('Upload associations...') - bulk_upload_model( - Association, association_models_generator(associations_df) - ) + logger.info("Upload associations...") + bulk_upload_model(Association, association_models_generator(associations_df)) -def make_upload_measurements(measurements_df: pd.DataFrame) -> pd.DataFrame: +def make_upload_measurements(measurements_df: pd.DataFrame) -> None: """ Uploads the measurements from the supplied measurements DataFrame. @@ -237,21 +220,11 @@ def make_upload_measurements(measurements_df: pd.DataFrame) -> pd.DataFrame: Returns: Original DataFrame with the database ID attached to each row. """ - meas_dj_ids = bulk_upload_model( - Measurement, - measurement_models_generator(measurements_df), - return_ids=True - ) - - measurements_df['id'] = meas_dj_ids + bulk_upload_model(Measurement, measurement_models_generator(measurements_df)) - return measurements_df - -def update_sources( - sources_df: pd.DataFrame, batch_size: int = 10_000 -) -> pd.DataFrame: - ''' +def update_sources(sources_df: pd.DataFrame, batch_size: int = 10_000) -> pd.DataFrame: + """ Update database using SQL code. This function opens one connection to the database, and closes it after the update is done. @@ -267,37 +240,36 @@ def update_sources( Returns: DataFrame containing the new data to be uploaded to the database. - ''' + """ # Get all possible columns from the model all_source_table_cols = [ - fld.attname for fld in Source._meta.get_fields() - if getattr(fld, 'attname', None) is not None + fld.attname + for fld in Source._meta.get_fields() + if getattr(fld, "attname", None) is not None ] # Filter to those present in sources_df - columns = [ - col for col in all_source_table_cols if col in sources_df.columns - ] + columns = [col for col in all_source_table_cols if col in sources_df.columns] - sources_df['id'] = sources_df.index.values + sources_df["id"] = sources_df.index.values - batches = np.ceil(len(sources_df)/batch_size) + batches = np.ceil(len(sources_df) / batch_size) dfs = np.array_split(sources_df, batches) with connection.cursor() as cursor: for df_batch in dfs: - SQL_comm = SQL_update( - df_batch, Source, index='id', columns=columns - ) + SQL_comm = SQL_update(df_batch, Source, index="id", columns=columns) cursor.execute(SQL_comm) return sources_df def SQL_update( - df: pd.DataFrame, model: models.Model, index: Optional[str] = None, - columns: Optional[List[str]] = None + df: pd.DataFrame, + model: models.Model, + index: Optional[str] = None, + columns: Optional[List[str]] = None, ) -> str: - ''' + """ Generate the SQL code required to update the database. Args: @@ -316,7 +288,7 @@ def SQL_update( Returns: The SQL command to update the database. - ''' + """ # set index and columns if None if index is None: index = model._meta.pk.name @@ -326,8 +298,8 @@ def SQL_update( # get names table = model._meta.db_table - new_columns = ', '.join('new_'+c for c in columns) - set_columns = ', '.join(c+'=new_'+c for c in columns) + new_columns = ", ".join("new_" + c for c in columns) + set_columns = ", ".join(c + "=new_" + c for c in columns) # get index values and new values column_headers = [index] @@ -335,9 +307,9 @@ def SQL_update( data_arr = df[column_headers].to_numpy() values = [] for row in data_arr: - val_row = '(' + ', '.join(f'{val}' for val in row) + ')' + val_row = "(" + f"'{row[0]}', " + ", ".join(f"{val}" for val in row[1:]) + ")" values.append(val_row) - values = ', '.join(values) + values = ", ".join(values) # update database SQL_comm = f""" @@ -345,7 +317,7 @@ def SQL_update( SET {set_columns} FROM (VALUES {values}) AS new_values (index_col, {new_columns}) - WHERE {index}=index_col; + WHERE {index}=index_col::uuid; """ return SQL_comm diff --git a/vast_pipeline/pipeline/main.py b/vast_pipeline/pipeline/main.py index 6e1fe1721..5fa55e1d5 100644 --- a/vast_pipeline/pipeline/main.py +++ b/vast_pipeline/pipeline/main.py @@ -28,7 +28,7 @@ get_src_skyregion_merged_df, group_skyregions, get_parallel_assoc_image_df, - write_parquets + write_parquets, ) from .errors import MaxPipelineRunsError @@ -37,7 +37,7 @@ logger = logging.getLogger(__name__) -class Pipeline(): +class Pipeline: """Instance of a pipeline. All the methods runs the pipeline opearations, such as association. @@ -53,6 +53,7 @@ class Pipeline(): previous_parquets: A dict mapping that provides the paths to parquet files for previous executions of this pipeline run. """ + def __init__(self, name: str, config_path: str, validate_config: bool = True): """Initialise an instance of Pipeline with a name and configuration file path. @@ -67,9 +68,9 @@ def __init__(self, name: str, config_path: str, validate_config: bool = True): config_path, validate=validate_config ) self.img_paths: Dict[str, Dict[str, str]] = { - 'selavy': {}, - 'noise': {}, - 'background': {}, + "selavy": {}, + "noise": {}, + "background": {}, } # maps input image paths to their selavy/noise/background counterpart path self.img_epochs: Dict[str, str] = {} # maps image names to their provided epoch self.add_mode: bool = False @@ -112,9 +113,9 @@ def process_pipeline(self, p_run: Run) -> None: Returns: None """ - logger.info(f'Epoch based association: {self.config.epoch_based}') + logger.info(f"Epoch based association: {self.config.epoch_based}") if self.add_mode: - logger.info('Running in image add mode.') + logger.info("Running in image add mode.") # Update epoch based flag to not cause user confusion when running # the pipeline (i.e. if it was only updated at the end). It is not @@ -130,8 +131,7 @@ def process_pipeline(self, p_run: Run) -> None: # upload/retrieve image data images, skyregions, bands = make_upload_images( - self.img_paths, - self.config.image_opts() + self.img_paths, self.config.image_opts() ) # associate the pipeline run with each image @@ -140,11 +140,13 @@ def process_pipeline(self, p_run: Run) -> None: add_run_to_img(p_run, img) # write parquet files and retrieve skyregions as a dataframe - skyregs_df = write_parquets(images, skyregions, bands, self.config["run"]["path"]) + skyregs_df = write_parquets( + images, skyregions, bands, self.config["run"]["path"] + ) # STEP #2: measurements association # order images by time - images.sort(key=operator.attrgetter('datetime')) + images.sort(key=operator.attrgetter("datetime")) # If the user has given lists we need to reorder the # image epochs such that they are in date order. @@ -153,9 +155,7 @@ def process_pipeline(self, p_run: Run) -> None: for i, img in enumerate(images): self.img_epochs[img.name] = i + 1 - image_epochs = [ - self.img_epochs[img.name] for img in images - ] + image_epochs = [self.img_epochs[img.name] for img in images] limit = Angle(self.config["source_association"]["radius"] * u.arcsec) dr_limit = self.config["source_association"]["deruiter_radius"] bw_limit = self.config["source_association"]["deruiter_beamwidth_limit"] @@ -166,20 +166,17 @@ def process_pipeline(self, p_run: Run) -> None: # 2.1 Check if sky regions to be associated can be # split into connected point groups skyregion_groups = group_skyregions( - skyregs_df[['id', 'centre_ra', 'centre_dec', 'xtr_radius']] + skyregs_df[["id", "centre_ra", "centre_dec", "xtr_radius"]] ) - n_skyregion_groups = skyregion_groups[ - 'skyreg_group' - ].unique().shape[0] + n_skyregion_groups = skyregion_groups["skyreg_group"].unique().shape[0] # Get already done images if in add mode if self.add_mode: done_images_df = pd.read_parquet( - self.previous_parquets['images'], columns=['id', 'name'] + self.previous_parquets["images"], columns=["id", "name"] ) done_source_ids = pd.read_parquet( - self.previous_parquets['sources'], - columns=['wavg_ra'] + self.previous_parquets["sources"], columns=["wavg_ra"] ).index.tolist() else: done_images_df = None @@ -187,10 +184,8 @@ def process_pipeline(self, p_run: Run) -> None: # 2.2 Associate with other measurements if self.config["source_association"]["parallel"] and n_skyregion_groups > 1: - images_df = get_parallel_assoc_image_df( - images, skyregion_groups - ) - images_df['epoch'] = image_epochs + images_df = get_parallel_assoc_image_df(images, skyregion_groups) + images_df["epoch"] = image_epochs sources_df = parallel_association( images_df, @@ -203,23 +198,18 @@ def process_pipeline(self, p_run: Run) -> None: self.add_mode, self.previous_parquets, done_images_df, - done_source_ids + done_source_ids, ) else: images_df = pd.DataFrame.from_dict( - { - 'image_dj': images, - 'epoch': image_epochs - } + {"image_dj": images, "epoch": image_epochs} ) - images_df['skyreg_id'] = images_df['image_dj'].apply( - lambda x: x.skyreg_id + images_df["skyreg_id"] = images_df["image_dj"].apply( + lambda x: str(x.skyreg_id) ) - images_df['image_name'] = images_df['image_dj'].apply( - lambda x: x.name - ) + images_df["image_name"] = images_df["image_dj"].apply(lambda x: x.name) sources_df = association( images_df, @@ -230,24 +220,30 @@ def process_pipeline(self, p_run: Run) -> None: self.config, self.add_mode, self.previous_parquets, - done_images_df + done_images_df, ) # Obtain the number of selavy measurements for the run # n_selavy_measurements = sources_df. - nr_selavy_measurements = sources_df['id'].unique().shape[0] + nr_selavy_measurements = sources_df["id"].unique().shape[0] # STEP #3: Merge sky regions and sources ready for # steps 4 and 5 below. missing_source_cols = [ - 'source', 'datetime', 'image', 'epoch', - 'interim_ew', 'weight_ew', 'interim_ns', 'weight_ns' + "source", + "datetime", + "image", + "epoch", + "interim_ew", + "weight_ew", + "interim_ns", + "weight_ns", ] # need to make sure no forced measurments are being passed which # could happen in add mode, otherwise the wrong detection image is # assigned. missing_sources_df = get_src_skyregion_merged_df( - sources_df.loc[sources_df['forced'] == False, missing_source_cols], + sources_df.loc[sources_df["forced"] == False, missing_source_cols], images_df, skyregs_df, ) @@ -258,23 +254,18 @@ def process_pipeline(self, p_run: Run) -> None: missing_sources_df, self.config["new_sources"]["min_sigma"], self.config["source_monitoring"]["edge_buffer_scale"], - p_run + p_run, ) # Drop column no longer required in missing_sources_df. - missing_sources_df = ( - missing_sources_df.drop(['in_primary'], axis=1) - ) + missing_sources_df = missing_sources_df.drop(["in_primary"], axis=1) # STEP #5: Run forced extraction/photometry if asked if self.config["source_monitoring"]["monitor"]: - ( + (sources_df, nr_forced_measurements) = forced_extraction( sources_df, - nr_forced_measurements - ) = forced_extraction( - sources_df, - self.config["measurements"]["ra_uncertainty"] / 3600., - self.config["measurements"]["dec_uncertainty"] / 3600., + self.config["measurements"]["ra_uncertainty"] / 3600.0, + self.config["measurements"]["dec_uncertainty"] / 3600.0, p_run, missing_sources_df, self.config["source_monitoring"]["min_sigma"], @@ -283,7 +274,7 @@ def process_pipeline(self, p_run: Run) -> None: self.config["source_monitoring"]["allow_nan"], self.add_mode, done_images_df, - done_source_ids + done_source_ids, ) del missing_sources_df @@ -298,7 +289,7 @@ def process_pipeline(self, p_run: Run) -> None: self.config["variability"]["source_aggregate_pair_metrics_min_abs_vs"], self.add_mode, done_source_ids, - self.previous_parquets + self.previous_parquets, ) # calculate number processed images @@ -310,7 +301,9 @@ def process_pipeline(self, p_run: Run) -> None: p_run.n_sources = nr_sources p_run.n_selavy_measurements = nr_selavy_measurements p_run.n_forced_measurements = ( - nr_forced_measurements if self.config["source_monitoring"]["monitor"] else 0 + nr_forced_measurements + if self.config["source_monitoring"]["monitor"] + else 0 ) p_run.n_new_sources = nr_new_sources p_run.save() @@ -334,7 +327,7 @@ def check_current_runs() -> None: raise MaxPipelineRunsError @staticmethod - def set_status(pipe_run: Run, status: str=None) -> None: + def set_status(pipe_run: Run, status: str = None) -> None: """ Function to change the status of a pipeline run model object and save to the database. @@ -346,8 +339,8 @@ def set_status(pipe_run: Run, status: str=None) -> None: Returns: None """ - #TODO: This function gives no feedback if the status is not accepted? - choices = [x[0] for x in Run._meta.get_field('status').choices] + # TODO: This function gives no feedback if the status is not accepted? + choices = [x[0] for x in Run._meta.get_field("status").choices] if status and status in choices and pipe_run.status != status: with transaction.atomic(): pipe_run.status = status diff --git a/vast_pipeline/pipeline/model_generator.py b/vast_pipeline/pipeline/model_generator.py index 310babae0..d72c59388 100644 --- a/vast_pipeline/pipeline/model_generator.py +++ b/vast_pipeline/pipeline/model_generator.py @@ -6,16 +6,14 @@ from typing import Iterable, Generator from vast_pipeline.utils.utils import deg2hms, deg2dms -from vast_pipeline.models import ( - Association, Measurement, Source, RelatedSource, Run -) +from vast_pipeline.models import Association, Measurement, Source, RelatedSource, Run logger = logging.getLogger(__name__) def measurement_models_generator( - meas_df: pd.DataFrame + meas_df: pd.DataFrame, ) -> Iterable[Generator[Measurement, None, None]]: """ Creates a generator object containing yielded Measurement objects from @@ -33,7 +31,7 @@ def measurement_models_generator( for i, row in meas_df.iterrows(): one_m = Measurement() for fld in one_m._meta.get_fields(): - if getattr(fld, 'attname', None) and fld.attname in row.index: + if getattr(fld, "attname", None) and fld.attname in row.index: setattr(one_m, fld.attname, row[fld.attname]) yield one_m @@ -65,15 +63,16 @@ def source_models_generator( src = Source() src.run_id = pipeline_run.id src.name = name + src.id = i for fld in src._meta.get_fields(): - if getattr(fld, 'attname', None) and fld.attname in row.index: + if getattr(fld, "attname", None) and fld.attname in row.index: setattr(src, fld.attname, row[fld.attname]) yield src def association_models_generator( - assoc_df: pd.DataFrame + assoc_df: pd.DataFrame, ) -> Iterable[Generator[Association, None, None]]: """ Creates a generator object containing yielded Association objects from @@ -89,15 +88,15 @@ def association_models_generator( """ for i, row in assoc_df.iterrows(): yield Association( - meas_id=row['id'], - source_id=row['source_id'], - d2d=row['d2d'], - dr=row['dr'], + meas_id=row["id"], + source_id=row["source"], + d2d=row["d2d"], + dr=row["dr"], ) def related_models_generator( - related_df: pd.DataFrame + related_df: pd.DataFrame, ) -> Iterable[Generator[RelatedSource, None, None]]: """ Creates a generator object containing yielded Association objects from diff --git a/vast_pipeline/pipeline/pairs.py b/vast_pipeline/pipeline/pairs.py index 470cbab3b..0e2863ccb 100644 --- a/vast_pipeline/pipeline/pairs.py +++ b/vast_pipeline/pipeline/pairs.py @@ -89,7 +89,9 @@ def calculate_measurement_pair_metrics(df: pd.DataFrame) -> pd.DataFrame: dd.from_pandas(df, n_cpu) .groupby("source")["id"] .apply( - lambda x: pd.DataFrame(list(combinations(x, 2))), meta={0: "i", 1: "i"},) + lambda x: pd.DataFrame(list(combinations(x, 2))), + meta={0: "i", 1: "i"}, + ) .compute(num_workers=n_cpu, scheduler="processes") ) @@ -109,40 +111,46 @@ def calculate_measurement_pair_metrics(df: pd.DataFrame) -> pd.DataFrame: 33644 11128 6216 23534 Where source is the source ID, id_a and id_b are measurement IDs. """ - measurement_combinations = measurement_combinations.reset_index( - level=1, drop=True - ).rename(columns={0: "id_a", 1: "id_b"}).astype(int).reset_index() + measurement_combinations = ( + measurement_combinations.reset_index(level=1, drop=True) + .rename(columns={0: "id_a", 1: "id_b"}) + .astype(str) + .reset_index() + ) # Dask has a tendency to swap which order the measurement pairs are # defined in, even if the dataframe is pre-sorted. We want the pairs to be # in date order (a < b) so the code below corrects any that are not. measurement_combinations = measurement_combinations.join( - df[['source', 'id', 'datetime']].set_index(['source', 'id']), - on=['source', 'id_a'], + df[["source", "id", "datetime"]].set_index(["source", "id"]), + on=["source", "id_a"], ) measurement_combinations = measurement_combinations.join( - df[['source', 'id', 'datetime']].set_index(['source', 'id']), - on=['source', 'id_b'], lsuffix='_a', rsuffix='_b' + df[["source", "id", "datetime"]].set_index(["source", "id"]), + on=["source", "id_b"], + lsuffix="_a", + rsuffix="_b", ) to_correct_mask = ( - measurement_combinations['datetime_a'] - > measurement_combinations['datetime_b'] + measurement_combinations["datetime_a"] > measurement_combinations["datetime_b"] ) if np.any(to_correct_mask): - logger.debug('Correcting measurement pairs order') + logger.debug("Correcting measurement pairs order") ( - measurement_combinations.loc[to_correct_mask, 'id_a'], - measurement_combinations.loc[to_correct_mask, 'id_b'] - ) = np.array([ - measurement_combinations.loc[to_correct_mask, 'id_b'].values, - measurement_combinations.loc[to_correct_mask, 'id_a'].values - ]) + measurement_combinations.loc[to_correct_mask, "id_a"], + measurement_combinations.loc[to_correct_mask, "id_b"], + ) = np.array( + [ + measurement_combinations.loc[to_correct_mask, "id_b"].values, + measurement_combinations.loc[to_correct_mask, "id_a"].values, + ] + ) measurement_combinations = measurement_combinations.drop( - ['datetime_a', 'datetime_b'], axis=1 + ["datetime_a", "datetime_b"], axis=1 ) # add the measurement fluxes and errors diff --git a/vast_pipeline/pipeline/utils.py b/vast_pipeline/pipeline/utils.py index 82437141c..924e5a345 100644 --- a/vast_pipeline/pipeline/utils.py +++ b/vast_pipeline/pipeline/utils.py @@ -7,6 +7,7 @@ import logging import glob import shutil +import uuid import numpy as np import pandas as pd import pyarrow as pa @@ -24,11 +25,12 @@ from vast_pipeline.image.main import FitsImage, SelavyImage from vast_pipeline.image.utils import open_fits from vast_pipeline.utils.utils import ( - eq_to_cart, StopWatch, optimize_ints, optimize_floats -) -from vast_pipeline.models import ( - Band, Image, Run, SkyRegion + eq_to_cart, + StopWatch, + optimize_ints, + optimize_floats, ) +from vast_pipeline.models import Band, Image, Run, SkyRegion logger = logging.getLogger(__name__) @@ -36,7 +38,7 @@ def get_create_skyreg(image: Image) -> SkyRegion: - ''' + """ This creates a Sky Region object in Django ORM given the related image object. @@ -45,18 +47,16 @@ def get_create_skyreg(image: Image) -> SkyRegion: Returns: The sky region Django ORM object. - ''' + """ # In the calculations below, it is assumed the image has square # pixels (this pipeline has been designed for ASKAP images, so it # should always be square). It will likely give wrong results if not skyregions = SkyRegion.objects.filter( - centre_ra=image.ra, - centre_dec=image.dec, - xtr_radius=image.fov_bmin + centre_ra=image.ra, centre_dec=image.dec, xtr_radius=image.fov_bmin ) if skyregions: skyr = skyregions.get() - logger.info('Found sky region %s', skyr) + logger.info("Found sky region %s", skyr) else: x, y, z = eq_to_cart(image.ra, image.dec) skyr = SkyRegion( @@ -70,13 +70,13 @@ def get_create_skyreg(image: Image) -> SkyRegion: z=z, ) skyr.save() - logger.info('Created sky region %s', skyr) + logger.info("Created sky region %s", skyr) return skyr def get_create_img_band(image: FitsImage) -> Band: - ''' + """ Return the existing Band row for the given FitsImage. An image is considered to belong to a band if its frequency is within some tolerance of the band's frequency. @@ -87,12 +87,12 @@ def get_create_img_band(image: FitsImage) -> Band: Returns: The band Django ORM object. - ''' + """ # For now we match bands using the central frequency. # This assumes that every band has a unique frequency, # which is true for the data we've used so far. - freq = int(image.freq_eff * 1.e-6) - freq_band = int(image.freq_bw * 1.e-6) + freq = int(image.freq_eff * 1.0e-6) + freq_band = int(image.freq_bw * 1.0e-6) # TODO: refine the band query for band in Band.objects.all(): diff = abs(freq - band.frequency) / float(band.frequency) @@ -101,7 +101,7 @@ def get_create_img_band(image: FitsImage) -> Band: # no band has been found so create it band = Band(name=str(freq), frequency=freq, bandwidth=freq_band) - logger.info('Adding new frequency band: %s', band) + logger.info("Adding new frequency band: %s", band) band.save() return band @@ -131,27 +131,28 @@ def get_create_img(band_id: int, image: SelavyImage) -> Tuple[Image, bool]: else: # at this stage, measurement parquet file is not created but # assume location - img_folder_name = image.name.replace('.', '_') + img_folder_name = image.name.replace(".", "_") measurements_path = os.path.join( settings.PIPELINE_WORKING_DIR, - 'images', + "images", img_folder_name, - 'measurements.parquet' - ) - img = Image( - band_id=band_id, - measurements_path=measurements_path + "measurements.parquet", ) + img = Image(band_id=band_id, measurements_path=measurements_path) # set the attributes and save the image, # by selecting only valid (not hidden) attributes # FYI attributs and/or method starting with _ are hidden # and with __ can't be modified/called for fld in img._meta.get_fields(): - if getattr(fld, 'attname', None) and (getattr(image, fld.attname, None) is not None): + if getattr(fld, "attname", None) and ( + getattr(image, fld.attname, None) is not None + ): setattr(img, fld.attname, getattr(image, fld.attname)) - img.rms_median, img.rms_min, img.rms_max = get_rms_noise_image_values(img.noise_path) + img.rms_median, img.rms_min, img.rms_max = get_rms_noise_image_values( + img.noise_path + ) # get create the sky region and associate with image img.skyreg = get_create_skyreg(img) @@ -163,7 +164,7 @@ def get_create_img(band_id: int, image: SelavyImage) -> Tuple[Image, bool]: def get_create_p_run( name: str, path: str, description: str = None, user: User = None ) -> Tuple[Run, bool]: - ''' + """ Get or create a pipeline run in db, return the run django object and a flag True/False if has been created or already exists. @@ -177,7 +178,7 @@ def get_create_p_run( Returns: The pipeline run object. Whether the pipeline run already existed ('True') or not ('False'). - ''' + """ p_run = Run.objects.filter(name__exact=name) if p_run: return p_run.get(), True @@ -207,18 +208,16 @@ def add_run_to_img(pipeline_run: Run, img: Image) -> None: skyreg = img.skyreg # check and add the many to many if not existent if not Image.objects.filter(id=img.id, run__id=pipeline_run.id).exists(): - logger.info('Adding %s to image %s', pipeline_run, img.name) + logger.info("Adding %s to image %s", pipeline_run, img.name) img.run.add(pipeline_run) if pipeline_run not in skyreg.run.all(): - logger.info('Adding %s to sky region %s', pipeline_run, skyreg) + logger.info("Adding %s to sky region %s", pipeline_run, skyreg) skyreg.run.add(pipeline_run) def remove_duplicate_measurements( - sources_df: pd.DataFrame, - dup_lim: Optional[Angle] = None, - ini_df: bool = False + sources_df: pd.DataFrame, dup_lim: Optional[Angle] = None, ini_df: bool = False ) -> pd.DataFrame: """ Remove perceived duplicate sources from a dataframe of loaded @@ -240,87 +239,64 @@ def remove_duplicate_measurements( Returns: The input sources_df with duplicate sources removed. """ - logger.debug('Cleaning duplicate sources from epoch...') + logger.debug("Cleaning duplicate sources from epoch...") if dup_lim is None: dup_lim = Angle(2.5 * u.arcsec) - logger.debug( - 'Using duplicate crossmatch radius of %.2f arcsec.', dup_lim.arcsec - ) + logger.debug("Using duplicate crossmatch radius of %.2f arcsec.", dup_lim.arcsec) # sort by the distance from the image centre so we know # that the first source is always the one to keep - sources_df = sources_df.sort_values(by='dist_from_centre') + sources_df = sources_df.sort_values(by="dist_from_centre") - sources_sc = SkyCoord( - sources_df['ra'], - sources_df['dec'], - unit=(u.deg, u.deg) - ) + sources_sc = SkyCoord(sources_df["ra"], sources_df["dec"], unit=(u.deg, u.deg)) # perform search around sky to get all self matches - idxc, idxcatalog, *_ = sources_sc.search_around_sky( - sources_sc, dup_lim - ) + idxc, idxcatalog, *_ = sources_sc.search_around_sky(sources_sc, dup_lim) # create df from results results = pd.DataFrame( data={ - 'source_id': idxc, - 'match_id': idxcatalog, - 'source_image': sources_df.iloc[idxc]['image'].tolist(), - 'match_image': sources_df.iloc[idxcatalog]['image'].tolist() + "source_id": idxc, + "match_id": idxcatalog, + "source_image": sources_df.iloc[idxc]["image"].tolist(), + "match_image": sources_df.iloc[idxcatalog]["image"].tolist(), } ) # Drop those that are matched from the same image - matching_image_mask = ( - results['source_image'] != results['match_image'] - ) + matching_image_mask = results["source_image"] != results["match_image"] - results = ( - results.loc[matching_image_mask] - .drop(['source_image', 'match_image'], axis=1) + results = results.loc[matching_image_mask].drop( + ["source_image", "match_image"], axis=1 ) # create a pair column defining each pair ith index - results['pair'] = results.apply(tuple, 1).apply(sorted).apply(tuple) + results["pair"] = results.apply(tuple, 1).apply(sorted).apply(tuple) # Drop the duplicate pairs (pairs are sorted so this works) - results = results.drop_duplicates('pair') + results = results.drop_duplicates("pair") # No longer need pair - results = results.drop('pair', axis=1) + results = results.drop("pair", axis=1) # Drop all self matches and we are left with those to drop # in the match id column. - to_drop = results.loc[ - results['source_id'] != results['match_id'], - 'match_id' - ] + to_drop = results.loc[results["source_id"] != results["match_id"], "match_id"] # Get the index values from the ith values to_drop_indexes = sources_df.iloc[to_drop].index.values - logger.debug( - "Dropping %i duplicate measurements.", to_drop_indexes.shape[0] - ) + logger.debug("Dropping %i duplicate measurements.", to_drop_indexes.shape[0]) # Drop them from sources - sources_df = sources_df.drop(to_drop_indexes).sort_values(by='ra') + sources_df = sources_df.drop(to_drop_indexes).sort_values(by="ra") # reset the source_df index sources_df = sources_df.reset_index(drop=True) - # Reset the source number - if ini_df: - sources_df['source'] = sources_df.index + 1 - del results return sources_df def _load_measurements( - image: Image, - cols: List[str], - start_id: int = 0, - ini_df: bool = False + image: Image, cols: List[str], ini_df: bool = False ) -> pd.DataFrame: """ Load the measurements for an image from the parquet file. @@ -331,9 +307,6 @@ def _load_measurements( measurements. cols: The columns to load. - start_id: - The number to start from when setting the source ids (when - 'ini_df' is 'True'). Defaults to 0. ini_df: Boolean to indicate whether these sources are part of the initial source list creation for association. If 'True' the source ids are @@ -343,27 +316,23 @@ def _load_measurements( The measurements of the image with some extra values set ready for association. """ - image_centre = SkyCoord( - image.ra, - image.dec, - unit=(u.deg, u.deg) - ) + image_centre = SkyCoord(image.ra, image.dec, unit=(u.deg, u.deg)) df = pd.read_parquet(image.measurements_path, columns=cols) - df['image'] = image.name - df['datetime'] = image.datetime + df["image"] = image.name + df["datetime"] = image.datetime # these are the first 'sources' if ini_df is True. - df['source'] = df.index + start_id + 1 if ini_df else -1 - df['ra_source'] = df['ra'] - df['dec_source'] = df['dec'] - df['d2d'] = 0. - df['dr'] = 0. - df['related'] = None + df["source"] = df["id"].apply(lambda _: str(uuid.uuid4())) if ini_df else None + df["ra_source"] = df["ra"] + df["dec_source"] = df["dec"] + df["d2d"] = 0.0 + df["dr"] = 0.0 + df["related"] = None - sources_sc = SkyCoord(df['ra'], df['dec'], unit=(u.deg, u.deg)) + sources_sc = SkyCoord(df["ra"], df["dec"], unit=(u.deg, u.deg)) seps = sources_sc.separation(image_centre).degree - df['dist_from_centre'] = seps + df["dist_from_centre"] = seps del sources_sc del seps @@ -373,11 +342,11 @@ def _load_measurements( def prep_skysrc_df( images: List[Image], - perc_error: float = 0., + perc_error: float = 0.0, duplicate_limit: Optional[Angle] = None, - ini_df: bool = False + ini_df: bool = False, ) -> pd.DataFrame: - ''' + """ Initialise the source dataframe to use in association logic by reading the measurement parquet file and creating columns. When epoch based association is used it will also remove duplicate measurements from @@ -402,25 +371,25 @@ def prep_skysrc_df( Returns: The measurements of the image(s) with some extra values set ready for association and duplicates removed if necessary. - ''' + """ cols = [ - 'id', - 'ra', - 'uncertainty_ew', - 'weight_ew', - 'dec', - 'uncertainty_ns', - 'weight_ns', - 'flux_int', - 'flux_int_err', - 'flux_int_isl_ratio', - 'flux_peak', - 'flux_peak_err', - 'flux_peak_isl_ratio', - 'forced', - 'compactness', - 'has_siblings', - 'snr' + "id", + "ra", + "uncertainty_ew", + "weight_ew", + "dec", + "uncertainty_ns", + "weight_ns", + "flux_int", + "flux_int_err", + "flux_int_isl_ratio", + "flux_peak", + "flux_peak_err", + "flux_peak_isl_ratio", + "forced", + "compactness", + "has_siblings", + "snr", ] df = _load_measurements(images[0], cols, ini_df=ini_df) @@ -428,34 +397,26 @@ def prep_skysrc_df( if len(images) > 1: for img in images[1:]: df = pd.concat( - [ - df, - _load_measurements( - img, cols, df.source.max(), ini_df=ini_df - ) - ], - ignore_index=True + [df, _load_measurements(img, cols, ini_df=ini_df)], + ignore_index=True, ) - df = remove_duplicate_measurements( - df, dup_lim=duplicate_limit, ini_df=ini_df - ) + df = remove_duplicate_measurements(df, dup_lim=duplicate_limit, ini_df=ini_df) - df = df.drop('dist_from_centre', axis=1) + df = df.drop("dist_from_centre", axis=1) if perc_error != 0.0: - logger.info('Correcting flux errors with config error setting...') - for col in ['flux_int', 'flux_peak']: - df[f'{col}_err'] = np.hypot( - df[f'{col}_err'].values, perc_error * df[col].values + logger.info("Correcting flux errors with config error setting...") + for col in ["flux_int", "flux_peak"]: + df[f"{col}_err"] = np.hypot( + df[f"{col}_err"].values, perc_error * df[col].values ) return df def add_new_one_to_many_relations( - row: pd.Series, advanced: bool = False, - source_ids: Optional[pd.DataFrame] = None + row: pd.Series, advanced: bool = False, source_ids: Optional[pd.DataFrame] = None ) -> List[int]: """ This handles the relation information being created from the @@ -490,8 +451,8 @@ def add_new_one_to_many_relations( if source_ids is None: source_ids = pd.DataFrame() - related_col = 'related_skyc1' if advanced else 'related' - source_col = 'source_skyc1' if advanced else 'source' + related_col = "related_skyc1" if advanced else "related" + source_col = "source_skyc1" if advanced else "source" # this is the not_original case where the original source id is appended. if source_ids.empty: @@ -499,7 +460,9 @@ def add_new_one_to_many_relations( out = row[related_col] out.append(row[source_col]) else: - out = [row[source_col], ] + out = [ + row[source_col], + ] else: # the original case to append all the new ids. source_ids = source_ids.loc[row[source_col]].iloc[0] @@ -528,10 +491,10 @@ def add_new_many_to_one_relations(row: pd.Series) -> List[int]: The new related field for the source in question, containing the appended ids. """ - out = row['new_relations'].copy() + out = row["new_relations"].copy() - if isinstance(row['related_skyc1'], list): - out += row['related_skyc1'].copy() + if isinstance(row["related_skyc1"], list): + out += row["related_skyc1"].copy() return out @@ -547,17 +510,13 @@ def cross_join(left: pd.DataFrame, right: pd.DataFrame) -> pd.DataFrame: Returns: The resultant merged DataFrame. """ - return ( - left.assign(key=1) - .merge(right.assign(key=1), on='key') - .drop('key', axis=1) - ) + return left.assign(key=1).merge(right.assign(key=1), on="key").drop("key", axis=1) def get_eta_metric( row: Dict[str, float], df: pd.DataFrame, peak: bool = False ) -> float: - ''' + """ Calculates the eta variability metric of a source. Works on the grouped by dataframe using the fluxes of the associated measurements. @@ -571,23 +530,22 @@ def get_eta_metric( Returns: The calculated eta value. - ''' - if row['n_meas'] == 1: - return 0. - - suffix = 'peak' if peak else 'int' - weights = 1. / df[f'flux_{suffix}_err'].values**2 - fluxes = df[f'flux_{suffix}'].values - eta = (row['n_meas'] / (row['n_meas']-1)) * ( - (weights * fluxes**2).mean() - ( - (weights * fluxes).mean()**2 / weights.mean() - ) + """ + if row["n_meas"] == 1: + return 0.0 + + suffix = "peak" if peak else "int" + weights = 1.0 / df[f"flux_{suffix}_err"].values ** 2 + fluxes = df[f"flux_{suffix}"].values + eta = (row["n_meas"] / (row["n_meas"] - 1)) * ( + (weights * fluxes**2).mean() + - ((weights * fluxes).mean() ** 2 / weights.mean()) ) return eta def groupby_funcs(df: pd.DataFrame) -> pd.Series: - ''' + """ Performs calculations on the unique sources to get the lightcurve properties. Works on the grouped by source dataframe. @@ -598,69 +556,61 @@ def groupby_funcs(df: pd.DataFrame) -> pd.Series: Returns: Pandas series containing the calculated metrics of the source. - ''' + """ # calculated average ra, dec, fluxes and metrics d = {} - d['img_list'] = df['image'].values.tolist() - d['n_meas_forced'] = df['forced'].sum() - d['n_meas'] = df['id'].count() - d['n_meas_sel'] = d['n_meas'] - d['n_meas_forced'] - d['n_sibl'] = df['has_siblings'].sum() - if d['n_meas_forced'] > 0: - non_forced_sel = ~df['forced'] - d['wavg_ra'] = ( - df.loc[non_forced_sel, 'interim_ew'].sum() / - df.loc[non_forced_sel, 'weight_ew'].sum() + d["img_list"] = df["image"].values.tolist() + d["n_meas_forced"] = df["forced"].sum() + d["n_meas"] = df["id"].count() + d["n_meas_sel"] = d["n_meas"] - d["n_meas_forced"] + d["n_sibl"] = df["has_siblings"].sum() + if d["n_meas_forced"] > 0: + non_forced_sel = ~df["forced"] + d["wavg_ra"] = ( + df.loc[non_forced_sel, "interim_ew"].sum() + / df.loc[non_forced_sel, "weight_ew"].sum() ) - d['wavg_dec'] = ( - df.loc[non_forced_sel, 'interim_ns'].sum() / - df.loc[non_forced_sel, 'weight_ns'].sum() + d["wavg_dec"] = ( + df.loc[non_forced_sel, "interim_ns"].sum() + / df.loc[non_forced_sel, "weight_ns"].sum() ) - d['avg_compactness'] = df.loc[ - non_forced_sel, 'compactness' - ].mean() - d['min_snr'] = df.loc[ - non_forced_sel, 'snr' - ].min() - d['max_snr'] = df.loc[ - non_forced_sel, 'snr' - ].max() + d["avg_compactness"] = df.loc[non_forced_sel, "compactness"].mean() + d["min_snr"] = df.loc[non_forced_sel, "snr"].min() + d["max_snr"] = df.loc[non_forced_sel, "snr"].max() else: - d['wavg_ra'] = df['interim_ew'].sum() / df['weight_ew'].sum() - d['wavg_dec'] = df['interim_ns'].sum() / df['weight_ns'].sum() - d['avg_compactness'] = df['compactness'].mean() - d['min_snr'] = df['snr'].min() - d['max_snr'] = df['snr'].max() - - d['wavg_uncertainty_ew'] = 1. / np.sqrt(df['weight_ew'].sum()) - d['wavg_uncertainty_ns'] = 1. / np.sqrt(df['weight_ns'].sum()) - for col in ['avg_flux_int', 'avg_flux_peak']: - d[col] = df[col.split('_', 1)[1]].mean() - for col in ['max_flux_peak', 'max_flux_int']: - d[col] = df[col.split('_', 1)[1]].max() - for col in ['min_flux_peak', 'min_flux_int']: - d[col] = df[col.split('_', 1)[1]].min() - for col in ['min_flux_peak_isl_ratio', 'min_flux_int_isl_ratio']: - d[col] = df[col.split('_', 1)[1]].min() - - for col in ['flux_int', 'flux_peak']: - d[f'{col}_sq'] = (df[col]**2).mean() - d['v_int'] = df['flux_int'].std() / df['flux_int'].mean() - d['v_peak'] = df['flux_peak'].std() / df['flux_peak'].mean() - d['eta_int'] = get_eta_metric(d, df) - d['eta_peak'] = get_eta_metric(d, df, peak=True) + d["wavg_ra"] = df["interim_ew"].sum() / df["weight_ew"].sum() + d["wavg_dec"] = df["interim_ns"].sum() / df["weight_ns"].sum() + d["avg_compactness"] = df["compactness"].mean() + d["min_snr"] = df["snr"].min() + d["max_snr"] = df["snr"].max() + + d["wavg_uncertainty_ew"] = 1.0 / np.sqrt(df["weight_ew"].sum()) + d["wavg_uncertainty_ns"] = 1.0 / np.sqrt(df["weight_ns"].sum()) + for col in ["avg_flux_int", "avg_flux_peak"]: + d[col] = df[col.split("_", 1)[1]].mean() + for col in ["max_flux_peak", "max_flux_int"]: + d[col] = df[col.split("_", 1)[1]].max() + for col in ["min_flux_peak", "min_flux_int"]: + d[col] = df[col.split("_", 1)[1]].min() + for col in ["min_flux_peak_isl_ratio", "min_flux_int_isl_ratio"]: + d[col] = df[col.split("_", 1)[1]].min() + + for col in ["flux_int", "flux_peak"]: + d[f"{col}_sq"] = (df[col] ** 2).mean() + d["v_int"] = df["flux_int"].std() / df["flux_int"].mean() + d["v_peak"] = df["flux_peak"].std() / df["flux_peak"].mean() + d["eta_int"] = get_eta_metric(d, df) + d["eta_peak"] = get_eta_metric(d, df, peak=True) # remove not used cols - for col in ['flux_int_sq', 'flux_peak_sq']: + for col in ["flux_int_sq", "flux_peak_sq"]: d.pop(col) # get unique related sources - list_uniq_related = list(set( - chain.from_iterable( - lst for lst in df['related'] if isinstance(lst, list) - ) - )) - d['related_list'] = list_uniq_related if list_uniq_related else -1 + list_uniq_related = list( + set(chain.from_iterable(lst for lst in df["related"] if isinstance(lst, list))) + ) + d["related_list"] = list_uniq_related if list_uniq_related else -1 return pd.Series(d).fillna(value={"v_int": 0.0, "v_peak": 0.0}) @@ -677,44 +627,41 @@ def parallel_groupby(df: pd.DataFrame) -> pd.DataFrame: The source dataframe with the calculated metric columns. """ col_dtype = { - 'img_list': 'O', - 'n_meas_forced': 'i', - 'n_meas': 'i', - 'n_meas_sel': 'i', - 'n_sibl': 'i', - 'wavg_ra': 'f', - 'wavg_dec': 'f', - 'avg_compactness': 'f', - 'min_snr': 'f', - 'max_snr': 'f', - 'wavg_uncertainty_ew': 'f', - 'wavg_uncertainty_ns': 'f', - 'avg_flux_int': 'f', - 'avg_flux_peak': 'f', - 'max_flux_peak': 'f', - 'max_flux_int': 'f', - 'min_flux_peak': 'f', - 'min_flux_int': 'f', - 'min_flux_peak_isl_ratio': 'f', - 'min_flux_int_isl_ratio': 'f', - 'v_int': 'f', - 'v_peak': 'f', - 'eta_int': 'f', - 'eta_peak': 'f', - 'related_list': 'O' + "img_list": "O", + "n_meas_forced": "i", + "n_meas": "i", + "n_meas_sel": "i", + "n_sibl": "i", + "wavg_ra": "f", + "wavg_dec": "f", + "avg_compactness": "f", + "min_snr": "f", + "max_snr": "f", + "wavg_uncertainty_ew": "f", + "wavg_uncertainty_ns": "f", + "avg_flux_int": "f", + "avg_flux_peak": "f", + "max_flux_peak": "f", + "max_flux_int": "f", + "min_flux_peak": "f", + "min_flux_int": "f", + "min_flux_peak_isl_ratio": "f", + "min_flux_int_isl_ratio": "f", + "v_int": "f", + "v_peak": "f", + "eta_int": "f", + "eta_peak": "f", + "related_list": "O", } n_cpu = cpu_count() - 1 out = dd.from_pandas(df, n_cpu) out = ( - out.groupby('source') - .apply( - groupby_funcs, - meta=col_dtype - ) - .compute(num_workers=n_cpu, scheduler='processes') + out.groupby("source") + .apply(groupby_funcs, meta=col_dtype) + .compute(num_workers=n_cpu, scheduler="processes") ) - out['n_rel'] = out['related_list'].apply(lambda x: 0 if x == -1 else len(x)) + out["n_rel"] = out["related_list"].apply(lambda x: 0 if x == -1 else len(x)) return out @@ -734,11 +681,11 @@ def calc_ave_coord(grp: pd.DataFrame) -> pd.Series: image and epoch lists. """ d = {} - grp = grp.sort_values(by='datetime') - d['img_list'] = grp['image'].values.tolist() - d['epoch_list'] = grp['epoch'].values.tolist() - d['wavg_ra'] = grp['interim_ew'].sum() / grp['weight_ew'].sum() - d['wavg_dec'] = grp['interim_ns'].sum() / grp['weight_ns'].sum() + grp = grp.sort_values(by="datetime") + d["img_list"] = grp["image"].values.tolist() + d["epoch_list"] = grp["epoch"].values.tolist() + d["wavg_ra"] = grp["interim_ew"].sum() / grp["weight_ew"].sum() + d["wavg_dec"] = grp["interim_ns"].sum() / grp["weight_ns"].sum() return pd.Series(d) @@ -757,24 +704,24 @@ def parallel_groupby_coord(df: pd.DataFrame) -> pd.DataFrame: lists for each unique source (group). """ col_dtype = { - 'img_list': 'O', - 'epoch_list': 'O', - 'wavg_ra': 'f', - 'wavg_dec': 'f', + "img_list": "O", + "epoch_list": "O", + "wavg_ra": "f", + "wavg_dec": "f", } n_cpu = cpu_count() - 1 out = dd.from_pandas(df, n_cpu) out = ( - out.groupby('source') + out.groupby("source") .apply(calc_ave_coord, meta=col_dtype) - .compute(num_workers=n_cpu, scheduler='processes') + .compute(num_workers=n_cpu, scheduler="processes") ) return out def get_rms_noise_image_values(rms_path: str) -> Tuple[float, float, float]: - ''' + """ Open the RMS noise FITS file and compute the median, max and min rms values to be added to the image model and then used in the calculations. @@ -789,20 +736,20 @@ def get_rms_noise_image_values(rms_path: str) -> Tuple[float, float, float]: Raises: IOError: Raised when the RMS FITS file cannot be found. - ''' - logger.debug('Extracting Image RMS values from Noise file...') - med_val = min_val = max_val = 0. + """ + logger.debug("Extracting Image RMS values from Noise file...") + med_val = min_val = max_val = 0.0 try: with open_fits(rms_path) as f: data = f[0].data data = data[np.logical_not(np.isnan(data))] data = data[data != 0] - med_val = np.median(data) * 1e+3 - min_val = np.min(data) * 1e+3 - max_val = np.max(data) * 1e+3 + med_val = np.median(data) * 1e3 + min_val = np.min(data) * 1e3 + max_val = np.max(data) * 1e3 del data except Exception: - raise IOError(f'Could not read this RMS FITS file: {rms_path}') + raise IOError(f"Could not read this RMS FITS file: {rms_path}") return med_val, min_val, max_val @@ -821,9 +768,7 @@ def get_image_list_diff(row: pd.Series) -> Union[List[str], int]: A list of the images missing from the observed image list. A '-1' integer value if there are no missing images. """ - out = list( - filter(lambda arg: arg not in row['img_list'], row['skyreg_img_list']) - ) + out = list(filter(lambda arg: arg not in row["img_list"], row["skyreg_img_list"])) # set empty list to -1 if not out: @@ -832,15 +777,15 @@ def get_image_list_diff(row: pd.Series) -> Union[List[str], int]: # Check that an epoch has not already been seen (just not in the 'ideal' # image) out_epochs = [ - row['skyreg_epoch'][pair[0]] for pair in enumerate( - row['skyreg_img_list'] - ) if pair[1] in out + row["skyreg_epoch"][pair[0]] + for pair in enumerate(row["skyreg_img_list"]) + if pair[1] in out ] out = [ - out[pair[0]] for pair in enumerate( - out_epochs - ) if pair[1] not in row['epoch_list'] + out[pair[0]] + for pair in enumerate(out_epochs) + if pair[1] not in row["epoch_list"] ] if not out: @@ -863,11 +808,20 @@ def get_names_and_epochs(grp: pd.DataFrame) -> pd.Series: image names, epochs and datetimes. """ d = {} - d['skyreg_img_epoch_list'] = [[[x, ], y, z] for x, y, z in zip( - grp['name'].values.tolist(), - grp['epoch'].values.tolist(), - grp['datetime'].values.tolist() - )] + d["skyreg_img_epoch_list"] = [ + [ + [ + x, + ], + y, + z, + ] + for x, y, z in zip( + grp["name"].values.tolist(), + grp["epoch"].values.tolist(), + grp["datetime"].values.tolist(), + ) + ] return pd.Series(d) @@ -884,7 +838,7 @@ def check_primary_image(row: pd.Series) -> bool: Returns: True if primary in image list else False. """ - return row['primary'] in row['img_list'] + return row["primary"] in row["img_list"] def get_src_skyregion_merged_df( @@ -951,32 +905,22 @@ def get_src_skyregion_merged_df( merged_timer = StopWatch() - skyreg_df = skyreg_df.drop( - ['x', 'y', 'z', 'width_ra', 'width_dec'], axis=1 - ) + skyreg_df = skyreg_df.drop(["x", "y", "z", "width_ra", "width_dec"], axis=1) - images_df['name'] = images_df['image_dj'].apply( - lambda x: x.name - ) - images_df['datetime'] = images_df['image_dj'].apply( - lambda x: x.datetime - ) + images_df["name"] = images_df["image_dj"].apply(lambda x: x.name) + images_df["datetime"] = images_df["image_dj"].apply(lambda x: x.datetime) skyreg_df = skyreg_df.join( - pd.DataFrame( - images_df.groupby('skyreg_id').apply( - get_names_and_epochs - ) - ), - on='id' + pd.DataFrame(images_df.groupby("skyreg_id").apply(get_names_and_epochs)), + on="id", ) - sources_df = sources_df.sort_values(by='datetime') + sources_df = sources_df.sort_values(by="datetime") # calculate some metrics on sources # compute only some necessary metrics in the groupby timer = StopWatch() srcs_df = parallel_groupby_coord(sources_df) - logger.debug('Groupby-apply time: %.2f seconds', timer.reset()) + logger.debug("Groupby-apply time: %.2f seconds", timer.reset()) del sources_df @@ -1009,89 +953,60 @@ def get_src_skyregion_merged_df( del skyreg_df - src_skyrg_df[ - ['skyreg_img_list', 'skyreg_epoch', 'skyreg_datetime'] - ] = pd.DataFrame( - src_skyrg_df['skyreg_img_epoch_list'].tolist(), - index=src_skyrg_df.index + src_skyrg_df[["skyreg_img_list", "skyreg_epoch", "skyreg_datetime"]] = pd.DataFrame( + src_skyrg_df["skyreg_img_epoch_list"].tolist(), index=src_skyrg_df.index ) - src_skyrg_df = src_skyrg_df.drop('skyreg_img_epoch_list', axis=1) + src_skyrg_df = src_skyrg_df.drop("skyreg_img_epoch_list", axis=1) src_skyrg_df = ( - src_skyrg_df.sort_values( - ['source', 'sep'] - ) - .drop_duplicates(['source', 'skyreg_epoch']) - .sort_values(by='skyreg_datetime') - .drop( - ['sep', 'skyreg_datetime'], - axis=1 - ) + src_skyrg_df.sort_values(["source", "sep"]) + .drop_duplicates(["source", "skyreg_epoch"]) + .sort_values(by="skyreg_datetime") + .drop(["sep", "skyreg_datetime"], axis=1) ) # annoyingly epoch needs to be not a list to drop duplicates # but then we need to sum the epochs into a list - src_skyrg_df['skyreg_epoch'] = src_skyrg_df['skyreg_epoch'].apply( - lambda x: [x, ] + src_skyrg_df["skyreg_epoch"] = src_skyrg_df["skyreg_epoch"].apply( + lambda x: [ + x, + ] ) - src_skyrg_df = ( - src_skyrg_df.groupby('source') - .sum(numeric_only=False) # sum because we need to preserve order - ) + src_skyrg_df = src_skyrg_df.groupby("source").sum( + numeric_only=False + ) # sum because we need to preserve order # merge into main df and compare the images - srcs_df = srcs_df.merge( - src_skyrg_df, left_index=True, right_index=True - ) + srcs_df = srcs_df.merge(src_skyrg_df, left_index=True, right_index=True) del src_skyrg_df - srcs_df['img_diff'] = srcs_df[ - ['img_list', 'skyreg_img_list', 'epoch_list', 'skyreg_epoch'] - ].apply( - get_image_list_diff, axis=1 - ) + srcs_df["img_diff"] = srcs_df[ + ["img_list", "skyreg_img_list", "epoch_list", "skyreg_epoch"] + ].apply(get_image_list_diff, axis=1) - srcs_df = srcs_df.loc[ - srcs_df['img_diff'] != -1 - ] + srcs_df = srcs_df.loc[srcs_df["img_diff"] != -1] - srcs_df = srcs_df.drop( - ['epoch_list', 'skyreg_epoch'], - axis=1 - ) + srcs_df = srcs_df.drop(["epoch_list", "skyreg_epoch"], axis=1) - srcs_df['primary'] = srcs_df[ - 'skyreg_img_list' - ].apply(lambda x: x[0]) + srcs_df["primary"] = srcs_df["skyreg_img_list"].apply(lambda x: x[0]) - srcs_df['detection'] = srcs_df[ - 'img_list' - ].apply(lambda x: x[0]) + srcs_df["detection"] = srcs_df["img_list"].apply(lambda x: x[0]) - srcs_df['in_primary'] = srcs_df[ - ['primary', 'img_list'] - ].apply( - check_primary_image, - axis=1 + srcs_df["in_primary"] = srcs_df[["primary", "img_list"]].apply( + check_primary_image, axis=1 ) - srcs_df = srcs_df.drop(['img_list', 'skyreg_img_list', 'primary'], axis=1) + srcs_df = srcs_df.drop(["img_list", "skyreg_img_list", "primary"], axis=1) - logger.info( - 'Ideal source coverage time: %.2f seconds', merged_timer.reset() - ) + logger.info("Ideal source coverage time: %.2f seconds", merged_timer.reset()) return srcs_df -def _get_skyregion_relations( - row: pd.Series, - coords: SkyCoord, - ids: pd.core.indexes.numeric.Int64Index -) -> List[int]: - ''' +def _get_skyregion_relations(row: pd.Series, coords: SkyCoord, ids: int) -> List[int]: + """ For each sky region row a list is returned that contains the ids of other sky regions that overlap with the row sky region (including itself). @@ -1107,18 +1022,14 @@ def _get_skyregion_relations( Returns: A list of other sky regions (including self) that are within the 'xtr_radius' of the sky region in the row. - ''' - target = SkyCoord( - row['centre_ra'], - row['centre_dec'], - unit=(u.deg, u.deg) - ) + """ + target = SkyCoord(row["centre_ra"], row["centre_dec"], unit=(u.deg, u.deg)) seps = target.separation(coords) # place a slight buffer on the radius to make sure # any neighbouring fields are caught - mask = seps <= row['xtr_radius'] * 1.1 * u.deg + mask = seps <= row["xtr_radius"] * 1.1 * u.deg related_ids = ids[mask].to_list() @@ -1155,28 +1066,19 @@ def group_skyregions(df: pd.DataFrame) -> pd.DataFrame: | 1 | 2 | +----+----------------+ """ - sr_coords = SkyCoord( - df['centre_ra'], - df['centre_dec'], - unit=(u.deg, u.deg) - ) + sr_coords = SkyCoord(df["centre_ra"], df["centre_dec"], unit=(u.deg, u.deg)) - df = df.set_index('id') + df = df.set_index("id") - results = df.apply( - _get_skyregion_relations, - args=(sr_coords, df.index), - axis=1 - ) + results = df.apply(_get_skyregion_relations, args=(sr_coords, df.index), axis=1) skyreg_groups: Dict[int, List[Any]] = {} master_done = [] # keep track of all checked ids in master done - for skyreg_id, neighbours in results.iteritems(): - + for skyreg_id, neighbours in results.items(): if skyreg_id not in master_done: - local_done = [] # a local done list for the sky region group. + local_done = [] # a local done list for the sky region group. # add the current skyreg_id to both master and local done. master_done.append(skyreg_id) local_done.append(skyreg_id) @@ -1221,9 +1123,9 @@ def group_skyregions(df: pd.DataFrame) -> pd.DataFrame: for j in skyreg_groups[i]: skyreg_group_ids[j] = i - skyreg_group_ids = pd.DataFrame.from_dict( - skyreg_group_ids, orient='index' - ).rename(columns={0: 'skyreg_group'}) + skyreg_group_ids = pd.DataFrame.from_dict(skyreg_group_ids, orient="index").rename( + columns={0: "skyreg_group"} + ) return skyreg_group_ids @@ -1264,27 +1166,22 @@ def get_parallel_assoc_image_df( # | 6 | VAST_2118-06A.EPOCH06x.I.fits | 3 | 1 | # | 7 | VAST_0127-73A.EPOCH08.I.fits | 1 | 2 | # +----+-------------------------------+-------------+----------------+ - skyreg_ids = [i.skyreg_id for i in images] + skyreg_ids = [str(i.skyreg_id) for i in images] - images_df = pd.DataFrame({ - 'image_dj': images, - 'skyreg_id': skyreg_ids, - }) + images_df = pd.DataFrame( + { + "image_dj": images, + "skyreg_id": skyreg_ids, + } + ) images_df = images_df.merge( - skyregion_groups, - how='left', - left_on='skyreg_id', - right_index=True + skyregion_groups, how="left", left_on="skyreg_id", right_index=True ) - images_df['image_name'] = images_df['image_dj'].apply( - lambda x: x.name - ) + images_df["image_name"] = images_df["image_dj"].apply(lambda x: x.name) - images_df['image_datetime'] = images_df['image_dj'].apply( - lambda x: x.datetime - ) + images_df["image_datetime"] = images_df["image_dj"].apply(lambda x: x.datetime) return images_df @@ -1301,58 +1198,41 @@ def create_measurements_arrow_file(p_run: Run) -> None: Returns: None """ - logger.info('Creating measurements.arrow for run %s.', p_run.name) + logger.info("Creating measurements.arrow for run %s.", p_run.name) - associations = pd.read_parquet( - os.path.join( - p_run.path, - 'associations.parquet' - ) - ) - images = pd.read_parquet( - os.path.join( - p_run.path, - 'images.parquet' - ) - ) + associations = pd.read_parquet(os.path.join(p_run.path, "associations.parquet")) + images = pd.read_parquet(os.path.join(p_run.path, "images.parquet")) - m_files = images['measurements_path'].tolist() + m_files = images["measurements_path"].tolist() - m_files += glob.glob(os.path.join( - p_run.path, - 'forced*.parquet' - )) + m_files += glob.glob(os.path.join(p_run.path, "forced*.parquet")) - logger.debug('Loading %i files...', len(m_files)) - measurements = dd.read_parquet(m_files, engine='pyarrow').compute() + logger.debug("Loading %i files...", len(m_files)) + measurements = dd.read_parquet(m_files, engine="pyarrow").compute() measurements = measurements.loc[ - measurements['id'].isin(associations['meas_id'].values) + measurements["id"].isin(associations["meas_id"].values) ] measurements = ( - associations.loc[:, ['meas_id', 'source_id']] - .set_index('meas_id') - .merge( - measurements, - left_index=True, - right_on='id' - ) - .rename(columns={'source_id': 'source'}) + associations.loc[:, ["meas_id", "source_id"]] + .set_index("meas_id") + .merge(measurements, left_index=True, right_on="id") + .rename(columns={"source_id": "source"}) ) # drop timezone from datetime for vaex compatibility # TODO: Look to keep the timezone if/when vaex is compatible. - measurements['time'] = measurements['time'].dt.tz_localize(None) + measurements["time"] = measurements["time"].dt.tz_localize(None) - logger.debug('Optimising dataframes.') + logger.debug("Optimising dataframes.") measurements = optimize_ints(optimize_floats(measurements)) logger.debug("Loading to pyarrow table.") measurements = pa.Table.from_pandas(measurements) logger.debug("Exporting to arrow file.") - outname = os.path.join(p_run.path, 'measurements.arrow') + outname = os.path.join(p_run.path, "measurements.arrow") local = pa.fs.LocalFileSystem() @@ -1373,23 +1253,20 @@ def create_measurement_pairs_arrow_file(p_run: Run) -> None: Returns: None """ - logger.info('Creating measurement_pairs.arrow for run %s.', p_run.name) + logger.info("Creating measurement_pairs.arrow for run %s.", p_run.name) measurement_pairs_df = pd.read_parquet( - os.path.join( - p_run.path, - 'measurement_pairs.parquet' - ) + os.path.join(p_run.path, "measurement_pairs.parquet") ) - logger.debug('Optimising dataframe.') + logger.debug("Optimising dataframe.") measurement_pairs_df = optimize_ints(optimize_floats(measurement_pairs_df)) logger.debug("Loading to pyarrow table.") measurement_pairs_df = pa.Table.from_pandas(measurement_pairs_df) logger.debug("Exporting to arrow file.") - outname = os.path.join(p_run.path, 'measurement_pairs.arrow') + outname = os.path.join(p_run.path, "measurement_pairs.arrow") local = pa.fs.LocalFileSystem() @@ -1413,12 +1290,13 @@ def backup_parquets(p_run_path: str) -> None: parquets = ( glob.glob(os.path.join(p_run_path, "*.parquet")) # TODO Remove arrow when arrow files are no longer required. - + glob.glob(os.path.join(p_run_path, "*.arrow"))) + + glob.glob(os.path.join(p_run_path, "*.arrow")) + ) for i in parquets: - backup_name = i + '.bak' + backup_name = i + ".bak" if os.path.isfile(backup_name): - logger.debug(f'Removing old backup file: {backup_name}.') + logger.debug(f"Removing old backup file: {backup_name}.") os.remove(backup_name) shutil.copyfile(i, backup_name) @@ -1437,18 +1315,17 @@ def create_temp_config_file(p_run_path: str) -> None: Returns: None """ - config_name = 'config.yaml' - temp_config_name = 'config_temp.yaml' + config_name = "config.yaml" + temp_config_name = "config_temp.yaml" shutil.copyfile( os.path.join(p_run_path, config_name), - os.path.join(p_run_path, temp_config_name) + os.path.join(p_run_path, temp_config_name), ) def reconstruct_associtaion_dfs( - images_df_done: pd.DataFrame, - previous_parquet_paths: Dict[str, str] + images_df_done: pd.DataFrame, previous_parquet_paths: Dict[str, str] ) -> Tuple[pd.DataFrame, pd.DataFrame]: """ This function is used with add image mode and performs the necessary @@ -1467,27 +1344,22 @@ def reconstruct_associtaion_dfs( The reconstructed `sources_df` dataframe. The reconstructed `skyc1_srs` dataframes. """ - prev_associations = pd.read_parquet(previous_parquet_paths['associations']) + prev_associations = pd.read_parquet(previous_parquet_paths["associations"]) # Get the parquet paths from the image objects img_meas_paths = ( - images_df_done['image_dj'].apply(lambda x: x.measurements_path) - .to_list() + images_df_done["image_dj"].apply(lambda x: x.measurements_path).to_list() ) # Obtain the pipeline run path in order to fetch forced measurements. - run_path = previous_parquet_paths['sources'].replace( - 'sources.parquet.bak', '' - ) + run_path = previous_parquet_paths["sources"].replace("sources.parquet.bak", "") # Get the forced measurement paths. img_fmeas_paths = [] for i in images_df_done.image_name.values: forced_parquet = os.path.join( - run_path, "forced_measurements_{}.parquet".format( - i.replace(".", "_") - ) + run_path, "forced_measurements_{}.parquet".format(i.replace(".", "_")) ) if os.path.isfile(forced_parquet): img_fmeas_paths.append(forced_parquet) @@ -1497,178 +1369,229 @@ def reconstruct_associtaion_dfs( # Define the columns that are required cols = [ - 'id', - 'ra', - 'uncertainty_ew', - 'weight_ew', - 'dec', - 'uncertainty_ns', - 'weight_ns', - 'flux_int', - 'flux_int_err', - 'flux_int_isl_ratio', - 'flux_peak', - 'flux_peak_err', - 'flux_peak_isl_ratio', - 'forced', - 'compactness', - 'has_siblings', - 'snr', - 'image_id', - 'time', + "id", + "ra", + "uncertainty_ew", + "weight_ew", + "dec", + "uncertainty_ns", + "weight_ns", + "flux_int", + "flux_int_err", + "flux_int_isl_ratio", + "flux_peak", + "flux_peak_err", + "flux_peak_isl_ratio", + "forced", + "compactness", + "has_siblings", + "snr", + "image_id", + "time", ] # Open all the parquets - logger.debug( - "Opening all measurement parquet files to use in reconstruction..." - ) - measurements = pd.concat( - [pd.read_parquet(f, columns=cols) for f in img_meas_paths] - ) + logger.debug("Opening all measurement parquet files to use in reconstruction...") + measurements = pd.concat([pd.read_parquet(f, columns=cols) for f in img_meas_paths]) # Create mask to drop measurements for epoch mode (epoch based mode). - measurements_mask = measurements['id'].isin( - prev_associations['meas_id']) - measurements = measurements.loc[measurements_mask].set_index('id') + measurements_mask = measurements["id"].isin(prev_associations["meas_id"]) + measurements = measurements.loc[measurements_mask].set_index("id") # Set the index on images_df for faster merging. - images_df_done['image_id'] = images_df_done['image_dj'].apply( - lambda x: x.id).values - images_df_done = images_df_done.set_index('image_id') + images_df_done["image_id"] = images_df_done["image_dj"].apply(lambda x: str(x.id)).values + images_df_done = images_df_done.set_index("image_id") # Merge image information to measurements - measurements = ( - measurements.merge( - images_df_done[['image_name', 'epoch']], - left_on='image_id', right_index=True - ) - .rename(columns={'image_name': 'image'}) - ) + measurements = measurements.merge( + images_df_done[["image_name", "epoch"]], left_on="image_id", right_index=True + ).rename(columns={"image_name": "image"}) # Drop any associations that are not used in this sky region group. - associations_mask = prev_associations['meas_id'].isin( - measurements.index.values) + associations_mask = prev_associations["meas_id"].isin(measurements.index.values) prev_associations = prev_associations.loc[associations_mask] # Merge measurements into the associations to form the sources_df. - sources_df = ( - prev_associations.merge( - measurements, left_on='meas_id', right_index=True - ) - .rename(columns={ - 'source_id': 'source', 'time': 'datetime', 'meas_id': 'id', - 'ra': 'ra_source', 'dec': 'dec_source', - 'uncertainty_ew': 'uncertainty_ew_source', - 'uncertainty_ns': 'uncertainty_ns_source', - }) + sources_df = prev_associations.merge( + measurements, left_on="meas_id", right_index=True + ).rename( + columns={ + "source_id": "source", + "time": "datetime", + "meas_id": "id", + "ra": "ra_source", + "dec": "dec_source", + "uncertainty_ew": "uncertainty_ew_source", + "uncertainty_ns": "uncertainty_ns_source", + } ) # Load up the previous unique sources. prev_sources = pd.read_parquet( - previous_parquet_paths['sources'], columns=[ - 'wavg_ra', 'wavg_dec', - 'wavg_uncertainty_ew', 'wavg_uncertainty_ns', - ] + previous_parquet_paths["sources"], + columns=[ + "wavg_ra", + "wavg_dec", + "wavg_uncertainty_ew", + "wavg_uncertainty_ns", + ], ) # Merge the wavg ra and dec to the sources_df - this is required to # create the skyc1_srcs below (but MUST be converted back to the source # ra and dec) - sources_df = ( - sources_df.merge( - prev_sources, left_on='source', right_index=True) - .rename(columns={ - 'wavg_ra': 'ra', 'wavg_dec': 'dec', - 'wavg_uncertainty_ew': 'uncertainty_ew', - 'wavg_uncertainty_ns': 'uncertainty_ns', - }) + sources_df = sources_df.merge( + prev_sources, left_on="source", right_index=True + ).rename( + columns={ + "wavg_ra": "ra", + "wavg_dec": "dec", + "wavg_uncertainty_ew": "uncertainty_ew", + "wavg_uncertainty_ns": "uncertainty_ns", + } ) # Load the previous relations - prev_relations = pd.read_parquet(previous_parquet_paths['relations']) + prev_relations = pd.read_parquet(previous_parquet_paths["relations"]) # Form relation lists to merge in. prev_relations = pd.DataFrame( - prev_relations - .groupby('from_source_id')['to_source_id'] - .apply(lambda x: x.values.tolist()) - ).rename(columns={'to_source_id': 'related'}) + prev_relations.groupby("from_source_id")["to_source_id"].apply( + lambda x: x.values.tolist() + ) + ).rename(columns={"to_source_id": "related"}) # Append the relations to only the last instance of each source # First get the ids of the sources - relation_ids = sources_df[ - sources_df.source.isin(prev_relations.index.values)].drop_duplicates( - 'source', keep='last' - ).index.values + relation_ids = ( + sources_df[sources_df.source.isin(prev_relations.index.values)] + .drop_duplicates("source", keep="last") + .index.values + ) # Make sure we attach the correct source id source_ids = sources_df.loc[relation_ids].source.values - sources_df['related'] = np.nan + sources_df["related"] = np.nan relations_to_update = prev_relations.loc[source_ids].to_numpy().copy() - relations_to_update = np.reshape( - relations_to_update, relations_to_update.shape[0]) - sources_df.loc[relation_ids, 'related'] = relations_to_update + relations_to_update = np.reshape(relations_to_update, relations_to_update.shape[0]) + sources_df.loc[relation_ids, "related"] = relations_to_update # Reorder so we don't mess up the dask metas. - sources_df = sources_df[[ - 'id', 'uncertainty_ew', 'weight_ew', 'uncertainty_ns', 'weight_ns', - 'flux_int', 'flux_int_err', 'flux_int_isl_ratio', 'flux_peak', - 'flux_peak_err', 'flux_peak_isl_ratio', 'forced', 'compactness', - 'has_siblings', 'snr', 'image', 'datetime', 'source', 'ra', 'dec', - 'ra_source', 'dec_source', 'd2d', 'dr', 'related', 'epoch', - 'uncertainty_ew_source', 'uncertainty_ns_source' - ]] + sources_df = sources_df[ + [ + "id", + "uncertainty_ew", + "weight_ew", + "uncertainty_ns", + "weight_ns", + "flux_int", + "flux_int_err", + "flux_int_isl_ratio", + "flux_peak", + "flux_peak_err", + "flux_peak_isl_ratio", + "forced", + "compactness", + "has_siblings", + "snr", + "image", + "datetime", + "source", + "ra", + "dec", + "ra_source", + "dec_source", + "d2d", + "dr", + "related", + "epoch", + "uncertainty_ew_source", + "uncertainty_ns_source", + ] + ] # Create the unique skyc1_srcs dataframe. skyc1_srcs = ( - sources_df[~sources_df['forced']] - .sort_values(by='id') - .drop('related', axis=1) - .drop_duplicates('source') + sources_df[~sources_df["forced"]] + .sort_values(by="id") + .drop("related", axis=1) + .drop_duplicates("source") ).copy(deep=True) # Get relations into the skyc1_srcs (as we only keep the first instance # which does not have the relation information) skyc1_srcs = skyc1_srcs.merge( - prev_relations, how='left', left_on='source', right_index=True + prev_relations, how="left", left_on="source", right_index=True ) # Need to break the pointer relationship between the related sources ( # deep=True copy does not truly copy mutable type objects) relation_mask = skyc1_srcs.related.notna() - relation_vals = skyc1_srcs.loc[relation_mask, 'related'].to_list() - new_relation_vals = [x.copy() for x in relation_vals] - skyc1_srcs.loc[relation_mask, 'related'] = new_relation_vals + relation_vals = skyc1_srcs.loc[relation_mask, "related"].to_list() + new_relation_vals = np.array([x.copy() for x in relation_vals], dtype='object') + skyc1_srcs.loc[relation_mask, "related"] = new_relation_vals # Reorder so we don't mess up the dask metas. - skyc1_srcs = skyc1_srcs[[ - 'id', 'ra', 'uncertainty_ew', 'weight_ew', 'dec', 'uncertainty_ns', - 'weight_ns', 'flux_int', 'flux_int_err', 'flux_int_isl_ratio', - 'flux_peak', 'flux_peak_err', 'flux_peak_isl_ratio', 'forced', - 'compactness', 'has_siblings', 'snr', 'image', 'datetime', 'source', - 'ra_source', 'dec_source', 'd2d', 'dr', 'related', 'epoch' - ]].reset_index(drop=True) + skyc1_srcs = skyc1_srcs[ + [ + "id", + "ra", + "uncertainty_ew", + "weight_ew", + "dec", + "uncertainty_ns", + "weight_ns", + "flux_int", + "flux_int_err", + "flux_int_isl_ratio", + "flux_peak", + "flux_peak_err", + "flux_peak_isl_ratio", + "forced", + "compactness", + "has_siblings", + "snr", + "image", + "datetime", + "source", + "ra_source", + "dec_source", + "d2d", + "dr", + "related", + "epoch", + ] + ].reset_index(drop=True) # Finally move the source ra and dec back to the sources_df ra and dec # columns - sources_df['ra'] = sources_df['ra_source'] - sources_df['dec'] = sources_df['dec_source'] - sources_df['uncertainty_ew'] = sources_df['uncertainty_ew_source'] - sources_df['uncertainty_ns'] = sources_df['uncertainty_ns_source'] + sources_df["ra"] = sources_df["ra_source"] + sources_df["dec"] = sources_df["dec_source"] + sources_df["uncertainty_ew"] = sources_df["uncertainty_ew_source"] + sources_df["uncertainty_ns"] = sources_df["uncertainty_ns_source"] # Drop not needed columns for the sources_df. - sources_df = sources_df.drop([ - 'uncertainty_ew_source', 'uncertainty_ns_source' - ], axis=1).reset_index(drop=True) + sources_df = sources_df.drop( + ["uncertainty_ew_source", "uncertainty_ns_source"], axis=1 + ).reset_index(drop=True) return sources_df, skyc1_srcs +def _convert_uuid_col_to_str(series: pd.Series) -> pd.Series: + """Converts a UUID column to a string column. + + Args: + series: A pandas series containing UUIDs. + + Returns: + A pandas series containing strings. + """ + return series.astype(str) + + def write_parquets( - images: List[Image], - skyregions: List[SkyRegion], - bands: List[Band], - run_path: str + images: List[Image], skyregions: List[SkyRegion], bands: List[Band], run_path: str ) -> pd.DataFrame: """ This function saves images, skyregions and bands to parquet files. @@ -1686,24 +1609,21 @@ def write_parquets( """ # write images parquet file under pipeline run folder images_df = pd.DataFrame(map(lambda x: x.__dict__, images)) - images_df = images_df.drop('_state', axis=1) - images_df.to_parquet( - os.path.join(run_path, 'images.parquet'), - index=False - ) + images_df = images_df.drop("_state", axis=1) + for col in ["id", "skyreg_id", "band_id"]: + images_df[col] = _convert_uuid_col_to_str(images_df[col]) + images_df.to_parquet(os.path.join(run_path, "images.parquet"), index=False) + # write skyregions parquet file under pipeline run folder skyregs_df = pd.DataFrame(map(lambda x: x.__dict__, skyregions)) - skyregs_df = skyregs_df.drop('_state', axis=1) - skyregs_df.to_parquet( - os.path.join(run_path, 'skyregions.parquet'), - index=False - ) + skyregs_df = skyregs_df.drop("_state", axis=1) + skyregs_df["id"] = _convert_uuid_col_to_str(skyregs_df["id"]) + skyregs_df.to_parquet(os.path.join(run_path, "skyregions.parquet"), index=False) + # write skyregions parquet file under pipeline run folder bands_df = pd.DataFrame(map(lambda x: x.__dict__, bands)) - bands_df = bands_df.drop('_state', axis=1) - bands_df.to_parquet( - os.path.join(run_path, 'bands.parquet'), - index=False - ) + bands_df = bands_df.drop("_state", axis=1) + bands_df["id"] = _convert_uuid_col_to_str(bands_df["id"]) + bands_df.to_parquet(os.path.join(run_path, "bands.parquet"), index=False) return skyregs_df diff --git a/vast_pipeline/plots.py b/vast_pipeline/plots.py index 9068a6390..eaeb23e38 100644 --- a/vast_pipeline/plots.py +++ b/vast_pipeline/plots.py @@ -22,7 +22,7 @@ RadioButtonGroup, Scatter, WheelZoomTool, - ColorBar + ColorBar, ) from bokeh.models.formatters import DatetimeTickFormatter from bokeh.layouts import row, Row, gridplot, Spacer, column @@ -36,6 +36,7 @@ from typing import Tuple from vast_pipeline.models import Measurement, Source +from vast_pipeline.pipeline.utils import _convert_uuid_col_to_str def plot_lightcurve( @@ -72,25 +73,24 @@ def plot_lightcurve( ) .values( "id", - "pk", "taustart_ts", "flux", "flux_err_upper", "flux_err_lower", "forced", - "name" + "name", ) .order_by("taustart_ts") ) # lightcurve required cols: taustart_ts, flux, flux_err_upper, flux_err_lower, forced lightcurve = pd.DataFrame(measurements_qs) + lightcurve["id"] = _convert_uuid_col_to_str(lightcurve["id"]) + # remap method values to labels to make a better legend - lightcurve["method"] = lightcurve.forced.map( - {True: "Forced", False: "Selavy"} - ) - lightcurve['cutout'] = lightcurve['id'].apply( - lambda x: f'/cutout/{x}/normal/?img_type=png' + lightcurve["method"] = lightcurve.forced.map({True: "Forced", False: "Selavy"}) + lightcurve["cutout"] = lightcurve["id"].apply( + lambda x: f"/cutout/{x}/normal/?img_type=png" ) lc_source = ColumnDataSource(lightcurve) @@ -135,7 +135,7 @@ def plot_lightcurve( ) ) fig_lc.xaxis.axis_label = "Datetime" - fig_lc.xaxis[0].formatter = DatetimeTickFormatter(days="%F", hours='%H:%M') + fig_lc.xaxis[0].formatter = DatetimeTickFormatter(days="%F", hours="%H:%M") fig_lc.yaxis.axis_label = ( "Peak flux (mJy/beam)" if use_peak_flux else "Integrated flux (mJy)" ) @@ -162,9 +162,22 @@ def plot_lightcurve( hover_tool_lc_callback = None measurement_pairs = source.get_measurement_pairs() if len(measurement_pairs) > 0: - candidate_measurement_pairs_df = pd.DataFrame(measurement_pairs).query( - f"m_{metric_suffix}.abs() >= {m_abs_min} and vs_{metric_suffix}.abs() >= {vs_abs_min}" - ).reset_index() + candidate_measurement_pairs_df = ( + pd.DataFrame(measurement_pairs) + .query( + f"m_{metric_suffix}.abs() >= {m_abs_min} and vs_{metric_suffix}.abs() >= {vs_abs_min}" + ) + .reset_index() + ) + candidate_measurement_pairs_df["measurement_a_id"] = _convert_uuid_col_to_str( + candidate_measurement_pairs_df["measurement_a_id"] + ) + candidate_measurement_pairs_df["measurement_b_id"] = _convert_uuid_col_to_str( + candidate_measurement_pairs_df["measurement_b_id"] + ) + candidate_measurement_pairs_df["source_id"] = _convert_uuid_col_to_str( + candidate_measurement_pairs_df["source_id"] + ) g = nx.Graph() for _row in candidate_measurement_pairs_df.itertuples(index=False): g.add_edge(_row.measurement_a_id, _row.measurement_b_id) @@ -303,7 +316,9 @@ def plot_lightcurve( """, - formatters={"@taustart_ts": "datetime", }, + formatters={ + "@taustart_ts": "datetime", + }, mode="mouse", callback=hover_tool_lc_callback, ) @@ -311,6 +326,7 @@ def plot_lightcurve( plot_row = row(fig_lc, fig_graph, sizing_mode="stretch_width") plot_row.css_classes.append("mx-auto") + return plot_row @@ -335,21 +351,17 @@ def fit_eta_v( """ if use_peak_flux: - eta_label = 'eta_peak' - v_label = 'v_peak' + eta_label = "eta_peak" + v_label = "v_peak" else: - eta_label = 'eta_int' - v_label = 'v_int' + eta_label = "eta_int" + v_label = "v_int" eta_log = np.log10(df[eta_label]) v_log = np.log10(df[v_label]) - eta_log_clipped = sigma_clip( - eta_log, masked=False, stdfunc=mad_std, sigma=3 - ) - v_log_clipped = sigma_clip( - v_log, masked=False, stdfunc=mad_std, sigma=3 - ) + eta_log_clipped = sigma_clip(eta_log, masked=False, stdfunc=mad_std, sigma=3) + v_log_clipped = sigma_clip(v_log, masked=False, stdfunc=mad_std, sigma=3) eta_fit_mean, eta_fit_sigma = norm.fit(eta_log_clipped) v_fit_mean, v_fit_sigma = norm.fit(v_log_clipped) @@ -358,10 +370,7 @@ def fit_eta_v( def plot_eta_v_bokeh( - source: Source, - eta_sigma: float, - v_sigma: float, - use_peak_flux: bool = True + source: Source, eta_sigma: float, v_sigma: float, use_peak_flux: bool = True ) -> gridplot: """ Adapted from code written by Andrew O'Brien. @@ -381,20 +390,23 @@ def plot_eta_v_bokeh( Bokeh grid object containing figure. """ - df = pd.DataFrame(source.values( - "id", "name", "eta_peak", "eta_int", "v_peak", "v_int", "n_meas_sel" - )) + df = pd.DataFrame( + source.values( + "id", "name", "eta_peak", "eta_int", "v_peak", "v_int", "n_meas_sel" + ) + ) - ( - eta_fit_mean, eta_fit_sigma, - v_fit_mean, v_fit_sigma - ) = fit_eta_v(df, use_peak_flux=use_peak_flux) + df["id"] = _convert_uuid_col_to_str(df["id"]) + + (eta_fit_mean, eta_fit_sigma, v_fit_mean, v_fit_sigma) = fit_eta_v( + df, use_peak_flux=use_peak_flux + ) eta_cutoff_log10 = eta_fit_mean + eta_sigma * eta_fit_sigma v_cutoff_log10 = v_fit_mean + v_sigma * v_fit_sigma - eta_cutoff = 10 ** eta_cutoff_log10 - v_cutoff = 10 ** v_cutoff_log10 + eta_cutoff = 10**eta_cutoff_log10 + v_cutoff = 10**v_cutoff_log10 # generate fitted curve data for plotting eta_x = np.linspace( @@ -410,12 +422,12 @@ def plot_eta_v_bokeh( v_y = norm.pdf(v_x, loc=v_fit_mean, scale=v_fit_sigma) if use_peak_flux: - x_label = 'eta_peak' - y_label = 'v_peak' - title = 'Peak Flux' + x_label = "eta_peak" + y_label = "v_peak" + title = "Peak Flux" else: - x_label = 'eta_int' - y_label = 'v_int' + x_label = "eta_int" + y_label = "v_int" title = "Int. Flux" # PLOTTING NOTE! @@ -444,11 +456,10 @@ def plot_eta_v_bokeh( cb_title = "Number of Selavy Measurements" if df.shape[0] > settings.ETA_V_DATASHADER_THRESHOLD: - - hv.extension('bokeh') + hv.extension("bokeh") # create dfs for bokeh and datashader - mask = ((df[x_label] >= eta_cutoff) & (df[y_label] >= v_cutoff)) + mask = (df[x_label] >= eta_cutoff) & (df[y_label] >= v_cutoff) bokeh_df = df.loc[mask] ds_df = df.loc[~mask] @@ -456,11 +467,10 @@ def plot_eta_v_bokeh( # create datashader version first points = spread( datashade( - hv.Points(ds_df[[f"{x_label}_log10", f"{y_label}_log10"]]), - cmap="Blues" + hv.Points(ds_df[[f"{x_label}_log10", f"{y_label}_log10"]]), cmap="Blues" ), px=1, - shape='square' + shape="square", ).opts(height=PLOT_HEIGHT, width=PLOT_WIDTH) fig = hv.render(points) @@ -468,11 +478,11 @@ def plot_eta_v_bokeh( fig.xaxis.axis_label = x_axis_label fig.yaxis.axis_label = y_axis_label fig.aspect_scale = 1 - fig.sizing_mode = 'stretch_width' + fig.sizing_mode = "stretch_width" fig.output_backend = "webgl" # update the y axis default range if bokeh_df.shape[0] > 0: - fig.y_range.end = bokeh_df[f'{y_label}_log10'].max() + 0.2 + fig.y_range.end = bokeh_df[f"{y_label}_log10"].max() + 0.2 cb_title += " (interactive points only)" else: @@ -499,7 +509,7 @@ def plot_eta_v_bokeh( fill_color=cmap, line_color=cmap, marker="circle", - size=5 + size=5, ) bokeh_g1 = fig.add_glyph(source_or_glyph=source, glyph=bokeh_points) @@ -510,19 +520,16 @@ def plot_eta_v_bokeh( ("source", "@name"), ("\u03B7", f"@{x_label}"), ("V", f"@{y_label}"), - ("id", "@id") + ("id", "@id"), ], - mode='mouse' + mode="mouse", ) fig.add_tools(hover) - color_bar = ColorBar( - color_mapper=cmap['transform'], - title=cb_title - ) + color_bar = ColorBar(color_mapper=cmap["transform"], title=cb_title) - fig.add_layout(color_bar, 'below') + fig.add_layout(color_bar, "below") # axis histograms # filter out any forced-phot points for these @@ -539,7 +546,9 @@ def plot_eta_v_bokeh( output_backend="webgl", ) x_hist_data, x_hist_edges = np.histogram( - df[f"{x_label}_log10"], density=True, bins=50, + df[f"{x_label}_log10"], + density=True, + bins=50, ) x_hist.quad( top=x_hist_data, @@ -569,7 +578,9 @@ def plot_eta_v_bokeh( output_backend="webgl", ) y_hist_data, y_hist_edges = np.histogram( - (df[f"{y_label}_log10"]), density=True, bins=50, + (df[f"{y_label}_log10"]), + density=True, + bins=50, ) y_hist.quad( right=y_hist_data, @@ -602,7 +613,7 @@ def plot_eta_v_bokeh( step=0.1, value=eta_sigma, title="\u03B7 sigma value", - sizing_mode='stretch_width' + sizing_mode="stretch_width", ) v_slider = Slider( start=0, @@ -610,29 +621,23 @@ def plot_eta_v_bokeh( step=0.1, value=v_sigma, title="V sigma value", - sizing_mode='stretch_width' + sizing_mode="stretch_width", ) - labels = ['Peak', 'Integrated'] + labels = ["Peak", "Integrated"] active = 0 if use_peak_flux else 1 flux_choice_radio = RadioButtonGroup( - labels=labels, - active=active, - sizing_mode='stretch_width' + labels=labels, active=active, sizing_mode="stretch_width" ) - button = Button( - label="Apply", - button_type="primary", - sizing_mode='stretch_width' - ) + button = Button(label="Apply", button_type="primary", sizing_mode="stretch_width") button.js_on_click( CustomJS( args=dict( eta_slider=eta_slider, v_slider=v_slider, button=button, - flux_choice_radio=flux_choice_radio + flux_choice_radio=flux_choice_radio, ), code=""" button.label = "Loading..." @@ -641,7 +646,7 @@ def plot_eta_v_bokeh( const peak = ["peak", "int"]; var fluxType = peak[flux_choice_radio.active]; getEtaVPlot(e, v, fluxType); - """ + """, ) ) @@ -658,7 +663,7 @@ def plot_eta_v_bokeh( eta_slider, v_slider, button, - sizing_mode='stretch_width' + sizing_mode="stretch_width", ) plot_column.css_classes.append("mx-auto") @@ -677,7 +682,7 @@ def plot_eta_v_bokeh( update_card(id); getLightcurvePlot(id, fluxType); }); - """ + """, ) tap = TapTool(callback=callback, renderers=[bokeh_g1]) diff --git a/vast_pipeline/serializers.py b/vast_pipeline/serializers.py index 0670fd221..aa0b9e608 100644 --- a/vast_pipeline/serializers.py +++ b/vast_pipeline/serializers.py @@ -11,26 +11,26 @@ class RunSerializer(serializers.ModelSerializer): - id = serializers.IntegerField(read_only=True) + id = serializers.UUIDField(read_only=True) path = serializers.SerializerMethodField() n_sources = serializers.IntegerField(read_only=True) n_images = serializers.IntegerField(read_only=True) n_selavy_measurements = serializers.IntegerField(read_only=True) n_forced_measurements = serializers.IntegerField(read_only=True) epoch_based = serializers.BooleanField(read_only=True) - status = serializers.CharField(source='get_status_display') + status = serializers.CharField(source="get_status_display") class Meta: model = Run - fields = '__all__' - datatables_always_serialize = ('id',) + fields = "__all__" + datatables_always_serialize = ("id",) def get_path(self, run): return os.path.relpath(run.path) class ImageSerializer(serializers.ModelSerializer): - id = serializers.IntegerField(read_only=True) + id = serializers.UUIDField(read_only=True) frequency = serializers.SerializerMethodField(read_only=True) def get_frequency(self, obj): @@ -39,24 +39,24 @@ def get_frequency(self, obj): class Meta: model = Image fields = [ - 'id', - 'name', - 'datetime', - 'frequency', - 'ra', - 'dec', - 'rms_median', - 'rms_min', - 'rms_max', - 'beam_bmaj', - 'beam_bmin', - 'beam_bpa' + "id", + "name", + "datetime", + "frequency", + "ra", + "dec", + "rms_median", + "rms_min", + "rms_max", + "beam_bmaj", + "beam_bmin", + "beam_bpa", ] - datatables_always_serialize = ('id',) + datatables_always_serialize = ("id",) class MeasurementSerializer(serializers.ModelSerializer): - id = serializers.IntegerField(read_only=True) + id = serializers.UUIDField(read_only=True) frequency = serializers.SerializerMethodField(read_only=True) def get_frequency(self, obj): @@ -65,53 +65,57 @@ def get_frequency(self, obj): class Meta: model = Measurement fields = [ - 'id', - 'name', - 'ra', - 'ra_err', - 'uncertainty_ew', - 'dec', - 'dec_err', - 'uncertainty_ns', - 'flux_peak', - 'flux_peak_err', - 'flux_peak_isl_ratio', - 'flux_int', - 'flux_int_err', - 'flux_int_isl_ratio', - 'compactness', - 'snr', - 'has_siblings', - 'forced', - 'island_id', - 'frequency' + "id", + "name", + "ra", + "ra_err", + "uncertainty_ew", + "dec", + "dec_err", + "uncertainty_ns", + "flux_peak", + "flux_peak_err", + "flux_peak_isl_ratio", + "flux_int", + "flux_int_err", + "flux_int_isl_ratio", + "compactness", + "snr", + "has_siblings", + "forced", + "island_id", + "frequency", ] - datatables_always_serialize = ('id',) + datatables_always_serialize = ("id",) class UserSerializer(serializers.ModelSerializer): class Meta: model = User - fields =['username'] + fields = ["username"] class RunNameSerializer(serializers.ModelSerializer): + id = serializers.UUIDField(read_only=True) + class Meta: model = Run - fields = ['id', 'name'] - datatables_always_serialize = ('id',) + fields = ["id", "name"] + datatables_always_serialize = ("id",) class SourceNameSerializer(serializers.ModelSerializer): + id = serializers.UUIDField(read_only=True) run = RunNameSerializer() + class Meta: model = Source - fields= ['id', 'name', 'run'] - datatables_always_serialize = ('id',) + fields = ["id", "name", "run"] + datatables_always_serialize = ("id",) class SourceSerializer(serializers.ModelSerializer): - id = serializers.IntegerField(read_only=True) + id = serializers.UUIDField(read_only=True) run = RunNameSerializer() wavg_ra = serializers.SerializerMethodField() wavg_dec = serializers.SerializerMethodField() @@ -119,7 +123,7 @@ class SourceSerializer(serializers.ModelSerializer): class Meta: model = Source fields = "__all__" - datatables_always_serialize = ('id',) + datatables_always_serialize = ("id",) def get_wavg_ra(self, source): return deg2hms(source.wavg_ra, hms_format=True) @@ -129,17 +133,18 @@ def get_wavg_dec(self, source): class SourceFavSerializer(serializers.ModelSerializer): + id = serializers.UUIDField(read_only=True) user = UserSerializer(read_only=True) source = SourceNameSerializer(read_only=True) deletefield = serializers.SerializerMethodField() class Meta: model = SourceFav - fields = '__all__' - datatables_always_serialize = ('id', 'source', 'user') + fields = "__all__" + datatables_always_serialize = ("id", "source", "user") def get_deletefield(self, obj): - redirect = reverse('vast_pipeline:api_sources_favs-detail', args=[obj.id]) + redirect = reverse("vast_pipeline:api_sources_favs-detail", args=[obj.id]) string = ( f'' '' @@ -160,7 +165,9 @@ class RawImageSelavyListSerializer(serializers.Serializer): class SesameResultSerializer(serializers.Serializer): object_name = serializers.CharField(required=True) - service = serializers.ChoiceField(choices=["all", "simbad", "ned", "vizier"], required=True) + service = serializers.ChoiceField( + choices=["all", "simbad", "ned", "vizier"], required=True + ) coord = serializers.CharField(read_only=True) def validate(self, data): @@ -175,7 +182,9 @@ def validate(self, data): class CoordinateValidatorSerializer(serializers.Serializer): coord = serializers.CharField(required=True) - frame = serializers.ChoiceField(choices=frame_transform_graph.get_names(), required=True) + frame = serializers.ChoiceField( + choices=frame_transform_graph.get_names(), required=True + ) def validate(self, data): try: @@ -186,8 +195,8 @@ def validate(self, data): class ExternalSearchSerializer(serializers.Serializer): - """Serializer for external database cone search results, i.e. SIMBAD and NED. - """ + """Serializer for external database cone search results, i.e. SIMBAD and NED.""" + object_name = serializers.CharField() database = serializers.CharField( help_text="Result origin database, e.g. SIMBAD or NED." diff --git a/vast_pipeline/tests/test_pipeline/data/skyc1_srcs_in.csv b/vast_pipeline/tests/test_pipeline/data/skyc1_srcs_in.csv index 09f25456f..fdffaa3fe 100644 --- a/vast_pipeline/tests/test_pipeline/data/skyc1_srcs_in.csv +++ b/vast_pipeline/tests/test_pipeline/data/skyc1_srcs_in.csv @@ -1,3 +1,3 @@ id,ra,dec,uncertainty_ew,uncertainty_ns,source,d2d,dr,related,epoch -1,149.983325,-29.977778,0,2,1,0,0,,1 -2,150.020532,-30.016111,1,3,2,0,0,,1 +a7dbdab0-2b61-11ec-8d14-4a0009155011,149.983325,-29.977778,0,2,a8dbdab0-2b61-11ec-8d14-4a0009155011,0,0,,1 +b9fc9111-1234-1234-1234-123456789012,150.020532,-30.016111,1,3,b0fc9111-1234-1234-1234-123456789012,0,0,,1 diff --git a/vast_pipeline/tests/test_pipeline/data/skyc2_srcs_in.csv b/vast_pipeline/tests/test_pipeline/data/skyc2_srcs_in.csv index 4eacc7baa..65897dfa7 100644 --- a/vast_pipeline/tests/test_pipeline/data/skyc2_srcs_in.csv +++ b/vast_pipeline/tests/test_pipeline/data/skyc2_srcs_in.csv @@ -1,4 +1,4 @@ id,ra,dec,uncertainty_ew,uncertainty_ns,source,d2d,dr,related,epoch -1,149.983324,-29.977779,0.1,1.1,-1,0,0,,2 -2,149.983318,-30.016111,0.2,1.2,-1,0,0,,2 -3,150.020523,-30.016108,0.3,1.3,-1,0,0,,2 +a7dbdab0-2b61-11ec-8d14-4a0009155022,149.983324,-29.977779,0.1,1.1,,0,0,,2 +b0fc9222-1234-1234-1234-123456789012,149.983318,-30.016111,0.2,1.2,,0,0,,2 +b0fc9333-1234-1234-1234-123456789012,150.020523,-30.016108,0.3,1.3,,0,0,,2 diff --git a/vast_pipeline/tests/test_pipeline/data/sources_df_all.csv b/vast_pipeline/tests/test_pipeline/data/sources_df_all.csv index f6c8767af..02af3c8cd 100644 --- a/vast_pipeline/tests/test_pipeline/data/sources_df_all.csv +++ b/vast_pipeline/tests/test_pipeline/data/sources_df_all.csv @@ -1,6 +1,6 @@ id,ra,dec,source,d2d,related,epoch -1,149.983325,-29.977778,1,0,,1 -2,150.020532,-30.016111,2,0,,1 -1,149.983324,-29.977779,3,0,,2 -2,149.983318,-30.016111,4,0,,2 -3,150.020523,-30.016108,5,0,,2 +a7dbdab0-2b61-11ec-8d14-4a0009155011,149.983325,-29.977778,a8dbdab0-2b61-11ec-8d14-4a0009155011,0,,1 +b9fc9111-1234-1234-1234-123456789012,150.020532,-30.016111,b0fc9111-1234-1234-1234-123456789012,0,,1 +a7dbdab0-2b61-11ec-8d14-4a0009155022,149.983324,-29.977779,3,0,,2 +b0fc9222-1234-1234-1234-123456789012,149.983318,-30.016111,4,0,,2 +b0fc9333-1234-1234-1234-123456789012,150.020523,-30.016108,5,0,,2 diff --git a/vast_pipeline/tests/test_pipeline/data/sources_df_ass_in.csv b/vast_pipeline/tests/test_pipeline/data/sources_df_ass_in.csv index ea44fdf8e..de67ebd7a 100644 --- a/vast_pipeline/tests/test_pipeline/data/sources_df_ass_in.csv +++ b/vast_pipeline/tests/test_pipeline/data/sources_df_ass_in.csv @@ -1,3 +1,3 @@ id,ra,dec,source,d2d,related,epoch -1,149.983325,-29.977778,1,0,,1 -2,150.020532,-30.016111,2,0,,1 +a7dbdab0-2b61-11ec-8d14-4a0009155011,149.983325,-29.977778,a8dbdab0-2b61-11ec-8d14-4a0009155011,0,,1 +b9fc9111-1234-1234-1234-123456789012,150.020532,-30.016111,b0fc9111-1234-1234-1234-123456789012,0,,1 diff --git a/vast_pipeline/tests/test_pipeline/test_association.py b/vast_pipeline/tests/test_pipeline/test_association.py index f477e87c5..6d7592da3 100644 --- a/vast_pipeline/tests/test_pipeline/test_association.py +++ b/vast_pipeline/tests/test_pipeline/test_association.py @@ -1,5 +1,6 @@ import ast import os +import numpy as np import pandas as pd from pathlib import Path @@ -15,7 +16,6 @@ many_to_one_advanced, basic_association, advanced_association, - _correct_parallel_source_ids ) @@ -107,6 +107,14 @@ def test_duplicated_skyc2_nonempty(self): sources_df: must contain at least all source ids present in skyc2_src, rows with same id as duplicates in skyc2_srcs will be duplicated and assigned to the new id. + + source related d2d + 0 1 NaN 3.1 + 1 9a327f7d-2d7a-4c18-a169-7ddb60fd984e [2] 4.2 + 2 2 [9a327f7d-2d7a-4c18-a169-7ddb60fd984e] 2.3 + 3 3 [a035b62f-57de-42c0-ba18-963dfe57a38c, 87f5aef... 3.3 + 4 87f5aef3-8c04-4d42-b619-fd4c68fa0316 [3] 5.6 + 5 a035b62f-57de-42c0-ba18-963dfe57a38c [3] 4.0 ''' skyc2_srcs = pd.read_csv( os.path.join(DATA_PATH, 'skyc2_srcs_dup.csv'), @@ -119,8 +127,28 @@ def test_duplicated_skyc2_nonempty(self): skyc2_srcs, sources_df = one_to_many_basic(skyc2_srcs, sources_df) - self.assertTrue(skyc2_srcs.equals(self.skyc2_srcs_out)) - self.assertTrue(sources_df.equals(self.sources_df_out)) + # Note the testing is more complex here as the source indexes are now + # randomly generated UUIDs, so we can't test the source_skyc1 column + # directly. Instead we test that the source column is correct and that + # the related column is correct. + + assert skyc2_srcs['source'].loc[[0, 2, 3]].to_list() == [1, 2, 3] + for source_id in skyc2_srcs['source'].loc[[1, 4, 5]]: + assert isinstance(source_id, str) + assert len(source_id) == 36 + assert skyc2_srcs["related"].fillna(-1).to_list() == [ + -1, + [2], + [skyc2_srcs['source'].loc[1]], + [skyc2_srcs['source'].loc[5], skyc2_srcs['source'].loc[4]], + [3], + [3], + ] + + assert sources_df['source'].loc[[0, 1, 2, 3, 4]].to_list() == [1, 2, 2, 2, 3] + for source_id in sources_df['source'].loc[[5, 6, 7, 8, 9]]: + assert isinstance(source_id, str) + assert len(source_id) == 36 class OneToManyAdvancedTest(SimpleTestCase): @@ -213,8 +241,35 @@ def test_method_advanced(self): method='advanced' ) - self.assertTrue(temp_srcs.equals(self.temp_srcs_advanced_out)) - self.assertTrue(sources_df.equals(self.sources_df_out)) + # Note the testing is more complex here as the source indexes are now + # randomly generated UUIDs, so we can't test the source_skyc1 column + # directly. Instead we test that the source column is correct and that + # the related column is correct. + + assert temp_srcs['source_skyc1'].loc[[0, 2, 5, 6, 7]].to_list() == [ + 1, 2, 3, 7, 8 + ] + for source_id in temp_srcs['source_skyc1'].loc[[1, 3, 4]]: + assert isinstance(source_id, str) + assert len(source_id) == 36 + assert temp_srcs["related_skyc1"].fillna(-1).to_list() == [ + -1, + [2], + [temp_srcs['source_skyc1'].loc[1]], + [3], + [3], + [temp_srcs['source_skyc1'].loc[3], temp_srcs['source_skyc1'].loc[4]], + -1, + -1 + ] + + assert sources_df['source'].loc[[0, 1, 2, 3, 4]].to_list() == [ + 1, 2, 2, 2, 3 + ] + for source_id in sources_df['source'].loc[[5, 6, 7, 8, 9]]: + assert isinstance(source_id, str) + assert len(source_id) == 36 + def test_method_deruiter(self): ''' @@ -246,8 +301,34 @@ def test_method_deruiter(self): method='deruiter' ) - self.assertTrue(temp_srcs.equals(self.temp_srcs_deruiter_out)) - self.assertTrue(sources_df.equals(self.sources_df_out)) + # Note the testing is more complex here as the source indexes are now + # randomly generated UUIDs, so we can't test the source_skyc1 column + # directly. Instead we test that the source column is correct and that + # the related column is correct. + + assert temp_srcs['source_skyc1'].loc[[0, 1, 3, 6, 7]].to_list() == [ + 1, 2, 3, 7, 8 + ] + for source_id in temp_srcs['source_skyc1'].loc[[2, 4, 5]]: + assert isinstance(source_id, str) + assert len(source_id) == 36 + assert temp_srcs["related_skyc1"].fillna(-1).to_list() == [ + -1, + [temp_srcs['source_skyc1'].loc[2]], + [2], + [temp_srcs['source_skyc1'].loc[4], temp_srcs['source_skyc1'].loc[5]], + [3], + [3], + -1, + -1 + ] + + assert sources_df['source'].loc[[0, 1, 2, 3, 4]].to_list() == [ + 1, 2, 2, 2, 3 + ] + for source_id in sources_df['source'].loc[[5, 6, 7, 8, 9]]: + assert isinstance(source_id, str) + assert len(source_id) == 36 class ManyToManyAdvancedTest(SimpleTestCase): @@ -387,7 +468,7 @@ class TestHelpers(SimpleTestCase): Class which has some helper functions for testing. ''' - def check_col(self, df1, df2, columns=['ra', 'dec', 'source', 'epoch']): + def check_col(self, df1, df2, columns=['ra', 'dec', 'epoch']): ''' Function which checks that certain columns of two DataFrames are equal for BasicAssociationTest and AdvancedAssociationTest. @@ -476,11 +557,12 @@ def test_no_new_skyc2_srcs(self): limit = Angle(10, unit='arcsec') sources_df, skyc1_srcs = basic_association( - sources_df, skyc1_srcs, skyc1, skyc2_srcs, skyc2, limit + sources_df, skyc1_srcs, skyc1, skyc2_srcs, skyc2, limit, ) self.check_col(sources_df, self.sources_df_no_new) self.check_col(skyc1_srcs, self.skyc1_srcs_in) + assert sources_df["source"].nunique() == 2 def test_zero_limit(self): ''' @@ -517,6 +599,7 @@ def test_zero_limit(self): self.check_col(sources_df, self.sources_df_all) self.check_col(skyc1_srcs, self.skyc1_srcs_all) + assert sources_df['source'].nunique() == 5 def test_basic_association(self): ''' @@ -553,6 +636,7 @@ def test_basic_association(self): self.check_col(sources_df, self.sources_df_basic_out) self.check_col(skyc1_srcs, self.skyc1_srcs_out) + assert sources_df["source"].nunique() == 3 class AdvancedAssociationTest(TestHelpers): @@ -626,6 +710,7 @@ def test_no_new_skyc2_srcs(self): self.check_col(sources_df, self.sources_df_no_new) self.check_col(skyc1_srcs, self.skyc1_srcs_in) + assert sources_df['source'].nunique() == 2 def test_zero_bw_max(self): ''' @@ -664,6 +749,7 @@ def test_zero_bw_max(self): self.check_col(sources_df, self.sources_df_all) self.check_col(skyc1_srcs, self.skyc1_srcs_all) + assert sources_df['source'].nunique() == 5 def test_advanced(self): ''' @@ -702,6 +788,7 @@ def test_advanced(self): self.check_col(sources_df, self.sources_df_advanced_out) self.check_col(skyc1_srcs, self.skyc1_srcs_out) + assert sources_df['source'].nunique() == 3 def test_deruiter(self): ''' @@ -742,56 +829,4 @@ def test_deruiter(self): self.check_col(sources_df, self.sources_df_advanced_out) self.check_col(skyc1_srcs, self.skyc1_srcs_out) - - -class CorrectParallelSourceIdsTest(SimpleTestCase): - ''' - Tests for _correct_parallel_souce_ids in association.py - ''' - - @classmethod - def setUpClass(self): - ''' - Load in correct outputs so inplace operations are tested. - ''' - super().setUpClass() - self.sources_df_in = pd.read_csv( - os.path.join(DATA_PATH, 'sources_df_in.csv'), - header=0, - converters={'related': parse_or_nan} - ) - self.sources_df_out_2 = pd.read_csv( - os.path.join(DATA_PATH, 'sources_df_out_2.csv'), - header=0, - converters={'related': parse_or_nan} - ) - - def test_zero(self): - ''' - Test _correct_parallel_source_ids doesn't change the input df when - correction=0. - ''' - df = pd.read_csv( - os.path.join(DATA_PATH, 'sources_df_in.csv'), - header=0, - converters={'related': parse_or_nan} - ) - - df = _correct_parallel_source_ids(df, 0) - - self.assertTrue(df.equals(self.sources_df_in)) - - def test_correct_parllel_source_ids(self): - ''' - Test _correct_parallel_source_ids increases the numbers in the source - and relate column by the correction amount. - ''' - df = pd.read_csv( - os.path.join(DATA_PATH, 'sources_df_in.csv'), - header=0, - converters={'related': parse_or_nan} - ) - - df = _correct_parallel_source_ids(df, 2) - - self.assertTrue(df.equals(self.sources_df_out_2)) + assert sources_df['source'].nunique() == 3 diff --git a/vast_pipeline/tests/test_regression/property_check.py b/vast_pipeline/tests/test_regression/property_check.py index d720cc6ed..aa32d9405 100644 --- a/vast_pipeline/tests/test_regression/property_check.py +++ b/vast_pipeline/tests/test_regression/property_check.py @@ -139,8 +139,9 @@ def test_known_in_forced(testcase: TestCase, forced: dict, sources: pd.DataFrame The expected force extraction files for PSR J2129-04. ''' sources = sources.reset_index() + sources id_match = known_source(sources) - source_id = sources.loc[id_match, 'id'] + source_id = sources.loc[id_match, 'source'] meas_id = associations[ associations['source_id'] == source_id ]['meas_id'].values diff --git a/vast_pipeline/urls.py b/vast_pipeline/urls.py index b6e168990..373eed0c6 100644 --- a/vast_pipeline/urls.py +++ b/vast_pipeline/urls.py @@ -10,55 +10,63 @@ from vast_pipeline.models import Source -app_name = 'vast_pipeline' +app_name = "vast_pipeline" register_converter(converters.RightAscensionConverter, "ra") register_converter(converters.DeclinationConverter, "dec") register_converter(converters.AngleConverter, "angle") router = DefaultRouter() -router.register(r'piperuns', views.RunViewSet, 'api_pipe_runs') -router.register(r'images', views.ImageViewSet, 'api_images') -router.register(r'measurements', views.MeasurementViewSet, 'api_measurements') -router.register(r'sources', views.SourceViewSet, 'api_sources') -router.register(r'rawimages', views.RawImageListSet, 'api_rawimages') -router.register(r'runcfg', views.RunConfigSet, 'api_runcfg') -router.register(r'runlog', views.RunLogSet, 'api_runlog') -router.register(r'sourcesfavs', views.SourceFavViewSet, 'api_sources_favs') -router.register(r'utils', views.UtilitiesSet, 'api_utils') -router.register(r'plots', views.SourcePlotsSet, 'api_source_plots') +router.register(r"piperuns", views.RunViewSet, "api_pipe_runs") +router.register(r"images", views.ImageViewSet, "api_images") +router.register(r"measurements", views.MeasurementViewSet, "api_measurements") +router.register(r"sources", views.SourceViewSet, "api_sources") +router.register(r"rawimages", views.RawImageListSet, "api_rawimages") +router.register(r"runcfg", views.RunConfigSet, "api_runcfg") +router.register(r"runlog", views.RunLogSet, "api_runlog") +router.register(r"sourcesfavs", views.SourceFavViewSet, "api_sources_favs") +router.register(r"utils", views.UtilitiesSet, "api_utils") +router.register(r"plots", views.SourcePlotsSet, "api_source_plots") urlpatterns = [ - path('piperuns/', views.RunIndex, name='run_index'), - path('piperuns//', views.RunDetail, name='run_detail'), - path('images/', views.ImageIndex, name='image_index'), - re_path( - r'^images/(?P\d+)(?:/(?P[\w]+))?/$', + path("piperuns/", views.RunIndex, name="run_index"), + path("piperuns//", views.RunDetail, name="run_detail"), + path("images/", views.ImageIndex, name="image_index"), + path( + "images//", views.ImageDetail, - name='image_detail' + name="image_detail", ), - path('measurements/', views.MeasurementIndex, name='measurement_index'), - re_path( - r'^measurements/(?P\d+)(?:/(?P[\w]+))?/$', + path("measurements/", views.MeasurementIndex, name="measurement_index"), + path( + "measurements//", views.MeasurementDetail, - name='measurement_detail' + name="measurement_detail", + ), + path("sources/query/", views.SourceQuery, name="source_query"), + path("sources/query/plot/", views.SourceEtaVPlot, name="source_etav_plot"), + path( + "sources/query/plot/update//", + views.SourceEtaVPlotUpdate, + name="source_etav_plot_update", ), - path('sources/query/', views.SourceQuery, name='source_query'), - path('sources/query/plot/', views.SourceEtaVPlot, name='source_etav_plot'), - path('sources/query/plot/update//', views.SourceEtaVPlotUpdate, name='source_etav_plot_update'), - path('sources//', views.SourceDetail, name='source_detail'), - path('sources/favs/', views.UserSourceFavsList, name='source_favs'), + path("sources//", views.SourceDetail, name="source_detail"), + path("sources/favs/", views.UserSourceFavsList, name="source_favs"), path( "sources/tags/autocomplete/", tagulous.views.autocomplete_login, kwargs={"tag_model": Source.tags.tag_model}, name="source_tags_autocomplete", ), - path('cutout//', views.ImageCutout.as_view(), name='cutout'), - path('cutout///', views.ImageCutout.as_view(), name='cutout'), + path("cutout//", views.ImageCutout.as_view(), name="cutout"), + path( + "cutout///", + views.ImageCutout.as_view(), + name="cutout", + ), path( - 'measurements//,,/region/', + "measurements//,,/region/", views.MeasurementQuery.as_view(), - name="measurements_region" + name="measurements_region", ), - path('api/', include(router.urls)), + path("api/", include(router.urls)), ] diff --git a/vast_pipeline/utils/utils.py b/vast_pipeline/utils/utils.py index 6ea4904fe..142e6fa1c 100644 --- a/vast_pipeline/utils/utils.py +++ b/vast_pipeline/utils/utils.py @@ -236,7 +236,7 @@ def equ2gal(ra: float, dec: float) -> Tuple[float, float]: Galactic longitude in degrees. Galactic latitude in degrees. """ - c = SkyCoord(np.float(ra), np.float(dec), unit=(u.deg, u.deg), frame="icrs") + c = SkyCoord(float(ra), float(dec), unit=(u.deg, u.deg), frame="icrs") l = c.galactic.l.deg b = c.galactic.b.deg diff --git a/vast_pipeline/utils/view.py b/vast_pipeline/utils/view.py index ec25a26ed..8502a577f 100644 --- a/vast_pipeline/utils/view.py +++ b/vast_pipeline/utils/view.py @@ -1,4 +1,5 @@ """Functions and variables used in pipeline/views.py.""" +from uuid import UUID from vast_pipeline.models import SkyRegion from typing import List, Dict, Optional, Any @@ -6,181 +7,179 @@ # Defines the float format and scaling for all # parameters presented in DATATABLES via AJAX call FLOAT_FIELDS = { - 'ra': { - 'precision': 4, - 'scale': 1, + "ra": { + "precision": 4, + "scale": 1, }, - 'ra_err': { - 'precision': 4, - 'scale': 3600., + "ra_err": { + "precision": 4, + "scale": 3600.0, }, - 'uncertainty_ew': { - 'precision': 4, - 'scale': 3600., + "uncertainty_ew": { + "precision": 4, + "scale": 3600.0, + }, + "dec": { + "precision": 4, + "scale": 1, + }, + "dec_err": { + "precision": 4, + "scale": 3600, + }, + "uncertainty_ns": { + "precision": 4, + "scale": 3600.0, + }, + "flux_int": { + "precision": 3, + "scale": 1, + }, + "flux_peak": { + "precision": 3, + "scale": 1, + }, + "flux_int_err": { + "precision": 3, + "scale": 1, + }, + "flux_peak_err": { + "precision": 3, + "scale": 1, + }, + "v_int": { + "precision": 2, + "scale": 1, + }, + "eta_int": { + "precision": 2, + "scale": 1, + }, + "v_peak": { + "precision": 2, + "scale": 1, + }, + "eta_peak": { + "precision": 2, + "scale": 1, + }, + "avg_flux_int": { + "precision": 3, + "scale": 1, + }, + "avg_flux_peak": { + "precision": 3, + "scale": 1, + }, + "max_flux_peak": { + "precision": 3, + "scale": 1, }, - 'dec': { - 'precision': 4, - 'scale': 1, + "min_flux_peak": { + "precision": 3, + "scale": 1, }, - 'dec_err': { - 'precision': 4, - 'scale': 3600, + "min_flux_int": { + "precision": 3, + "scale": 1, }, - 'uncertainty_ns': { - 'precision': 4, - 'scale': 3600., + "max_flux_int": { + "precision": 3, + "scale": 1, }, - 'flux_int': { - 'precision': 3, - 'scale': 1, + "min_flux_int_isl_ratio": { + "precision": 2, + "scale": 1, }, - 'flux_peak': { - 'precision': 3, - 'scale': 1, + "min_flux_peak_isl_ratio": { + "precision": 2, + "scale": 1, }, - 'flux_int_err': { - 'precision': 3, - 'scale': 1, + "flux_peak_isl_ratio": { + "precision": 2, + "scale": 1, }, - 'flux_peak_err': { - 'precision': 3, - 'scale': 1, + "flux_int_isl_ratio": { + "precision": 2, + "scale": 1, }, - 'v_int': { - 'precision': 2, - 'scale': 1, + "rms_median": { + "precision": 3, + "scale": 1, }, - 'eta_int': { - 'precision': 2, - 'scale': 1, + "rms_min": { + "precision": 3, + "scale": 1, }, - 'v_peak': { - 'precision': 2, - 'scale': 1, + "rms_max": { + "precision": 3, + "scale": 1, }, - 'eta_peak': { - 'precision': 2, - 'scale': 1, + "new_high_sigma": {"precision": 3, "scale": 1}, + "compactness": { + "precision": 3, + "scale": 1, }, - 'avg_flux_int': { - 'precision': 3, - 'scale': 1, + "avg_compactness": { + "precision": 2, + "scale": 1, }, - 'avg_flux_peak': { - 'precision': 3, - 'scale': 1, + "n_neighbour_dist": { + "precision": 2, + "scale": 60.0, }, - 'max_flux_peak': { - 'precision': 3, - 'scale': 1, + "snr": { + "precision": 2, + "scale": 1, }, - 'min_flux_peak': { - 'precision': 3, - 'scale': 1, + "min_snr": { + "precision": 2, + "scale": 1, }, - 'min_flux_int': { - 'precision': 3, - 'scale': 1, + "max_snr": { + "precision": 2, + "scale": 1, }, - 'max_flux_int': { - 'precision': 3, - 'scale': 1, + "beam_bmaj": { + "precision": 2, + "scale": 3600.0, }, - 'min_flux_int_isl_ratio': { - 'precision': 2, - 'scale': 1, + "beam_bmin": { + "precision": 2, + "scale": 3600.0, }, - 'min_flux_peak_isl_ratio': { - 'precision': 2, - 'scale': 1, + "beam_bpa": { + "precision": 2, + "scale": 1, }, - 'flux_peak_isl_ratio': { - 'precision': 2, - 'scale': 1, + "frequency": { + "precision": 2, + "scale": 1, }, - 'flux_int_isl_ratio': { - 'precision': 2, - 'scale': 1, + "vs_abs_significant_max_int": { + "precision": 2, + "scale": 1, }, - 'rms_median': { - 'precision': 3, - 'scale': 1, + "vs_abs_significant_max_peak": { + "precision": 2, + "scale": 1, }, - 'rms_min': { - 'precision': 3, - 'scale': 1, + "m_abs_significant_max_int": { + "precision": 2, + "scale": 1, }, - 'rms_max': { - 'precision': 3, - 'scale': 1, - }, - 'new_high_sigma': { - 'precision': 3, - 'scale': 1 - }, - 'compactness': { - 'precision': 3, - 'scale': 1, - }, - 'avg_compactness': { - 'precision': 2, - 'scale': 1, - }, - 'n_neighbour_dist': { - 'precision': 2, - 'scale': 60., - }, - 'snr': { - 'precision': 2, - 'scale': 1, - }, - 'min_snr': { - 'precision': 2, - 'scale': 1, - }, - 'max_snr': { - 'precision': 2, - 'scale': 1, - }, - 'beam_bmaj': { - 'precision': 2, - 'scale': 3600., - }, - 'beam_bmin': { - 'precision': 2, - 'scale': 3600., - }, - 'beam_bpa': { - 'precision': 2, - 'scale': 1, - }, - 'frequency': { - 'precision': 2, - 'scale': 1, - }, - 'vs_abs_significant_max_int': { - 'precision': 2, - 'scale': 1, - }, - 'vs_abs_significant_max_peak': { - 'precision': 2, - 'scale': 1, - }, - 'm_abs_significant_max_int': { - 'precision': 2, - 'scale': 1, - }, - 'm_abs_significant_max_peak': { - 'precision': 2, - 'scale': 1, + "m_abs_significant_max_peak": { + "precision": 2, + "scale": 1, }, } def generate_colsfields( - fields: List[str], url_prefix_dict: Dict[str, str], - not_orderable_col: Optional[List[str]]=None, - not_searchable_col: Optional[List[str]]=None, + fields: List[str], + url_prefix_dict: Dict[str, str], + not_orderable_col: Optional[List[str]] = None, + not_searchable_col: Optional[List[str]] = None, ) -> List[Dict[str, Any]]: """ Generate data to be included in context for datatables. @@ -211,64 +210,54 @@ def generate_colsfields( not_searchable_col = [] for col in fields: field2append = {} - if col == 'name': + if col == "name": field2append = { - 'data': col, 'render': { - 'url': { - 'prefix': url_prefix_dict[col], - 'col': 'name' - } - } + "data": col, + "render": {"url": {"prefix": url_prefix_dict[col], "col": "name"}}, } - elif '.name' in col: + elif ".name" in col: # this is for nested fields to build a render with column name # and id in url. The API results should look like: # {... , main_col : {'name': value, 'id': value, ... }} - main_col = col.rsplit('.', 1)[0] - field2append = { - 'data': col, - 'render': { - 'url': { - 'prefix': url_prefix_dict[col], - 'col': main_col, - 'nested': True, - } - } - } - elif col == 'n_sibl': + main_col = col.rsplit(".", 1)[0] field2append = { - 'data': col, 'render': { - 'contains_sibl': { - 'col': col + "data": col, + "render": { + "url": { + "prefix": url_prefix_dict[col], + "col": main_col, + "nested": True, } - } + }, } + elif col == "n_sibl": + field2append = {"data": col, "render": {"contains_sibl": {"col": col}}} elif col in FLOAT_FIELDS: field2append = { - 'data': col, - 'render': { - 'float': { - 'col': col, - 'precision': FLOAT_FIELDS[col]['precision'], - 'scale': FLOAT_FIELDS[col]['scale'], + "data": col, + "render": { + "float": { + "col": col, + "precision": FLOAT_FIELDS[col]["precision"], + "scale": FLOAT_FIELDS[col]["scale"], } - } + }, } else: - field2append = {'data': col} + field2append = {"data": col} if col in not_orderable_col: - field2append['orderable'] = False + field2append["orderable"] = False if col in not_searchable_col: - field2append['searchable'] = False + field2append["searchable"] = False colsfields.append(field2append) return colsfields -def get_skyregions_collection(run_id: Optional[int]=None) -> Dict[str, Any]: +def get_skyregions_collection(run_id: Optional[UUID] = None) -> Dict[str, Any]: """ Produce Sky region geometry shapes JSON object for d3-celestial. @@ -284,37 +273,33 @@ def get_skyregions_collection(run_id: Optional[int]=None) -> Dict[str, Any]: features = [] - for skr in skyregions: - ra_fix = 360. if skr.centre_ra > 180. else 0. + for i, skr in enumerate(skyregions): + ra_fix = 360.0 if skr.centre_ra > 180.0 else 0.0 ra = skr.centre_ra - ra_fix dec = skr.centre_dec - width_ra = skr.width_ra / 2. - width_dec = skr.width_dec / 2. + width_ra = skr.width_ra / 2.0 + width_dec = skr.width_dec / 2.0 id = skr.id features.append( { "type": "Feature", "id": f"SkyRegion{id}", - "properties": { - "n": f"{id:02d}", - "loc": [ra, dec] - }, + "properties": {"n": f"{i:02d}", "loc": [ra, dec]}, "geometry": { "type": "MultiLineString", - "coordinates": [[ - [ra+width_ra, dec+width_dec], - [ra+width_ra, dec-width_dec], - [ra-width_ra, dec-width_dec], - [ra-width_ra, dec+width_dec], - [ra+width_ra, dec+width_dec] - ]] - } + "coordinates": [ + [ + [ra + width_ra, dec + width_dec], + [ra + width_ra, dec - width_dec], + [ra - width_ra, dec - width_dec], + [ra - width_ra, dec + width_dec], + [ra + width_ra, dec + width_dec], + ] + ], + }, } ) - skyregions_collection = { - "type": "FeatureCollection", - "features" : features - } + skyregions_collection = {"type": "FeatureCollection", "features": features} return skyregions_collection diff --git a/vast_pipeline/views.py b/vast_pipeline/views.py index 6245ed7dd..ce3d3e937 100644 --- a/vast_pipeline/views.py +++ b/vast_pipeline/views.py @@ -11,6 +11,7 @@ from glob import glob from itertools import tee from pathlib import Path +from uuid import UUID, uuid4 from astropy.io import fits from astropy.coordinates import SkyCoord, Angle @@ -26,7 +27,11 @@ from django.db import transaction from django.db.models import F, Count, QuerySet from django.http import ( - FileResponse, Http404, HttpResponseRedirect, JsonResponse, HttpResponse + FileResponse, + Http404, + HttpResponseRedirect, + JsonResponse, + HttpResponse, ) from django.shortcuts import render, redirect, get_object_or_404 from django.template.loader import render_to_string @@ -42,9 +47,7 @@ from rest_framework.response import Response from rest_framework.views import APIView from rest_framework.viewsets import ModelViewSet, ViewSet -from rest_framework.authentication import ( - SessionAuthentication, BasicAuthentication -) +from rest_framework.authentication import SessionAuthentication, BasicAuthentication from rest_framework.permissions import IsAuthenticated from rest_framework import serializers from django.contrib.postgres.aggregates.general import ArrayAgg @@ -52,13 +55,24 @@ from vast_pipeline.plots import plot_lightcurve, plot_eta_v_bokeh from vast_pipeline.models import ( - Comment, CommentableModel, Image, Measurement, Run, Source, SourceFav, + Comment, + CommentableModel, + Image, + Measurement, + Run, + Source, + SourceFav, ) from vast_pipeline.serializers import ( - ImageSerializer, MeasurementSerializer, RunSerializer, - SourceSerializer, RawImageSelavyListSerializer, - SourceFavSerializer, SesameResultSerializer, CoordinateValidatorSerializer, - ExternalSearchSerializer + ImageSerializer, + MeasurementSerializer, + RunSerializer, + SourceSerializer, + RawImageSelavyListSerializer, + SourceFavSerializer, + SesameResultSerializer, + CoordinateValidatorSerializer, + ExternalSearchSerializer, ) from vast_pipeline.utils import external_query from vast_pipeline.utils.utils import deg2dms, deg2hms, parse_coord, equ2gal @@ -99,7 +113,8 @@ def _process_comment_form_get_comments( comment_target_type = ContentType.objects.get_for_model(instance) comments = Comment.objects.filter( - content_type__pk=comment_target_type.id, object_id=instance.id, + content_type__pk=comment_target_type.id, + object_id=instance.id, ).order_by("datetime") return comment_form, comments @@ -107,25 +122,23 @@ def _process_comment_form_get_comments( def Login(request): context = { - 'particlejs_conf_f': os.path.join( - settings.STATIC_URL, 'js', 'particlesjs-config.json' + "particlejs_conf_f": os.path.join( + settings.STATIC_URL, "js", "particlesjs-config.json" ) } - return render(request, 'login.html', context) + return render(request, "login.html", context) @login_required def Home(request): - context = { - 'static_url': settings.STATIC_URL - } - return render(request, 'index.html', context) + context = {"static_url": settings.STATIC_URL} + return render(request, "index.html", context) # Runs table @login_required def RunIndex(request): - if request.method == 'POST': + if request.method == "POST": # this POST section is for initialise a pipeline run form = PipelineRunForm(request.POST) if form.is_valid(): @@ -137,10 +150,7 @@ def RunIndex(request): # Get the lists of user-provided file paths. These aren't in PipelineRunForm # but rather manually defined in the template. We should fix that. # TODO move file fields from the template into PipelineRunForm - f_list = [ - 'image_files', 'selavy_files', 'background_files', - 'noise_files' - ] + f_list = ["image_files", "selavy_files", "background_files", "noise_files"] for files in f_list: cfg_data[files] = request.POST.getlist(files) @@ -154,62 +164,57 @@ def RunIndex(request): messages.success( request, mark_safe( - f'Pipeline run {p_run.name} ' - 'initilialised successfully!' - ) + f"Pipeline run {p_run.name} " + "initilialised successfully!" + ), ) - return redirect('vast_pipeline:run_detail', id=p_run.id) + return redirect("vast_pipeline:run_detail", id=p_run.id) except Exception as e: - messages.error( - request, - f'Issue in pipeline run initilisation: {e}' - ) - return redirect('vast_pipeline:run_index') + messages.error(request, f"Issue in pipeline run initilisation: {e}") + return redirect("vast_pipeline:run_index") else: - messages.error( - request, - f'Form not valid: {form.errors}' - ) - return redirect('vast_pipeline:run_index') + messages.error(request, f"Form not valid: {form.errors}") + return redirect("vast_pipeline:run_index") - fields = [ - 'name', - 'time', - 'path', - 'n_images', - 'n_sources', - 'status' - ] + fields = ["name", "time", "path", "n_images", "n_sources", "status"] colsfields = generate_colsfields( fields, - {'name': reverse('vast_pipeline:run_detail', args=[1])[:-2]} + { + "name": reverse( + "vast_pipeline:run_detail", + args=["e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813"], + )[:-37] + }, ) return render( request, - 'generic_table.html', + "generic_table.html", { - 'text': { - 'title': 'Pipeline Runs', - 'description': 'List of pipeline runs below', - 'breadcrumb': {'title': 'Pipeline Runs', 'url': request.path}, + "text": { + "title": "Pipeline Runs", + "description": "List of pipeline runs below", + "breadcrumb": {"title": "Pipeline Runs", "url": request.path}, }, - 'datatable': { - 'api': ( - reverse('vast_pipeline:api_pipe_runs-list') + - '?format=datatables' + "datatable": { + "api": ( + reverse("vast_pipeline:api_pipe_runs-list") + "?format=datatables" ), - 'colsFields': colsfields, - 'colsNames': [ - 'Name', 'Run Datetime', 'Path', 'Nr Images', - 'Nr Sources', 'Run Status' + "colsFields": colsfields, + "colsNames": [ + "Name", + "Run Datetime", + "Path", + "Nr Images", + "Nr Sources", + "Run Status", ], - 'search': True, + "search": True, }, - 'runconfig' : settings.PIPE_RUN_CONFIG_DEFAULTS, - 'max_piperun_images': settings.MAX_PIPERUN_IMAGES - } + "runconfig": settings.PIPE_RUN_CONFIG_DEFAULTS, + "max_piperun_images": settings.MAX_PIPERUN_IMAGES, + }, ) @@ -219,9 +224,9 @@ class RunViewSet(ModelViewSet): queryset = Run.objects.all() serializer_class = RunSerializer - @rest_framework.decorators.action(detail=True, methods=['get']) + @rest_framework.decorators.action(detail=True, methods=["get"]) def images(self, request, pk=None): - qs = Image.objects.filter(run__id=pk).order_by('id') + qs = Image.objects.filter(run__id=pk).order_by("id") qs = self.filter_queryset(qs) page = self.paginate_queryset(qs) if page is not None: @@ -231,9 +236,9 @@ def images(self, request, pk=None): serializer = ImageSerializer(qs, many=True) return Response(serializer.data) - @rest_framework.decorators.action(detail=True, methods=['get']) + @rest_framework.decorators.action(detail=True, methods=["get"]) def measurements(self, request, pk=None): - qs = Measurement.objects.filter(image__run__in=[pk]).order_by('id') + qs = Measurement.objects.filter(image__run__in=[pk]).order_by("id") qs = self.filter_queryset(qs) page = self.paginate_queryset(qs) if page is not None: @@ -243,10 +248,8 @@ def measurements(self, request, pk=None): serializer = MeasurementSerializer(qs, many=True) return Response(serializer.data) - @rest_framework.decorators.action(detail=True, methods=['post']) - def run( - self, request: Request, pk: Optional[int] = None - ) -> HttpResponseRedirect: + @rest_framework.decorators.action(detail=True, methods=["post"]) + def run(self, request: Request, pk: Optional[int] = None) -> HttpResponseRedirect: """ Launches a pipeline run using a Django Q cluster. Includes a check on ownership or admin stataus of the user to make sure processing @@ -265,84 +268,81 @@ def run( """ if not pk: messages.error( - request, - 'Error in config write: Run pk parameter null or not passed' + request, "Error in config write: Run pk parameter null or not passed" ) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) try: p_run = get_object_or_404(self.queryset, pk=pk) except Exception as e: - messages.error(request, f'Error in config write: {e}') - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, f"Error in config write: {e}") + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) # make sure that only the run creator or an admin can request the run # to be processed. if p_run.user != request.user and not request.user.is_staff: - msg = 'You do not have permission to process this pipeline run!' + msg = "You do not have permission to process this pipeline run!" messages.error(request, msg) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) # check that it's not already running or queued if p_run.status in ["RUN", "QUE", "RES"]: msg = ( - f'{p_run.name} is already running, queued or restoring.' - ' Please wait for the run to complete before trying to' - ' submit again.' - ) - messages.error( - request, - msg + f"{p_run.name} is already running, queued or restoring." + " Please wait for the run to complete before trying to" + " submit again." ) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, msg) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) if Run.objects.check_max_runs(settings.MAX_PIPELINE_RUNS): msg = ( - 'The maximum number of simultaneous pipeline runs has been' - f' reached ({settings.MAX_PIPELINE_RUNS})! Please try again' - ' when other jobs have finished.' + "The maximum number of simultaneous pipeline runs has been" + f" reached ({settings.MAX_PIPELINE_RUNS})! Please try again" + " when other jobs have finished." ) - messages.error( - request, - msg - ) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, msg) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) prev_status = p_run.status try: with transaction.atomic(): - p_run.status = 'QUE' + p_run.status = "QUE" p_run.save() - debug_flag = True if request.POST.get('debug', None) else False - full_rerun = True if request.POST.get('fullReRun', None) else False + debug_flag = True if request.POST.get("debug", None) else False + full_rerun = True if request.POST.get("fullReRun", None) else False async_task( - 'vast_pipeline.management.commands.runpipeline.run_pipe', - p_run.name, p_run.path, p_run, False, debug_flag, - task_name=p_run.name, ack_failure=True, user=request.user, - full_rerun=full_rerun, prev_ui_status=prev_status + "vast_pipeline.management.commands.runpipeline.run_pipe", + p_run.name, + p_run.path, + p_run, + False, + debug_flag, + task_name=p_run.name, + ack_failure=True, + user=request.user, + full_rerun=full_rerun, + prev_ui_status=prev_status, ) msg = mark_safe( - f'{p_run.name} successfully sent to the queue!

Refresh the' - ' page to check the status.' - ) - messages.success( - request, - msg + f"{p_run.name} successfully sent to the queue!

Refresh the" + " page to check the status." ) + messages.success(request, msg) except Exception as e: with transaction.atomic(): - p_run.status = 'ERR' + p_run.status = "ERR" p_run.save() - messages.error(request, f'Error in running pipeline: {e}') - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, f"Error in running pipeline: {e}") + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) return HttpResponseRedirect( - reverse('vast_pipeline:run_detail', args=[p_run.id]) + reverse("vast_pipeline:run_detail", args=[p_run.id]) ) - @rest_framework.decorators.action(detail=True, methods=['post']) + @rest_framework.decorators.action(detail=True, methods=["post"]) def restore( self, request: Request, pk: Optional[int] = None ) -> HttpResponseRedirect: @@ -364,80 +364,70 @@ def restore( """ if not pk: messages.error( - request, - 'Error in config write: Run pk parameter null or not passed' + request, "Error in config write: Run pk parameter null or not passed" ) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) try: p_run = get_object_or_404(self.queryset, pk=pk) except Exception as e: - messages.error(request, f'Error in run fetch: {e}') - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, f"Error in run fetch: {e}") + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) # make sure that only the run creator or an admin can request the run # to be processed. if p_run.user != request.user and not request.user.is_staff: - msg = 'You do not have permission to process this pipeline run!' + msg = "You do not have permission to process this pipeline run!" messages.error(request, msg) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) # check that it's not already running or queued if p_run.status in ["RUN", "QUE", "RES", "INI"]: msg = ( - f'{p_run.name} is already running, queued, restoring or is ' - 'only initialised. It cannot be restored at this time.' - ) - messages.error( - request, - msg + f"{p_run.name} is already running, queued, restoring or is " + "only initialised. It cannot be restored at this time." ) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, msg) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) if Run.objects.check_max_runs(settings.MAX_PIPELINE_RUNS): msg = ( - 'The maximum number of simultaneous pipeline runs has been' - f' reached ({settings.MAX_PIPELINE_RUNS})! Please try again' - ' when other jobs have finished.' - ) - messages.error( - request, - msg + "The maximum number of simultaneous pipeline runs has been" + f" reached ({settings.MAX_PIPELINE_RUNS})! Please try again" + " when other jobs have finished." ) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, msg) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) prev_status = p_run.status try: - debug_flag = 3 if request.POST.get('restoreDebug', None) else 1 + debug_flag = 3 if request.POST.get("restoreDebug", None) else 1 async_task( - 'django.core.management.call_command', - 'restorepiperun', + "django.core.management.call_command", + "restorepiperun", p_run.path, no_confirm=True, - verbosity=debug_flag + verbosity=debug_flag, ) msg = mark_safe( - f'Restore {p_run.name} successfully sent to the queue!

Refresh the' - ' page to check the status.' - ) - messages.success( - request, - msg + f"Restore {p_run.name} successfully sent to the queue!

Refresh the" + " page to check the status." ) + messages.success(request, msg) except Exception as e: with transaction.atomic(): - p_run.status = 'ERR' + p_run.status = "ERR" p_run.save() - messages.error(request, f'Error in restoring run: {e}') - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, f"Error in restoring run: {e}") + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) return HttpResponseRedirect( - reverse('vast_pipeline:run_detail', args=[p_run.id]) + reverse("vast_pipeline:run_detail", args=[p_run.id]) ) - @rest_framework.decorators.action(detail=True, methods=['post']) + @rest_framework.decorators.action(detail=True, methods=["post"]) def delete( self, request: Request, pk: Optional[int] = None ) -> HttpResponseRedirect: @@ -458,67 +448,58 @@ def delete( """ if not pk: messages.error( - request, - 'Error in config write: Run pk parameter null or not passed' + request, "Error in config write: Run pk parameter null or not passed" ) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) try: p_run = get_object_or_404(self.queryset, pk=pk) except Exception as e: - messages.error(request, f'Error in run fetch: {e}') - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, f"Error in run fetch: {e}") + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) # make sure that only the run creator or an admin can request the run # to be processed. if p_run.user != request.user and not request.user.is_staff: - msg = 'You do not have permission to process this pipeline run!' + msg = "You do not have permission to process this pipeline run!" messages.error(request, msg) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) # check that it's not already running or queued if p_run.status in ["RUN", "QUE", "RES"]: msg = ( - f'{p_run.name} is already running, queued or restoring. ' - 'It cannot be deleted at this time.' + f"{p_run.name} is already running, queued or restoring. " + "It cannot be deleted at this time." ) - messages.error( - request, - msg - ) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, msg) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) try: async_task( - 'django.core.management.call_command', - 'clearpiperun', + "django.core.management.call_command", + "clearpiperun", p_run.path, remove_all=True, ) msg = mark_safe( - f'Delete {p_run.name} successfully requested!

' - ' Refresh the Pipeline Runs page for the deletion to take effect.' - ) - messages.success( - request, - msg + f"Delete {p_run.name} successfully requested!

" + " Refresh the Pipeline Runs page for the deletion to take effect." ) + messages.success(request, msg) except Exception as e: with transaction.atomic(): - p_run.status = 'ERR' + p_run.status = "ERR" p_run.save() - messages.error(request, f'Error in deleting run: {e}') - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, f"Error in deleting run: {e}") + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) - return HttpResponseRedirect( - reverse('vast_pipeline:run_index') - ) + return HttpResponseRedirect(reverse("vast_pipeline:run_index")) - @rest_framework.decorators.action(detail=True, methods=['post']) + @rest_framework.decorators.action(detail=True, methods=["post"]) def genarrow( self, request: Request, pk: Optional[int] = None - ) ->HttpResponseRedirect: + ) -> HttpResponseRedirect: """ Launches the create arrow files process for a pipeline run using a Django Q cluster. Includes a check on ownership or admin status of @@ -537,160 +518,158 @@ def genarrow( """ if not pk: messages.error( - request, - 'Error in config write: Run pk parameter null or not passed' + request, "Error in config write: Run pk parameter null or not passed" ) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) try: p_run = get_object_or_404(self.queryset, pk=pk) except Exception as e: - messages.error(request, f'Error in run fetch: {e}') - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, f"Error in run fetch: {e}") + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) # make sure that only the run creator or an admin can request the run # to be processed. if p_run.user != request.user and not request.user.is_staff: - msg = 'You do not have permission to process this pipeline run!' + msg = "You do not have permission to process this pipeline run!" messages.error(request, msg) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) # check that it's not already running or queued if p_run.status != "END": msg = ( - f'{p_run.name} has not completed successfully.' - ' The arrow files can only be generated after the run is' - ' successful.' + f"{p_run.name} has not completed successfully." + " The arrow files can only be generated after the run is" + " successful." ) - messages.error( - request, - msg - ) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, msg) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) try: - overwrite_flag = True if request.POST.get('arrowOverwrite', None) else False + overwrite_flag = True if request.POST.get("arrowOverwrite", None) else False async_task( - 'django.core.management.call_command', - 'createmeasarrow', + "django.core.management.call_command", + "createmeasarrow", p_run.path, overwrite=overwrite_flag, - verbosity=3 + verbosity=3, ) msg = mark_safe( - f'Generate the arrow files for {p_run.name} successfully requested!

' - ' Refresh the page and check the generate arrow log output for the status of the process.' - ) - messages.success( - request, - msg + f"Generate the arrow files for {p_run.name} successfully requested!

" + " Refresh the page and check the generate arrow log output for the status of the process." ) + messages.success(request, msg) except Exception as e: with transaction.atomic(): - p_run.status = 'ERR' + p_run.status = "ERR" p_run.save() - messages.error(request, f'Error in deleting run: {e}') - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, f"Error in deleting run: {e}") + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) return HttpResponseRedirect( - reverse('vast_pipeline:run_detail', args=[p_run.id]) + reverse("vast_pipeline:run_detail", args=[p_run.id]) ) # Run detail @login_required def RunDetail(request, id): - p_run_model = Run.objects.filter(id=id).prefetch_related('image_set').get() + p_run_model = Run.objects.filter(id=id).prefetch_related("image_set").get() p_run = p_run_model.__dict__ # build config path for POST and later - p_run['user'] = p_run_model.user.username if p_run_model.user else None - p_run['status'] = p_run_model.get_status_display() + p_run["user"] = p_run_model.user.username if p_run_model.user else None + p_run["status"] = p_run_model.get_status_display() # Change measurement count to N.A. if run is not complete. - if p_run_model.image_set.exists() and p_run_model.status == 'Completed': - p_run['nr_meas'] = p_run['n_selavy_measurements'] - p_run['nr_frcd'] = p_run['n_forced_measurements'] - p_run['nr_srcs'] = p_run['n_sources'] - p_run['new_srcs'] = p_run['n_new_sources'] + if p_run_model.image_set.exists() and p_run_model.status == "Completed": + p_run["nr_meas"] = p_run["n_selavy_measurements"] + p_run["nr_frcd"] = p_run["n_forced_measurements"] + p_run["nr_srcs"] = p_run["n_sources"] + p_run["new_srcs"] = p_run["n_new_sources"] else: - p_run['nr_meas'] = 'N/A' - p_run['nr_frcd'] = 'N/A' - p_run['nr_srcs'] = 'N/A' - p_run['new_srcs'] = 'N/A' + p_run["nr_meas"] = "N/A" + p_run["nr_frcd"] = "N/A" + p_run["nr_srcs"] = "N/A" + p_run["new_srcs"] = "N/A" # read run config - f_path = os.path.join(p_run['path'], 'config.yaml') + f_path = os.path.join(p_run["path"], "config.yaml") if os.path.exists(f_path): with open(f_path) as fp: - p_run['config_txt'] = fp.read() + p_run["config_txt"] = fp.read() # read prev run config - f_path = os.path.join(p_run['path'], 'config.yaml.bak') + f_path = os.path.join(p_run["path"], "config.yaml.bak") if os.path.exists(f_path): with open(f_path) as fp: - p_run['prev_config_txt'] = fp.read() + p_run["prev_config_txt"] = fp.read() - log_files = sorted(glob(os.path.join(p_run['path'], '*[0-9]_log.txt'))) + log_files = sorted(glob(os.path.join(p_run["path"], "*[0-9]_log.txt"))) log_files = [os.path.basename(i) for i in log_files[::-1]] restore_log_files = sorted( - glob(os.path.join(p_run['path'], '*[0-9]_restore_log.txt')) + glob(os.path.join(p_run["path"], "*[0-9]_restore_log.txt")) ) restore_log_files = [os.path.basename(i) for i in restore_log_files[::-1]] genarrow_log_files = sorted( - glob(os.path.join(p_run['path'], '*[0-9]_gen_arrow_log.txt')) + glob(os.path.join(p_run["path"], "*[0-9]_gen_arrow_log.txt")) ) genarrow_log_files = [os.path.basename(i) for i in genarrow_log_files[::-1]] # Detect whether arrow files are present - p_run['arrow_files'] = os.path.isfile( - os.path.join(p_run['path'], 'measurements.arrow') + p_run["arrow_files"] = os.path.isfile( + os.path.join(p_run["path"], "measurements.arrow") ) image_fields = [ - 'name', - 'datetime', - 'frequency', - 'ra', - 'dec', - 'rms_median', - 'rms_min', - 'rms_max', - 'beam_bmaj', - 'beam_bmin', - 'beam_bpa', + "name", + "datetime", + "frequency", + "ra", + "dec", + "rms_median", + "rms_min", + "rms_max", + "beam_bmaj", + "beam_bmin", + "beam_bpa", ] image_colsfields = generate_colsfields( image_fields, - {'name': reverse('vast_pipeline:image_detail', args=[1])[:-2]}, - not_searchable_col=['frequency'] + { + "name": reverse( + "vast_pipeline:image_detail", + args=["e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813"], + )[:-37] + }, + not_searchable_col=["frequency"], ) image_datatable = { - 'table_id': 'dataTable', - 'api': ( - reverse('vast_pipeline:api_pipe_runs-images', args=[p_run['id']]) + - '?format=datatables' + "table_id": "dataTable", + "api": ( + reverse("vast_pipeline:api_pipe_runs-images", args=[p_run["id"]]) + + "?format=datatables" ), - 'colsFields': image_colsfields, - 'colsNames': [ - 'Name', - 'Time (UTC)', - 'Frequency (MHz)', - 'RA (deg)', - 'Dec (deg)', - 'Median RMS (mJy)', - 'Min RMS (mJy)', - 'Max RMS (mJy)', - 'Beam Major (arcsec)', - 'Beam Minor (arcsec)', - 'Beam PA (deg)' + "colsFields": image_colsfields, + "colsNames": [ + "Name", + "Time (UTC)", + "Frequency (MHz)", + "RA (deg)", + "Dec (deg)", + "Median RMS (mJy)", + "Min RMS (mJy)", + "Max RMS (mJy)", + "Beam Major (arcsec)", + "Beam Minor (arcsec)", + "Beam PA (deg)", ], - 'search': True, - 'order': [1, 'asc'] + "search": True, + "order": [1, "asc"], } context = { @@ -700,72 +679,75 @@ def RunDetail(request, id): "static_url": settings.STATIC_URL, "log_files": log_files, "restore_log_files": restore_log_files, - "genarrow_log_files": genarrow_log_files + "genarrow_log_files": genarrow_log_files, } context["comment_form"], context["comments"] = _process_comment_form_get_comments( - request, - p_run_model + request, p_run_model ) - return render(request, 'run_detail.html', context) + return render(request, "run_detail.html", context) # Images table @login_required def ImageIndex(request): fields = [ - 'name', - 'datetime', - 'frequency', - 'ra', - 'dec', - 'rms_median', - 'rms_min', - 'rms_max', - 'beam_bmaj', - 'beam_bmin', - 'beam_bpa' + "name", + "datetime", + "frequency", + "ra", + "dec", + "rms_median", + "rms_min", + "rms_max", + "beam_bmaj", + "beam_bmin", + "beam_bpa", ] colsfields = generate_colsfields( fields, - {'name': reverse('vast_pipeline:image_detail', args=[1])[:-2]}, - not_searchable_col=['frequency'] + { + "name": reverse( + "vast_pipeline:image_detail", + args=["e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813"], + )[:-37] + }, + not_searchable_col=["frequency"], ) return render( request, - 'generic_table.html', + "generic_table.html", { - 'text': { - 'title': 'Images', - 'description': 'List of images below', - 'breadcrumb': {'title': 'Images', 'url': request.path}, + "text": { + "title": "Images", + "description": "List of images below", + "breadcrumb": {"title": "Images", "url": request.path}, }, - 'datatable': { - 'api': ( - reverse('vast_pipeline:api_images-list') + - '?format=datatables' + "datatable": { + "api": ( + reverse("vast_pipeline:api_images-list") + "?format=datatables" ), - 'colsFields': colsfields, - 'colsNames': [ - 'Name', - 'Time (UTC)', - 'Frequency (MHz)', - 'RA (deg)', - 'Dec (deg)', - 'Median RMS (mJy)', - 'Min RMS (mJy)', - 'Max RMS (mJy)', - 'Beam Major (arcsec)', - 'Beam Minor (arcsec)', - 'Beam PA (deg)' + "colsFields": colsfields, + "colsNames": [ + "Name", + "Time (UTC)", + "Frequency (MHz)", + "RA (deg)", + "Dec (deg)", + "Median RMS (mJy)", + "Min RMS (mJy)", + "Max RMS (mJy)", + "Beam Major (arcsec)", + "Beam Minor (arcsec)", + "Beam PA (deg)", ], - 'search': True, - 'order': [1, 'asc'] - } - } + "search": True, + "order": [1, "asc"], + }, + }, ) @@ -775,9 +757,9 @@ class ImageViewSet(ModelViewSet): queryset = Image.objects.all() serializer_class = ImageSerializer - @rest_framework.decorators.action(detail=True, methods=['get']) + @rest_framework.decorators.action(detail=True, methods=["get"]) def measurements(self, request, pk=None): - qs = Measurement.objects.filter(image__in=[pk], forced=False).order_by('id') + qs = Measurement.objects.filter(image__in=[pk], forced=False).order_by("id") qs = self.filter_queryset(qs) page = self.paginate_queryset(qs) if page is not None: @@ -787,10 +769,10 @@ def measurements(self, request, pk=None): serializer = MeasurementSerializer(qs, many=True) return Response(serializer.data) - @rest_framework.decorators.action(detail=True, methods=['get']) + @rest_framework.decorators.action(detail=True, methods=["get"]) def runs(self, request, pk=None): image = self.queryset.get(pk=pk) - qs = image.run.all().order_by('id') + qs = image.run.all().order_by("id") qs = self.filter_queryset(qs) page = self.paginate_queryset(qs) if page is not None: @@ -804,242 +786,271 @@ def runs(self, request, pk=None): @login_required def ImageDetail(request, id, action=None): # source data - image = Image.objects.all().order_by('id') + image = Image.objects.all().order_by("id") if action: - if action == 'next': + if action == "next": img = image.filter(id__gt=id) if img.exists(): - image = img.annotate( - frequency=F('band__frequency'), - bandwidth=F('band__bandwidth'), - n_runs=Count('run') - ).values().first() + image = ( + img.annotate( + frequency=F("band__frequency"), + bandwidth=F("band__bandwidth"), + n_runs=Count("run"), + ) + .values() + .first() + ) else: - image = image.filter(id=id).annotate( - frequency=F('band__frequency'), - bandwidth=F('band__bandwidth'), - n_runs=Count('run') - ).values().get() - elif action == 'prev': + image = ( + image.filter(id=id) + .annotate( + frequency=F("band__frequency"), + bandwidth=F("band__bandwidth"), + n_runs=Count("run"), + ) + .values() + .get() + ) + elif action == "prev": img = image.filter(id__lt=id) if img.exists(): - image = img.annotate( - frequency=F('band__frequency'), - bandwidth=F('band__bandwidth'), - n_runs=Count('run') - ).values().last() + image = ( + img.annotate( + frequency=F("band__frequency"), + bandwidth=F("band__bandwidth"), + n_runs=Count("run"), + ) + .values() + .last() + ) else: - image = image.filter(id=id).annotate( - frequency=F('band__frequency'), - bandwidth=F('band__bandwidth'), - n_runs=Count('run') - ).values().get() + image = ( + image.filter(id=id) + .annotate( + frequency=F("band__frequency"), + bandwidth=F("band__bandwidth"), + n_runs=Count("run"), + ) + .values() + .get() + ) else: - image = image.filter(id=id).annotate( - frequency=F('band__frequency'), - bandwidth=F('band__bandwidth'), - n_runs=Count('run') - ).values().get() - - image['aladin_ra'] = image['ra'] - image['aladin_dec'] = image['dec'] - image['aladin_zoom'] = 17.0 - image['aladin_box_ra'] = image['physical_bmaj'] - image['aladin_box_dec'] = image['physical_bmin'] - image['ra_hms'] = deg2hms(image['ra'], hms_format=True) - image['dec_dms'] = deg2dms(image['dec'], dms_format=True) - image['l'], image['b'] = equ2gal(image['ra'], image['dec']) - - image['datetime'] = image['datetime'].isoformat() - image['n_meas'] = ( - pd.read_parquet(image['measurements_path'], columns=['id']) - .shape[0] - ) + image = ( + image.filter(id=id) + .annotate( + frequency=F("band__frequency"), + bandwidth=F("band__bandwidth"), + n_runs=Count("run"), + ) + .values() + .get() + ) + + image["aladin_ra"] = image["ra"] + image["aladin_dec"] = image["dec"] + image["aladin_zoom"] = 17.0 + image["aladin_box_ra"] = image["physical_bmaj"] + image["aladin_box_dec"] = image["physical_bmin"] + image["ra_hms"] = deg2hms(image["ra"], hms_format=True) + image["dec_dms"] = deg2dms(image["dec"], dms_format=True) + image["l"], image["b"] = equ2gal(image["ra"], image["dec"]) + + image["datetime"] = image["datetime"].isoformat() + image["n_meas"] = pd.read_parquet(image["measurements_path"], columns=["id"]).shape[ + 0 + ] meas_fields = [ - 'name', - 'ra', - 'ra_err', - 'uncertainty_ew', - 'dec', - 'dec_err', - 'uncertainty_ns', - 'flux_peak', - 'flux_peak_err', - 'flux_peak_isl_ratio', - 'flux_int', - 'flux_int_err', - 'flux_int_isl_ratio', - 'frequency', - 'compactness', - 'snr', - 'has_siblings', - 'forced' + "name", + "ra", + "ra_err", + "uncertainty_ew", + "dec", + "dec_err", + "uncertainty_ns", + "flux_peak", + "flux_peak_err", + "flux_peak_isl_ratio", + "flux_int", + "flux_int_err", + "flux_int_isl_ratio", + "frequency", + "compactness", + "snr", + "has_siblings", + "forced", ] meas_colsfields = generate_colsfields( meas_fields, - {'name': reverse('vast_pipeline:measurement_detail', args=[1])[:-2]}, - not_searchable_col=['frequency'] + { + "name": reverse( + "vast_pipeline:measurement_detail", + args=["e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813"], + )[:-37] + }, + not_searchable_col=["frequency"], ) meas_datatable = { - 'table_id': 'measDataTable', - 'api': ( - reverse('vast_pipeline:api_images-measurements', args=[image['id']]) + - '?format=datatables' + "table_id": "measDataTable", + "api": ( + reverse("vast_pipeline:api_images-measurements", args=[image["id"]]) + + "?format=datatables" ), - 'colsFields': meas_colsfields, - 'colsNames': [ - 'Name', - 'RA (deg)', - 'RA Error (arcsec)', - 'Uncertainty EW (arcsec)', - 'Dec (deg)', - 'Dec Error (arcsec)', - 'Uncertainty NS (arcsec)', - 'Peak Flux (mJy/beam)', - 'Peak Flux Error (mJy/beam)', - 'Peak Flux Isl. Ratio', - 'Int. Flux (mJy)', - 'Int. Flux Error (mJy)', - 'Int. Flux Isl. Ratio', - 'Frequency (MHz)', - 'Compactness', - 'SNR', - 'Has siblings', - 'Forced Extraction' + "colsFields": meas_colsfields, + "colsNames": [ + "Name", + "RA (deg)", + "RA Error (arcsec)", + "Uncertainty EW (arcsec)", + "Dec (deg)", + "Dec Error (arcsec)", + "Uncertainty NS (arcsec)", + "Peak Flux (mJy/beam)", + "Peak Flux Error (mJy/beam)", + "Peak Flux Isl. Ratio", + "Int. Flux (mJy)", + "Int. Flux Error (mJy)", + "Int. Flux Isl. Ratio", + "Frequency (MHz)", + "Compactness", + "SNR", + "Has siblings", + "Forced Extraction", ], - 'search': True, + "search": True, } - run_fields = [ - 'name', - 'time', - 'path', - 'n_images', - 'n_sources', - 'status' - ] + run_fields = ["name", "time", "path", "n_images", "n_sources", "status"] run_colsfields = generate_colsfields( run_fields, - {'name': reverse('vast_pipeline:run_detail', args=[1])[:-2]} + { + "name": reverse( + "vast_pipeline:run_detail", + args=["e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813"], + )[:-37] + }, ) run_datatable = { - 'table_id': 'runDataTable', - 'api': ( - reverse('vast_pipeline:api_images-runs', args=[image['id']]) + - '?format=datatables' + "table_id": "runDataTable", + "api": ( + reverse("vast_pipeline:api_images-runs", args=[image["id"]]) + + "?format=datatables" ), - 'colsFields': run_colsfields, - 'colsNames': [ - 'Name', - 'Run Datetime', - 'Path', - 'Nr Images', - 'Nr Sources', - 'Run Status' + "colsFields": run_colsfields, + "colsNames": [ + "Name", + "Run Datetime", + "Path", + "Nr Images", + "Nr Sources", + "Run Status", ], - 'search': True, + "search": True, } - context = {'image': image, 'datatables': [meas_datatable, run_datatable]} + context = {"image": image, "datatables": [meas_datatable, run_datatable]} context["comment_form"], context["comments"] = _process_comment_form_get_comments( - request, - Image.objects.get(id=image["id"]) + request, Image.objects.get(id=image["id"]) ) - return render(request, 'image_detail.html', context) + return render(request, "image_detail.html", context) # Measurements table @login_required def MeasurementIndex(request): fields = [ - 'name', - 'ra', - 'uncertainty_ew', - 'dec', - 'uncertainty_ns', - 'flux_peak', - 'flux_peak_err', - 'flux_peak_isl_ratio', - 'flux_int', - 'flux_int_err', - 'flux_int_isl_ratio', - 'frequency', - 'compactness', - 'snr', - 'has_siblings', - 'forced' + "name", + "ra", + "uncertainty_ew", + "dec", + "uncertainty_ns", + "flux_peak", + "flux_peak_err", + "flux_peak_isl_ratio", + "flux_int", + "flux_int_err", + "flux_int_isl_ratio", + "frequency", + "compactness", + "snr", + "has_siblings", + "forced", ] colsfields = generate_colsfields( fields, - {'name': reverse('vast_pipeline:measurement_detail', args=[1])[:-2]}, - not_searchable_col=['frequency'] + { + "name": reverse( + "vast_pipeline:measurement_detail", + args=["e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813"], + )[:-37] + }, + not_searchable_col=["frequency"], ) return render( request, - 'generic_table.html', + "generic_table.html", { - 'text': { - 'title': 'Image Data Measurements', - 'description': 'List of source measurements below', - 'breadcrumb': {'title': 'Measurements', 'url': request.path}, + "text": { + "title": "Image Data Measurements", + "description": "List of source measurements below", + "breadcrumb": {"title": "Measurements", "url": request.path}, }, - 'datatable': { - 'api': ( - reverse('vast_pipeline:api_measurements-list') + - '?format=datatables' + "datatable": { + "api": ( + reverse("vast_pipeline:api_measurements-list") + + "?format=datatables" ), - 'colsFields': colsfields, - 'colsNames': [ - 'Name', - 'RA (deg)', - 'RA Error (arcsec)', - 'Dec (deg)', - 'Dec Error (arcsec)', - 'Peak Flux (mJy/beam)', - 'Peak Flux Error (mJy/beam)', - 'Peak Flux Isl. Ratio', - 'Int. Flux (mJy)', - 'Int. Flux Error (mJy)', - 'Int. Flux Isl. Ratio', - 'Frequency (MHz)', - 'Compactness', - 'SNR', - 'Has siblings', - 'Forced Extraction' + "colsFields": colsfields, + "colsNames": [ + "Name", + "RA (deg)", + "RA Error (arcsec)", + "Dec (deg)", + "Dec Error (arcsec)", + "Peak Flux (mJy/beam)", + "Peak Flux Error (mJy/beam)", + "Peak Flux Isl. Ratio", + "Int. Flux (mJy)", + "Int. Flux Error (mJy)", + "Int. Flux Isl. Ratio", + "Frequency (MHz)", + "Compactness", + "SNR", + "Has siblings", + "Forced Extraction", ], - 'search': True, - } - } + "search": True, + }, + }, ) class MeasurementViewSet(ModelViewSet): authentication_classes = [SessionAuthentication, BasicAuthentication] permission_classes = [IsAuthenticated] - queryset = Measurement.objects.all().order_by('id') + queryset = Measurement.objects.all().order_by("id") serializer_class = MeasurementSerializer def get_queryset(self): - run_id = self.request.query_params.get('run_id', None) + run_id = self.request.query_params.get("run_id", None) return self.queryset.filter(source__id=run_id) if run_id else self.queryset - @rest_framework.decorators.action(detail=True, methods=['get']) + @rest_framework.decorators.action(detail=True, methods=["get"]) def siblings(self, request, pk=None): measurement = self.queryset.get(pk=pk) image_id = measurement.image_id island_id = measurement.island_id - qs = self.queryset.filter( - image__id=image_id, island_id=island_id - ).exclude(pk=pk) + qs = self.queryset.filter(image__id=image_id, island_id=island_id).exclude( + pk=pk + ) qs = self.filter_queryset(qs) page = self.paginate_queryset(qs) if page is not None: @@ -1049,7 +1060,7 @@ def siblings(self, request, pk=None): serializer = self.get_serializer(qs, many=True) return Response(serializer.data) - @rest_framework.decorators.action(detail=True, methods=['get']) + @rest_framework.decorators.action(detail=True, methods=["get"]) def sources(self, request, pk=None): measurement = self.queryset.get(pk=pk) qs = measurement.source.all() @@ -1066,195 +1077,223 @@ def sources(self, request, pk=None): @login_required def MeasurementDetail(request, id, action=None): # source data - measurement = Measurement.objects.all().order_by('id') + measurement = Measurement.objects.all().order_by("id") if action: - if action == 'next': + if action == "next": msr = measurement.filter(id__gt=id) if msr.exists(): - measurement = msr.annotate( - datetime=F('image__datetime'), - image_name=F('image__name'), - source_ids=ArrayAgg('source__id'), - frequency=F('image__band__frequency') - ).values().first() + measurement = ( + msr.annotate( + datetime=F("image__datetime"), + image_name=F("image__name"), + source_ids=ArrayAgg("source__id"), + frequency=F("image__band__frequency"), + ) + .values() + .first() + ) else: - measurement = measurement.filter(id=id).annotate( - datetime=F('image__datetime'), - image_name=F('image__name'), - source_ids=ArrayAgg('source__id'), - source_names=ArrayAgg('source__name'), - frequency=F('image__band__frequency') - ).values().get() - elif action == 'prev': + measurement = ( + measurement.filter(id=id) + .annotate( + datetime=F("image__datetime"), + image_name=F("image__name"), + source_ids=ArrayAgg("source__id"), + source_names=ArrayAgg("source__name"), + frequency=F("image__band__frequency"), + ) + .values() + .get() + ) + elif action == "prev": msr = measurement.filter(id__lt=id) if msr.exists(): - measurement = msr.annotate( - datetime=F('image__datetime'), - image_name=F('image__name'), - source_ids=ArrayAgg('source__id'), - frequency=F('image__band__frequency') - ).values().last() + measurement = ( + msr.annotate( + datetime=F("image__datetime"), + image_name=F("image__name"), + source_ids=ArrayAgg("source__id"), + frequency=F("image__band__frequency"), + ) + .values() + .last() + ) else: - measurement = measurement.filter(id=id).annotate( - datetime=F('image__datetime'), - image_name=F('image__name'), - source_ids=ArrayAgg('source__id'), - frequency=F('image__band__frequency') - ).values().get() + measurement = ( + measurement.filter(id=id) + .annotate( + datetime=F("image__datetime"), + image_name=F("image__name"), + source_ids=ArrayAgg("source__id"), + frequency=F("image__band__frequency"), + ) + .values() + .get() + ) else: - measurement = measurement.filter(id=id).annotate( - datetime=F('image__datetime'), - image_name=F('image__name'), - source_ids=ArrayAgg('source__id'), - frequency=F('image__band__frequency') - ).values().get() - - measurement['aladin_ra'] = measurement['ra'] - measurement['aladin_dec'] = measurement['dec'] - measurement['aladin_zoom'] = 0.15 - measurement['ra_hms'] = deg2hms(measurement['ra'], hms_format=True) - measurement['dec_dms'] = deg2dms(measurement['dec'], dms_format=True) - measurement['l'], measurement['b'] = equ2gal(measurement['ra'], measurement['dec']) - - measurement['datetime'] = measurement['datetime'].isoformat() - - measurement['nr_sources'] = ( - 0 if measurement['source_ids'] == [None] else len(measurement['source_ids']) + measurement = ( + measurement.filter(id=id) + .annotate( + datetime=F("image__datetime"), + image_name=F("image__name"), + source_ids=ArrayAgg("source__id"), + frequency=F("image__band__frequency"), + ) + .values() + .get() + ) + + measurement["aladin_ra"] = measurement["ra"] + measurement["aladin_dec"] = measurement["dec"] + measurement["aladin_zoom"] = 0.15 + measurement["ra_hms"] = deg2hms(measurement["ra"], hms_format=True) + measurement["dec_dms"] = deg2dms(measurement["dec"], dms_format=True) + measurement["l"], measurement["b"] = equ2gal(measurement["ra"], measurement["dec"]) + + measurement["datetime"] = measurement["datetime"].isoformat() + + measurement["nr_sources"] = ( + 0 if measurement["source_ids"] == [None] else len(measurement["source_ids"]) ) sibling_fields = [ - 'name', - 'flux_peak', - 'flux_peak_isl_ratio', - 'flux_int', - 'flux_int_isl_ratio', - 'island_id', + "name", + "flux_peak", + "flux_peak_isl_ratio", + "flux_int", + "flux_int_isl_ratio", + "island_id", ] sibling_colsfields = generate_colsfields( sibling_fields, - {'name': reverse('vast_pipeline:measurement_detail', args=[1])[:-2]} + { + "name": reverse( + "vast_pipeline:measurement_detail", + args=["e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813"], + )[:-37] + }, ) sibling_datatable = { - 'table_id': 'siblingTable', - 'api': ( - reverse('vast_pipeline:api_measurements-siblings', args=[measurement['id']]) + - '?format=datatables' + "table_id": "siblingTable", + "api": ( + reverse("vast_pipeline:api_measurements-siblings", args=[measurement["id"]]) + + "?format=datatables" ), - 'colsFields': sibling_colsfields, - 'colsNames': [ - 'Name', - 'Peak Flux (mJy/beam)', - 'Peak Flux Isl. Ratio', - 'Int. Flux (mJy/beam)', - 'Int. Flux Isl. Ratio', - 'Island ID' + "colsFields": sibling_colsfields, + "colsNames": [ + "Name", + "Peak Flux (mJy/beam)", + "Peak Flux Isl. Ratio", + "Int. Flux (mJy/beam)", + "Int. Flux Isl. Ratio", + "Island ID", ], - 'search': True, + "search": True, } source_fields = [ - 'name', - 'run.name', - 'wavg_ra', - 'wavg_dec', - 'avg_flux_peak', - 'min_flux_peak', - 'max_flux_peak', - 'min_flux_peak_isl_ratio', - 'avg_flux_int', - 'min_flux_int', - 'max_flux_int', - 'min_flux_int_isl_ratio', - 'min_snr', - 'max_snr', - 'avg_compactness', - 'n_meas', - 'n_meas_sel', - 'n_meas_forced', - 'n_neighbour_dist', - 'n_rel', - 'v_int', - 'eta_int', - 'v_peak', - 'eta_peak', - 'vs_abs_significant_max_int', - 'vs_abs_significant_max_peak', - 'm_abs_significant_max_int', - 'm_abs_significant_max_peak', - 'n_sibl', - 'new', - 'new_high_sigma' + "name", + "run.name", + "wavg_ra", + "wavg_dec", + "avg_flux_peak", + "min_flux_peak", + "max_flux_peak", + "min_flux_peak_isl_ratio", + "avg_flux_int", + "min_flux_int", + "max_flux_int", + "min_flux_int_isl_ratio", + "min_snr", + "max_snr", + "avg_compactness", + "n_meas", + "n_meas_sel", + "n_meas_forced", + "n_neighbour_dist", + "n_rel", + "v_int", + "eta_int", + "v_peak", + "eta_peak", + "vs_abs_significant_max_int", + "vs_abs_significant_max_peak", + "m_abs_significant_max_int", + "m_abs_significant_max_peak", + "n_sibl", + "new", + "new_high_sigma", ] api_col_dict = { - 'name': reverse('vast_pipeline:source_detail', args=[1])[:-2], - 'run.name': reverse('vast_pipeline:run_detail', args=[1])[:-2] + "name": reverse( + "vast_pipeline:source_detail", args=["e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813"] + )[:-37], + "run.name": reverse( + "vast_pipeline:run_detail", args=["e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813"] + )[:-37], } - source_colsfields = generate_colsfields( - source_fields, - api_col_dict - ) + source_colsfields = generate_colsfields(source_fields, api_col_dict) source_datatable = { - 'table_id': 'measSourcesTable', - 'api': ( - reverse('vast_pipeline:api_measurements-sources', args=[measurement['id']]) + - '?format=datatables' + "table_id": "measSourcesTable", + "api": ( + reverse("vast_pipeline:api_measurements-sources", args=[measurement["id"]]) + + "?format=datatables" ), - 'colsFields': source_colsfields, - 'colsNames': [ - 'Name', - 'Run', - 'W. Avg. RA', - 'W. Avg. Dec', - 'Avg. Peak Flux (mJy/beam)', - 'Min Peak Flux (mJy/beam)', - 'Max Peak Flux (mJy/beam)', - 'Min Peak Flux Isl. Ratio', - 'Avg. Int. Flux (mJy)', - 'Min Int. Flux (mJy)', - 'Max Int. Flux (mJy)', - 'Min Int. Flux Isl. Ratio', - 'Min SNR', - 'Max SNR', - 'Avg. Compactness', - 'Total Datapoints', - 'Selavy Datapoints', - 'Forced Datapoints', - 'Nearest Neighbour Dist. (arcmin)', - 'Relations', - 'V int flux', - '\u03B7 int flux', - 'V peak flux', - '\u03B7 peak flux', - 'Max |Vs| int', - 'Max |Vs| peak', - 'Max |m| int', - 'Max |m| peak', - 'Contains siblings', - 'New Source', - 'New High Sigma' + "colsFields": source_colsfields, + "colsNames": [ + "Name", + "Run", + "W. Avg. RA", + "W. Avg. Dec", + "Avg. Peak Flux (mJy/beam)", + "Min Peak Flux (mJy/beam)", + "Max Peak Flux (mJy/beam)", + "Min Peak Flux Isl. Ratio", + "Avg. Int. Flux (mJy)", + "Min Int. Flux (mJy)", + "Max Int. Flux (mJy)", + "Min Int. Flux Isl. Ratio", + "Min SNR", + "Max SNR", + "Avg. Compactness", + "Total Datapoints", + "Selavy Datapoints", + "Forced Datapoints", + "Nearest Neighbour Dist. (arcmin)", + "Relations", + "V int flux", + "\u03B7 int flux", + "V peak flux", + "\u03B7 peak flux", + "Max |Vs| int", + "Max |Vs| peak", + "Max |m| int", + "Max |m| peak", + "Contains siblings", + "New Source", + "New High Sigma", ], - 'search': True, + "search": True, } context = { - 'measurement': measurement, - 'datatables': [source_datatable, sibling_datatable] + "measurement": measurement, + "datatables": [source_datatable, sibling_datatable], } # add base url for using in JS9 if assigned - if settings.BASE_URL and settings.BASE_URL != '': - context['base_url'] = settings.BASE_URL.strip('/') + if settings.BASE_URL and settings.BASE_URL != "": + context["base_url"] = settings.BASE_URL.strip("/") context["comment_form"], context["comments"] = _process_comment_form_get_comments( - request, - Measurement.objects.get(id=measurement["id"]) + request, Measurement.objects.get(id=measurement["id"]) ) - return render(request, 'measurement_detail.html', context) + return render(request, "measurement_detail.html", context) class SourceViewSet(ModelViewSet): @@ -1263,102 +1302,98 @@ class SourceViewSet(ModelViewSet): serializer_class = SourceSerializer def get_queryset(self): - qs = Source.objects.all().filter(run__status='END') + qs = Source.objects.all().filter(run__status="END") - radius_conversions = { - "arcsec": 3600., - "arcmin": 60., - "deg": 1. - } + radius_conversions = {"arcsec": 3600.0, "arcmin": 60.0, "deg": 1.0} qry_dict = {} - p_run = self.request.query_params.get('run') + p_run = self.request.query_params.get("run") if p_run: - qry_dict['run__name'] = p_run + qry_dict["run__name"] = p_run flux_qry_flds = [ - 'avg_flux_int', - 'avg_flux_peak', - 'min_flux_peak', - 'max_flux_peak', - 'min_flux_int', - 'max_flux_int', - 'min_flux_peak_isl_ratio', - 'min_flux_int_isl_ratio', - 'v_int', - 'v_peak', - 'eta_int', - 'eta_peak', - 'vs_abs_significant_max_int', - 'vs_abs_significant_max_peak', - 'm_abs_significant_max_int', - 'm_abs_significant_max_peak', - 'n_meas', - 'n_meas_sel', - 'n_meas_forced', - 'n_rel', - 'new_high_sigma', - 'avg_compactness', - 'min_snr', - 'max_snr', - 'n_neighbour_dist', - 'source_selection', - 'source_selection_type' + "avg_flux_int", + "avg_flux_peak", + "min_flux_peak", + "max_flux_peak", + "min_flux_int", + "max_flux_int", + "min_flux_peak_isl_ratio", + "min_flux_int_isl_ratio", + "v_int", + "v_peak", + "eta_int", + "eta_peak", + "vs_abs_significant_max_int", + "vs_abs_significant_max_peak", + "m_abs_significant_max_int", + "m_abs_significant_max_peak", + "n_meas", + "n_meas_sel", + "n_meas_forced", + "n_rel", + "new_high_sigma", + "avg_compactness", + "min_snr", + "max_snr", + "n_neighbour_dist", + "source_selection", + "source_selection_type", ] - neighbour_unit = self.request.query_params.get('NeighbourUnit') + neighbour_unit = self.request.query_params.get("NeighbourUnit") for fld in flux_qry_flds: - for limit in ['max', 'min']: - val = self.request.query_params.get(limit + '_' + fld) + for limit in ["max", "min"]: + val = self.request.query_params.get(limit + "_" + fld) if val: - ky = fld + '__lte' if limit == 'max' else fld + '__gte' - if fld == 'n_neighbour_dist': + ky = fld + "__lte" if limit == "max" else fld + "__gte" + if fld == "n_neighbour_dist": val = float(val) / radius_conversions[neighbour_unit] qry_dict[ky] = val - measurements = self.request.query_params.get('meas') + measurements = self.request.query_params.get("meas") if measurements: - qry_dict['measurements'] = measurements + qry_dict["measurements"] = measurements - if 'source_selection' in self.request.query_params: - selection_type = self.request.query_params['source_selection_type'] + if "source_selection" in self.request.query_params: + selection_type = self.request.query_params["source_selection_type"] selection: List[str] = ( - self.request.query_params['source_selection'] + self.request.query_params["source_selection"] .replace(" ", "") .replace("VAST", "") # remove published source prefix if present .split(",") ) - if selection_type == 'name': - qry_dict['name__in'] = selection + if selection_type == "name": + qry_dict["name__in"] = selection else: try: - selection = [int(i) for i in selection] - qry_dict['id__in'] = selection + selection = [UUID(i) for i in selection] + qry_dict["id__in"] = selection except: # this avoids an error on the check if the user has # accidentally entered names with a 'id' selection type. - qry_dict['id'] = -1 + qry_dict["id"] = uuid4() - if 'newsrc' in self.request.query_params: - qry_dict['new'] = True + if "newsrc" in self.request.query_params: + qry_dict["new"] = True - if 'no_siblings' in self.request.query_params: - qry_dict['n_sibl'] = 0 + if "no_siblings" in self.request.query_params: + qry_dict["n_sibl"] = 0 - if 'tags_include' in self.request.query_params: - qry_dict['tags'] = self.request.query_params['tags_include'] + if "tags_include" in self.request.query_params: + qry_dict["tags"] = self.request.query_params["tags_include"] - if 'tags_exclude' in self.request.query_params: - qs = qs.exclude(tags=self.request.query_params['tags_exclude']) + if "tags_exclude" in self.request.query_params: + qs = qs.exclude(tags=self.request.query_params["tags_exclude"]) if qry_dict: qs = qs.filter(**qry_dict) - radius = self.request.query_params.get('radius') - radiusUnit = self.request.query_params.get('radiusunit') - coordsys = self.request.query_params.get('coordsys') - coord_string = self.request.query_params.get('coord') + radius = self.request.query_params.get("radius") + radiusUnit = self.request.query_params.get("radiusunit") + coordsys = self.request.query_params.get("coordsys") + coord_string = self.request.query_params.get("coord") wavg_ra, wavg_dec = None, None if coord_string: coord = parse_coord(coord_string, coord_frame=coordsys).transform_to("icrs") @@ -1377,14 +1412,14 @@ def list(self, request, *args, **kwargs): button links. Then, call the original list function. """ queryset = self.filter_queryset(self.get_queryset()) - self.request.session["source_query_result_ids"] = list( - queryset.values_list("id", flat=True) - ) + self.request.session["source_query_result_ids"] = [ + str(i) for i in list(queryset.values_list("id", flat=True)) + ] return super().list(request, *args, **kwargs) - @rest_framework.decorators.action(detail=True, methods=['get']) + @rest_framework.decorators.action(detail=True, methods=["get"]) def related(self, request, pk=None): - qs = Source.objects.filter(related__id=pk).order_by('id') + qs = Source.objects.filter(related__id=pk).order_by("id") qs = self.filter_queryset(qs) page = self.paginate_queryset(qs) if page is not None: @@ -1399,101 +1434,101 @@ def related(self, request, pk=None): @login_required def SourceQuery(request): fields = [ - 'name', - 'run.name', - 'wavg_ra', - 'wavg_dec', - 'avg_flux_peak', - 'min_flux_peak', - 'max_flux_peak', - 'min_flux_peak_isl_ratio', - 'avg_flux_int', - 'min_flux_int', - 'max_flux_int', - 'min_flux_int_isl_ratio', - 'min_snr', - 'max_snr', - 'avg_compactness', - 'n_meas', - 'n_meas_sel', - 'n_meas_forced', - 'n_neighbour_dist', - 'n_rel', - 'v_int', - 'eta_int', - 'v_peak', - 'eta_peak', - 'vs_abs_significant_max_int', - 'vs_abs_significant_max_peak', - 'm_abs_significant_max_int', - 'm_abs_significant_max_peak', - 'n_sibl', - 'new', - 'new_high_sigma' + "name", + "run.name", + "wavg_ra", + "wavg_dec", + "avg_flux_peak", + "min_flux_peak", + "max_flux_peak", + "min_flux_peak_isl_ratio", + "avg_flux_int", + "min_flux_int", + "max_flux_int", + "min_flux_int_isl_ratio", + "min_snr", + "max_snr", + "avg_compactness", + "n_meas", + "n_meas_sel", + "n_meas_forced", + "n_neighbour_dist", + "n_rel", + "v_int", + "eta_int", + "v_peak", + "eta_peak", + "vs_abs_significant_max_int", + "vs_abs_significant_max_peak", + "m_abs_significant_max_int", + "m_abs_significant_max_peak", + "n_sibl", + "new", + "new_high_sigma", ] api_col_dict = { - 'name': reverse('vast_pipeline:source_detail', args=[1])[:-2], - 'run.name': reverse('vast_pipeline:run_detail', args=[1])[:-2] + "name": reverse( + "vast_pipeline:source_detail", args=["e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813"] + )[:-37], + "run.name": reverse( + "vast_pipeline:run_detail", args=["e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813"] + )[:-37], } - colsfields = generate_colsfields( - fields, - api_col_dict - ) + colsfields = generate_colsfields(fields, api_col_dict) # get all pipeline run names - p_runs = list(Run.objects.filter(status='END').values('name').all()) + p_runs = list(Run.objects.filter(status="END").values("name").all()) return render( request, - 'sources_query.html', + "sources_query.html", { - 'breadcrumb': {'title': 'Sources', 'url': request.path}, - 'runs': p_runs, - 'datatable': { - 'api': ( - reverse('vast_pipeline:api_sources-list') + - '?format=datatables' + "breadcrumb": {"title": "Sources", "url": request.path}, + "runs": p_runs, + "datatable": { + "api": ( + reverse("vast_pipeline:api_sources-list") + "?format=datatables" ), - 'colsFields': colsfields, - 'colsNames': [ - 'Name', - 'Run', - 'W. Avg. RA', - 'W. Avg. Dec', - 'Avg. Peak Flux (mJy/beam)', - 'Min Peak Flux (mJy/beam)', - 'Max Peak Flux (mJy/beam)', - 'Min Peak Flux Isl. Ratio', - 'Avg. Int. Flux (mJy)', - 'Min Int. Flux (mJy)', - 'Max Int. Flux (mJy)', - 'Min Int. Flux Isl. Ratio', - 'Min SNR', - 'Max SNR', - 'Avg. Compactness', - 'Total Datapoints', - 'Selavy Datapoints', - 'Forced Datapoints', - 'Nearest Neighbour Dist. (arcmin)', - 'Relations', - 'V int flux', - '\u03B7 int flux', - 'V peak flux', - '\u03B7 peak flux', - 'Max |Vs| int', - 'Max |Vs| peak', - 'Max |m| int', - 'Max |m| peak', - 'Contains siblings', - 'New Source', - 'New High Sigma' + "colsFields": colsfields, + "colsNames": [ + "Name", + "Run", + "W. Avg. RA", + "W. Avg. Dec", + "Avg. Peak Flux (mJy/beam)", + "Min Peak Flux (mJy/beam)", + "Max Peak Flux (mJy/beam)", + "Min Peak Flux Isl. Ratio", + "Avg. Int. Flux (mJy)", + "Min Int. Flux (mJy)", + "Max Int. Flux (mJy)", + "Min Int. Flux Isl. Ratio", + "Min SNR", + "Max SNR", + "Avg. Compactness", + "Total Datapoints", + "Selavy Datapoints", + "Forced Datapoints", + "Nearest Neighbour Dist. (arcmin)", + "Relations", + "V int flux", + "\u03B7 int flux", + "V peak flux", + "\u03B7 peak flux", + "Max |Vs| int", + "Max |Vs| peak", + "Max |m| int", + "Max |m| peak", + "Contains siblings", + "New Source", + "New High Sigma", ], - 'search': False, - 'deferLoading': 0, # don't fetch results until a query is made - } - } + "search": False, + "deferLoading": 0, # don't fetch results until a query is made + }, + }, ) @@ -1511,6 +1546,7 @@ def SourceEtaVPlot(request: Request) -> Response: min_sources = 50 source_query_result_id_list = request.session.get("source_query_result_ids", []) + source_query_result_id_list = [UUID(i) for i in source_query_result_id_list] sources_query_len = len(source_query_result_id_list) @@ -1518,10 +1554,10 @@ def SourceEtaVPlot(request: Request) -> Response: messages.error( request, ( - f'The query has returned only {sources_query_len} sources.' - f' A minimum of {min_sources} sources must be used to produce' - ' the plot.' - ) + f"The query has returned only {sources_query_len} sources." + f" A minimum of {min_sources} sources must be used to produce" + " the plot." + ), ) plot_ok = 0 @@ -1533,7 +1569,7 @@ def SourceEtaVPlot(request: Request) -> Response: eta_peak__gt=0, eta_int__gt=0, v_peak__gt=0, - v_int__gt=0 + v_int__gt=0, ) new_sources_ids_list = list(sources.values_list("id", flat=True)) @@ -1546,22 +1582,24 @@ def SourceEtaVPlot(request: Request) -> Response: messages.warning( request, ( - f'Removed {diff} sources that either had' - ' only one datapoint, or, an \u03B7 or V value of 0.' - ' Change the query options to avoid these sources.' - ) + f"Removed {diff} sources that either had" + " only one datapoint, or, an \u03B7 or V value of 0." + " Change the query options to avoid these sources." + ), ) - request.session["source_query_result_ids"] = new_sources_ids_list + request.session["source_query_result_ids"] = [ + str(x) for x in new_sources_ids_list + ] if new_sources_query_len < min_sources: messages.error( request, ( - 'After filtering, the query has returned only' - f' {sources_query_len} sources. A minimum of {min_sources}' - ' sources must be used to produce the plot.' - ) + "After filtering, the query has returned only" + f" {sources_query_len} sources. A minimum of {min_sources}" + " sources must be used to produce the plot." + ), ) plot_ok = 0 @@ -1574,20 +1612,20 @@ def SourceEtaVPlot(request: Request) -> Response: "Sources outside of the selected sigma area" " are displayed as a non-interactive averaged" " distribution." - ) + ), ) plot_ok = 1 context = { - 'plot_ok': plot_ok, + "plot_ok": plot_ok, } - return render(request, 'sources_etav_plot.html', context) + return render(request, "sources_etav_plot.html", context) @login_required -def SourceEtaVPlotUpdate(request: Request, pk: int) -> Response: +def SourceEtaVPlotUpdate(request: Request, pk: UUID) -> Response: """The view to perform the update on the eta-V plot page. Args: @@ -1605,59 +1643,60 @@ def SourceEtaVPlotUpdate(request: Request, pk: int) -> Response: except Source.DoesNotExist: raise Http404 - source['wavg_ra_hms'] = deg2hms(source['wavg_ra'], hms_format=True) - source['wavg_dec_dms'] = deg2dms(source['wavg_dec'], dms_format=True) - source['wavg_l'], source['wavg_b'] = equ2gal(source['wavg_ra'], source['wavg_dec']) + source["id"] = str(source["id"]) + source["wavg_ra_hms"] = deg2hms(source["wavg_ra"], hms_format=True) + source["wavg_dec_dms"] = deg2dms(source["wavg_dec"], dms_format=True) + source["wavg_l"], source["wavg_b"] = equ2gal(source["wavg_ra"], source["wavg_dec"]) context = { - 'source': source, - 'sourcefav': ( + "source": source, + "sourcefav": ( SourceFav.objects.filter( - user__id=request.user.id, - source__id=source['id'] - ) - .exists() + user__id=request.user.id, source__id=pk + ).exists() ), - 'datatables': [] + "datatables": [], } - return render(request, 'sources_etav_plot_update.html', context) + return render(request, "sources_etav_plot_update.html", context) # Source detail @login_required def SourceDetail(request, pk): # source data - source = Source.objects.filter(id=pk).annotate(run_name=F('run__name')).values().get() - source['aladin_ra'] = source['wavg_ra'] - source['aladin_dec'] = source['wavg_dec'] - source['aladin_zoom'] = 0.15 - source['wavg_ra_hms'] = deg2hms(source['wavg_ra'], hms_format=True) - source['wavg_dec_dms'] = deg2dms(source['wavg_dec'], dms_format=True) - source['wavg_l'], source['wavg_b'] = equ2gal(source['wavg_ra'], source['wavg_dec']) + source = ( + Source.objects.filter(id=pk).annotate(run_name=F("run__name")).values().get() + ) + source["aladin_ra"] = source["wavg_ra"] + source["aladin_dec"] = source["wavg_dec"] + source["aladin_zoom"] = 0.15 + source["wavg_ra_hms"] = deg2hms(source["wavg_ra"], hms_format=True) + source["wavg_dec_dms"] = deg2dms(source["wavg_dec"], dms_format=True) + source["wavg_l"], source["wavg_b"] = equ2gal(source["wavg_ra"], source["wavg_dec"]) # source data cols = [ - 'id', - 'name', - 'datetime', - 'image_name', - 'frequency', - 'ra', - 'ra_err', - 'dec', - 'dec_err', - 'flux_peak', - 'flux_peak_err', - 'flux_peak_isl_ratio', - 'flux_int', - 'flux_int_err', - 'flux_int_isl_ratio', - 'local_rms', - 'snr', - 'has_siblings', - 'forced', - 'image_id' + "id", + "name", + "datetime", + "image_name", + "frequency", + "ra", + "ra_err", + "dec", + "dec_err", + "flux_peak", + "flux_peak_err", + "flux_peak_isl_ratio", + "flux_int", + "flux_int_err", + "flux_int_isl_ratio", + "local_rms", + "snr", + "has_siblings", + "forced", + "image_id", ] measurements_qs = ( Measurement.objects.filter(source__id=pk) @@ -1673,113 +1712,122 @@ def SourceDetail(request, pk): # subset of measurements used for the cutouts measurements_cutouts = list( measurements_qs[: settings.MAX_CUTOUT_IMAGES].values( - "id", "ra", "dec", "image_id", "image_name", + "id", + "ra", + "dec", + "image_id", + "image_name", ) ) # get the measurement for the first detection - used for the first detection cutout - first_det_meas = measurements[[i['forced'] for i in measurements].index(False)] + first_det_meas = measurements[[i["forced"] for i in measurements].index(False)] for one_m in measurements: - one_m['datetime'] = one_m['datetime'].isoformat() + one_m["datetime"] = one_m["datetime"].isoformat() # add the data for the datatable api measurements = { - 'table': 'source_detail', - 'table_id': 'dataTableMeasurements', - 'dataQuery': measurements, - 'colsFields': cols, - 'search': True, - 'order': [2, 'asc'], - 'colsNames': [ - 'ID', - 'Name', - 'Date (UTC)', - 'Image', - 'Frequency (MHz)', - 'RA (deg)', - 'RA Error (arcsec)', - 'Dec (deg)', - 'Dec Error (arcsec)', - 'Peak Flux (mJy/beam)', - 'Peak Flux Error (mJy/beam)', - 'Peak Flux Isl. Ratio', - 'Int. Flux (mJy)', - 'Int. Flux Error (mJy)', - 'Int. Flux Isl. Ratio', - 'Local RMS (mJy)', - 'SNR', - 'Has siblings', - 'Forced Extraction', - 'Image ID' - ] + "table": "source_detail", + "table_id": "dataTableMeasurements", + "dataQuery": measurements, + "colsFields": cols, + "search": True, + "order": [2, "asc"], + "colsNames": [ + "ID", + "Name", + "Date (UTC)", + "Image", + "Frequency (MHz)", + "RA (deg)", + "RA Error (arcsec)", + "Dec (deg)", + "Dec Error (arcsec)", + "Peak Flux (mJy/beam)", + "Peak Flux Error (mJy/beam)", + "Peak Flux Isl. Ratio", + "Int. Flux (mJy)", + "Int. Flux Error (mJy)", + "Int. Flux Isl. Ratio", + "Local RMS (mJy)", + "SNR", + "Has siblings", + "Forced Extraction", + "Image ID", + ], } # generate context for related sources datatable related_fields = [ - 'name', - 'wavg_ra', - 'wavg_dec', - 'avg_flux_int', - 'avg_flux_peak', - 'max_flux_peak', - 'min_snr', - 'max_snr', - 'avg_compactness', - 'n_meas', - 'n_meas_sel', - 'n_meas_forced', - 'n_neighbour_dist', - 'n_rel', - 'v_int', - 'eta_int', - 'v_peak', - 'eta_peak', - 'n_sibl', - 'new', - 'new_high_sigma' + "name", + "wavg_ra", + "wavg_dec", + "avg_flux_int", + "avg_flux_peak", + "max_flux_peak", + "min_snr", + "max_snr", + "avg_compactness", + "n_meas", + "n_meas_sel", + "n_meas_forced", + "n_neighbour_dist", + "n_rel", + "v_int", + "eta_int", + "v_peak", + "eta_peak", + "n_sibl", + "new", + "new_high_sigma", ] related_colsfields = generate_colsfields( related_fields, - {'name': reverse('vast_pipeline:source_detail', args=[1])[:-2]} + { + "name": reverse( + "vast_pipeline:source_detail", + args=["e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813"], + )[:-37] + }, ) related_datatables = { - 'table_id': 'dataTableRelated', - 'api': ( - reverse('vast_pipeline:api_sources-related', args=[source['id']]) + - '?format=datatables' + "table_id": "dataTableRelated", + "api": ( + reverse("vast_pipeline:api_sources-related", args=[source["id"]]) + + "?format=datatables" ), - 'colsFields': related_colsfields, - 'colsNames': [ - 'Name', - 'W. Avg. RA', - 'W. Avg. Dec', - 'Avg. Int. Flux (mJy)', - 'Avg. Peak Flux (mJy/beam)', - 'Max Peak Flux (mJy/beam)', - 'Min SNR', - 'Max SNR', - 'Avg. Compactness', - 'Total Datapoints', - 'Selavy Datapoints', - 'Forced Datapoints', - 'Nearest Neighbour Dist. (arcmin)', - 'Relations', - 'V int flux', - '\u03B7 int flux', - 'V peak flux', - '\u03B7 peak flux', - 'Contains siblings', - 'New Source', - 'New High Sigma' + "colsFields": related_colsfields, + "colsNames": [ + "Name", + "W. Avg. RA", + "W. Avg. Dec", + "Avg. Int. Flux (mJy)", + "Avg. Peak Flux (mJy/beam)", + "Max Peak Flux (mJy/beam)", + "Min SNR", + "Max SNR", + "Avg. Compactness", + "Total Datapoints", + "Selavy Datapoints", + "Forced Datapoints", + "Nearest Neighbour Dist. (arcmin)", + "Relations", + "V int flux", + "\u03B7 int flux", + "V peak flux", + "\u03B7 peak flux", + "Contains siblings", + "New Source", + "New High Sigma", ], - 'search': True, + "search": True, } # find next and previous sources source_query_result_id_list = request.session.get("source_query_result_ids", []) source_next_id, source_previous_id = None, None for i, source_id in enumerate(source_query_result_id_list): - if source_id == source['id']: + if source_id == source["id"]: if i + 1 < len(source_query_result_id_list): source_next_id = source_query_result_id_list[i + 1] if i - 1 >= 0: @@ -1787,24 +1835,22 @@ def SourceDetail(request, pk): break context = { - 'source': source, - 'source_next_id': source_next_id, - 'source_previous_id': source_previous_id, - 'first_det_meas': first_det_meas, - 'datatables': [measurements, related_datatables], - 'cutout_measurements': measurements_cutouts, + "source": source, + "source_next_id": source_next_id, + "source_previous_id": source_previous_id, + "first_det_meas": first_det_meas, + "datatables": [measurements, related_datatables], + "cutout_measurements": measurements_cutouts, # flag to deactivate starring and render yellow star - 'sourcefav': ( + "sourcefav": ( SourceFav.objects.filter( - user__id=request.user.id, - source__id=source['id'] - ) - .exists() - ) + user__id=request.user.id, source__id=source["id"] + ).exists() + ), } # add base url for using in JS9 if assigned - if settings.BASE_URL and settings.BASE_URL != '': - context['base_url'] = settings.BASE_URL.strip('/') + if settings.BASE_URL and settings.BASE_URL != "": + context["base_url"] = settings.BASE_URL.strip("/") # process comments and tags source_obj = Source.objects.get(id=source["id"]) @@ -1835,7 +1881,9 @@ def SourceDetail(request, pk): # create the Comment only if a comment was made or if tags were changed if comment_text: comment_obj = Comment( - author=request.user, comment=comment_text, content_object=source_obj, + author=request.user, + comment=comment_text, + content_object=source_obj, ) comment_obj.save() source_obj.tags.set_tag_list(tag_set) @@ -1846,13 +1894,14 @@ def SourceDetail(request, pk): ) comment_target_type = ContentType.objects.get_for_model(source_obj) comments = Comment.objects.filter( - content_type__pk=comment_target_type.id, object_id=source_obj.id, + content_type__pk=comment_target_type.id, + object_id=source_obj.id, ).order_by("datetime") context["comment_form"] = tag_comment_form context["comments"] = comments - return render(request, 'source_detail.html', context) + return render(request, "source_detail.html", context) class ImageCutout(APIView): @@ -1860,11 +1909,9 @@ class ImageCutout(APIView): permission_classes = [IsAuthenticated] def get(self, request, measurement_id: int, size: str = "normal"): - img_type = request.query_params.get('img_type', 'fits') - if img_type not in ('fits', 'png'): - raise Http404( - "GET query param img_type must be either 'fits' or 'png'." - ) + img_type = request.query_params.get("img_type", "fits") + if img_type not in ("fits", "png"): + raise Http404("GET query param img_type must be either 'fits' or 'png'.") measurement = Measurement.objects.get(id=measurement_id) @@ -1888,8 +1935,11 @@ def get(self, request, measurement_id: int, size: str = "normal"): data = image_hdu.data cutout = Cutout2D( - data, coord, Angle(sizes[size]), wcs=WCS(image_hdu.header, naxis=2), - mode='partial' + data, + coord, + Angle(sizes[size]), + wcs=WCS(image_hdu.header, naxis=2), + mode="partial", ) # add beam properties to the cutout header and fix cdelts as JS9 does not deal @@ -1903,7 +1953,7 @@ def get(self, request, measurement_id: int, size: str = "normal"): CDELT2=cdelt2, BMAJ=image_hdu.header["BMAJ"], BMIN=image_hdu.header["BMIN"], - BPA=image_hdu.header["BPA"] + BPA=image_hdu.header["BPA"], ) cutout_hdu = fits.PrimaryHDU(data=cutout.data, header=cutout_header) @@ -1915,9 +1965,7 @@ def get(self, request, measurement_id: int, size: str = "normal"): plt.imsave(cutout_file, cutout.data, dpi=600) cutout_file.seek(0) response = FileResponse( - cutout_file, - as_attachment=True, - filename=filenames[size] + cutout_file, as_attachment=True, filename=filenames[size] ) return response @@ -1958,7 +2006,18 @@ def get( Returns: FileResponse: Django FileReponse containing a DS9/JS9 region file. """ - columns = ["id", "name", "ra", "dec", "bmaj", "bmin", "pa", "forced", "source", "source__name"] + columns = [ + "id", + "name", + "ra", + "dec", + "bmaj", + "bmin", + "pa", + "forced", + "source", + "source__name", + ] selection_model = request.GET.get("selection_model", "measurement") selection_id = request.GET.get("selection_id", None) run_id = request.GET.get("run_id", None) @@ -1967,7 +2026,9 @@ def get( # validate selection query params if selection_id is not None: if selection_model not in ("measurement", "source"): - raise Http404("GET param selection_model must be either 'measurement' or 'source'.") + raise Http404( + "GET param selection_model must be either 'measurement' or 'source'." + ) if selection_model == "measurement": selection_attr = "id" selection_name = "name" @@ -2000,8 +2061,10 @@ def get( "color": color, "data": { "text": f"{selection_model} ID: {meas[selection_attr]}", - "link": reverse(f"vast_pipeline:{selection_model}_detail", args=[selection_id]), - } + "link": reverse( + f"vast_pipeline:{selection_model}_detail", args=[selection_id] + ), + }, } if meas["forced"]: properties.update(strokeDashArray=[3, 2]) @@ -2023,7 +2086,7 @@ class RawImageListSet(ViewSet): @staticmethod def gen_title_data_tokens(list_of_paths): - ''' + """ generate a dataframe with extra columns for HTML tags title and data-tokens to generate something like: @@ -2036,78 +2099,80 @@ def gen_title_data_tokens(list_of_paths): VAST_2118-06A.EPOCH06x.I.selavy.components.txt datatokens EPOCH06x VAST_2118-06A.EPOCH06x.I.selavy.compo... - ''' - df = pd.DataFrame(list_of_paths, columns=['path']) - df = df.sort_values('path') - df['title'] = df['path'].str.split(pat=os.sep).str.get(-1) - df['datatokens'] = ( - df['path'].str.split(pat=os.sep).str.get(0) - .str.cat(df['title'], sep=' ') + """ + df = pd.DataFrame(list_of_paths, columns=["path"]) + df = df.sort_values("path") + df["title"] = df["path"].str.split(pat=os.sep).str.get(-1) + df["datatokens"] = ( + df["path"].str.split(pat=os.sep).str.get(0).str.cat(df["title"], sep=" ") ) - return df.to_dict(orient='records') + return df.to_dict(orient="records") def list(self, request): # generate the folders path regex, e.g. /path/to/images/**/*.fits # first generate the list of main subfolders, e.g. [EPOCH01, ... ] img_root = settings.RAW_IMAGE_DIR if not os.path.exists(img_root): - msg = 'Raw image folder does not exists' + msg = "Raw image folder does not exists" messages.error(request, msg) raise Http404(msg) img_subfolders_gen = filter( - lambda x: os.path.isdir(os.path.join(img_root, x)), - os.listdir(img_root) + lambda x: os.path.isdir(os.path.join(img_root, x)), os.listdir(img_root) ) img_subfolders1, img_subfolders2 = tee(img_subfolders_gen) - img_regex_list = list(map( - lambda x: os.path.join(img_root, x, '**' + os.sep + '*.fits'), - img_subfolders1 - )) - selavy_regex_list = list(map( - lambda x: os.path.join(img_root, x, '**' + os.sep + '*.txt'), - img_subfolders2 - )) + img_regex_list = list( + map( + lambda x: os.path.join(img_root, x, "**" + os.sep + "*.fits"), + img_subfolders1, + ) + ) + selavy_regex_list = list( + map( + lambda x: os.path.join(img_root, x, "**" + os.sep + "*.txt"), + img_subfolders2, + ) + ) # add home directory user data for user and jupyter-user (user = github name) req_user = request.user.username - for user in [f'{req_user}', f'jupyter-{req_user}']: + for user in [f"{req_user}", f"jupyter-{req_user}"]: if settings.HOME_DATA_ROOT is not None: user_home_data = os.path.join( settings.HOME_DATA_ROOT, user, settings.HOME_DATA_DIR ) else: user_home_data = os.path.join( - os.path.expanduser(f'~{user}'), settings.HOME_DATA_DIR + os.path.expanduser(f"~{user}"), settings.HOME_DATA_DIR ) if settings.HOME_DATA_DIR and os.path.exists(user_home_data): - img_regex_list.append(os.path.join(user_home_data, '**' + os.sep + '*.fits')) - selavy_regex_list.append(os.path.join(user_home_data, '**' + os.sep + '*.txt')) + img_regex_list.append( + os.path.join(user_home_data, "**" + os.sep + "*.fits") + ) + selavy_regex_list.append( + os.path.join(user_home_data, "**" + os.sep + "*.txt") + ) # generate raw image list in parallel dask_list = db.from_sequence(img_regex_list) fits_files = ( - dask_list.map(lambda x: glob(x, recursive=True)) - .flatten() - .compute() + dask_list.map(lambda x: glob(x, recursive=True)).flatten().compute() ) if not fits_files: - messages.info(request, 'no fits files found') + messages.info(request, "no fits files found") # generate raw image list in parallel dask_list = db.from_sequence(selavy_regex_list) selavy_files = ( - dask_list.map(lambda x: glob(x, recursive=True)) - .flatten() - .compute() + dask_list.map(lambda x: glob(x, recursive=True)).flatten().compute() ) if not fits_files: - messages.info(request, 'no selavy files found') + messages.info(request, "no selavy files found") # generate response datastructure data = { - 'fits': self.gen_title_data_tokens(fits_files), - 'selavy': self.gen_title_data_tokens(selavy_files) + "fits": self.gen_title_data_tokens(fits_files), + "selavy": self.gen_title_data_tokens(selavy_files), } serializer = RawImageSelavyListSerializer(data) @@ -2119,36 +2184,36 @@ class RunConfigSet(ViewSet): permission_classes = [IsAuthenticated] queryset = Run.objects.all() - @rest_framework.decorators.action(detail=True, methods=['get']) + @rest_framework.decorators.action(detail=True, methods=["get"]) def validate(self, request, pk=None): if not pk: return Response( { - 'message': { - 'severity': 'danger', - 'text': [ - 'Error in config validation:', - 'Run pk parameter null or not passed' - ] + "message": { + "severity": "danger", + "text": [ + "Error in config validation:", + "Run pk parameter null or not passed", + ], } }, - status=status.HTTP_400_BAD_REQUEST + status=status.HTTP_400_BAD_REQUEST, ) p_run = get_object_or_404(self.queryset, pk=pk) - path = os.path.join(p_run.path, 'config.yaml') + path = os.path.join(p_run.path, "config.yaml") if not os.path.exists(path): return Response( { - 'message': { - 'severity': 'danger', - 'text': [ - 'Error in config validation:', - f'Path {path} not existent' - ] + "message": { + "severity": "danger", + "text": [ + "Error in config validation:", + f"Path {path} not existent", + ], } }, - status=status.HTTP_400_BAD_REQUEST + status=status.HTTP_400_BAD_REQUEST, ) try: @@ -2156,64 +2221,60 @@ def validate(self, request, pk=None): pipeline_config.validate(user=request.user) except Exception as e: trace = traceback.format_exc().splitlines() - trace = '\n'.join(trace[-4:]) + trace = "\n".join(trace[-4:]) msg = { - 'message': { - 'severity': 'danger', - 'text': ( - 'Error in config validation\n' - f'{e}\n\n' - 'Debug trace:\n' - f'{trace}' - ).split('\n'), + "message": { + "severity": "danger", + "text": ( + "Error in config validation\n" + f"{e}\n\n" + "Debug trace:\n" + f"{trace}" + ).split("\n"), } } return Response(msg, status=status.HTTP_400_BAD_REQUEST) msg = { - 'message': { - 'severity': 'success', - 'text': ['Configuration is valid.'], + "message": { + "severity": "success", + "text": ["Configuration is valid."], } } return Response(msg, status=status.HTTP_202_ACCEPTED) - @rest_framework.decorators.action(detail=True, methods=['post']) + @rest_framework.decorators.action(detail=True, methods=["post"]) def write(self, request, pk=None): # this post is for writing the config text (modified or not) # from the UI to a config.yaml file if not pk: messages.error( - request, - 'Error in config write: Run pk parameter null or not passed' + request, "Error in config write: Run pk parameter null or not passed" ) - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) try: p_run = get_object_or_404(self.queryset, pk=pk) except Exception as e: - messages.error(request, f'Error in config write: {e}') - return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + messages.error(request, f"Error in config write: {e}") + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) - config_text = request.POST.get('config_text', None) + config_text = request.POST.get("config_text", None) if config_text: - f_path = os.path.join(p_run.path, 'config.yaml') + f_path = os.path.join(p_run.path, "config.yaml") try: - with open(f_path, 'w') as fp: + with open(f_path, "w") as fp: fp.write(config_text) - messages.success( - request, - 'Pipeline config written successfully' - ) + messages.success(request, "Pipeline config written successfully") except Exception as e: - messages.error(request, f'Error in config write: {e}') + messages.error(request, f"Error in config write: {e}") else: - messages.info(request, 'Error in config write: Config text null') + messages.info(request, "Error in config write: Config text null") return HttpResponseRedirect( - reverse('vast_pipeline:run_detail', args=[p_run.id]) + reverse("vast_pipeline:run_detail", args=[p_run.id]) ) @@ -2222,36 +2283,36 @@ class RunLogSet(ViewSet): permission_classes = [IsAuthenticated] queryset = Run.objects.all() - @rest_framework.decorators.action(detail=True, methods=['get']) + @rest_framework.decorators.action(detail=True, methods=["get"]) def fetch(self, request, pk=None): if not pk: return Response( { - 'message': { - 'severity': 'danger', - 'text': [ - 'Error in run log fetch request:', - 'Run pk parameter null or not passed' - ] + "message": { + "severity": "danger", + "text": [ + "Error in run log fetch request:", + "Run pk parameter null or not passed", + ], } }, - status=status.HTTP_400_BAD_REQUEST + status=status.HTTP_400_BAD_REQUEST, ) - logname = self.request.query_params.get('logname', None) + logname = self.request.query_params.get("logname", None) if not logname: return Response( { - 'message': { - 'severity': 'danger', - 'text': [ - 'Error in run log fetch request:', - 'logname url parameter null or not passed' - ] + "message": { + "severity": "danger", + "text": [ + "Error in run log fetch request:", + "logname url parameter null or not passed", + ], } }, - status=status.HTTP_400_BAD_REQUEST + status=status.HTTP_400_BAD_REQUEST, ) p_run = get_object_or_404(self.queryset, pk=pk) logpath = Path(p_run.path) / logname @@ -2259,38 +2320,36 @@ def fetch(self, request, pk=None): if not logpath.exists(): return Response( { - 'message': { - 'severity': 'danger', - 'text': [ - 'Error in run log fetch request:', - f'Path {logpath} does not exist' - ] + "message": { + "severity": "danger", + "text": [ + "Error in run log fetch request:", + f"Path {logpath} does not exist", + ], } }, - status=status.HTTP_400_BAD_REQUEST + status=status.HTTP_400_BAD_REQUEST, ) try: pipeline_log = logpath.read_text() except Exception as e: trace = traceback.format_exc().splitlines() - trace = '\n'.join(trace[-4:]) + trace = "\n".join(trace[-4:]) msg = { - 'message': { - 'severity': 'danger', - 'text': ( - 'Error in run log fetch request\n' - f'{e}\n\n' - 'Debug trace:\n' - f'{trace}' - ).split('\n'), + "message": { + "severity": "danger", + "text": ( + "Error in run log fetch request\n" + f"{e}\n\n" + "Debug trace:\n" + f"{trace}" + ).split("\n"), } } return Response(msg, status=status.HTTP_400_BAD_REQUEST) - logfile = { - 'log_html_content': ""+ pipeline_log + "" - } + logfile = {"log_html_content": "" + pipeline_log + ""} return JsonResponse(logfile, status=status.HTTP_200_OK) @@ -2301,8 +2360,8 @@ class SourceFavViewSet(ModelViewSet): serializer_class = SourceFavSerializer def get_queryset(self): - qs = SourceFav.objects.all().order_by('id') - user = self.request.query_params.get('user') + qs = SourceFav.objects.all().order_by("id") + user = self.request.query_params.get("user") if user: qs = qs.filter(user__username=user) @@ -2317,45 +2376,33 @@ def create(self, request): # return Response(serializer.data, status=status.HTTP_201_CREATED) # return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) data = request.data.dict() - if 'next' in data.keys(): - data.pop('next') - data.pop('csrfmiddlewaretoken') - data['user_id'] = request.user.id + if "next" in data.keys(): + data.pop("next") + data.pop("csrfmiddlewaretoken") + data["user_id"] = request.user.id return_data = {} try: - check = ( - SourceFav.objects.filter( - user__id=data['user_id'], - source__id=data['source_id'] - ) - .exists() - ) + check = SourceFav.objects.filter( + user__id=data["user_id"], source__id=data["source_id"] + ).exists() if check: - messages.error(request, 'Source already added to favourites!') + messages.error(request, "Source already added to favourites!") success = False else: fav = SourceFav(**data) fav.save() - messages.success(request, 'Added to favourites successfully') + messages.success(request, "Added to favourites successfully") success = True except Exception as e: - messages.error( - request, - f'Errors in adding source to favourites: \n{e}' - ) + messages.error(request, f"Errors in adding source to favourites: \n{e}") success = False - return_data['success'] = success - return_data['messages'] = render_to_string( - 'messages.html', - {}, - request - ) + return_data["success"] = success + return_data["messages"] = render_to_string("messages.html", {}, request) return HttpResponse( - json.dumps(return_data, ensure_ascii=False), - content_type="application/json" + json.dumps(return_data, ensure_ascii=False), content_type="application/json" ) def destroy(self, request, pk=None): @@ -2363,54 +2410,53 @@ def destroy(self, request, pk=None): qs = SourceFav.objects.filter(id=pk) if qs.exists(): qs.delete() - messages.success( - request, - 'Favourite source deleted successfully.' - ) - return Response({'message': 'ok'}, status=status.HTTP_200_OK) + messages.success(request, "Favourite source deleted successfully.") + return Response({"message": "ok"}, status=status.HTTP_200_OK) else: - messages.error(request, 'Not found') + messages.error(request, "Not found") return Response( - {'message': 'not found'}, - status=status.HTTP_404_NOT_FOUND + {"message": "not found"}, status=status.HTTP_404_NOT_FOUND ) except Exception as e: - messages.error(request, 'Error in deleting the favourite source') + messages.error(request, "Error in deleting the favourite source") return Response( - {'message': 'error in request'}, - status=status.HTTP_400_BAD_REQUEST + {"message": "error in request"}, status=status.HTTP_400_BAD_REQUEST ) @login_required def UserSourceFavsList(request): - fields = ['source.name', 'comment', 'source.run.name', 'deletefield'] + fields = ["source.name", "comment", "source.run.name", "deletefield"] api_col_dict = { - 'source.name': reverse('vast_pipeline:source_detail', args=[1])[:-2], - 'source.run.name': reverse('vast_pipeline:run_detail', args=[1])[:-2] + "source.name": reverse( + "vast_pipeline:source_detail", args=["e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813"] + )[:-37], + "source.run.name": reverse( + "vast_pipeline:run_detail", args=["e1f6bf88-4b07-4f28-bf9b-3ccf9d2ca813"] + )[:-37], } - colsfields = generate_colsfields(fields, api_col_dict, ['deletefield']) + colsfields = generate_colsfields(fields, api_col_dict, ["deletefield"]) return render( request, - 'generic_table.html', + "generic_table.html", { - 'text': { - 'title': 'Favourite Sources', - 'description': 'List of favourite (starred) sources', - 'breadcrumb': {'title': 'Favourite Sources', 'url': request.path}, + "text": { + "title": "Favourite Sources", + "description": "List of favourite (starred) sources", + "breadcrumb": {"title": "Favourite Sources", "url": request.path}, }, - 'datatable': { - 'api': ( - reverse('vast_pipeline:api_sources_favs-list') + - f'?format=datatables&user={request.user.username}' + "datatable": { + "api": ( + reverse("vast_pipeline:api_sources_favs-list") + + f"?format=datatables&user={request.user.username}" ), - 'colsFields': colsfields, - 'colsNames': ['Source', 'Comment', 'Pipeline Run', 'Delete'], - 'search': True, - } - } + "colsFields": colsfields, + "colsNames": ["Source", "Comment", "Pipeline Run", "Delete"], + "search": True, + }, + }, ) @@ -2433,7 +2479,7 @@ def _external_search_error_handler( results = [] return results - @rest_framework.decorators.action(methods=['get'], detail=False) + @rest_framework.decorators.action(methods=["get"], detail=False) def sesame_search(self, request: Request) -> Response: """Query the Sesame name resolver service and return a coordinate. @@ -2456,12 +2502,14 @@ def sesame_search(self, request: Request) -> Response: object_name = request.query_params.get("object_name", "") service = request.query_params.get("service", "all") - serializer = SesameResultSerializer(data=dict(object_name=object_name, service=service)) + serializer = SesameResultSerializer( + data=dict(object_name=object_name, service=service) + ) serializer.is_valid(raise_exception=True) return Response(serializer.data) - @rest_framework.decorators.action(methods=['get'], detail=False) + @rest_framework.decorators.action(methods=["get"], detail=False) def coordinate_validator(self, request: Request) -> Response: """Validate a coordinate string. @@ -2481,7 +2529,9 @@ def coordinate_validator(self, request: Request) -> Response: coord_string = request.query_params.get("coord", "") frame = request.query_params.get("frame", "") - serializer = CoordinateValidatorSerializer(data=dict(coord=coord_string, frame=frame)) + serializer = CoordinateValidatorSerializer( + data=dict(coord=coord_string, frame=frame) + ) serializer.is_valid(raise_exception=True) return Response() @@ -2547,8 +2597,8 @@ class SourcePlotsSet(ViewSet): authentication_classes = [SessionAuthentication, BasicAuthentication] permission_classes = [IsAuthenticated] - @rest_framework.decorators.action(methods=['get'], detail=True) - def lightcurve(self, request: Request, pk: int = None) -> Response: + @rest_framework.decorators.action(methods=["get"], detail=True) + def lightcurve(self, request: Request, pk: UUID = None) -> Response: """Create lightcurve and 2-epoch metric graph plots for a source. Args: @@ -2569,9 +2619,10 @@ def lightcurve(self, request: Request, pk: int = None) -> Response: # TODO raster plots version for Slack posts use_peak_flux = request.query_params.get("peak_flux", "true").lower() == "true" plot_document = plot_lightcurve(source, use_peak_flux=use_peak_flux) + return Response(json_item(plot_document)) - @rest_framework.decorators.action(methods=['get'], detail=False) + @rest_framework.decorators.action(methods=["get"], detail=False) def etavplot(self, request: Request) -> Response: """Create the eta-V plot. @@ -2586,6 +2637,7 @@ def etavplot(self, request: Request) -> Response: JSON format to be embedded in the HTML template. """ source_query_result_id_list = request.session.get("source_query_result_ids", []) + source_query_result_id_list = [UUID(x) for x in source_query_result_id_list] try: source = Source.objects.filter(pk__in=source_query_result_id_list) except Source.DoesNotExist: @@ -2597,5 +2649,6 @@ def etavplot(self, request: Request) -> Response: v_sigma = float(request.query_params.get("v_sigma", 3.0)) plot_document = plot_eta_v_bokeh( - source, eta_sigma=eta_sigma, v_sigma=v_sigma, use_peak_flux=use_peak_flux) + source, eta_sigma=eta_sigma, v_sigma=v_sigma, use_peak_flux=use_peak_flux + ) return Response(json_item(plot_document)) diff --git a/webinterface/settings.py b/webinterface/settings.py index 5e57e49a1..e5ce53676 100644 --- a/webinterface/settings.py +++ b/webinterface/settings.py @@ -14,13 +14,13 @@ # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = env('SECRET_KEY', cast=str, default='FillMeUPWithSomeComplicatedString') +SECRET_KEY = env("SECRET_KEY", cast=str, default="FillMeUPWithSomeComplicatedString") # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = env('DEBUG', cast=bool, default=True) -ALLOWED_HOSTS = env('ALLOWED_HOSTS', cast=list, default=[]) +DEBUG = env("DEBUG", cast=bool, default=True) +ALLOWED_HOSTS = env("ALLOWED_HOSTS", cast=list, default=[]) INTERNAL_IPS = [ - '127.0.0.1', + "127.0.0.1", ] SITE_ID = 1 @@ -28,63 +28,70 @@ # Application definition INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'django.contrib.humanize', - 'rest_framework', - 'rest_framework_datatables', - 'social_django', - 'crispy_forms', - 'django_q', - 'tagulous', + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + "django.contrib.humanize", + "rest_framework", + "rest_framework_datatables", + "social_django", + "crispy_forms", + "django_q", + "tagulous", # pipeline app and others - 'vast_pipeline', -] + env('EXTRA_APPS', cast=list, default=[]) + "vast_pipeline", +] + env("EXTRA_APPS", cast=list, default=[]) + +SERIALIZATION_MODULES = { + "xml": "tagulous.serializers.xml_serializer", + "json": "tagulous.serializers.json", + "python": "tagulous.serializers.python", + "yaml": "tagulous.serializers.pyyaml", +} MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'social_django.middleware.SocialAuthExceptionMiddleware', -] + env('EXTRA_MIDDLEWARE', cast=list, default=[]) - -ROOT_URLCONF = 'webinterface.urls' + "django.middleware.security.SecurityMiddleware", + "whitenoise.middleware.WhiteNoiseMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", + "social_django.middleware.SocialAuthExceptionMiddleware", +] + env("EXTRA_MIDDLEWARE", cast=list, default=[]) + +ROOT_URLCONF = "webinterface.urls" TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [BASE_DIR + '/templates/', ], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - 'social_django.context_processors.backends', - 'social_django.context_processors.login_redirect', - 'vast_pipeline.context_processors.maintainance_banner', - 'vast_pipeline.context_processors.pipeline_version', + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [ + BASE_DIR + "/templates/", + ], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + "social_django.context_processors.backends", + "social_django.context_processors.login_redirect", + "vast_pipeline.context_processors.maintainance_banner", + "vast_pipeline.context_processors.pipeline_version", ], - 'libraries': { - 'unit_tags': 'vast_pipeline.utils.unit_tags' - } + "libraries": {"unit_tags": "vast_pipeline.utils.unit_tags"}, }, }, ] -WSGI_APPLICATION = 'webinterface.wsgi.application' +WSGI_APPLICATION = "webinterface.wsgi.application" -DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' +DEFAULT_AUTO_FIELD = "django.db.models.AutoField" # Authentication # Password validation @@ -107,100 +114,100 @@ # docs @ https://python-social-auth.readthedocs.io/en/latest/backends/github.html#github AUTHENTICATION_BACKENDS = [ - 'social_core.backends.github.GithubOrganizationOAuth2', - 'django.contrib.auth.backends.ModelBackend', + "social_core.backends.github.GithubOrganizationOAuth2", + "django.contrib.auth.backends.ModelBackend", ] -LOGIN_URL = 'login' -LOGIN_REDIRECT_URL = 'index' -LOGOUT_URL = 'logout' -LOGOUT_REDIRECT_URL = 'login' -LOGIN_ERROR_URL = 'login' +LOGIN_URL = "login" +LOGIN_REDIRECT_URL = "index" +LOGOUT_URL = "logout" +LOGOUT_REDIRECT_URL = "login" +LOGIN_ERROR_URL = "login" -SOCIAL_AUTH_STRATEGY = 'social_django.strategy.DjangoStrategy' -SOCIAL_AUTH_STORAGE = 'social_django.models.DjangoStorage' +SOCIAL_AUTH_STRATEGY = "social_django.strategy.DjangoStrategy" +SOCIAL_AUTH_STORAGE = "social_django.models.DjangoStorage" SOCIAL_AUTH_POSTGRES_JSONFIELD = True -SOCIAL_AUTH_ADMIN_USER_SEARCH_FIELDS = ['email'] +SOCIAL_AUTH_ADMIN_USER_SEARCH_FIELDS = ["email"] SOCIAL_AUTH_PIPELINE = ( - 'social_core.pipeline.social_auth.social_details', - 'social_core.pipeline.social_auth.social_uid', - 'social_core.pipeline.social_auth.auth_allowed', - 'social_core.pipeline.social_auth.social_user', - 'social_core.pipeline.user.get_username', - 'social_core.pipeline.user.create_user', - 'vast_pipeline.utils.auth.create_admin_user', - 'social_core.pipeline.social_auth.associate_user', - 'social_core.pipeline.social_auth.load_extra_data', - 'vast_pipeline.utils.auth.load_github_avatar', - 'social_core.pipeline.user.user_details', + "social_core.pipeline.social_auth.social_details", + "social_core.pipeline.social_auth.social_uid", + "social_core.pipeline.social_auth.auth_allowed", + "social_core.pipeline.social_auth.social_user", + "social_core.pipeline.user.get_username", + "social_core.pipeline.user.create_user", + "vast_pipeline.utils.auth.create_admin_user", + "social_core.pipeline.social_auth.associate_user", + "social_core.pipeline.social_auth.load_extra_data", + "vast_pipeline.utils.auth.load_github_avatar", + "social_core.pipeline.user.user_details", ) -SOCIAL_AUTH_GITHUB_ORG_KEY = env('SOCIAL_AUTH_GITHUB_KEY', cast=str, default='') -SOCIAL_AUTH_GITHUB_ORG_SECRET = env('SOCIAL_AUTH_GITHUB_SECRET', cast=str, default='') -SOCIAL_AUTH_GITHUB_ORG_NAME = env('SOCIAL_AUTH_GITHUB_ORG_NAME', cast=str, default='') -SOCIAL_AUTH_GITHUB_ADMIN_TEAM = env('SOCIAL_AUTH_GITHUB_ADMIN_TEAM', cast=str, default='') -SOCIAL_AUTH_GITHUB_ORG_SCOPE = ['read:org', 'user:email'] +SOCIAL_AUTH_GITHUB_ORG_KEY = env("SOCIAL_AUTH_GITHUB_KEY", cast=str, default="") +SOCIAL_AUTH_GITHUB_ORG_SECRET = env("SOCIAL_AUTH_GITHUB_SECRET", cast=str, default="") +SOCIAL_AUTH_GITHUB_ORG_NAME = env("SOCIAL_AUTH_GITHUB_ORG_NAME", cast=str, default="") +SOCIAL_AUTH_GITHUB_ADMIN_TEAM = env( + "SOCIAL_AUTH_GITHUB_ADMIN_TEAM", cast=str, default="" +) +SOCIAL_AUTH_GITHUB_ORG_SCOPE = ["read:org", "user:email"] CRISPY_TEMPLATE_PACK = "bootstrap4" -TNS_API_KEY = env('TNS_API_KEY', default=None) -TNS_USER_AGENT = env('TNS_USER_AGENT', default=None) +TNS_API_KEY = env("TNS_API_KEY", default=None) +TNS_USER_AGENT = env("TNS_USER_AGENT", default=None) # Database # https://docs.djangoproject.com/en/2.2/ref/settings/#databases -DATABASES = { - 'default': env.db() -} +DATABASES = {"default": env.db()} # Cache (necessary to run pipeline jobs from UI) CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', - 'LOCATION': 'pipeline_cache_table', + "default": { + "BACKEND": "django.core.cache.backends.db.DatabaseCache", + "LOCATION": "pipeline_cache_table", } } # Django Queue Cluster Q_CLUSTER = { - 'name': 'VastPipeline', - 'workers': 3, - 'timeout': env('Q_CLUSTER_TIMEOUT', cast=int, default=86400), - 'queue_limit': 6, - 'ack_failures': True, - 'bulk': 10, - 'orm': 'default',# same as above in DATABASES but can be changed - 'label': 'Django Q tasks', - 'daemonize_workers': False, - 'recycle': 100, - 'retry': env('Q_CLUSTER_RETRY', cast=int, default=86402), - 'max_attempts': env('Q_CLUSTER_MAX_ATTEMPTS', cast=int, default=1), + "name": "VastPipeline", + "workers": 3, + "timeout": env("Q_CLUSTER_TIMEOUT", cast=int, default=86400), + "queue_limit": 6, + "ack_failures": True, + "bulk": 10, + "orm": "default", # same as above in DATABASES but can be changed + "label": "Django Q tasks", + "daemonize_workers": False, + "recycle": 100, + "retry": env("Q_CLUSTER_RETRY", cast=int, default=86402), + "max_attempts": env("Q_CLUSTER_MAX_ATTEMPTS", cast=int, default=1), } # REST framework settings REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework.authentication.BasicAuthentication', - 'rest_framework.authentication.SessionAuthentication', + "DEFAULT_AUTHENTICATION_CLASSES": ( + "rest_framework.authentication.BasicAuthentication", + "rest_framework.authentication.SessionAuthentication", ), - 'DEFAULT_RENDERER_CLASSES': ( - 'rest_framework.renderers.JSONRenderer', - 'rest_framework.renderers.BrowsableAPIRenderer', - 'rest_framework_datatables.renderers.DatatablesRenderer', + "DEFAULT_RENDERER_CLASSES": ( + "rest_framework.renderers.JSONRenderer", + "rest_framework.renderers.BrowsableAPIRenderer", + "rest_framework_datatables.renderers.DatatablesRenderer", ), - 'DEFAULT_FILTER_BACKENDS': ( - 'rest_framework_datatables.filters.DatatablesFilterBackend', + "DEFAULT_FILTER_BACKENDS": ( + "rest_framework_datatables.filters.DatatablesFilterBackend", ), - 'DEFAULT_PAGINATION_CLASS': 'rest_framework_datatables.pagination.DatatablesPageNumberPagination', - 'PAGE_SIZE': 100, + "DEFAULT_PAGINATION_CLASS": "rest_framework_datatables.pagination.DatatablesPageNumberPagination", + "PAGE_SIZE": 100, } # Internationalization # https://docs.djangoproject.com/en/2.2/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = "en-us" -TIME_ZONE = 'UTC' +TIME_ZONE = "UTC" USE_I18N = True @@ -211,51 +218,55 @@ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.2/howto/static-files/ -BASE_URL = env('BASE_URL', cast=str, default=None) -STATIC_URL = env('STATIC_URL', cast=str, default='/static/') +BASE_URL = env("BASE_URL", cast=str, default=None) +STATIC_URL = env("STATIC_URL", cast=str, default="/static/") if BASE_URL: - STATIC_URL = '/' + BASE_URL.strip('/') + '/' + STATIC_URL.strip('/') + '/' -STATICFILES_DIRS = env('STATICFILES_DIRS', cast=list, default=[os.path.join(BASE_DIR, 'static')]) -STATIC_ROOT = env('STATIC_ROOT', cast=str, default=os.path.join(BASE_DIR, 'staticfiles')) -STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' + STATIC_URL = "/" + BASE_URL.strip("/") + "/" + STATIC_URL.strip("/") + "/" +STATICFILES_DIRS = env( + "STATICFILES_DIRS", cast=list, default=[os.path.join(BASE_DIR, "static")] +) +STATIC_ROOT = env( + "STATIC_ROOT", cast=str, default=os.path.join(BASE_DIR, "staticfiles") +) +STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage" # Logging LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'formatters': { - 'verbose': { - 'format': '{asctime} {process:d} {thread:d} {name} {levelname} {message}', - 'style': '{', + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "verbose": { + "format": "{asctime} {process:d} {thread:d} {name} {levelname} {message}", + "style": "{", }, - 'default': { - 'format': '{asctime} {module} {levelname} {message}', - 'style': '{', + "default": { + "format": "{asctime} {module} {levelname} {message}", + "style": "{", }, }, - 'handlers': { - 'mail_admins': { - 'level': 'ERROR', - 'class': 'django.utils.log.AdminEmailHandler' + "handlers": { + "mail_admins": { + "level": "ERROR", + "class": "django.utils.log.AdminEmailHandler", }, - 'console': { - 'class': 'logging.StreamHandler', - 'formatter': 'default', + "console": { + "class": "logging.StreamHandler", + "formatter": "default", }, }, - 'loggers': { - 'django.request': { - 'handlers': ['mail_admins'], - 'level': 'ERROR', - 'propagate': True, + "loggers": { + "django.request": { + "handlers": ["mail_admins"], + "level": "ERROR", + "propagate": True, }, # root logger - '': { - 'handlers': ['console'], - 'propagate': True, - 'level': 'INFO', + "": { + "handlers": ["console"], + "propagate": True, + "level": "INFO", }, - } + }, } # PRODUCTION SETTINGS @@ -265,90 +276,96 @@ # SECURE_SSL_REDIRECT = True # set this to True when your reverse proxy server does not redirect http to https SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True - SECURE_HSTS_SECONDS = 31536000 # see https://docs.djangoproject.com/en/3.1/ref/middleware/#http-strict-transport-security + SECURE_HSTS_SECONDS = 31536000 # see https://docs.djangoproject.com/en/3.1/ref/middleware/#http-strict-transport-security SECURE_HSTS_INCLUDE_SUBDOMAINS = True SECURE_HSTS_PRELOAD = True - SECURE_REFERRER_POLICY = 'same-origin' # see https://docs.djangoproject.com/en/3.0/ref/middleware/#referrer-policy + SECURE_REFERRER_POLICY = "same-origin" # see https://docs.djangoproject.com/en/3.0/ref/middleware/#referrer-policy SECURE_BROWSER_XSS_FILTER = True SECURE_CONTENT_TYPE_NOSNIFF = True - X_FRAME_OPTIONS = 'DENY' + X_FRAME_OPTIONS = "DENY" # from https://ubuntu.com/blog/django-behind-a-proxy-fixing-absolute-urls USE_X_FORWARDED_HOST = True - SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') + SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") # PIPELINE settings # project default folder -PIPELINE_WORKING_DIR = env('PIPELINE_WORKING_DIR', cast=str, default=os.path.join(BASE_DIR, 'pipeline-runs')) -if '/' not in PIPELINE_WORKING_DIR: +PIPELINE_WORKING_DIR = env( + "PIPELINE_WORKING_DIR", cast=str, default=os.path.join(BASE_DIR, "pipeline-runs") +) +if "/" not in PIPELINE_WORKING_DIR: PIPELINE_WORKING_DIR = os.path.join(BASE_DIR, PIPELINE_WORKING_DIR) # raw image data folder (containing FITS files, selavy, etc) -RAW_IMAGE_DIR = env('RAW_IMAGE_DIR', cast=str, default=os.path.join(BASE_DIR, 'raw-images')) -if '/' not in RAW_IMAGE_DIR: +RAW_IMAGE_DIR = env( + "RAW_IMAGE_DIR", cast=str, default=os.path.join(BASE_DIR, "raw-images") +) +if "/" not in RAW_IMAGE_DIR: RAW_IMAGE_DIR = os.path.join(BASE_DIR, RAW_IMAGE_DIR) # extra user-supplied data folder # HOME_DATA_DIR is relative to HOME_DATA_ROOT if HOME_DATA_ROOT is not None # otherwise, HOME_DATA_DIR is relative to the user's home directory on the deployment machine -HOME_DATA_ROOT = env('HOME_DATA_ROOT', default=None) -HOME_DATA_DIR = env('HOME_DATA_DIR', cast=str, default='vast-pipeline-extra-data') +HOME_DATA_ROOT = env("HOME_DATA_ROOT", default=None) +HOME_DATA_DIR = env("HOME_DATA_DIR", cast=str, default="vast-pipeline-extra-data") # allowed source finders -SOURCE_FINDERS = ['selavy'] +SOURCE_FINDERS = ["selavy"] # default source finder -DEFAULT_SOURCE_FINDER = 'selavy' +DEFAULT_SOURCE_FINDER = "selavy" # defaults source association methods -DEFAULT_ASSOCIATION_METHODS = ['basic', 'advanced', 'deruiter'] +DEFAULT_ASSOCIATION_METHODS = ["basic", "advanced", "deruiter"] # minimum default accepted error on flux -FLUX_DEFAULT_MIN_ERROR = env('FLUX_DEFAULT_MIN_ERROR', cast=float, default=0.001) +FLUX_DEFAULT_MIN_ERROR = env("FLUX_DEFAULT_MIN_ERROR", cast=float, default=0.001) # minimum default accepted error on ra and dec -POS_DEFAULT_MIN_ERROR = env('POS_DEFAULT_MIN_ERROR', cast=float, default=0.01) +POS_DEFAULT_MIN_ERROR = env("POS_DEFAULT_MIN_ERROR", cast=float, default=0.01) # Default pipeline run config values PIPE_RUN_CONFIG_DEFAULTS = { - 'image_files': [], - 'selavy_files': [], - 'background_files': [], - 'noise_files': [], - 'source_finder': 'selavy', - 'monitor': False, - 'monitor_min_sigma': 3.0, - 'monitor_edge_buffer_scale': 1.2, - 'monitor_cluster_threshold': 3.0, - 'monitor_allow_nan': False, - 'astrometric_uncertainty_ra': 1, - 'astrometric_uncertainty_dec': 1, - 'association_parallel': False, - 'association_epoch_duplicate_radius': 2.5, - 'association_method': 'basic', - 'association_radius': 10., - 'association_de_ruiter_radius': 5.68, - 'association_beamwidth_limit': 1.5, - 'new_source_min_sigma': 5.0, - 'flux_perc_error': 0, - 'use_condon_errors': True, - 'selavy_local_rms_zero_fill_value': 0.2, - 'create_measurements_arrow_files': False, - 'suppress_astropy_warnings': True, - 'pair_metrics': True, - 'source_aggregate_pair_metrics_min_abs_vs': 4.3, + "image_files": [], + "selavy_files": [], + "background_files": [], + "noise_files": [], + "source_finder": "selavy", + "monitor": False, + "monitor_min_sigma": 3.0, + "monitor_edge_buffer_scale": 1.2, + "monitor_cluster_threshold": 3.0, + "monitor_allow_nan": False, + "astrometric_uncertainty_ra": 1, + "astrometric_uncertainty_dec": 1, + "association_parallel": False, + "association_epoch_duplicate_radius": 2.5, + "association_method": "basic", + "association_radius": 10.0, + "association_de_ruiter_radius": 5.68, + "association_beamwidth_limit": 1.5, + "new_source_min_sigma": 5.0, + "flux_perc_error": 0, + "use_condon_errors": True, + "selavy_local_rms_zero_fill_value": 0.2, + "create_measurements_arrow_files": False, + "suppress_astropy_warnings": True, + "pair_metrics": True, + "source_aggregate_pair_metrics_min_abs_vs": 4.3, } # default max concurrent pipeline runs -MAX_PIPELINE_RUNS = env('MAX_PIPELINE_RUNS', cast=int, default=3) +MAX_PIPELINE_RUNS = env("MAX_PIPELINE_RUNS", cast=int, default=3) # maximum number of images for non-admin runs -MAX_PIPERUN_IMAGES = env('MAX_PIPERUN_IMAGES', cast=int, default=200) +MAX_PIPERUN_IMAGES = env("MAX_PIPERUN_IMAGES", cast=int, default=200) # maximum number of cutout images to render on the source detail page -MAX_CUTOUT_IMAGES = env('MAX_CUTOUT_IMAGES', cast=int, default=30) +MAX_CUTOUT_IMAGES = env("MAX_CUTOUT_IMAGES", cast=int, default=30) # pipeline maintainance message/banner -PIPELINE_MAINTAINANCE_MESSAGE = env('PIPELINE_MAINTAINANCE_MESSAGE', cast=str, default=None) +PIPELINE_MAINTAINANCE_MESSAGE = env( + "PIPELINE_MAINTAINANCE_MESSAGE", cast=str, default=None +) # web server eta v plot datashader threshold -ETA_V_DATASHADER_THRESHOLD = env('ETA_V_DATASHADER_THRESHOLD', cast=int, default=20000) +ETA_V_DATASHADER_THRESHOLD = env("ETA_V_DATASHADER_THRESHOLD", cast=int, default=20000)