diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5beccdb..39e643e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -32,7 +32,8 @@ repos: args: [--autofix, --preserve-quotes] - id: pretty-format-toml args: [--autofix] -- repo: https://github.com/gitleaks/gitleaks - rev: v8.30.0 - hooks: - - id: gitleaks + additional_dependencies: [toml-sort==0.24.2, tomlkit==0.15.1] +# - repo: https://github.com/gitleaks/gitleaks +# rev: v8.30.0 +# hooks: +# - id: gitleaks diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..6324d40 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.14 diff --git a/pyproject.toml b/pyproject.toml index abdde0a..94fe2c9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,30 +1,36 @@ [build-system] -requires = ["setuptools>=45", "setuptools_scm[toml]>=6.2"] +build-backend = "setuptools.build_meta" +requires = ["setuptools>=77", "setuptools_scm>=8"] [dependency-groups] dev = [ "mypy>=2.4.0", "pandas-stubs>=3.0.5.260914", + "pre-commit>=4.6.2", "pytest>=9.1.1" ] [project] classifiers = [ - "Development Status :: 3 - Alpha", + "Development Status :: 4 - Beta", "Intended Audience :: Science/Research", - "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Topic :: Scientific/Engineering" ] -dependencies = ["cfgrib", "ecmwf-datastores-client", "ecmwf-opendata", "polytope-client", "xarray"] +dependencies = ["attrs", "cfgrib", "ecmwf-datastores-client", "ecmwf-opendata", "numpy", "pandas", "polytope-client", "xarray"] description = "Xarray backend to access ECMWF datastores" dynamic = ["version"] -license = {file = "LICENSE"} +license = "Apache-2.0" +license-files = ["LICENSE"] name = "xarray-ecmwf" readme = "README.md" +requires-python = ">=3.11" [project.entry-points."xarray.backends"] ecmwf = "xarray_ecmwf.engine_ecmwf:ECMWFBackendEntrypoint" @@ -75,6 +81,9 @@ convention = "numpy" [tool.setuptools] packages = ["xarray_ecmwf"] +[tool.setuptools.package-data] +xarray_ecmwf = ["py.typed"] + [tool.setuptools_scm] write_to = "xarray_ecmwf/version.py" write_to_template = ''' diff --git a/uv.lock b/uv.lock index d876c70..d9ec0da 100644 --- a/uv.lock +++ b/uv.lock @@ -1,10 +1,10 @@ requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and sys_platform == 'win32'", "python_full_version >= '3.15' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and sys_platform == 'emscripten'", "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'emscripten'", "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", @@ -212,6 +212,15 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/6d/e8/16c58c57c9ce1474dd1e50090ebd78b008c70fc4f06793da65f9a0aba391/cfgrib-0.9.15.1-py3-none-any.whl", hash = "sha256:f1bee90e86917389be9f767051bf32d00f95f6f4e4312b344567511b3cfd62d2", size = 49123, upload-time = "2025-09-30T22:46:12.206Z"} ] +[[package]] +name = "cfgv" +sdist = {url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z"} +source = {registry = "https://pypi.org/simple"} +version = "3.5.0" +wheels = [ + {url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z"} +] + [[package]] name = "charset-normalizer" sdist = {url = "https://files.pythonhosted.org/packages/33/1c/f41d4e74c28ab327ff3acd36053f7ea506c55872d7a90b0fa71aa3ab0c89/charset_normalizer-3.5.2.tar.gz", hash = "sha256:39de2a259fc954455c57274dc94c79d5842774e1247a016aff30bc0efed0f4ef", size = 172659, upload-time = "2026-09-30T04:39:23.398Z"} @@ -377,6 +386,15 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z"} ] +[[package]] +name = "distlib" +sdist = {url = "https://files.pythonhosted.org/packages/c9/02/bd72be9134d25ed783ecbbc38a539ffaefbf90c78418c7fb7229600dbac7/distlib-0.4.3.tar.gz", hash = "sha256:f152097224a0ae24be5a0f6bae1b9359af82133bce63f98a95f86cae1aede9ed", size = 615141, upload-time = "2026-06-12T08:04:52.847Z"} +source = {registry = "https://pypi.org/simple"} +version = "0.4.3" +wheels = [ + {url = "https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl", hash = "sha256:4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b", size = 470628, upload-time = "2026-06-12T08:04:50.506Z"} +] + [[package]] name = "docstring-parser" sdist = {url = "https://files.pythonhosted.org/packages/e0/4d/f332313098c1de1b2d2ff91cf2674415cc7cddab2ca1b01ae29774bd5fdf/docstring_parser-0.18.0.tar.gz", hash = "sha256:292510982205c12b1248696f44959db3cdd1740237a968ea1e2e7a900eeb2015", size = 29341, upload-time = "2026-04-14T04:09:19.867Z"} @@ -433,6 +451,15 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/ab/9b/c6f8400c3ada14c8a042a4bd919ebf9d62dc25e7f882eff698200207bb74/ecmwf_opendata-0.3.34-py3-none-any.whl", hash = "sha256:2ed33e30af73ed7180da9e21552f3d28bd284376cce93286c01b1fa436a8df49", size = 24263, upload-time = "2026-07-30T12:36:55.563Z"} ] +[[package]] +name = "filelock" +sdist = {url = "https://files.pythonhosted.org/packages/53/e4/34efcb869715cf299e47d1ac7b2624d2bcb6f2d3dffc2f0abe8417f65ab2/filelock-4.0.12.tar.gz", hash = "sha256:cf42711a7ac791818b299fab0332a088c65aeeefa36290de98db92c434303b0c", size = 253880, upload-time = "2026-10-05T13:17:43.677Z"} +source = {registry = "https://pypi.org/simple"} +version = "4.0.12" +wheels = [ + {url = "https://files.pythonhosted.org/packages/da/a1/b047e1c486a2c66283633b7dbb73872ca16ca1ce6a426f70d4d037fc8e1c/filelock-4.0.12-py3-none-any.whl", hash = "sha256:5f17ee83ecee8a6f3e389c75822fb70a1c2f0506b99438a6dffa1d56793588c8", size = 111732, upload-time = "2026-10-05T13:17:42.361Z"} +] + [[package]] name = "findlibs" sdist = {url = "https://files.pythonhosted.org/packages/91/21/235e81c0e29a5aa84e5374d469723d508de63692049e80654b1b56d1c57e/findlibs-0.1.3.tar.gz", hash = "sha256:49bbe509c8b439ecd9c0d021c301aa9db643a2e6ab4e189a40b505ee4a49db62", size = 11335, upload-time = "2026-07-14T10:52:47.795Z"} @@ -442,6 +469,15 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/d1/13/63305a756cb6e9408828961d4ff8542f3625d7cfb62289b19016216a9fa2/findlibs-0.1.3-py3-none-any.whl", hash = "sha256:9c14f8506cdcd37e38369259f8cd9aa3c002d58cd7c2beff4852bd205495c555", size = 10714, upload-time = "2026-07-14T10:52:46.902Z"} ] +[[package]] +name = "identify" +sdist = {url = "https://files.pythonhosted.org/packages/53/35/d70c0006c7cee65999ea94a6273e60b2094f600a3d8b71b04318253fc643/identify-2.6.20.tar.gz", hash = "sha256:ad729860a923858d26917c2f4fb0a1d83d27a75b1e090c06440c573f048f3285", size = 99681, upload-time = "2026-09-26T20:29:07.187Z"} +source = {registry = "https://pypi.org/simple"} +version = "2.6.20" +wheels = [ + {url = "https://files.pythonhosted.org/packages/fa/70/fffc9613501877c0a10a1ef73a165e6ded3e53f6e7502227fef56d973933/identify-2.6.20-py2.py3-none-any.whl", hash = "sha256:6a16b69b93187244e0548cbfd25b3e4a6f9a7a2ad784625c3bec2b8d27b81aaa", size = 99506, upload-time = "2026-09-26T20:29:06.054Z"} +] + [[package]] name = "idna" sdist = {url = "https://files.pythonhosted.org/packages/f5/08/8eea9d4b8302028f3abb2c0813953f7aec26d33b7a8960ed760e65ff29fa/idna-3.20.tar.gz", hash = "sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44", size = 216463, upload-time = "2026-09-17T14:11:04.752Z"} @@ -687,6 +723,15 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z"} ] +[[package]] +name = "nodeenv" +sdist = {url = "https://files.pythonhosted.org/packages/9a/8e/105de02c1322cfada6d9710d9146ef8026419d433c9d08359a2d35805811/nodeenv-1.11.0.tar.gz", hash = "sha256:3ce8fe5b71d16e8af7039ca65257354100bc772965d6bc549070649e53b1b146", size = 99301, upload-time = "2026-09-26T11:29:21.367Z"} +source = {registry = "https://pypi.org/simple"} +version = "1.11.0" +wheels = [ + {url = "https://files.pythonhosted.org/packages/54/c8/12811c9b48fde162bb72b6f2e78fada9a247a09d7bb5be2050a5d099c77b/nodeenv-1.11.0-py2.py3-none-any.whl", hash = "sha256:edaa16e6c14d7cf395d75d4bbd5a26390f4dc06501a33b4e76282b02cc688a25", size = 34277, upload-time = "2026-09-26T11:29:19.933Z"} +] + [[package]] name = "numpy" resolution-markers = [ @@ -775,10 +820,10 @@ wheels = [ name = "numpy" resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", - "python_full_version == '3.14.*' and sys_platform == 'win32'", "python_full_version >= '3.15' and sys_platform == 'emscripten'", - "python_full_version == '3.14.*' and sys_platform == 'emscripten'", "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'emscripten'", "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", @@ -957,6 +1002,15 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z"} ] +[[package]] +name = "platformdirs" +sdist = {url = "https://files.pythonhosted.org/packages/42/23/4a86fc741c38c5b69792a4ef954b281afa69bea9f083f881de1b0d23bc07/platformdirs-4.12.3.tar.gz", hash = "sha256:427fc0bb321ae0c5b037fa03238ca74820437be162e78b4848c4d4055b9b766c", size = 59538, upload-time = "2026-10-03T23:40:46.595Z"} +source = {registry = "https://pypi.org/simple"} +version = "4.12.3" +wheels = [ + {url = "https://files.pythonhosted.org/packages/c5/9b/6ce1ead737fe496611bda600c263b9a11ae7bd8f41bb13f9bd7e0a2c37a4/platformdirs-4.12.3-py3-none-any.whl", hash = "sha256:080f3b39423b5abfca9a23d84c4e9795f54d395cd8459867a8ded44084fcd5f8", size = 32493, upload-time = "2026-10-03T23:40:45.104Z"} +] + [[package]] name = "pluggy" sdist = {url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z"} @@ -983,6 +1037,22 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/6e/fb/79b8f748ceb9401843057469f2ffbc39c16045910aa885dd62451e76f1f6/polytope_client-0.7.10-py3-none-any.whl", hash = "sha256:9c278b5f702b4cf89957ea7f52cf191a3ab0941eb47eecca2915928231831f34", size = 55064, upload-time = "2026-07-15T09:35:42.769Z"} ] +[[package]] +dependencies = [ + {name = "cfgv"}, + {name = "identify"}, + {name = "nodeenv"}, + {name = "pyyaml"}, + {name = "virtualenv"} +] +name = "pre-commit" +sdist = {url = "https://files.pythonhosted.org/packages/74/89/1f3e8e1fc3e97de0fa963495832f581f025f29471602a309e48808244292/pre_commit-4.6.2.tar.gz", hash = "sha256:8f5d7bfb021ecdbcd9d49d89847082dd24172ccde534390081a679ad046e2441", size = 198670, upload-time = "2026-08-10T22:07:18.421Z"} +source = {registry = "https://pypi.org/simple"} +version = "4.6.2" +wheels = [ + {url = "https://files.pythonhosted.org/packages/45/e2/bbb7129c9e7999a6b8ee9cca3b66486c25c423ab5a75f34071798b74ce94/pre_commit-4.6.2-py2.py3-none-any.whl", hash = "sha256:e2dde9a75d3bce11bd3831c26d134df00a2803c1d818be6a0383c3dcda25dc4e", size = 226202, upload-time = "2026-08-10T22:07:16.942Z"} +] + [[package]] name = "pycparser" sdist = {url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z"} @@ -1029,6 +1099,18 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z"} ] +[[package]] +dependencies = [ + {name = "filelock"} +] +name = "python-discovery" +sdist = {url = "https://files.pythonhosted.org/packages/0c/57/250bd238b966cece44328235eb85290045d059265fdaf7527a3a958123db/python_discovery-1.6.1.tar.gz", hash = "sha256:cf87d3627dfb4412437fdd5b13eae402607722998d21567993aedbc59b23c15e", size = 84338, upload-time = "2026-09-18T01:31:53.971Z"} +source = {registry = "https://pypi.org/simple"} +version = "1.6.1" +wheels = [ + {url = "https://files.pythonhosted.org/packages/16/7d/e9ffbadfbf89c93848412d04594135c4ae8c1d37d9e053b9c3ed718fabc4/python_discovery-1.6.1-py3-none-any.whl", hash = "sha256:d43fcdef879fe795352bd13ccf8d185ba5a9f86f36cfcd00529f596e737442b3", size = 38664, upload-time = "2026-09-18T01:31:52.448Z"} +] + [[package]] name = "pytz" sdist = {url = "https://files.pythonhosted.org/packages/14/21/d83d6ef28c4c912c4bb4d1dcf591f7b8c6bde87b9c66f9f454677314e16d/pytz-2026.5.tar.gz", hash = "sha256:fa23724b9c486543b9ff54a327ee7569ac83ade54bb9afd0fc18676620401c86", size = 318572, upload-time = "2026-10-04T02:37:58.719Z"} @@ -1305,6 +1387,22 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/92/9d/c4e665119135114480843e7ab388fa94d8480650450e6f8e26b70d323a4c/urllib3-2.8.0-py3-none-any.whl", hash = "sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3", size = 135717, upload-time = "2026-09-15T19:29:34.577Z"} ] +[[package]] +dependencies = [ + {name = "distlib"}, + {name = "filelock"}, + {name = "packaging"}, + {name = "platformdirs"}, + {name = "python-discovery"} +] +name = "virtualenv" +sdist = {url = "https://files.pythonhosted.org/packages/c4/f9/f323b3b6058cff3853b31cf6a49c0425ed797bf9611572ec10d065e08bac/virtualenv-21.14.5.tar.gz", hash = "sha256:c4cb6c13e46b57225a999c7e22a09b163393878facc7ac4c059a57f46faa1647", size = 5467127, upload-time = "2026-10-02T17:42:25.613Z"} +source = {registry = "https://pypi.org/simple"} +version = "21.14.5" +wheels = [ + {url = "https://files.pythonhosted.org/packages/df/93/084f10ebbecdedf7902ed68fbecc903f0e9c5742155bfffb05eccbc071da/virtualenv-21.14.5-py3-none-any.whl", hash = "sha256:b0651e0174982bba17cc6f0aaa2ef496730cb85a3f35eb5d1119d1c904f7d1da", size = 5487482, upload-time = "2026-10-02T17:42:23.38Z"} +] + [[package]] dependencies = [ {name = "numpy", version = "2.4.6", source = {registry = "https://pypi.org/simple"}, marker = "python_full_version < '3.12'"}, @@ -1322,9 +1420,13 @@ wheels = [ [[package]] dependencies = [ + {name = "attrs"}, {name = "cfgrib"}, {name = "ecmwf-datastores-client"}, {name = "ecmwf-opendata"}, + {name = "numpy", version = "2.4.6", source = {registry = "https://pypi.org/simple"}, marker = "python_full_version < '3.12'"}, + {name = "numpy", version = "2.5.3", source = {registry = "https://pypi.org/simple"}, marker = "python_full_version >= '3.12'"}, + {name = "pandas"}, {name = "polytope-client"}, {name = "xarray"} ] @@ -1335,14 +1437,18 @@ source = {editable = "."} dev = [ {name = "mypy"}, {name = "pandas-stubs"}, + {name = "pre-commit"}, {name = "pytest"} ] [package.metadata] requires-dist = [ + {name = "attrs"}, {name = "cfgrib"}, {name = "ecmwf-datastores-client"}, {name = "ecmwf-opendata"}, + {name = "numpy"}, + {name = "pandas"}, {name = "polytope-client"}, {name = "xarray"} ] @@ -1351,5 +1457,6 @@ requires-dist = [ dev = [ {name = "mypy", specifier = ">=2.4.0"}, {name = "pandas-stubs", specifier = ">=3.0.5.260914"}, + {name = "pre-commit", specifier = ">=4.6.2"}, {name = "pytest", specifier = ">=9.1.1"} ] diff --git a/xarray_ecmwf/py.typed b/xarray_ecmwf/py.typed new file mode 100644 index 0000000..e69de29