diff --git a/.github/workflows/install.sh b/.github/workflows/install.sh index fe9f4d5c6..72196ab2f 100755 --- a/.github/workflows/install.sh +++ b/.github/workflows/install.sh @@ -11,7 +11,7 @@ echo "Installing package and requirements for ${flavor}" if [[ "${flavor}" = "testing" ]]; then poetry run pip install wradlib --no-deps - poetry install --no-interaction --extras=sql --extras=export --extras=restapi --extras=explorer + poetry install --no-interaction --extras=sql --extras=export --extras=restapi --extras=explorer --extras=bufr elif [[ "${flavor}" = "docs" ]]; then poetry install --no-interaction --extras=docs diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4e1cce05c..c78d9cda6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -48,6 +48,13 @@ jobs: path: .venv key: poetry-${{ runner.os }}-py${{ matrix.python-version }}-${{ hashFiles('poetry.lock') }}-${{ env.CACHE_NUMBER }} + - name: Install eccodes (Mac only) + run: | + if [ "$RUNNER_OS" == "macOS" ]; then + brew install eccodes && export WD_ECCODES_DIR=$(brew --prefix eccodes) + fi + shell: bash + - name: Install dependencies run: .github/workflows/install.sh testing if: steps.poetry-cache-flag.outputs.cache-hit != 'true' diff --git a/CHANGELOG.rst b/CHANGELOG.rst index ffde804f6..8acdf633a 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,6 +4,8 @@ Changelog Development *********** +- Radar: read bufr data into pandas.DataFrame when eccodes library is provided + 0.32.0 (24.04.2022) ******************* @@ -111,6 +113,7 @@ Features - Enable selecting a parameter precisely from a dataset by passing a tuple like [("precipitation_height", "kl")] or [("precipitation_height", "precipitation_more")], or for cli/restapi use "precipitation_height/kl" +- Allow parsing DWD radar data in bufr format to a pandas DataFrame - Rename wetterdienst show to wetterdienst info, make version accessible via cli with wetterdienst version diff --git a/THIRD_PARTY_NOTICES b/THIRD_PARTY_NOTICES index 2592ff2bd..2d5be4100 100644 --- a/THIRD_PARTY_NOTICES +++ b/THIRD_PARTY_NOTICES @@ -883,7 +883,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Jinja2 -3.1.1 +3.1.2 BSD License Armin Ronacher https://palletsprojects.com/p/jinja/ @@ -1635,7 +1635,7 @@ DAMAGE. PyPDF2 -1.27.9 +1.27.10 BSD License Mathieu Fenniak https://pypdf2.readthedocs.io/en/latest/ @@ -3198,7 +3198,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. click -8.1.2 +8.1.3 BSD License Armin Ronacher https://palletsprojects.com/p/click/ @@ -5846,7 +5846,7 @@ THE SOFTWARE. flake8-eradicate -1.2.0 +1.2.1 MIT License Nikita Sobolev https://github.com/wemake-services/flake8-eradicate @@ -6255,7 +6255,7 @@ https://gitlab.com/pycqa/flake8-polyfill UNKNOWN flake8-print -4.0.0 +4.0.1 MIT License Joseph Kahn https://github.com/jbkahn/flake8-print @@ -7323,7 +7323,7 @@ THE SOFTWARE. jupyter-client -7.2.2 +7.3.0 BSD License Jupyter Development Team https://jupyter.org @@ -7458,10 +7458,10 @@ to indicate the copyright and license terms: jupyter-server -1.16.0 +1.17.0 BSD License Jupyter Development Team -https://jupyter.org +https://jupyter-server.readthedocs.io # Licensing terms This project is licensed under the terms of the Modified BSD License diff --git a/docs/usage/python-api.rst b/docs/usage/python-api.rst index 17a85f9c0..cf86675a4 100644 --- a/docs/usage/python-api.rst +++ b/docs/usage/python-api.rst @@ -142,6 +142,14 @@ and to set it back to standard from wetterdienst import Settings Settings.reset() +The environmental settings recognized by our settings are + +.. ipython:: python + + import json + from wetterdienst import Settings + print(json.dumps(Settings.env.dump(), indent=4)) + Also if for whatever reason you have concurrent code running and want it all to have thread-safe settings use it like .. ipython:: python diff --git a/poetry.lock b/poetry.lock index a9781e107..b9604710d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -119,7 +119,7 @@ python-versions = "*" [[package]] name = "asgiref" -version = "3.5.0" +version = "3.5.1" description = "ASGI specs, helper code, and adapters" category = "main" optional = true @@ -316,7 +316,7 @@ python-versions = "*" name = "cffi" version = "1.15.0" description = "Foreign Function Interface for Python calling C code." -category = "dev" +category = "main" optional = false python-versions = "*" @@ -347,7 +347,7 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.1.2" +version = "8.1.3" description = "Composable command line interface toolkit" category = "main" optional = false @@ -516,7 +516,7 @@ python-versions = "*" [[package]] name = "dask" -version = "2022.4.1" +version = "2022.4.2" description = "Parallel PyData with Task Scheduling" category = "main" optional = true @@ -532,10 +532,10 @@ toolz = ">=0.8.2" [package.extras] array = ["numpy (>=1.18)"] -complete = ["bokeh (>=2.4.2)", "distributed (==2022.04.1)", "jinja2", "numpy (>=1.18)", "pandas (>=1.0)"] +complete = ["bokeh (>=2.4.2)", "distributed (==2022.04.2)", "jinja2", "numpy (>=1.18)", "pandas (>=1.0)"] dataframe = ["numpy (>=1.18)", "pandas (>=1.0)"] diagnostics = ["bokeh (>=2.4.2)", "jinja2"] -distributed = ["distributed (==2022.04.1)"] +distributed = ["distributed (==2022.04.2)"] test = ["pytest", "pytest-rerunfailures", "pytest-xdist", "pre-commit"] [[package]] @@ -627,7 +627,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "duckdb" -version = "0.3.3" +version = "0.3.4" description = "DuckDB embedded database" category = "main" optional = true @@ -636,6 +636,19 @@ python-versions = "*" [package.dependencies] numpy = ">=1.14" +[[package]] +name = "eccodes" +version = "1.2.0" +description = "Python interface to the ecCodes GRIB and BUFR decoder/encoder" +category = "main" +optional = true +python-versions = "*" + +[package.dependencies] +attrs = "*" +cffi = "*" +numpy = "*" + [[package]] name = "entrypoints" version = "0.4" @@ -862,7 +875,7 @@ pydocstyle = ">=2.1" [[package]] name = "flake8-eradicate" -version = "1.2.0" +version = "1.2.1" description = "Flake8 plugin to find commented out code" category = "dev" optional = false @@ -910,7 +923,7 @@ flake8 = "*" [[package]] name = "flake8-print" -version = "4.0.0" +version = "4.0.1" description = "print statement checker plugin for flake8" category = "dev" optional = false @@ -953,7 +966,7 @@ docs = ["alabaster", "pygments-github-lexers", "recommonmark", "sphinx"] [[package]] name = "flask" -version = "2.1.1" +version = "2.1.2" description = "A simple framework for building complex web applications." category = "main" optional = true @@ -972,7 +985,7 @@ dotenv = ["python-dotenv"] [[package]] name = "flask-compress" -version = "1.11" +version = "1.12" description = "Compress responses in your Flask app with gzip, deflate or brotli." category = "main" optional = true @@ -984,7 +997,7 @@ flask = "*" [[package]] name = "fonttools" -version = "4.33.2" +version = "4.33.3" description = "Tools to manipulate font files" category = "main" optional = true @@ -1234,7 +1247,7 @@ python-versions = "*" [[package]] name = "ipython" -version = "7.32.0" +version = "7.33.0" description = "IPython: Productive Interactive Computing" category = "main" optional = true @@ -1311,7 +1324,7 @@ testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.1" +version = "3.1.2" description = "A very fast and expressive template engine." category = "main" optional = false @@ -1350,7 +1363,7 @@ format_nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jupyter-client" -version = "7.2.2" +version = "7.3.0" description = "Jupyter protocol implementation and client libraries" category = "dev" optional = false @@ -1386,14 +1399,14 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyter-server" -version = "1.16.0" +version = "1.17.0" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -anyio = ">=3.1.0" +anyio = ">=3.1.0,<4" argon2-cffi = "*" jinja2 = "*" jupyter-client = ">=6.1.12" @@ -1407,11 +1420,11 @@ pyzmq = ">=17" Send2Trash = "*" terminado = ">=0.8.3" tornado = ">=6.1.0" -traitlets = ">=5.1.0" +traitlets = ">=5.1" websocket-client = "*" [package.extras] -test = ["coverage", "pytest (>=6.0)", "pytest-cov", "pytest-mock", "pytest-timeout", "requests", "pytest-tornasync", "pytest-console-scripts", "ipykernel", "pre-commit"] +test = ["coverage", "ipykernel", "pre-commit", "pytest-console-scripts", "pytest-cov", "pytest-mock", "pytest-timeout", "pytest-tornasync", "pytest (>=6.0)", "requests"] [[package]] name = "jupyter-server-mathjax" @@ -1866,6 +1879,22 @@ category = "dev" optional = false python-versions = ">=2.6" +[[package]] +name = "pdbufr" +version = "0.9.0" +description = "Pandas reader for the BUFR format using ecCodes." +category = "main" +optional = true +python-versions = "*" + +[package.dependencies] +attrs = "*" +eccodes = "*" +pandas = "*" + +[package.extras] +tests = ["flake8", "pytest", "pytest-cov"] + [[package]] name = "percy" version = "2.0.2" @@ -1926,7 +1955,7 @@ uncertainties = ["uncertainties (>=3.0)"] [[package]] name = "pip-licenses" -version = "3.5.3" +version = "3.5.4" description = "Dump the software license list of Python packages installed with pip." category = "dev" optional = false @@ -2075,7 +2104,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" name = "pycparser" version = "2.21" description = "C parser in Python" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -2137,7 +2166,7 @@ diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pypdf2" -version = "1.27.9" +version = "1.27.10" description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" category = "main" optional = false @@ -2164,11 +2193,11 @@ python-versions = ">=3.7" [[package]] name = "pyshp" -version = "2.2.0" +version = "2.3.0" description = "Pure Python read/write support for ESRI Shapefile format" category = "main" optional = true -python-versions = ">= 2.7" +python-versions = ">=2.7" [[package]] name = "pytest" @@ -2293,7 +2322,7 @@ cli = ["click (>=5.0)"] [[package]] name = "python-slugify" -version = "6.1.1" +version = "6.1.2" description = "A Python slugify application that also handles Unicode" category = "main" optional = true @@ -2698,7 +2727,7 @@ cairosvg = ["cairosvg (>=1.0)"] [[package]] name = "sqlalchemy" -version = "1.4.35" +version = "1.4.36" description = "Database Abstraction Library" category = "main" optional = true @@ -3176,7 +3205,7 @@ 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)"] [extras] -bufr = [] +bufr = ["pdbufr"] cratedb = [] docs = ["sphinx", "sphinx-material", "tomlkit", "sphinx-autodoc-typehints", "sphinxcontrib-svg2pdfconverter", "matplotlib", "ipython"] duckdb = ["duckdb"] @@ -3187,14 +3216,14 @@ ipython = ["ipython", "ipython-genutils", "matplotlib"] mpl = ["matplotlib"] mysql = ["mysqlclient"] postgresql = ["psycopg2-binary"] -radar = ["wradlib"] +radar = ["wradlib", "pdbufr"] restapi = ["fastapi", "uvicorn"] sql = ["duckdb"] [metadata] lock-version = "1.1" python-versions = "^3.8,<3.11" -content-hash = "4fec25426c7ac8349757c0c7afc11ece4605d82fccbd640f08ec9a031a6b1e7c" +content-hash = "fdb29aa5aa6cc4abdc53e7b4377eb23e8bfc86036908fd3d750856d21316cdde" [metadata.files] aenum = [ @@ -3327,8 +3356,8 @@ asciitree = [ {file = "asciitree-0.3.3.tar.gz", hash = "sha256:4aa4b9b649f85e3fcb343363d97564aa1fb62e249677f2e18a96765145cc0f6e"}, ] asgiref = [ - {file = "asgiref-3.5.0-py3-none-any.whl", hash = "sha256:88d59c13d634dcffe0510be048210188edd79aeccb6a6c9028cdad6f31d730a9"}, - {file = "asgiref-3.5.0.tar.gz", hash = "sha256:2f8abc20f7248433085eda803936d98992f1343ddb022065779f37c5da0181d0"}, + {file = "asgiref-3.5.1-py3-none-any.whl", hash = "sha256:45a429524fba18aba9d512498b19d220c4d628e75b40cf5c627524dbaebc5cc1"}, + {file = "asgiref-3.5.1.tar.gz", hash = "sha256:fddeea3c53fa99d0cdb613c3941cc6e52d822491fc2753fba25768fb5bf4e865"}, ] async-timeout = [ {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, @@ -3575,8 +3604,8 @@ charset-normalizer = [ {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"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] click-params = [ {file = "click-params-0.1.2.tar.gz", hash = "sha256:249e7dfe958046aa2badffe9a5d3d63ac5f96a31716cb3d04af98c13c92b2eff"}, @@ -3686,8 +3715,8 @@ dash-table = [ {file = "dash_table-5.0.0.tar.gz", hash = "sha256:18624d693d4c8ef2ddec99a6f167593437a7ea0bf153aa20f318c170c5bc7308"}, ] dask = [ - {file = "dask-2022.4.1-py3-none-any.whl", hash = "sha256:df4231680fb9ba2274b4eafc4a42d87372e32b9de3e72811120afdaf4e3a4edf"}, - {file = "dask-2022.4.1.tar.gz", hash = "sha256:f3f4344edb8169f5040225f6a41dbc3042db886ed7546f11bab1270a5cd38454"}, + {file = "dask-2022.4.2-py3-none-any.whl", hash = "sha256:aebac683ecd3846ae86466a41b88af06e5b0ada049c2be4b3755b9c313a5d6f9"}, + {file = "dask-2022.4.2.tar.gz", hash = "sha256:da573206797768f6ff1b7aa1bd28ac0cd4fa2b7a30fd0f43af744c2d9b4f52d8"}, ] dateparser = [ {file = "dateparser-1.1.1-py2.py3-none-any.whl", hash = "sha256:9600874312ff28a41f96ec7ccdc73be1d1c44435719da47fea3339d55ff5a628"}, @@ -3721,19 +3750,48 @@ docutils = [ {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] duckdb = [ - {file = "duckdb-0.3.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75b7e54dd3ee8ffc19112b3cb5f6bc7024f80474d7ccdd2832183ed626d7860"}, - {file = "duckdb-0.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b60cf015a84055954be20e38889f85ebeb9e503f550be96f9f2e9b681a05def"}, - {file = "duckdb-0.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b1d7f2eb3f2d71b5c0ef6e7564ef49a07840d2cd28ea42f9a0877434cba08a85"}, - {file = "duckdb-0.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ac1bb736be38dca83be6e3af327b8a44ea6b2cc78bd2dec9ea81f4d5e2d3e031"}, - {file = "duckdb-0.3.3-cp310-cp310-win32.whl", hash = "sha256:03e9a28b94db53c68af66912a7a19ce71ac67daef6beec4877c8c5e6436765de"}, - {file = "duckdb-0.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:7d12a37cf064710329f1d5e7090e51428f64ead93a5f788201434d19f87b98cb"}, - {file = "duckdb-0.3.3-cp36-cp36m-win32.whl", hash = "sha256:d5f67f25ec034467e2b01d90dd6e37ba573f80ea71ea31a91c803f570b9815e4"}, - {file = "duckdb-0.3.3-cp36-cp36m-win_amd64.whl", hash = "sha256:85b196b555dacc1340d10eac45ddcb855106b56c3c3926588365f38b1620877f"}, - {file = "duckdb-0.3.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc500b36858da1b6834f39d9057fc4ea2c48729b2c65a2d4311846452d786ab5"}, - {file = "duckdb-0.3.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7563e7f227d7b5a7a14f73a25c915d360926e7df0533e70deba881a04627761"}, - {file = "duckdb-0.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2cc7c89aa37894430d05270766525ac21b24081809c2b061176887d2c3863a26"}, - {file = "duckdb-0.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e972b2439eb8362dddf83006737b3b3a8dbe765a3934796ec036a97afae19cef"}, - {file = "duckdb-0.3.3.tar.gz", hash = "sha256:4129d85af6e09789b3325205fdfec1673bdcc35f524159e638c39ef83c48c1ef"}, + {file = "duckdb-0.3.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ecfa5e8c6bde61efead473b05b35ed989dc08fe76c7ab1c931e4c16e082b10b"}, + {file = "duckdb-0.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7bda539e070d08391b36370e847122350c66d90d9fdf20727b23cde86847fa39"}, + {file = "duckdb-0.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d913ea8d59c4004508ed2a21b70dcf7c5cd5d667e7a48efac01e0453627aadc"}, + {file = "duckdb-0.3.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eeab0867e5194e14ea39dbe1d14164c058c9d9fff1328b120361fa6da87aa622"}, + {file = "duckdb-0.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0695ee38ad8b2fa4390507ef75c491c93bb508dbe636fec4d08f66bc20b2f911"}, + {file = "duckdb-0.3.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b4a743dc8f1e78539070295be548dfbb7a01c1625d2e37f2414068378a11c3d5"}, + {file = "duckdb-0.3.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6202a9f611aa6526db9699ba625ee0518ca3e269642d6955b995375285f38a7e"}, + {file = "duckdb-0.3.4-cp310-cp310-win32.whl", hash = "sha256:f3452e6780756508f07cd45b696dd92a08adac02d032442ffb4146578c31ff19"}, + {file = "duckdb-0.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:e27f5a6e486785797afc109204dffc81982e6eb0af2001e1e1709dd25c0c203d"}, + {file = "duckdb-0.3.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6e0b88fd0a905e23efb5555f22b980952494c9b94f103c14ea3b613019522095"}, + {file = "duckdb-0.3.4-cp36-cp36m-win32.whl", hash = "sha256:99ba0cdfbbaee22828cb936c4c324617476970359ff6a9e80b5b7daf4269c500"}, + {file = "duckdb-0.3.4-cp36-cp36m-win_amd64.whl", hash = "sha256:03020e992d6093a68ab597e11da2e34587863f238bcc317690e1fec1e93bca41"}, + {file = "duckdb-0.3.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d6280debb6c10a44b1efa073ba07fb067911f3e11d7f5ae9db715478a819a67d"}, + {file = "duckdb-0.3.4-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b2107da403605bf68692ed5b9194e5692290bd73fa9abdd48fde82be0d6457d"}, + {file = "duckdb-0.3.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e47ab2f2112a258f2e8fae66321009bb51253d674fadf7dd964be0886514684c"}, + {file = "duckdb-0.3.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9df6867017644f016cde47da37de57065540d3cfa410e50b943bd90f42d96110"}, + {file = "duckdb-0.3.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0da2cadcdfbf9aa2e34eba9cc4413ed7c635aaa0bb4cafef7eb37d951f205223"}, + {file = "duckdb-0.3.4-cp37-cp37m-win32.whl", hash = "sha256:672645773abbe32801bf543d12a1189dbc67122db4da6b90a57f3acecd525dbf"}, + {file = "duckdb-0.3.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6fa14f1d3cf225f788ad7f055e25b98d99c06d3a379df4b788fdf66ebe7f9b98"}, + {file = "duckdb-0.3.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:155f6717ad9fe1aa99d8d631508d2577b06519661b7e30cb14cff46a0446558c"}, + {file = "duckdb-0.3.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:013a65ddac424d2d778dff37d5b1e91c2f68365436cc8ec76ea45a906313e0bf"}, + {file = "duckdb-0.3.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba1d627a913154c651daca5ca168b8fa49caa6792a61f069f30eae645a8d52cd"}, + {file = "duckdb-0.3.4-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8d4e960945955b19ba051e5bb0d6b17c3bcea3d29f9114bb94faaa7585df8c5"}, + {file = "duckdb-0.3.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56ecd82eb31d89ff349059fd909e02906efa1971faeec1a0f7a81357d09d1ad9"}, + {file = "duckdb-0.3.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:78c8d2c6629e14140fd038402bf3cbb8c2017ba68148c29c66f8142ffa8f3a39"}, + {file = "duckdb-0.3.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4811c3fd101d1561d46b5d6c7b9915c3b2adbc8a6270e7cddc63411c6a4b4a0c"}, + {file = "duckdb-0.3.4-cp38-cp38-win32.whl", hash = "sha256:aa42d850cf2dd3f5f664f7a9c8be548f8618064ca6260808fa4e361a334ce2b1"}, + {file = "duckdb-0.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:6ec0be5153a35e3a7462c014a90bba81964f63f114af3f25384b97b0bf5fcae7"}, + {file = "duckdb-0.3.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e35d92606c34cfb56f084eca2540db6573b260f974245465f6dae9dbcdbe6434"}, + {file = "duckdb-0.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54cf2d11ea8e8a9d474a83137ea654a66b2ac7ea26f615ef4498b9e3fb5091f1"}, + {file = "duckdb-0.3.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8762917c1349c1517487500d5975c2788f3544b82ae341d79984eaa836e20a"}, + {file = "duckdb-0.3.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60a163e65a1afdf410b2b9cbecd124875a53e53ad9271bdd66ed98ae42034778"}, + {file = "duckdb-0.3.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f552592ac977d368ea02c6a89b62373fb53a49a36aa8e7d3b3c89999ee420010"}, + {file = "duckdb-0.3.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a1c355929e06f22f35a2d3a74c16721d7b2ecd35e5088bf9722f1ca574ff5a2b"}, + {file = "duckdb-0.3.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f5c65d6a4afa8c313c612d6bc92bca055f1cbcc81646640d5dde797c745b7876"}, + {file = "duckdb-0.3.4-cp39-cp39-win32.whl", hash = "sha256:79256b5521c3945f540dd4ccfcc7658d18e98a42ba619c5571eb075fc234b5a1"}, + {file = "duckdb-0.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:f38cdf5a55a4a4f18c30d2ad73055d4531679fa3282cb08cacf2646f0a0150be"}, + {file = "duckdb-0.3.4.tar.gz", hash = "sha256:ab94cfc9e4c25f93d4a7be2063879475c308d771d53588bfd6198a89a8c2bcd2"}, +] +eccodes = [ + {file = "eccodes-1.2.0-py3-none-any.whl", hash = "sha256:8d9ac25c7769659cf56f7c8f2aa1afca3d20e0b3f342e0f406da6b84c244f539"}, + {file = "eccodes-1.2.0.tar.gz", hash = "sha256:813a861e4e26efc494fef091d1127ff44c7e055e5ed1de68bf36bb1e509c5ecf"}, ] entrypoints = [ {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, @@ -3817,8 +3875,8 @@ flake8-docstrings = [ {file = "flake8_docstrings-1.6.0-py2.py3-none-any.whl", hash = "sha256:99cac583d6c7e32dd28bbfbef120a7c0d1b6dde4adb5a9fd441c4227a6534bde"}, ] flake8-eradicate = [ - {file = "flake8-eradicate-1.2.0.tar.gz", hash = "sha256:acaa1b6839ff00d284b805c432fdfa6047262bd15a5504ec945797e87b4de1fa"}, - {file = "flake8_eradicate-1.2.0-py3-none-any.whl", hash = "sha256:51dc660d0c1c1ed93af0f813540bbbf72ab2d3466c14e3f3bac371c618b6042f"}, + {file = "flake8-eradicate-1.2.1.tar.gz", hash = "sha256:e486f8ab7e2dba3667223688e9239158fbf4ecaa88125e2283bcda81171412b7"}, + {file = "flake8_eradicate-1.2.1-py3-none-any.whl", hash = "sha256:00d77faefb64cef18b3c1b48a004c3a2ad663aa3cf85650f422437d25ece6441"}, ] flake8-isort = [ {file = "flake8-isort-4.1.1.tar.gz", hash = "sha256:d814304ab70e6e58859bc5c3e221e2e6e71c958e7005239202fee19c24f82717"}, @@ -3833,8 +3891,8 @@ flake8-polyfill = [ {file = "flake8_polyfill-1.0.2-py2.py3-none-any.whl", hash = "sha256:12be6a34ee3ab795b19ca73505e7b55826d5f6ad7230d31b18e106400169b9e9"}, ] flake8-print = [ - {file = "flake8-print-4.0.0.tar.gz", hash = "sha256:5afac374b7dc49aac2c36d04b5eb1d746d72e6f5df75a6ecaecd99e9f79c6516"}, - {file = "flake8_print-4.0.0-py3-none-any.whl", hash = "sha256:6c0efce658513169f96d7a24cf136c434dc711eb00ebd0a985eb1120103fe584"}, + {file = "flake8-print-4.0.1.tar.gz", hash = "sha256:12b3c3bf65329d8ca9acde949fb3b932ec113e9e5ffa6cb7cd55a7dbcd67dae1"}, + {file = "flake8_print-4.0.1-py3-none-any.whl", hash = "sha256:e246bcd5b07d5259af460b7eff148052c49114640380d7f22340f30920fabf02"}, ] flake8-return = [ {file = "flake8-return-1.1.3.tar.gz", hash = "sha256:13a31edeb0c6157dd4f77166cdaa6141703d2b8b24def5558ae659852a003cb4"}, @@ -3845,16 +3903,16 @@ flakeheaven = [ {file = "flakeheaven-0.11.1.tar.gz", hash = "sha256:20f5a573b8e85be5a73fed2e3967f7ab8b5e77714a5898d8b634dd31a0b75f9b"}, ] flask = [ - {file = "Flask-2.1.1-py3-none-any.whl", hash = "sha256:8a4cf32d904cf5621db9f0c9fbcd7efabf3003f22a04e4d0ce790c7137ec5264"}, - {file = "Flask-2.1.1.tar.gz", hash = "sha256:a8c9bd3e558ec99646d177a9739c41df1ded0629480b4c8d2975412f3c9519c8"}, + {file = "Flask-2.1.2-py3-none-any.whl", hash = "sha256:fad5b446feb0d6db6aec0c3184d16a8c1f6c3e464b511649c8918a9be100b4fe"}, + {file = "Flask-2.1.2.tar.gz", hash = "sha256:315ded2ddf8a6281567edb27393010fe3406188bafbfe65a3339d5787d89e477"}, ] flask-compress = [ - {file = "Flask-Compress-1.11.tar.gz", hash = "sha256:f569f32c446d6b25ca8e347d5003a0531811ef732678005b0036fc1c9eb1c21c"}, - {file = "Flask_Compress-1.11-py3-none-any.whl", hash = "sha256:7ccc4102104a63e6207f39eb307f99aebbfbaf4e70992d727440cff29119a0a0"}, + {file = "Flask-Compress-1.12.tar.gz", hash = "sha256:e2159499f39d618a4d56ba0484e7b58b57956b9a2c6d3510f095f5bb14b7afc5"}, + {file = "Flask_Compress-1.12-py3-none-any.whl", hash = "sha256:9f4e40211755e86f85e5eb7d414856ef1e8751912caa78d62853169400335f0c"}, ] fonttools = [ - {file = "fonttools-4.33.2-py3-none-any.whl", hash = "sha256:b4da40696829845ea8c1cb33ce51c552179754cbee7ab4e8b96a6bcf421f437a"}, - {file = "fonttools-4.33.2.zip", hash = "sha256:696fe922a271584c3ec8325ba31d4001a4fd6c4953b22900b767f1cb53ce1044"}, + {file = "fonttools-4.33.3-py3-none-any.whl", hash = "sha256:f829c579a8678fa939a1d9e9894d01941db869de44390adb49ce67055a06cc2a"}, + {file = "fonttools-4.33.3.zip", hash = "sha256:c0fdcfa8ceebd7c1b2021240bd46ef77aa8e7408cf10434be55df52384865f8e"}, ] freezegun = [ {file = "freezegun-1.2.1-py3-none-any.whl", hash = "sha256:15103a67dfa868ad809a8f508146e396be2995172d25f927e48ce51c0bf5cb09"}, @@ -4052,8 +4110,8 @@ iniconfig = [ {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] ipython = [ - {file = "ipython-7.32.0-py3-none-any.whl", hash = "sha256:86df2cf291c6c70b5be6a7b608650420e89180c8ec74f376a34e2dc15c3400e7"}, - {file = "ipython-7.32.0.tar.gz", hash = "sha256:468abefc45c15419e3c8e8c0a6a5c115b2127bafa34d7c641b1d443658793909"}, + {file = "ipython-7.33.0-py3-none-any.whl", hash = "sha256:916a3126896e4fd78dd4d9cf3e21586e7fd93bae3f1cd751588b75524b64bf94"}, + {file = "ipython-7.33.0.tar.gz", hash = "sha256:bcffb865a83b081620301ba0ec4d95084454f26b91d6d66b475bff3dfb0218d4"}, ] ipython-genutils = [ {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, @@ -4072,8 +4130,8 @@ jedi = [ {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"}, ] jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] joblib = [ {file = "joblib-1.1.0-py2.py3-none-any.whl", hash = "sha256:f21f109b3c7ff9d95f8387f752d0d9c34a02aa2f7060c2135f465da0e5160ff6"}, @@ -4084,16 +4142,16 @@ jsonschema = [ {file = "jsonschema-4.4.0.tar.gz", hash = "sha256:636694eb41b3535ed608fe04129f26542b59ed99808b4f688aa32dcf55317a83"}, ] jupyter-client = [ - {file = "jupyter_client-7.2.2-py3-none-any.whl", hash = "sha256:44045448eadc12493d819d965eb1dc9d10d1927698adbb9b14eb9a3a4a45ba53"}, - {file = "jupyter_client-7.2.2.tar.gz", hash = "sha256:8fdbad344a8baa6a413d86d25bbf87ce21cb2b4aa5a8e0413863b9754eb8eb8a"}, + {file = "jupyter_client-7.3.0-py3-none-any.whl", hash = "sha256:671dd2d90d03f41716b09627a4eb06bb37875f92bf6563cc2ce4fe71c61c5cda"}, + {file = "jupyter_client-7.3.0.tar.gz", hash = "sha256:3bcc8e08a294d0fa9406e48cfe17e11ef0efdb7c504fe8cc335128e3ef8f3dac"}, ] jupyter-core = [ {file = "jupyter_core-4.10.0-py3-none-any.whl", hash = "sha256:e7f5212177af7ab34179690140f188aa9bf3d322d8155ed972cbded19f55b6f3"}, {file = "jupyter_core-4.10.0.tar.gz", hash = "sha256:a6de44b16b7b31d7271130c71a6792c4040f077011961138afed5e5e73181aec"}, ] jupyter-server = [ - {file = "jupyter_server-1.16.0-py3-none-any.whl", hash = "sha256:72dd1ff5373d2def94e80632ba4397e504cc9200c5b5f44b5b0af2e062a73353"}, - {file = "jupyter_server-1.16.0.tar.gz", hash = "sha256:c756f87ad64b84e2aa522ef482445e1a93f7fe4a5fc78358f4636e53c9a0463a"}, + {file = "jupyter_server-1.17.0-py3-none-any.whl", hash = "sha256:5aa5e0945e3dbf29390cfe9c418a9af245d812ce282932ae97d0671e10c147a0"}, + {file = "jupyter_server-1.17.0.tar.gz", hash = "sha256:7b3aa524790ab0da64f06dfe0b2af149d0a3f59aad71fdedcf1d8bae6508018c"}, ] jupyter-server-mathjax = [ {file = "jupyter_server_mathjax-0.2.5-py3-none-any.whl", hash = "sha256:d165c9ff876a1c32ccf99d309b57463fae206d9b6f0f3a9fa34ed01b3b26605e"}, @@ -4599,6 +4657,9 @@ pbr = [ {file = "pbr-5.8.1-py2.py3-none-any.whl", hash = "sha256:27108648368782d07bbf1cb468ad2e2eeef29086affd14087a6d04b7de8af4ec"}, {file = "pbr-5.8.1.tar.gz", hash = "sha256:66bc5a34912f408bb3925bf21231cb6f59206267b7f63f3503ef865c1a292e25"}, ] +pdbufr = [ + {file = "pdbufr-0.9.0.tar.gz", hash = "sha256:c9f9e19ebae7d27e86166d72a088c699044917a66c800cfccfa72005a1cda945"}, +] percy = [ {file = "percy-2.0.2-py2.py3-none-any.whl", hash = "sha256:c1647b768810e9453220a7721a5d52cec560dee913d13c1e29b713703f4f223e"}, {file = "percy-2.0.2.tar.gz", hash = "sha256:6238612dc401fa5c221c0ad7738f7ea43e48fe2695f6423e785ee2bc940f021d"}, @@ -4656,8 +4717,8 @@ pint = [ {file = "Pint-0.17.tar.gz", hash = "sha256:f4d0caa713239e6847a7c6eefe2427358566451fe56497d533f21fb590a3f313"}, ] pip-licenses = [ - {file = "pip-licenses-3.5.3.tar.gz", hash = "sha256:f44860e00957b791c6c6005a3328f2d5eaeee96ddb8e7d87d4b0aa25b02252e4"}, - {file = "pip_licenses-3.5.3-py3-none-any.whl", hash = "sha256:59c148d6a03784bf945d232c0dc0e9de4272a3675acaa0361ad7712398ca86ba"}, + {file = "pip-licenses-3.5.4.tar.gz", hash = "sha256:a8b4dabe2b83901f9ac876afc47b57cff9a5ebe19a6d90c0b2579fa8cf2db176"}, + {file = "pip_licenses-3.5.4-py3-none-any.whl", hash = "sha256:5e23593c670b8db616b627c68729482a65bb88498eefd8df337762fdaf7936a8"}, ] platformdirs = [ {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, @@ -4849,8 +4910,8 @@ pyparsing = [ {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, ] pypdf2 = [ - {file = "PyPDF2-1.27.9-py3-none-any.whl", hash = "sha256:5e29ffaf2efcfb77c25206e3b8df517a18af84e64ebe1b3a93abac8d01176374"}, - {file = "PyPDF2-1.27.9.tar.gz", hash = "sha256:5f7937fd94ba387a2a241db8858770e53091d8ffab9922512c0bf48e3f4cc615"}, + {file = "PyPDF2-1.27.10-py3-none-any.whl", hash = "sha256:631f62c80160d53473145e9c27b95ca6a589e7e130dba2fe87688599f2fd8cf1"}, + {file = "PyPDF2-1.27.10.tar.gz", hash = "sha256:f1fd4a200fb2a6634c7a027d678ea52c634e4b41d90c4c573530af3911964ad4"}, ] pyproj = [ {file = "pyproj-3.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:473961faef7a9fd723c5d432f65220ea6ab3854e606bf84b4d409a75a4261c78"}, @@ -4900,8 +4961,8 @@ pyrsistent = [ {file = "pyrsistent-0.18.1.tar.gz", hash = "sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96"}, ] pyshp = [ - {file = "pyshp-2.2.0-py3-none-any.whl", hash = "sha256:d9e1f0d9a9fec50d5055991ba83237cd4bdf4aad7f23162247446909b6e4c0f9"}, - {file = "pyshp-2.2.0.tar.gz", hash = "sha256:0eda209bd62f3345701c4f6799b638c114ceb67fee28295cddb4e1caf053e944"}, + {file = "pyshp-2.3.0-py2.py3-none-any.whl", hash = "sha256:fd391f7ee82a7b775eaf79dd26f9bfb43c5940fe8126c8664fd3ad7c2af539e4"}, + {file = "pyshp-2.3.0.tar.gz", hash = "sha256:825064ea403acf135e846cf8b0924499430e6be1cd37a0f34be7130906617d3c"}, ] pytest = [ {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, @@ -4936,8 +4997,8 @@ python-dotenv = [ {file = "python_dotenv-0.20.0-py3-none-any.whl", hash = "sha256:d92a187be61fe482e4fd675b6d52200e7be63a12b724abbf931a40ce4fa92938"}, ] python-slugify = [ - {file = "python-slugify-6.1.1.tar.gz", hash = "sha256:00003397f4e31414e922ce567b3a4da28cf1436a53d332c9aeeb51c7d8c469fd"}, - {file = "python_slugify-6.1.1-py2.py3-none-any.whl", hash = "sha256:8c0016b2d74503eb64761821612d58fcfc729493634b1eb0575d8f5b4aa1fbcf"}, + {file = "python-slugify-6.1.2.tar.gz", hash = "sha256:272d106cb31ab99b3496ba085e3fea0e9e76dcde967b5e9992500d1f785ce4e1"}, + {file = "python_slugify-6.1.2-py2.py3-none-any.whl", hash = "sha256:7b2c274c308b62f4269a9ba701aa69a797e9bca41aeee5b3a9e79e36b6656927"}, ] pytz = [ {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, @@ -5354,42 +5415,42 @@ sphinxcontrib-svg2pdfconverter = [ {file = "sphinxcontrib_svg2pdfconverter-1.2.0-py3-none-any.whl", hash = "sha256:2c6850903a8e66ae3e03b34d2b562070639d3f6d177e05e7620d08b189890147"}, ] 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"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:81e53bd383c2c33de9d578bfcc243f559bd3801a0e57f2bcc9a943c790662e0c"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6e1fe00ee85c768807f2a139b83469c1e52a9ffd58a6eb51aa7aeb524325ab18"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27m-win32.whl", hash = "sha256:d57ac32f8dc731fddeb6f5d1358b4ca5456e72594e664769f0a9163f13df2a31"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27m-win_amd64.whl", hash = "sha256:fca8322e04b2dde722fcb0558682740eebd3bd239bea7a0d0febbc190e99dc15"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:53d2d9ee93970c969bc4e3c78b1277d7129554642f6ffea039c282c7dc4577bc"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:f0394a3acfb8925db178f7728adb38c027ed7e303665b225906bfa8099dc1ce8"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c606d8238feae2f360b8742ffbe67741937eb0a05b57f536948d198a3def96"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8d07fe2de0325d06e7e73281e9a9b5e259fbd7cbfbe398a0433cbb0082ad8fa7"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5041474dcab7973baa91ec1f3112049a9dd4652898d6a95a6a895ff5c58beb6b"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-win32.whl", hash = "sha256:be094460930087e50fd08297db9d7aadaed8408ad896baf758e9190c335632da"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-win_amd64.whl", hash = "sha256:64d796e9af522162f7f2bf7a3c5531a0a550764c426782797bbeed809d0646c5"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a0ae3aa2e86a4613f2d4c49eb7da23da536e6ce80b2bfd60bbb2f55fc02b0b32"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d50cb71c1dbed70646d521a0975fb0f92b7c3f84c61fa59e07be23a1aaeecfc"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:16abf35af37a3d5af92725fc9ec507dd9e9183d261c2069b6606d60981ed1c6e"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864a83bd345871ad9699ce466388f836db7572003d67d9392a71998092210e3"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-win32.whl", hash = "sha256:fbf8c09fe9728168f8cc1b40c239eab10baf9c422c18be7f53213d70434dea43"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-win_amd64.whl", hash = "sha256:6e859fa96605027bd50d8e966db1c4e1b03e7b3267abbc4b89ae658c99393c58"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:166a3887ec355f7d2f12738f7fa25dc8ac541867147a255f790f2f41f614cb44"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e885548da361aa3f8a9433db4cfb335b2107e533bf314359ae3952821d84b3e"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5c90ef955d429966d84326d772eb34333178737ebb669845f1d529eb00c75e72"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a052bd9f53004f8993c624c452dfad8ec600f572dd0ed0445fbe64b22f5570e"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-win32.whl", hash = "sha256:dce3468bf1fc12374a1a732c9efd146ce034f91bb0482b602a9311cb6166a920"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-win_amd64.whl", hash = "sha256:6cb4c4f57a20710cea277edf720d249d514e587f796b75785ad2c25e1c0fed26"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e74ce103b81c375c3853b436297952ef8d7863d801dcffb6728d01544e5191b5"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b20c4178ead9bc398be479428568ff31b6c296eb22e75776273781a6551973f"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:af2587ae11400157753115612d6c6ad255143efba791406ad8a0cbcccf2edcb3"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83cf3077712be9f65c9aaa0b5bc47bc1a44789fd45053e2e3ecd59ff17c63fe9"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-win32.whl", hash = "sha256:ce20f5da141f8af26c123ebaa1b7771835ca6c161225ce728962a79054f528c3"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-win_amd64.whl", hash = "sha256:316c7e5304dda3e3ad711569ac5d02698bbc71299b168ac56a7076b86259f7ea"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:f522214f6749bc073262529c056f7dfd660f3b5ec4180c5354d985eb7219801e"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ecac4db8c1aa4a269f5829df7e706639a24b780d2ac46b3e485cbbd27ec0028"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3db741beaa983d4cbf9087558620e7787106319f7e63a066990a70657dd6b35"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ec89bf98cc6a0f5d1e28e3ad28e9be6f3b4bdbd521a4053c7ae8d5e1289a8a1"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-win32.whl", hash = "sha256:e12532c4d3f614678623da5d852f038ace1f01869b89f003ed6fe8c793f0c6a3"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-win_amd64.whl", hash = "sha256:cb441ca461bf97d00877b607f132772644b623518b39ced54da433215adce691"}, + {file = "SQLAlchemy-1.4.36.tar.gz", hash = "sha256:64678ac321d64a45901ef2e24725ec5e783f1f4a588305e196431447e7ace243"}, ] starlette = [ {file = "starlette-0.14.2-py3-none-any.whl", hash = "sha256:3c8e48e52736b3161e34c9f0e8153b4f32ec5d8995a3ee1d59410d92f75162ed"}, diff --git a/pyproject.toml b/pyproject.toml index 65a579264..5135044bd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -128,6 +128,10 @@ fastapi = { version = "^0.65", optional = true } uvicorn = { version = "^0.14", optional = true } wradlib = { version = "^1.13", optional = true } +# Radar +eccodes = { version = "1.2.0", optional = true } +pdbufr = { version = "^0.9.0", optional = true, extras = ["eccodes"] } + # Explorer UI service plotly = { version = "^5.0", optional = true } dash = { version = "^2.0", optional = true } @@ -148,7 +152,6 @@ diskcache = "^5.4.0" environs = "^9.4.0" scikit-learn = "^1.0.2" - [tool.poetry.dev-dependencies] poethepoet = "^0.9" @@ -220,8 +223,8 @@ influxdb = ["influxdb", "influxdb-client"] cratedb = ["crate"] mysql = ["mysqlclient"] postgresql = ["psycopg2-binary"] -radar = ["wradlib", "pybufrkit", "h5py"] -bufr = ["pybufrkit"] +radar = ["wradlib", "pybufrkit", "h5py", "pdbufr"] +bufr = ["pybufrkit", "pdbufr"] [tool.poetry.scripts] wetterdienst = 'wetterdienst.ui.cli:cli' @@ -275,7 +278,7 @@ flake8-bandit = ["-S101", "-S106"] flake8-bugbear = ["-B008"] [tool.poe.tasks] -install_dev = "poetry install -E mpl -E ipython -E docs -E sql -E export -E duckdb -E influxdb -E cratedb -E mysql -E postgresql -E radar -E bufr -E restapi -E explorer" +install_dev = "poetry install -E mpl -E ipython -E docs -E sql -E export -E duckdb -E influxdb -E cratedb -E mysql -E postgresql -E radar -E bufr -E restapi -E explorer -E bufr" black = "black wetterdienst example tests" isort = "isort wetterdienst example tests" format = ["black", "isort"] diff --git a/requirements.txt b/requirements.txt index 7e18cd4db..88d01cbf4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,7 +21,7 @@ certifi==2021.10.8; python_version >= "3.6" and python_full_version < "3.0.0" or cffi==1.15.0; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.0" and implementation_name == "pypy" charset-normalizer==2.0.12; python_full_version >= "3.6.0" and python_version >= "3.6" click-params==0.1.2; python_version >= "3.6" and python_version < "4.0" -click==8.1.2; python_version >= "3.7" +click==8.1.3; python_version >= "3.7" cloup==0.8.2; python_version >= "3.6" colorama==0.4.4; python_full_version >= "3.6.2" and platform_system == "Windows" and python_version >= "3.7" and sys_platform == "win32" and python_full_version < "4.0.0" and (python_version >= "3.7" and python_full_version < "3.0.0" and platform_system == "Windows" or platform_system == "Windows" and python_version >= "3.7" and python_full_version >= "3.5.0") and (python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.6" and python_full_version >= "3.5.0") and python_version < "4.0" and (python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6") and python_version < "4.0" or sys_platform == "win32" and python_version >= "3.7" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6") and python_version < "4.0" and python_full_version >= "3.5.0") and (python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.5.0") coverage==5.5; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0" and python_version < "4") @@ -46,11 +46,11 @@ flake8-builtins==1.5.3 flake8-comprehensions==3.8.0; python_version >= "3.7" flake8-copyright==0.2.2 flake8-docstrings==1.6.0 -flake8-eradicate==1.2.0; python_version >= "3.6" and python_version < "4.0" +flake8-eradicate==1.2.1; python_version >= "3.6" and python_version < "4.0" flake8-isort==4.1.1 flake8-plugin-utils==1.3.2; python_version >= "3.6" and python_version < "4.0" flake8-polyfill==1.0.2 -flake8-print==4.0.0; python_version >= "3.6" +flake8-print==4.0.1; python_version >= "3.6" flake8-return==1.1.3; python_version >= "3.6" and python_version < "4.0" flake8==4.0.1; python_full_version >= "3.6.2" and python_full_version < "4.0.0" and python_version >= "3.7" and python_version < "4.0" flakeheaven==0.11.1; python_full_version >= "3.6.2" and python_full_version < "4.0.0" @@ -66,13 +66,13 @@ importlib-metadata==4.11.3; python_version < "3.10" and python_version >= "3.7" importlib-resources==5.7.1; python_version >= "3.7" and python_version < "3.9" iniconfig==1.1.1; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.5.0" and python_version >= "3.7" and python_version < "4.0" isort==5.10.1; python_full_version >= "3.6.1" and python_version < "4.0" -jinja2==3.1.1; python_version >= "3.7" and python_version < "4.0" +jinja2==3.1.2; python_version >= "3.7" and python_version < "4.0" joblib==1.1.0; python_version >= "3.7" jsonschema==4.4.0; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.0" -jupyter-client==7.2.2; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.0" +jupyter-client==7.3.0; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.0" jupyter-core==4.10.0; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.0" jupyter-server-mathjax==0.2.5; python_version >= "3.7" and python_version < "4.0" -jupyter-server==1.16.0; python_version >= "3.7" and python_version < "4.0" +jupyter-server==1.17.0; python_version >= "3.7" and python_version < "4.0" jupyterlab-pygments==0.2.2; python_version >= "3.7" and python_version < "4.0" livereload==2.6.3; python_version >= "3.6" lxml==4.8.0; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0") @@ -99,7 +99,7 @@ pathspec==0.9.0; python_full_version >= "3.6.2" pbr==5.8.1; python_version >= "3.7" percy==2.0.2 pint==0.17; python_version >= "3.6" -pip-licenses==3.5.3; python_version >= "3.6" and python_version < "4.0" +pip-licenses==3.5.4; python_version >= "3.6" and python_version < "4.0" platformdirs==2.5.2; python_version >= "3.7" and python_full_version >= "3.6.2" pluggy==1.0.0; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.5.0" and python_version >= "3.7" and python_version < "4.0" poethepoet==0.9.0; python_version >= "3.6" and python_version < "4.0" @@ -114,7 +114,7 @@ pydocstyle==6.1.1; python_version >= "3.6" pyflakes==2.4.0; python_full_version >= "3.6.2" and python_full_version < "4.0.0" and python_version >= "3.7" and python_version < "4.0" pygments==2.12.0; python_full_version >= "3.6.2" and python_full_version < "4.0.0" and python_version >= "3.7" and python_version < "4.0" pyparsing==3.0.8; python_full_version >= "3.6.8" and python_version >= "3.6" -pypdf2==1.27.9; python_version >= "2.7" +pypdf2==1.27.10; python_version >= "2.7" pyrsistent==0.18.1; python_version >= "3.7" and python_version < "4.0" pytest-cov==2.12.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0") pytest-dictsdiff==0.5.8 diff --git a/tests/provider/dwd/radar/__init__.py b/tests/provider/dwd/radar/__init__.py index b6831f854..cb3d0712f 100644 --- a/tests/provider/dwd/radar/__init__.py +++ b/tests/provider/dwd/radar/__init__.py @@ -10,5 +10,5 @@ ) station_reference_pattern_de = ( "(deasb,)?(deboo,)?(dedrs,)?deeis,deess,(defbg,)?defld,(dehnr,)?" - "(deisn,)?(demem,)?(deneu,denhb,deoft,depro,deros(,detur)?(,deumd)?)?" + "(deisn,)?(demem,)?(deneu,)?(denhb,)?(deoft,depro,deros(,detur)?(,deumd)?)?" ) diff --git a/tests/provider/dwd/radar/test_api_historic.py b/tests/provider/dwd/radar/test_api_historic.py index b5d94fdb8..15ebfd09a 100644 --- a/tests/provider/dwd/radar/test_api_historic.py +++ b/tests/provider/dwd/radar/test_api_historic.py @@ -12,6 +12,7 @@ import requests import wradlib as wrl +from wetterdienst.eccodes import ensure_eccodes from wetterdienst.provider.dwd.radar import ( DwdRadarDataFormat, DwdRadarDataSubset, @@ -518,6 +519,53 @@ def test_radar_request_site_historic_pe_bufr(): decoder = pybufrkit.decoder.Decoder() decoder.process(payload, info_only=True) + assert not results[0].df.dropna().empty + + assert results[0].df.columns == [] + + +@pytest.mark.remote +@pytest.mark.skipif(not ensure_eccodes(), reason="eccodes required for pdbufr library") +def test_radar_request_site_historic_pe_bufr_dataframe(): + """ + Verify acquisition of radar/site/PE_ECHO_TOP data works + when using a specific date. + + This time, we will use the BUFR data format. + """ + + # Acquire data from yesterday at this time. + timestamp = datetime.utcnow() - timedelta(days=1) + + request = DwdRadarValues( + parameter=DwdRadarParameter.PE_ECHO_TOP, + start_date=timestamp, + site=DwdRadarSite.BOO, + fmt=DwdRadarDataFormat.BUFR, + ) + + results = list(request.query()) + + if len(results) == 0: + raise pytest.skip("Data currently not available") + + df = results[0].df + + assert not df.empty + + assert df.columns.tolist() == [ + "station_id", + "latitude", + "longitude", + "height", + "projectionType", + "pictureType", + "date", + "echotops", + ] + + assert not df.dropna().empty + @pytest.mark.remote @pytest.mark.parametrize( @@ -560,7 +608,12 @@ def test_radar_request_site_historic_pe_timerange(fmt): assert len(results) >= 1 - # TODO: Verify data. + first = results[0] + + if fmt == DwdRadarDataFormat.BUFR: + assert not first.df.dropna().empty + + assert first.df.columns == [""] @pytest.mark.xfail @@ -629,7 +682,9 @@ def test_radar_request_site_historic_px250_bufr_timerange(): assert len(results) == 12 - # TODO: Verify data. + first = results[0] + + assert not first.df.dropna().empty @pytest.mark.remote diff --git a/tests/ui/test_cli.py b/tests/ui/test_cli.py index c7df701ae..f8e67a5a0 100644 --- a/tests/ui/test_cli.py +++ b/tests/ui/test_cli.py @@ -42,7 +42,7 @@ "latitude": 51.13, "longitude": 13.75, "from_date": None, - "name": "DRESDEN", + "name": "DRESDEN/FLUGHAFEN", "state": None, }, [13.75, 51.13, 230.0], diff --git a/wetterdienst/eccodes.py b/wetterdienst/eccodes.py new file mode 100644 index 000000000..dc8fb7a00 --- /dev/null +++ b/wetterdienst/eccodes.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018-2022, earthobservations developers. +# Distributed under the MIT License. See LICENSE for more info. +def ensure_eccodes() -> bool: + """Function to ensure that eccodes is loaded""" + try: + import eccodes + + eccodes.eccodes.codes_get_api_version() + except (ModuleNotFoundError, RuntimeError): + return False + + return True diff --git a/wetterdienst/provider/dwd/radar/access.py b/wetterdienst/provider/dwd/radar/access.py index 2edc1ffc3..9c554e983 100644 --- a/wetterdienst/provider/dwd/radar/access.py +++ b/wetterdienst/provider/dwd/radar/access.py @@ -5,6 +5,7 @@ import gzip import logging import tarfile +import tempfile from dataclasses import dataclass from datetime import datetime from io import BytesIO @@ -13,7 +14,9 @@ import pandas as pd from fsspec.implementations.tar import TarFileSystem +from wetterdienst.eccodes import ensure_eccodes from wetterdienst.exceptions import FailedDownload +from wetterdienst.metadata.columns import Columns from wetterdienst.metadata.extension import Extension from wetterdienst.metadata.period import Period from wetterdienst.metadata.resolution import Resolution @@ -31,11 +34,26 @@ ) from wetterdienst.provider.dwd.radar.sites import DwdRadarSite from wetterdienst.provider.dwd.radar.util import get_date_from_filename, verify_hdf5 +from wetterdienst.settings import Settings from wetterdienst.util.cache import CacheExpiry from wetterdienst.util.network import download_file log = logging.getLogger(__name__) +ECCODES_FOUND = ensure_eccodes() + +if ECCODES_FOUND: + log.info("eccodes was found. data of bufr files will be read into pandas.DataFrame stored at result.df") + import pdbufr + + +BUFR_PARAMETER_MAPPING = { + DwdRadarParameter.PE_ECHO_TOP: "echoTops", + DwdRadarParameter.PG_REFLECTIVITY: "horizontalReflectivity", + DwdRadarParameter.LMAX_VOLUME_SCAN: "horizontalReflectivity", + DwdRadarParameter.PX250_REFLECTIVITY: "horizontalReflectivity", +} + @dataclass class RadarResult: @@ -45,6 +63,8 @@ class RadarResult: """ data: BytesIO + # placeholder for bufr files, which are read into pandas.DataFrame if eccodes available + df: pd.DataFrame = pd.DataFrame() timestamp: datetime = None url: str = None filename: str = None @@ -96,7 +116,6 @@ def collect_radar_data( :return: ``RadarResult`` item """ - # Find latest file. if start_date == DwdRadarDate.LATEST: @@ -202,6 +221,59 @@ def collect_radar_data( if result.timestamp is None: result.timestamp = date_time + if fmt == DwdRadarDataFormat.BUFR: + if ECCODES_FOUND and Settings.read_bufr: + buffer = result.data + + # TODO: pdbufr currently doesn't seem to allow reading directly from BytesIO + tf = tempfile.NamedTemporaryFile("w+b") + tf.write(buffer.read()) + tf.seek(0) + + df = pdbufr.read_bufr( + tf.name, + columns=( + "stationNumber", + "latitude", + "longitude", + "heightOfStation", + "projectionType", + "pictureType", + "year", + "month", + "day", + "hour", + "minute", + BUFR_PARAMETER_MAPPING[parameter], + ), + ) + + tf.close() + + df = df.rename( + columns={ + "stationNumber": Columns.STATION_ID.value, + "latitude": Columns.LATITUDE.value, + "longitude": Columns.LONGITUDE.value, + "heightOfStation": Columns.HEIGHT.value, + BUFR_PARAMETER_MAPPING[parameter]: BUFR_PARAMETER_MAPPING[parameter].lower(), + } + ) + + df[Columns.STATION_ID.value] = df[Columns.STATION_ID.value].astype(int).astype(str) + + date_columns = ["year", "month", "day", "hour", "minute"] + dates = df.loc[:, date_columns].apply( + lambda x: datetime( + year=x.year, month=x.month, day=x.day, hour=x.hour, minute=x.minute + ), + axis=1, + ) + df.insert(len(df.columns) - 1, Columns.DATE.value, dates) + df = df.drop(columns=date_columns) + + result.df = df + if verify: if fmt == DwdRadarDataFormat.HDF5: verify_hdf5(result.data) diff --git a/wetterdienst/provider/dwd/radar/index.py b/wetterdienst/provider/dwd/radar/index.py index 52d14fe0f..b0e45e123 100644 --- a/wetterdienst/provider/dwd/radar/index.py +++ b/wetterdienst/provider/dwd/radar/index.py @@ -101,7 +101,7 @@ def create_fileindex_radar( elif fmt == DwdRadarDataFormat.BUFR: files_server = files_server[files_server[DwdColumns.FILENAME.value].str.contains("--buf")] - # Drop duplicates of files packed as .bz2 + # Drop duplicates of files packed as .bz2, if not all files are .bz2 if not all(files_server[DwdColumns.FILENAME.value].str.endswith(".bz2")): files_server = files_server[~files_server[DwdColumns.FILENAME.value].str.endswith(".bz2")] diff --git a/wetterdienst/provider/dwd/radar/metadata/parameter.py b/wetterdienst/provider/dwd/radar/metadata/parameter.py index f8de4fad7..cfe8b8d72 100644 --- a/wetterdienst/provider/dwd/radar/metadata/parameter.py +++ b/wetterdienst/provider/dwd/radar/metadata/parameter.py @@ -16,7 +16,6 @@ class DwdRadarParameter(Enum): HG_REFLECTIVITY = "hg" PG_REFLECTIVITY = "pg" RV_REFLECTIVITY = "rv" - WX_REFLECTIVITY = "wx" WN_REFLECTIVITY = "wn" # /radolan @@ -37,7 +36,6 @@ class DwdRadarParameter(Enum): LMAX_VOLUME_SCAN = "lmax" PE_ECHO_TOP = "pe" PF_REFLECTIVITY = "pf" - PL_VOLUME_SCAN = "pl" PR_VELOCITY = "pr" PX_REFLECTIVITY = "px" PX250_REFLECTIVITY = "px250" @@ -60,7 +58,6 @@ class DwdRadarParameter(Enum): DwdRadarParameter.HG_REFLECTIVITY, DwdRadarParameter.PG_REFLECTIVITY, DwdRadarParameter.RV_REFLECTIVITY, - DwdRadarParameter.WX_REFLECTIVITY, DwdRadarParameter.WN_REFLECTIVITY, ] RADAR_PARAMETERS_RADOLAN = [ @@ -78,7 +75,6 @@ class DwdRadarParameter(Enum): DwdRadarParameter.PE_ECHO_TOP, DwdRadarParameter.PF_REFLECTIVITY, DwdRadarParameter.PX_REFLECTIVITY, - DwdRadarParameter.PL_VOLUME_SCAN, DwdRadarParameter.PR_VELOCITY, DwdRadarParameter.PX250_REFLECTIVITY, DwdRadarParameter.PZ_CAPPI, diff --git a/wetterdienst/provider/dwd/radar/sites.py b/wetterdienst/provider/dwd/radar/sites.py index 27a146759..6e14a211a 100644 --- a/wetterdienst/provider/dwd/radar/sites.py +++ b/wetterdienst/provider/dwd/radar/sites.py @@ -31,12 +31,11 @@ class DwdRadarSite(Enum): BOO = "boo" DRS = "drs" EIS = "eis" - EMD = "emd" ESS = "ess" FBG = "fbg" FLD = "fld" - ISN = "isn" HNR = "hnr" + ISN = "isn" MEM = "mem" NEU = "neu" NHB = "nhb" diff --git a/wetterdienst/settings.py b/wetterdienst/settings.py index 1d9139615..debe60976 100644 --- a/wetterdienst/settings.py +++ b/wetterdienst/settings.py @@ -1,3 +1,4 @@ +import pathlib from contextvars import ContextVar from dataclasses import dataclass @@ -15,12 +16,19 @@ class Settings: # cache cache_disable: bool = env.bool("CACHE_DISABLE", False) + # eccodes + eccodes_dir: pathlib.Path = env.path("ECCODES_DIR", None) + with env.prefixed("SCALAR_"): # scalar humanize: bool = env.bool("HUMANIZE", True) tidy: bool = env.bool("TIDY", True) si_units: bool = env.bool("SI_UNITS", True) + with env.prefixed("RADAR_"): + # radar related + read_bufr: bool = env.bool("READ_BUFR", True) + @classmethod def reset(cls): """Reset Wetterdienst Settings to start"""