From 633d63529153acc8a44300dca4e748b9838e3c95 Mon Sep 17 00:00:00 2001 From: Maarten Pronk <8655030+evetion@users.noreply.github.com> Date: Tue, 14 Nov 2023 16:13:57 +0100 Subject: [PATCH] Overhaul of Python architecture (#731) Fixes #512 Groundwork for #630 & #252 The code has become much simpler in some places (e.g. write_toml). ```python from ribasim import Model m = Model(filepath="generated_testmodels/basic/ribasim.toml") m.database.node.df # Node table m.basin.static.df # BasinStatc table m.write("test") ``` ### Some notes: - The config.py file cannot be autogenerated anymore. The schemas still can, but I disabled it for now to be sure (some imports error). ### Changes: I created new (parent) classes: - BaseModel, from Pydantic, with our own config - FileModel, like hydrolib-core (but now Pydantic v2), which can take a single filepath for initilization. Models who inherit require defining _load and _save, dealing with that filepath. - NodeModel, a class for nodes (where `add` will be). - TableModel, a class to read/write individual tables from/to gpkg/arrow. - SpatialTableModel, inherits TableModel, but reads/writes spatial stuff. I changed: - the Model class to be a carbon copy of Config (which has been deleted), so it mirrors the toml. - in turn this created a `database` NodeModel class (reflecting the field in the toml), with only Node and Edge underneath. - the NodeModel classes Basin from their node_type version to the one in Config, and set the type of the underlying table with a TypeVar like so: ```python class Terminal(NodeModel): static: TableModel[TerminalStaticSchema] ``` ### Yet to do: - [x] Update tests - [x] Fix sort! rules - [x] Delete node_types folder - [x] Link schemas to their Pydantic class (TableModel[TerminalStaticSchema] => TerminalStatic) --------- Co-authored-by: Martijn Visser Co-authored-by: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> Co-authored-by: Hofer-Julian --- docs/contribute/addnode.qmd | 4 +- docs/python/examples.ipynb | 46 +- pixi.lock | 3568 +++++++++-------- pixi.toml | 6 +- python/ribasim/pyproject.toml | 2 +- python/ribasim/ribasim/__init__.py | 44 +- python/ribasim/ribasim/config.py | 287 +- python/ribasim/ribasim/geometry/edge.py | 79 +- python/ribasim/ribasim/geometry/node.py | 107 +- python/ribasim/ribasim/input_base.py | 395 +- python/ribasim/ribasim/model.py | 436 +- python/ribasim/ribasim/node_types/__init__.py | 29 - python/ribasim/ribasim/node_types/basin.py | 44 - .../ribasim/node_types/discrete_control.py | 25 - .../ribasim/node_types/flow_boundary.py | 33 - .../ribasim/node_types/fractional_flow.py | 19 - .../ribasim/node_types/level_boundary.py | 31 - .../ribasim/node_types/linear_resistance.py | 20 - .../ribasim/node_types/manning_resistance.py | 20 - python/ribasim/ribasim/node_types/outlet.py | 23 - .../ribasim/ribasim/node_types/pid_control.py | 34 - python/ribasim/ribasim/node_types/pump.py | 23 - .../node_types/tabulated_rating_curve.py | 37 - python/ribasim/ribasim/node_types/terminal.py | 19 - python/ribasim/ribasim/node_types/user.py | 53 - python/ribasim/ribasim/schemas.py | 6 +- python/ribasim/ribasim/utils.py | 6 +- python/ribasim/tests/test_edge.py | 5 +- python/ribasim/tests/test_io.py | 33 +- python/ribasim/tests/test_model.py | 33 +- python/ribasim/tests/test_utils.py | 2 +- .../ribasim_testmodels/allocation.py | 35 +- .../ribasim_testmodels/backwater.py | 7 +- .../ribasim_testmodels/basic.py | 31 +- .../ribasim_testmodels/bucket.py | 7 +- .../ribasim_testmodels/discrete_control.py | 35 +- .../ribasim_testmodels/dutch_waterways.py | 9 +- .../ribasim_testmodels/equations.py | 35 +- .../ribasim_testmodels/invalid.py | 31 +- .../ribasim_testmodels/pid_control.py | 14 +- .../ribasim_testmodels/time.py | 7 +- .../ribasim_testmodels/trivial.py | 10 +- qgis/resources.py | 2 - utils/generate-testmodels.py | 1 + 44 files changed, 2742 insertions(+), 2951 deletions(-) delete mode 100644 python/ribasim/ribasim/node_types/__init__.py delete mode 100644 python/ribasim/ribasim/node_types/basin.py delete mode 100644 python/ribasim/ribasim/node_types/discrete_control.py delete mode 100644 python/ribasim/ribasim/node_types/flow_boundary.py delete mode 100644 python/ribasim/ribasim/node_types/fractional_flow.py delete mode 100644 python/ribasim/ribasim/node_types/level_boundary.py delete mode 100644 python/ribasim/ribasim/node_types/linear_resistance.py delete mode 100644 python/ribasim/ribasim/node_types/manning_resistance.py delete mode 100644 python/ribasim/ribasim/node_types/outlet.py delete mode 100644 python/ribasim/ribasim/node_types/pid_control.py delete mode 100644 python/ribasim/ribasim/node_types/pump.py delete mode 100644 python/ribasim/ribasim/node_types/tabulated_rating_curve.py delete mode 100644 python/ribasim/ribasim/node_types/terminal.py delete mode 100644 python/ribasim/ribasim/node_types/user.py diff --git a/docs/contribute/addnode.qmd b/docs/contribute/addnode.qmd index 1a9005b37..4c5d8fbbb 100644 --- a/docs/contribute/addnode.qmd +++ b/docs/contribute/addnode.qmd @@ -115,6 +115,7 @@ from typing import Optional import pandera as pa from pandera.engines.pandas_engine import PydanticModel from pandera.typing import DataFrame +from pydantic import ConfigDict from ribasim import models from ribasim.input_base import TableModel @@ -145,8 +146,7 @@ class NewNodeType(TableModel): static: Optional[DataFrame[StaticSchema]] = None # possible other schemas - class Config: - validate_assignment = True + model_config = ConfigDict(validate_assignment=True) def sort(self): self.static.sort_values("node_id", ignore_index=True, inplace=True) diff --git a/docs/python/examples.ipynb b/docs/python/examples.ipynb index ce50ffd93..ca37302cd 100644 --- a/docs/python/examples.ipynb +++ b/docs/python/examples.ipynb @@ -319,7 +319,7 @@ ")\n", "node_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])\n", "\n", - "node_id, node_type = ribasim.Node.get_node_ids_and_types(\n", + "node_id, node_type = ribasim.Node.node_ids_and_types(\n", " basin,\n", " manning_resistance,\n", " rating_curve,\n", @@ -333,7 +333,7 @@ "\n", "# Make sure the feature id starts at 1: explicitly give an index.\n", "node = ribasim.Node(\n", - " static=gpd.GeoDataFrame(\n", + " df=gpd.GeoDataFrame(\n", " data={\"type\": node_type},\n", " index=pd.Index(node_id, name=\"fid\"),\n", " geometry=node_xy,\n", @@ -363,7 +363,7 @@ ")\n", "lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\n", "edge = ribasim.Edge(\n", - " static=gpd.GeoDataFrame(\n", + " df=gpd.GeoDataFrame(\n", " data={\n", " \"from_node_id\": from_id,\n", " \"to_node_id\": to_id,\n", @@ -390,8 +390,10 @@ "outputs": [], "source": [ "model = ribasim.Model(\n", - " node=node,\n", - " edge=edge,\n", + " database=ribasim.Database(\n", + " node=node,\n", + " edge=edge,\n", + " ),\n", " basin=basin,\n", " level_boundary=level_boundary,\n", " flow_boundary=flow_boundary,\n", @@ -520,7 +522,7 @@ " .to_xarray()\n", ")\n", "\n", - "basin_ids = model.basin.static[\"node_id\"].to_numpy()\n", + "basin_ids = model.basin.static.df[\"node_id\"].to_numpy()\n", "basin_nodes = xr.DataArray(\n", " np.ones(len(basin_ids)), coords={\"node_id\": basin_ids}, dims=[\"node_id\"]\n", ")\n", @@ -548,8 +550,8 @@ "metadata": {}, "outputs": [], "source": [ - "model.basin.time = forcing\n", - "model.basin.state = state" + "model.basin.time.df = forcing\n", + "model.basin.state.df = state" ] }, { @@ -675,7 +677,7 @@ "\n", "# Make sure the feature id starts at 1: explicitly give an index.\n", "node = ribasim.Node(\n", - " static=gpd.GeoDataFrame(\n", + " df=gpd.GeoDataFrame(\n", " data={\"type\": node_type},\n", " index=pd.Index(np.arange(len(xy)) + 1, name=\"fid\"),\n", " geometry=node_xy,\n", @@ -705,7 +707,7 @@ "\n", "lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\n", "edge = ribasim.Edge(\n", - " static=gpd.GeoDataFrame(\n", + " df=gpd.GeoDataFrame(\n", " data={\"from_node_id\": from_id, \"to_node_id\": to_id, \"edge_type\": edge_type},\n", " geometry=lines,\n", " crs=\"EPSG:28992\",\n", @@ -903,8 +905,10 @@ "outputs": [], "source": [ "model = ribasim.Model(\n", - " node=node,\n", - " edge=edge,\n", + " database=ribasim.Database(\n", + " node=node,\n", + " edge=edge,\n", + " ),\n", " basin=basin,\n", " pump=pump,\n", " level_boundary=level_boundary,\n", @@ -994,7 +998,7 @@ "\n", "ax = df_basin_wide[\"level\"].plot()\n", "\n", - "greater_than = model.discrete_control.condition.greater_than\n", + "greater_than = model.discrete_control.condition.df.greater_than\n", "\n", "ax.hlines(\n", " greater_than,\n", @@ -1103,7 +1107,7 @@ "\n", "# Make sure the feature id starts at 1: explicitly give an index.\n", "node = ribasim.Node(\n", - " static=gpd.GeoDataFrame(\n", + " df=gpd.GeoDataFrame(\n", " data={\"type\": node_type},\n", " index=pd.Index(np.arange(len(xy)) + 1, name=\"fid\"),\n", " geometry=node_xy,\n", @@ -1130,7 +1134,7 @@ "\n", "lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\n", "edge = ribasim.Edge(\n", - " static=gpd.GeoDataFrame(\n", + " df=gpd.GeoDataFrame(\n", " data={\n", " \"from_node_id\": from_id,\n", " \"to_node_id\": to_id,\n", @@ -1325,8 +1329,10 @@ "outputs": [], "source": [ "model = ribasim.Model(\n", - " node=node,\n", - " edge=edge,\n", + " database=ribasim.Database(\n", + " node=node,\n", + " edge=edge,\n", + " ),\n", " basin=basin,\n", " flow_boundary=flow_boundary,\n", " level_boundary=level_boundary,\n", @@ -1415,8 +1421,8 @@ "ax.set_ylabel(\"level [m]\")\n", "\n", "# Plot target level\n", - "target_levels = model.pid_control.time.target.to_numpy()[::2]\n", - "times = date2num(model.pid_control.time.time)[::2]\n", + "target_levels = model.pid_control.time.df.target.to_numpy()[::2]\n", + "times = date2num(model.pid_control.time.df.time)[::2]\n", "ax.plot(times, target_levels, color=\"k\", ls=\":\", label=\"target level\")\n", "pass" ] @@ -1445,7 +1451,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.11.6" } }, "nbformat": 4, diff --git a/pixi.lock b/pixi.lock index f706f65ad..e3c86e693 100644 --- a/pixi.lock +++ b/pixi.lock @@ -76,6 +76,90 @@ package: license_family: GPL size: 554938 timestamp: 1693607226431 +- platform: linux-64 + name: annotated-types + version: 0.6.0 + category: main + manager: conda + dependencies: + - python >=3.7 + - typing-extensions >=4.0.0 + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.6.0-pyhd8ed1ab_0.conda + hash: + md5: 997c29372bdbe2afee073dff71f35923 + sha256: 3a2c98154d95cfd54daba6b7d507d31f5ba07ac2ad955c44eb041b66563193cd + build: pyhd8ed1ab_0 + arch: x86_64 + subdir: linux-64 + build_number: 0 + license: MIT + license_family: MIT + noarch: python + size: 17026 + timestamp: 1696634393637 +- platform: osx-64 + name: annotated-types + version: 0.6.0 + category: main + manager: conda + dependencies: + - python >=3.7 + - typing-extensions >=4.0.0 + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.6.0-pyhd8ed1ab_0.conda + hash: + md5: 997c29372bdbe2afee073dff71f35923 + sha256: 3a2c98154d95cfd54daba6b7d507d31f5ba07ac2ad955c44eb041b66563193cd + build: pyhd8ed1ab_0 + arch: x86_64 + subdir: osx-64 + build_number: 0 + license: MIT + license_family: MIT + noarch: python + size: 17026 + timestamp: 1696634393637 +- platform: osx-arm64 + name: annotated-types + version: 0.6.0 + category: main + manager: conda + dependencies: + - python >=3.7 + - typing-extensions >=4.0.0 + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.6.0-pyhd8ed1ab_0.conda + hash: + md5: 997c29372bdbe2afee073dff71f35923 + sha256: 3a2c98154d95cfd54daba6b7d507d31f5ba07ac2ad955c44eb041b66563193cd + build: pyhd8ed1ab_0 + arch: aarch64 + subdir: osx-arm64 + build_number: 0 + license: MIT + license_family: MIT + noarch: python + size: 17026 + timestamp: 1696634393637 +- platform: win-64 + name: annotated-types + version: 0.6.0 + category: main + manager: conda + dependencies: + - python >=3.7 + - typing-extensions >=4.0.0 + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.6.0-pyhd8ed1ab_0.conda + hash: + md5: 997c29372bdbe2afee073dff71f35923 + sha256: 3a2c98154d95cfd54daba6b7d507d31f5ba07ac2ad955c44eb041b66563193cd + build: pyhd8ed1ab_0 + arch: x86_64 + subdir: win-64 + build_number: 0 + license: MIT + license_family: MIT + noarch: python + size: 17026 + timestamp: 1696634393637 - platform: linux-64 name: anyio version: 4.0.0 @@ -400,20 +484,20 @@ package: dependencies: - cffi >=1.0.1 - libgcc-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py312h98912ed_4.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py311h459d7ec_4.conda hash: - md5: 00536e0a1734dcde9815fe227f32fc5a - sha256: 8ddb4a586bc128f1b9484f82c5cb0226340527fbfe093adf3b76b7e755e11477 - build: py312h98912ed_4 + md5: de5b16869a430949b02161b04b844a30 + sha256: 104194af519b4e667aa5341068b94b521a791aaaa05ec0091f8f0bdba43a60ac + build: py311h459d7ec_4 arch: x86_64 subdir: linux-64 build_number: 4 license: MIT license_family: MIT - size: 35142 - timestamp: 1695386704886 + size: 34955 + timestamp: 1695386703660 - platform: osx-64 name: argon2-cffi-bindings version: 21.2.0 @@ -421,20 +505,20 @@ package: manager: conda dependencies: - cffi >=1.0.1 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/argon2-cffi-bindings-21.2.0-py312h104f124_4.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/argon2-cffi-bindings-21.2.0-py311h2725bcf_4.conda hash: - md5: dddfb6125aed1fb84eb13319007c08fd - sha256: aa321e91f0ff365b5261fa1dcffa2d32aa957561bdbb38988e52e28e25a762a8 - build: py312h104f124_4 + md5: e2aba0ad0f533ee73f9d4330d2e32549 + sha256: be27659496bcb660fc9c3f5f74128a7bb090336897e9c7cfbcc55ae66f13b8d8 + build: py311h2725bcf_4 arch: x86_64 subdir: osx-64 build_number: 4 license: MIT license_family: MIT - size: 32556 - timestamp: 1695387174872 + size: 32542 + timestamp: 1695386887016 - platform: osx-arm64 name: argon2-cffi-bindings version: 21.2.0 @@ -442,21 +526,21 @@ package: manager: conda dependencies: - cffi >=1.0.1 - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-21.2.0-py312h02f2b3b_4.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-21.2.0-py311heffc1b2_4.conda hash: - md5: 015edbb6fae68ab35881f55f149d4725 - sha256: 1cfcf4b2d36a3b183a5cb1c69f85768166e50af6ced5ae381c440666a6da12c6 - build: py312h02f2b3b_4 + md5: e9a56c22ca1215ed3a7b6a9e8c4e6f07 + sha256: b9ab23e4f0d615432949d4b93723bd04b3c4aef725aa03b1e993903265c1b975 + build: py311heffc1b2_4 arch: aarch64 subdir: osx-arm64 build_number: 4 license: MIT license_family: MIT - size: 33607 - timestamp: 1695387216062 + size: 34126 + timestamp: 1695386994453 - platform: win-64 name: argon2-cffi-bindings version: 21.2.0 @@ -464,23 +548,23 @@ package: manager: conda dependencies: - cffi >=1.0.1 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-21.2.0-py312he70551f_4.conda + url: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-21.2.0-py311ha68e1ae_4.conda hash: - md5: 69b7a1d899d46b91f8eecab9abf9728c - sha256: 4c3c428b994400ca753d9d0adbb11ce2d2a87f4dacd86c91d6cf985c5d89a3e1 - build: py312he70551f_4 + md5: e95c947541bf1cb821ea4a6bf7d5794c + sha256: 0b8eb99e7ac6b409abbb5f3b9733f883865ff4314e85146380f072f6f6234929 + build: py311ha68e1ae_4 arch: x86_64 subdir: win-64 build_number: 4 license: MIT license_family: MIT - size: 34750 - timestamp: 1695387347676 + size: 34687 + timestamp: 1695387285415 - platform: linux-64 name: arrow version: 1.3.0 @@ -2443,20 +2527,20 @@ package: - packaging >=22.0 - pathspec >=0.9 - platformdirs >=2 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/black-23.10.1-py312h7900ff3_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/black-23.10.1-py311h38be061_0.conda hash: - md5: 8cd2baa0b2fd3d1257d4201143c8cbfb - sha256: 03fe0472e42d20480374f73f871cc098b4600cb60c6cb81b0931e43ea49d0664 - build: py312h7900ff3_0 + md5: 17874858641cb402ad73b9adb0e11a27 + sha256: f2114740c055ca5d250e363eec69d0181c2ae5b6ead7597762cf766eaa40fe1d + build: py311h38be061_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 354998 - timestamp: 1698342900815 + size: 359696 + timestamp: 1698342847430 - platform: osx-64 name: black version: 23.10.1 @@ -2468,20 +2552,20 @@ package: - packaging >=22.0 - pathspec >=0.9 - platformdirs >=2 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/black-23.10.1-py312hb401068_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/black-23.10.1-py311h6eed73b_0.conda hash: - md5: ba9e12d82bd9d0643c854dfb5ed2641b - sha256: 62a8c5890d0337ce34ec2126b267a6697d300600be8fd497402c877a165e42b4 - build: py312hb401068_0 + md5: c802bfc16625b15e57e4d2d05bee622a + sha256: e6c81cc86c288f2d15852dc0068caa5acae3700eff57eeeeb5742844b1048b2b + build: py311h6eed73b_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 355843 - timestamp: 1698343050915 + size: 360890 + timestamp: 1698342991427 - platform: osx-arm64 name: black version: 23.10.1 @@ -2493,21 +2577,21 @@ package: - packaging >=22.0 - pathspec >=0.9 - platformdirs >=2 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/black-23.10.1-py312h81bd7bf_0.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/black-23.10.1-py311h267d04e_0.conda hash: - md5: f8d5916124223db87a88e18b24ad7c96 - sha256: e0903af26367f3b8af9a14607029ccf50d4f6f7bd958a922f0ec7115d2950c1b - build: py312h81bd7bf_0 + md5: 12b064976b0152cb193120c645f6c3a0 + sha256: ec50f430559024cc7c8ef8733457bab49a6c88ef1ae857b4f7f2b44fe32b388e + build: py311h267d04e_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 357193 - timestamp: 1698343108277 + size: 361600 + timestamp: 1698343111708 - platform: win-64 name: black version: 23.10.1 @@ -2519,20 +2603,20 @@ package: - packaging >=22.0 - pathspec >=0.9 - platformdirs >=2 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/win-64/black-23.10.1-py312h2e8e312_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/win-64/black-23.10.1-py311h1ea47a8_0.conda hash: - md5: 75b975d3da95b635c8e99f0c165ac37f - sha256: 168347b4bc34ae43414be424fc15fcdc858bd322fd9a848dc2fa1a525cb925ab - build: py312h2e8e312_0 + md5: 2ffbba0bb141e3d4e0ba3a0344fd82a4 + sha256: a87085a9d9bdfc5a6f7841a218105c9b162ab7a17c34fa3b49bdbb1339c669b4 + build: py311h1ea47a8_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 370899 - timestamp: 1698343688120 + size: 377595 + timestamp: 1698343648045 - platform: linux-64 name: bleach version: 6.1.0 @@ -3084,13 +3168,13 @@ package: dependencies: - libgcc-ng >=12 - libstdcxx-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda hash: - md5: 45801a89533d3336a365284d93298e36 - sha256: b68706698b6ac0d31196a8bcb061f0d1f35264bcd967ea45e03e108149a74c6f - build: py312h30efb56_1 + md5: cce9e7c3f1c307f2a5fb08a2922d6164 + sha256: 559093679e9fdb6061b7b80ca0f9a31fe6ffc213f1dae65bc5c82e2cd1a94107 + build: py311hb755f60_1 arch: x86_64 subdir: linux-64 build_number: 1 @@ -3098,8 +3182,8 @@ package: - libbrotlicommon 1.1.0 hd590300_1 license: MIT license_family: MIT - size: 350604 - timestamp: 1695990206327 + size: 351340 + timestamp: 1695990160360 - platform: osx-64 name: brotli-python version: 1.1.0 @@ -3107,13 +3191,13 @@ package: manager: conda dependencies: - libcxx >=15.0.7 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312heafc425_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py311hdf8f085_1.conda hash: - md5: a288b88f06b8bfe0dedaf5c4b6ac6b7a - sha256: fc55988f9bc05a938ea4b8c20d6545bed6e9c6c10aa5147695f981136ca894c1 - build: py312heafc425_1 + md5: 546fdccabb90492fbaf2da4ffb78f352 + sha256: 0f5e0a7de58006f349220365e32db521a1fe494c37ee455e5ecf05b8fe567dcc + build: py311hdf8f085_1 arch: x86_64 subdir: osx-64 build_number: 1 @@ -3121,8 +3205,8 @@ package: - libbrotlicommon 1.1.0 h0dc2134_1 license: MIT license_family: MIT - size: 366883 - timestamp: 1695990710194 + size: 366864 + timestamp: 1695990449997 - platform: osx-arm64 name: brotli-python version: 1.1.0 @@ -3130,14 +3214,14 @@ package: manager: conda dependencies: - libcxx >=15.0.7 - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312h9f69965_1.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311ha891d26_1.conda hash: - md5: 1bc01b9ffdf42beb1a9fe4e9222e0567 - sha256: 3418b1738243abba99e931c017b952771eeaa1f353c07f7d45b55e83bb74fcb3 - build: py312h9f69965_1 + md5: 5e802b015e33447d1283d599d21f052b + sha256: 2d78c79ccf2c17236c52ef217a4c34b762eb7908a6903d94439f787aac1c8f4b + build: py311ha891d26_1 arch: aarch64 subdir: osx-arm64 build_number: 1 @@ -3145,24 +3229,24 @@ package: - libbrotlicommon 1.1.0 hb547adb_1 license: MIT license_family: MIT - size: 343435 - timestamp: 1695990731924 + size: 343332 + timestamp: 1695991223439 - platform: win-64 name: brotli-python version: 1.1.0 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py312h53d5487_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h12c1d0e_1.conda hash: - md5: d01a6667b99f0e8ad4097af66c938e62 - sha256: 769e276ecdebf86f097786cbde1ebd11e018cd6cd838800995954fe6360e0797 - build: py312h53d5487_1 + md5: 42fbf4e947c17ea605e6a4d7f526669a + sha256: 5390e1e5e8e159d4893ecbfd2c08ca75ef51bdce1a4a44ff4ee9e2d596004aac + build: py311h12c1d0e_1 arch: x86_64 subdir: win-64 build_number: 1 @@ -3170,8 +3254,8 @@ package: - libbrotlicommon 1.1.0 hcfcfb64_1 license: MIT license_family: MIT - size: 322514 - timestamp: 1695991054894 + size: 322086 + timestamp: 1695990976742 - platform: linux-64 name: build version: 0.7.0 @@ -3852,20 +3936,20 @@ package: - libffi >=3.4,<4.0a0 - libgcc-ng >=12 - pycparser - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda hash: - md5: 56b0ca764ce23cc54f3f7e2a7b970f6d - sha256: 5a36e2c254603c367d26378fa3a205bd92263e30acf195f488749562b4c44251 - build: py312hf06ca03_0 + md5: b3469563ac5e808b0cd92810d0697043 + sha256: b71c94528ca0c35133da4b7ef69b51a0b55eeee570376057f3d2ad60c3ab1444 + build: py311hb3a22ac_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 294523 - timestamp: 1696001868949 + size: 300207 + timestamp: 1696001873452 - platform: osx-64 name: cffi version: 1.16.0 @@ -3874,20 +3958,20 @@ package: dependencies: - libffi >=3.4,<4.0a0 - pycparser - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.16.0-py312h38bf5a0_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.16.0-py311hc0b63fd_0.conda hash: - md5: a45759c013ab20b9017ef9539d234dd7 - sha256: 8b856583b56fc30f064a7cb286f85e4b5725f2bd4fda8ba0c4e94bffe258741e - build: py312h38bf5a0_0 + md5: 15d07b82223cac96af629e5e747ba27a + sha256: 1f13a5fa7f310fdbd27f5eddceb9e62cfb10012c58a58c923dd6f51fa979748a + build: py311hc0b63fd_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 282370 - timestamp: 1696002004433 + size: 289932 + timestamp: 1696002096156 - platform: osx-arm64 name: cffi version: 1.16.0 @@ -3896,21 +3980,21 @@ package: dependencies: - libffi >=3.4,<4.0a0 - pycparser - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.16.0-py312h8e38eb3_0.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.16.0-py311h4a08483_0.conda hash: - md5: 960ecbd65860d3b1de5e30373e1bffb1 - sha256: 1544403cb1a5ca2aeabf0dac86d9ce6066d6fb4363493643b33ffd1b78038d18 - build: py312h8e38eb3_0 + md5: cbdde0484a47b40e6ce2a4e5aaeb48d7 + sha256: 9430416328fe2a28e206e703de771817064c8613a79a6a21fe7107f6a783104c + build: py311h4a08483_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 284245 - timestamp: 1696002181644 + size: 292511 + timestamp: 1696002194472 - platform: win-64 name: cffi version: 1.16.0 @@ -3918,23 +4002,23 @@ package: manager: conda dependencies: - pycparser - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/cffi-1.16.0-py312he70551f_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/cffi-1.16.0-py311ha68e1ae_0.conda hash: - md5: 5a51096925d52332c62bfd8904899055 - sha256: dd39e594f5c6bca52dfed343de2af9326a99700ce2ba3404bd89706926fc0137 - build: py312he70551f_0 + md5: d109d6e767c4890ea32880b8bfa4a3b6 + sha256: eb7463fe3785dd9ac0b3b1e5fea3b721d20eb082e194cab0af8d9ff28c28934f + build: py311ha68e1ae_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 287805 - timestamp: 1696002408940 + size: 297043 + timestamp: 1696002186279 - platform: linux-64 name: cfgv version: 3.3.1 @@ -4111,81 +4195,81 @@ package: category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_1.conda hash: - md5: af3980cc4690716a5510c8a08cb06238 - sha256: 584804790b465c8e28b3c3fcea8e774cb659fe479afd8adc0d39406e8c220194 - build: py312h7900ff3_1 + md5: b8cfb13de4dbe349a41800644391de6a + sha256: 80b547150fc6d125fe034bcc3e820222faa0136463b32b82d7cbe965cc5dec77 + build: py311h38be061_1 arch: x86_64 subdir: linux-64 build_number: 1 license: LGPL-2.1-only license_family: GPL - size: 260197 - timestamp: 1695468803539 + size: 264886 + timestamp: 1695468797136 - platform: osx-64 name: chardet version: 5.2.0 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/chardet-5.2.0-py312hb401068_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/chardet-5.2.0-py311h6eed73b_1.conda hash: - md5: 488080e6ee9bc087762669d1f6d2dc8a - sha256: ba2ebeb6d05a3cdd94dbd7a52dabc0686192e4337774c4f7c32da7ef0e04dd10 - build: py312hb401068_1 + md5: dd58f7f16513cea1fea710651e4df728 + sha256: 5826e13627594bafa2f0b4074d9233b0de74227835d249641f216423b3dc8dfc + build: py311h6eed73b_1 arch: x86_64 subdir: osx-64 build_number: 1 license: LGPL-2.1-only license_family: GPL - size: 259854 - timestamp: 1695468947554 + size: 267330 + timestamp: 1695468986364 - platform: osx-arm64 name: chardet version: 5.2.0 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/chardet-5.2.0-py312h81bd7bf_1.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/chardet-5.2.0-py311h267d04e_1.conda hash: - md5: ea728c39b7453cb5f7177bc44ee22c73 - sha256: 2451501ec933017ff77c18436884baa90b289420c43ad4bdb4fe60d55e5dcdfd - build: py312h81bd7bf_1 + md5: 2aa7eb0b906818f900e2075fc244976f + sha256: 69541a0c834baa0b404cb55f8389bb53f8e9d6962055d68285635d6fbc04334c + build: py311h267d04e_1 arch: aarch64 subdir: osx-arm64 build_number: 1 license: LGPL-2.1-only license_family: GPL - size: 263585 - timestamp: 1695469015195 + size: 269754 + timestamp: 1695469210623 - platform: win-64 name: chardet version: 5.2.0 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/win-64/chardet-5.2.0-py312h2e8e312_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/win-64/chardet-5.2.0-py311h1ea47a8_1.conda hash: - md5: fcc4fea02fa461bc3ad2a5d6de0c43a8 - sha256: 105e8f3c7a4510d8b8e3f164970c898e2b7ea02417b99369c7f58a0bb95af34d - build: py312h2e8e312_1 + md5: 5c7813415d332343dfe550685954d1b5 + sha256: 1972d150055784f8b10a0277f75176aed3164483cb529b027bff45ae4f32925f + build: py311h1ea47a8_1 arch: x86_64 subdir: win-64 build_number: 1 license: LGPL-2.1-only license_family: GPL - size: 277773 - timestamp: 1695468989681 + size: 284249 + timestamp: 1695469001100 - platform: linux-64 name: charset-normalizer version: 3.3.2 @@ -4527,20 +4611,20 @@ package: dependencies: - cffi >=1.0.0 - libgcc-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-0.8.0-py312h98912ed_3.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-0.8.0-py311h459d7ec_3.conda hash: - md5: 0c9c09134b2fb151c2bd8181b2c56080 - sha256: 1a9e60b18664c22f872435a1d2b1d727e37ea4159736b116afff364b9577dc02 - build: py312h98912ed_3 + md5: 5090d5a3ab2580cabb17a3ae965e257f + sha256: 01316757b817f21ec8c901ecdd1cf60141a80ea5bfddf352846ba85f4c7a3e9d + build: py311h459d7ec_3 arch: x86_64 subdir: linux-64 build_number: 3 license: MIT license_family: MIT - size: 135963 - timestamp: 1695669875921 + size: 136524 + timestamp: 1695669889658 - platform: osx-64 name: cmarkgfm version: 0.8.0 @@ -4548,20 +4632,20 @@ package: manager: conda dependencies: - cffi >=1.0.0 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/cmarkgfm-0.8.0-py312h104f124_3.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/cmarkgfm-0.8.0-py311h2725bcf_3.conda hash: - md5: 75b0ed827a414319d0c6fa63b92341b6 - sha256: d478a91584a96c5fcb372cde110cb37605b0821b2b8ec6e519d419b4851e9e4e - build: py312h104f124_3 + md5: 3a4ef0858a3fae7e61ae9cdf72adefd1 + sha256: a8036546261cc57f5383f9fcacaedd3c8aed76ca03c05fa5955fcd0a0707ff45 + build: py311h2725bcf_3 arch: x86_64 subdir: osx-64 build_number: 3 license: MIT license_family: MIT - size: 112756 - timestamp: 1695670021195 + size: 113116 + timestamp: 1695670250339 - platform: osx-arm64 name: cmarkgfm version: 0.8.0 @@ -4569,21 +4653,21 @@ package: manager: conda dependencies: - cffi >=1.0.0 - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-0.8.0-py312h02f2b3b_3.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/cmarkgfm-0.8.0-py311heffc1b2_3.conda hash: - md5: ffedee35be7a5015d09e2660a66b89c9 - sha256: 2e95c3797cd2796f32de8408626d63cb1283f2b7b0826021d2e26cc58d9231a0 - build: py312h02f2b3b_3 + md5: 5cb88950ae060fe9220ed27c2d06987d + sha256: d27c4d0cf73cd86551a403fa8363f61bdd270418a348aebbd51f5ca26be0661e + build: py311heffc1b2_3 arch: aarch64 subdir: osx-arm64 build_number: 3 license: MIT license_family: MIT - size: 113474 - timestamp: 1695670347968 + size: 114180 + timestamp: 1695670152127 - platform: win-64 name: cmarkgfm version: 0.8.0 @@ -4591,23 +4675,23 @@ package: manager: conda dependencies: - cffi >=1.0.0 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/cmarkgfm-0.8.0-py312he70551f_3.conda + url: https://conda.anaconda.org/conda-forge/win-64/cmarkgfm-0.8.0-py311ha68e1ae_3.conda hash: - md5: c02f42cc7c74c6dcac910f3aec3d3e6b - sha256: 9f5bdfbd843e58bfc727ae5a8b07079c2700d5579f0eef1e8c85aa4fa0ac5fa3 - build: py312he70551f_3 + md5: 489e7c645da48b8c19f8232d70b45ec8 + sha256: 8fe56f677ec4b47043170d2437ce020c204c88a56895c58490e89277af93a2ca + build: py311ha68e1ae_3 arch: x86_64 subdir: win-64 build_number: 3 license: MIT license_family: MIT - size: 119774 - timestamp: 1695670282391 + size: 120405 + timestamp: 1695670523318 - platform: linux-64 name: colorama version: 0.4.6 @@ -4781,20 +4865,20 @@ package: - libgcc-ng >=12 - libstdcxx-ng >=12 - numpy >=1.20,<2 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py312h8572e83_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda hash: - md5: b6249daaaf4577e6f72d95fc4ab767c6 - sha256: 80fa469e2f027eb8ae95965d796ffa5457a5a1f7063e99d6aa54b19a21227b4e - build: py312h8572e83_0 + md5: 40828c5b36ef52433e21f89943e09f33 + sha256: 2c76e2a970b74eef92ef9460aa705dbdc506dd59b7382bfbedce39d9c189d7f4 + build: py311h9547e67_0 arch: x86_64 subdir: linux-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 253156 - timestamp: 1699041681603 + size: 255843 + timestamp: 1699041590533 - platform: osx-64 name: contourpy version: 1.2.0 @@ -4804,20 +4888,20 @@ package: - __osx >=10.9 - libcxx >=16.0.6 - numpy >=1.20,<2 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.0-py312hbf0bb39_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.0-py311h7bea37d_0.conda hash: - md5: 74190e06053cda7139a0cb71f3e618fd - sha256: eddf6ba417fb23a3b44313528d561bb0ef9008af2644b888a1b8b028a2ef5e2e - build: py312hbf0bb39_0 + md5: 6711c052d956af4973a16749236a0387 + sha256: 40bca4a644e0c0b0e6d58cef849ba02d4f218af715f7a5787d41845797f3b8a9 + build: py311h7bea37d_0 arch: x86_64 subdir: osx-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 246660 - timestamp: 1699041735604 + size: 248078 + timestamp: 1699042040747 - platform: osx-arm64 name: contourpy version: 1.2.0 @@ -4827,21 +4911,21 @@ package: - __osx >=10.9 - libcxx >=16.0.6 - numpy >=1.20,<2 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.0-py312h76e736e_0.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.0-py311hd03642b_0.conda hash: - md5: 1dadb551925202b61d137da997f99e08 - sha256: 9651380de808917b67ca6d93d1ffa9db5ef0889c6e0ed87379ef0696517b47e3 - build: py312h76e736e_0 + md5: c0fa0bea0af7ecdea23bf983655fa2d0 + sha256: 3ec341c3a33bbb7f60e9a96214e0e08c4ba9e4a553b18104194e7843abbb4ef4 + build: py311hd03642b_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 237646 - timestamp: 1699041880921 + size: 240223 + timestamp: 1699041881051 - platform: win-64 name: contourpy version: 1.2.0 @@ -4849,23 +4933,23 @@ package: manager: conda dependencies: - numpy >=1.20,<2 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.0-py312h0d7def4_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.0-py311h005e61a_0.conda hash: - md5: 2f4496ef2b9e7a5ab9c866df31931028 - sha256: 75a9369a76ab7af83bc17583f8fd5f2db2b33a1d937e3802aac4229c19956822 - build: py312h0d7def4_0 + md5: 6e36537c6d0c16d2ee8ba8c3dd847662 + sha256: d043a1cc9157ee25319fa85271cba38fc4c51caf4d38354176659d95629d04ab + build: py311h005e61a_0 arch: x86_64 subdir: win-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 205030 - timestamp: 1699042174459 + size: 206078 + timestamp: 1699042419820 - platform: linux-64 name: coverage version: 7.3.2 @@ -4873,88 +4957,88 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tomli - url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.3.2-py312h98912ed_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.3.2-py311h459d7ec_0.conda hash: - md5: b248b512221477e79e600c3b9368c7d0 - sha256: 08c8f270851ce244e6e416d15022463076e94bdaf25002e85bc87e2a7ae7b00c - build: py312h98912ed_0 + md5: 7b3145fed7adc7c63a0e08f6f29f5480 + sha256: 8b56edd4336e7fc6ff9b73436a3a270cf835f57cf4d0565c6e240c40f1981085 + build: py311h459d7ec_0 arch: x86_64 subdir: linux-64 build_number: 0 license: Apache-2.0 license_family: APACHE - size: 346876 - timestamp: 1696281826215 + size: 355132 + timestamp: 1696281925482 - platform: osx-64 name: coverage version: 7.3.2 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tomli - url: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.3.2-py312h104f124_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.3.2-py311h2725bcf_0.conda hash: - md5: 1e98139a6dc6e29569dff47a1895a40c - sha256: 14adc346b2c1437543669ddf2bd163f2595fbac63a02bb689136c92e43896759 - build: py312h104f124_0 + md5: 0ce651c68a0322a6eacef726025b938a + sha256: ada34f95907fe0cd98d4d12e439bd1508363738f8b0fbe88d14cb398f4235af6 + build: py311h2725bcf_0 arch: x86_64 subdir: osx-64 build_number: 0 license: Apache-2.0 license_family: APACHE - size: 345557 - timestamp: 1696282123278 + size: 352862 + timestamp: 1696282084699 - platform: osx-arm64 name: coverage version: 7.3.2 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 - tomli - url: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.3.2-py312h02f2b3b_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.3.2-py311heffc1b2_0.conda hash: - md5: e24bb86144df711266255703328ce03d - sha256: 44c9e3bd2f2e137bc9a7fb6a5b34b21dfe89b4f17edec21944d0b95cbfbe9bc5 - build: py312h02f2b3b_0 + md5: 75928ad6625a73ff93f08be98014248c + sha256: 88d116c4c51a106c43937b950d3fd14007800fb7b3945573a5a117533c450e6b + build: py311heffc1b2_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: Apache-2.0 license_family: APACHE - size: 345467 - timestamp: 1696282123227 + size: 353390 + timestamp: 1696282185517 - platform: win-64 name: coverage version: 7.3.2 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tomli - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/coverage-7.3.2-py312he70551f_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/coverage-7.3.2-py311ha68e1ae_0.conda hash: - md5: 216219cb1e405a04ab52e27efa8eb94b - sha256: 190b65fa88ceee5838f3dc13a670f94e40b1d232e375a524ccafd22c1dd775d9 - build: py312he70551f_0 + md5: 6d0d75c92bdf393a2dd818b7fe6615a0 + sha256: 1025c5a4da262a05563b7067101dd2fa9ef36b6f9c31e6c1df05db800375e18d + build: py311ha68e1ae_0 arch: x86_64 subdir: win-64 build_number: 0 license: Apache-2.0 license_family: APACHE - size: 362433 - timestamp: 1696282251916 + size: 372107 + timestamp: 1696282186892 - platform: linux-64 name: cryptography version: 41.0.5 @@ -4964,20 +5048,20 @@ package: - cffi >=1.12 - libgcc-ng >=12 - openssl >=3.1.4,<4.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.5-py312h241aef2_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.5-py311h63ff55d_0.conda hash: - md5: 123356abefc00c74a9f241382a37930c - sha256: c0567f165aeb95dfc9462394ddc266d5c62cb676c6a3db47c603d34b24a4843f - build: py312h241aef2_0 + md5: 22584e5c97ed8f1a6b63a0ff43dba827 + sha256: 236ed2218fb857fecaa11fc7fee23574f683b3d03576f8f26f628b7fd2ced5fa + build: py311h63ff55d_0 arch: x86_64 subdir: linux-64 build_number: 0 license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT license_family: BSD - size: 2038475 - timestamp: 1698192317014 + size: 2036192 + timestamp: 1698192294727 - platform: linux-64 name: cycler version: 0.12.1 @@ -5265,20 +5349,20 @@ package: dependencies: - libgcc-ng >=12 - libstdcxx-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.0-py312h30efb56_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.0-py311hb755f60_1.conda hash: - md5: 9a737622d319c22a3393d0cd5bec171e - sha256: 8169ebedbd0a1f769446eed6ed165da9aa643f2acc408f452a3121c57f889851 - build: py312h30efb56_1 + md5: 2c241533b8eafe8028442d46ef41eb13 + sha256: f18492ebfaea54bbbeaec0ae207851f711ff589f60f2cc9b8a689f88b2442171 + build: py311hb755f60_1 arch: x86_64 subdir: linux-64 build_number: 1 license: MIT license_family: MIT - size: 2709821 - timestamp: 1695534492281 + size: 3001696 + timestamp: 1695534493087 - platform: osx-64 name: debugpy version: 1.8.0 @@ -5286,20 +5370,20 @@ package: manager: conda dependencies: - libcxx >=15.0.7 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.0-py312heafc425_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.0-py311hdf8f085_1.conda hash: - md5: 695ceaf17c0c51890a759299081e0167 - sha256: 1f03a0cd7a2408169b0659e2427f4a953608a7c21ff4432ff033a71ecc6baaeb - build: py312heafc425_1 + md5: 7f20ef8a63be62d1bcdaa8136ec09647 + sha256: 93e94c9077b13f3dde47794bb6ca02f9c3174c794edf889158306a54764a075c + build: py311hdf8f085_1 arch: x86_64 subdir: osx-64 build_number: 1 license: MIT license_family: MIT - size: 2752757 - timestamp: 1695535219749 + size: 2939392 + timestamp: 1695534639423 - platform: osx-arm64 name: debugpy version: 1.8.0 @@ -5307,44 +5391,44 @@ package: manager: conda dependencies: - libcxx >=15.0.7 - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.0-py312h9f69965_1.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.0-py311ha891d26_1.conda hash: - md5: 86aa5172acd2140b7a5134397938dd5a - sha256: d626f7e616ad7082e828fd4991a919d1f26925b5586fbd28baece8a3aa95ae52 - build: py312h9f69965_1 + md5: 575b875f1e7901213e9a0f44db9deccc + sha256: a7c3b4abf2d3d5256be7e891e76c86dd52e3893e9495d468e3c95e82932b9d7b + build: py311ha891d26_1 arch: aarch64 subdir: osx-arm64 build_number: 1 license: MIT license_family: MIT - size: 2764216 - timestamp: 1695534715799 + size: 2957693 + timestamp: 1695534717336 - platform: win-64 name: debugpy version: 1.8.0 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.0-py312h53d5487_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.0-py311h12c1d0e_1.conda hash: - md5: d2b4266ebf19123f42420a91ba29f041 - sha256: d57b150a127f575b8b48cf828c319eb3216c8fc6a15d39da41fab05564c70a9f - build: py312h53d5487_1 + md5: 8f521f35a7544cbf058b24e11561d53a + sha256: df14ab3bfa7864fedda2d45b16057792ad29dd607f0ff9a86b3e9cfbd0c41332 + build: py311h12c1d0e_1 arch: x86_64 subdir: win-64 build_number: 1 license: MIT license_family: MIT - size: 3747099 - timestamp: 1695534777959 + size: 3870801 + timestamp: 1695534773660 - platform: linux-64 name: decorator version: 5.1.1 @@ -5707,77 +5791,77 @@ package: category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_2.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_2.conda hash: - md5: 5e9bf8f7126528bea5c31f42ceebc06c - sha256: bade342768729e2e1f014d62f7c6c17db012ffe718e341274ce9f232d34383d4 - build: py312h7900ff3_2 + md5: 33f8066e53679dd4be2355fec849bf01 + sha256: 4e90bbc89f9ab192cb247d8b8ebe54c33e57652f8a057f9f176d9d9dd32993b9 + build: py311h38be061_2 arch: x86_64 subdir: linux-64 build_number: 2 license: LicenseRef-Public-Domain-Dedictation AND BSD-3-Clause AND BSD-2-Clause AND LicenseRef-PSF-2.1.1 - size: 897287 - timestamp: 1695300608494 + size: 915810 + timestamp: 1695300614781 - platform: osx-64 name: docutils version: 0.20.1 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/docutils-0.20.1-py312hb401068_2.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/docutils-0.20.1-py311h6eed73b_2.conda hash: - md5: 826e4b9430ddbcd481388ce0b5a997ee - sha256: 3f4bc9e3bf1f71e375cb5942150625650b6fa70406cd3caf64f4198d809459c3 - build: py312hb401068_2 + md5: d56b49f1a2c908d05d1ca6b3f85d0fd5 + sha256: 869e919066b308794e399bc551fc508c175da5f9324b7a324eb259cef8adabf2 + build: py311h6eed73b_2 arch: x86_64 subdir: osx-64 build_number: 2 license: LicenseRef-Public-Domain-Dedictation AND BSD-3-Clause AND BSD-2-Clause AND LicenseRef-PSF-2.1.1 - size: 901742 - timestamp: 1695300800891 + size: 921558 + timestamp: 1695300850498 - platform: osx-arm64 name: docutils version: 0.20.1 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/docutils-0.20.1-py312h81bd7bf_2.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/docutils-0.20.1-py311h267d04e_2.conda hash: - md5: 1aaf14b460547f6d09329ecaa5043b59 - sha256: 53bf9b9ddaa3c5523e9fe30cd456996fcac54524e36b1b75b74f24db02a36626 - build: py312h81bd7bf_2 + md5: e82ee6e9db96d5f7ddf289399744240d + sha256: 3bc810b946ef8f87681ea4bee2610e8c418f9f61772f5d1ff3ffa803ae7cfbb6 + build: py311h267d04e_2 arch: aarch64 subdir: osx-arm64 build_number: 2 license: LicenseRef-Public-Domain-Dedictation AND BSD-3-Clause AND BSD-2-Clause AND LicenseRef-PSF-2.1.1 - size: 902817 - timestamp: 1695300988923 + size: 921098 + timestamp: 1695300974246 - platform: win-64 name: docutils version: 0.20.1 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/win-64/docutils-0.20.1-py312h2e8e312_2.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/win-64/docutils-0.20.1-py311h1ea47a8_2.conda hash: - md5: f8e0b1c2a2f0d3bfe45a6e7674576632 - sha256: 7a802cd0a2535a021e6653b2bc16f0c046cc1adfdd3f40d4ceb0e8511cd6e69e - build: py312h2e8e312_2 + md5: 6b90695c3fc8616b09e3fabc77f816df + sha256: 56c6737d61281897eee17947361704eed48b1cddaf2a9df4e0e10757852622c6 + build: py311h1ea47a8_2 arch: x86_64 subdir: win-64 build_number: 2 license: LicenseRef-Public-Domain-Dedictation AND BSD-3-Clause AND BSD-2-Clause AND LicenseRef-PSF-2.1.1 - size: 950891 - timestamp: 1695300854692 + size: 972760 + timestamp: 1695301035902 - platform: linux-64 name: entrypoints version: '0.4' @@ -6323,24 +6407,24 @@ package: - libgdal >=3.7.2,<3.8.0a0 - libstdcxx-ng >=12 - munch - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - setuptools - shapely - six >=1.7 - url: https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.5-py312hc770a3a_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.5-py311hbac4ec9_0.conda hash: - md5: 95fe9ec01c226595e96885a7fb59f694 - sha256: a5cdbeb5ab0f255e1985d0e3fb9131fbd389c09feb7537cff86196079cc035cc - build: py312hc770a3a_0 + md5: 786d3808394b1bdfd3f41f2e2c67279e + sha256: 529600df1964a94c7745b87e31f432ddc03c7b5fd652c193c594c995e1964c6b + build: py311hbac4ec9_0 arch: x86_64 subdir: linux-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 976572 - timestamp: 1697078632323 + size: 988348 + timestamp: 1697078517209 - platform: osx-64 name: fiona version: 1.9.5 @@ -6357,24 +6441,24 @@ package: - libcxx >=16.0.6 - libgdal >=3.7.2,<3.8.0a0 - munch - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - setuptools - shapely - six >=1.7 - url: https://conda.anaconda.org/conda-forge/osx-64/fiona-1.9.5-py312h8683509_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/fiona-1.9.5-py311hf14a637_0.conda hash: - md5: 92d5ac0a5db5712cc2d4011a6ffa221e - sha256: d0b11dbbe52a6257d87b0d98eb3a320e564f95900fe3c6615aec9dfa36d77217 - build: py312h8683509_0 + md5: b0a818c3ad6768567ea7e72ca7a777f7 + sha256: ce1888df0112ab2405e6f30f04a208fab379a9598e7b7c89289fb3bbc5b4950c + build: py311hf14a637_0 arch: x86_64 subdir: osx-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 857190 - timestamp: 1697078764202 + size: 871895 + timestamp: 1697078935194 - platform: osx-arm64 name: fiona version: 1.9.5 @@ -6391,25 +6475,25 @@ package: - libcxx >=16.0.6 - libgdal >=3.7.2,<3.8.0a0 - munch - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 - setuptools - shapely - six >=1.7 - url: https://conda.anaconda.org/conda-forge/osx-arm64/fiona-1.9.5-py312h0aea21f_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/fiona-1.9.5-py311h45231e3_0.conda hash: - md5: 52cb2f8cf1cf1204a49f49343537053f - sha256: e3aaa6f6efb7d765f851586a168022d50298b01748bf61400843d014ffc4d859 - build: py312h0aea21f_0 + md5: 50d570663d8aca587902d0f3642f17ac + sha256: 008993778253638c048f61ed90fded9f3090dd2fbeb5b9c48f5a6a8ac382e4cf + build: py311h45231e3_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 850710 - timestamp: 1697078992674 + size: 873617 + timestamp: 1697078901418 - platform: win-64 name: fiona version: 1.9.5 @@ -6424,27 +6508,27 @@ package: - importlib-metadata - libgdal >=3.7.2,<3.8.0a0 - munch - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - setuptools - shapely - six >=1.7 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/fiona-1.9.5-py312he9aeaab_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/fiona-1.9.5-py311h4e4dc46_0.conda hash: - md5: 022a306700c15f1e4b950b2ded4239e3 - sha256: c2d21dbb64c0f1cb28a216792646e724093318e6ca6b5992b8e65e5beba16050 - build: py312he9aeaab_0 + md5: aaed872a9994c6c92cc9c5ffacbf6dc0 + sha256: ef190c4e1db9ecdcff2af1dbfa86ae445a26e5fc2c55e377b80232db4d8b2730 + build: py311h4e4dc46_0 arch: x86_64 subdir: win-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 816028 - timestamp: 1697079297524 + size: 837890 + timestamp: 1697079199653 - platform: linux-64 name: folium version: 0.15.0 @@ -7116,20 +7200,20 @@ package: - brotli - libgcc-ng >=12 - munkres - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.44.0-py312h98912ed_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.44.0-py311h459d7ec_0.conda hash: - md5: 285a46f34e2b5b357e5999b1e699714f - sha256: 121a315901b8a37ba46d8729b4268e172f920964a8e5de7daa89ae8d5218696f - build: py312h98912ed_0 + md5: f12f4d7361178f94df1052d6b63fd868 + sha256: d1a0023bc0a35b9e3f9be10b6fe5f305a0e14fe4e956d688304413f4234ae286 + build: py311h459d7ec_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 2678140 - timestamp: 1699023712164 + size: 2750270 + timestamp: 1699023759636 - platform: osx-64 name: fonttools version: 4.44.0 @@ -7138,20 +7222,20 @@ package: dependencies: - brotli - munkres - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.44.0-py312h41838bb_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.44.0-py311he705e18_0.conda hash: - md5: 1e62e0d32f5e39d36d328f28738905e9 - sha256: 091ea39260d44f0435ae5d54996fc80c019001a22acc1ca70e3aef3cceb63242 - build: py312h41838bb_0 + md5: 548f6770647b112d218577be7c10f644 + sha256: 30a7405f8689032835c34efae453af26ae5fb8750a90fe4eb907686bc2468902 + build: py311he705e18_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 2596829 - timestamp: 1699024045442 + size: 2652986 + timestamp: 1699023878757 - platform: osx-arm64 name: fonttools version: 4.44.0 @@ -7160,21 +7244,21 @@ package: dependencies: - brotli - munkres - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.44.0-py312he37b823_0.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.44.0-py311h05b510d_0.conda hash: - md5: de39ff465966dcb19782684d2231a945 - sha256: 0f213fcb2b237b0a5c1ea4a9e4c4f0013f6150e26356a98300087ffd034eea51 - build: py312he37b823_0 + md5: b39a3eefda8e93bbdf5be812e17bf521 + sha256: eefa9107f6b33d65b951aec2f3022da94c146656d55e66fbdceb6e36f2a9cde4 + build: py311h05b510d_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 2615904 - timestamp: 1699024213648 + size: 2673474 + timestamp: 1699024060218 - platform: win-64 name: fonttools version: 4.44.0 @@ -7183,23 +7267,23 @@ package: dependencies: - brotli - munkres - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.44.0-py312he70551f_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.44.0-py311ha68e1ae_0.conda hash: - md5: 0541c8350f1c1374c1c5a30adcc4a147 - sha256: 2cbbf5c046accc93ef5c05e10f0e7aae20f1f346150e0498475ed048c406070c - build: py312he70551f_0 + md5: 38ee0d81d9573521c9ce09c70a3f92fd + sha256: 477acc5cf0cd3503b457d893998aea30d59d8a46ee92015987ed0bb7ffe984af + build: py311ha68e1ae_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 2292522 - timestamp: 1699024326888 + size: 2341510 + timestamp: 1699024310629 - platform: linux-64 name: fqdn version: 1.5.1 @@ -7463,22 +7547,22 @@ package: - libgdal 3.7.3 h6f3d308_2 - libstdcxx-ng >=12 - libxml2 >=2.11.5,<2.12.0a0 - - numpy >=1.26.0,<2.0a0 + - numpy >=1.23.5,<2.0a0 - openssl >=3.1.4,<4.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.3-py312ha5e4baf_2.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.3-py311h815a124_2.conda hash: - md5: a6dc2692f3c1a1902dba33801a5a6492 - sha256: d58a467c820eaf08b9b842f3113b27dc652ae0574b02b5e4b2535e4b18213469 - build: py312ha5e4baf_2 + md5: 4811114768487ae6118e8068d0247ecb + sha256: 86a29ae673bb2fa82f28bca77f9c9be47f284728c7584bdf3a189e124c82c897 + build: py311h815a124_2 arch: x86_64 subdir: linux-64 build_number: 2 license: MIT license_family: MIT - size: 1608649 - timestamp: 1699112655186 + size: 1625735 + timestamp: 1699112276489 - platform: osx-64 name: gdal version: 3.7.3 @@ -7490,22 +7574,22 @@ package: - libcxx >=16.0.6 - libgdal 3.7.3 h926149b_2 - libxml2 >=2.11.5,<2.12.0a0 - - numpy >=1.26.0,<2.0a0 + - numpy >=1.23.5,<2.0a0 - openssl >=3.1.4,<4.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/gdal-3.7.3-py312hffe8f62_2.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/gdal-3.7.3-py311h5646c56_2.conda hash: - md5: b87becfad0953df5a17e3071f78432ef - sha256: 7b6a16bf1456db4d54bd258beaa9ee8d8145794ef00e744a1f92e9deb738aeb9 - build: py312hffe8f62_2 + md5: 6742cacdaf346b849be88a87aac67f73 + sha256: 24d2d2567afc3be05a1fca9a8a55a6f4a24680fd1af77c4dd448794847d75deb + build: py311h5646c56_2 arch: x86_64 subdir: osx-64 build_number: 2 license: MIT license_family: MIT - size: 1614997 - timestamp: 1699113690727 + size: 1634663 + timestamp: 1699113889566 - platform: osx-arm64 name: gdal version: 3.7.3 @@ -7517,23 +7601,23 @@ package: - libcxx >=16.0.6 - libgdal 3.7.3 h116f65a_2 - libxml2 >=2.11.5,<2.12.0a0 - - numpy >=1.26.0,<2.0a0 + - numpy >=1.23.5,<2.0a0 - openssl >=3.1.4,<4.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/gdal-3.7.3-py312hb8631af_2.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/gdal-3.7.3-py311h32a4f3d_2.conda hash: - md5: 160018cb378637012fc238edc77dd75b - sha256: a38781d38d0cf1be56dc16c2bbb9797a5b9847a9ee41bc39428ed96ea9143099 - build: py312hb8631af_2 + md5: 2524c7bddcc1cdae315c698423bb351e + sha256: fcd41f2b33cd7f8cb574428106b5afe9355dcf09b72a9bf9b27e2094ac6509c8 + build: py311h32a4f3d_2 arch: aarch64 subdir: osx-arm64 build_number: 2 license: MIT license_family: MIT - size: 1605262 - timestamp: 1699114195935 + size: 1617737 + timestamp: 1699113964198 - platform: win-64 name: gdal version: 3.7.3 @@ -7543,25 +7627,25 @@ package: - hdf5 >=1.14.2,<1.14.3.0a0 - libgdal 3.7.3 h3217549_2 - libxml2 >=2.11.5,<2.12.0a0 - - numpy >=1.26.0,<2.0a0 + - numpy >=1.23.5,<2.0a0 - openssl >=3.1.4,<4.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/gdal-3.7.3-py312hb5f3cee_2.conda + url: https://conda.anaconda.org/conda-forge/win-64/gdal-3.7.3-py311h9601e46_2.conda hash: - md5: 44b247ad5dd78526118d2f11499e513d - sha256: 9531ce5a201934310c4e5631c59ed0ee890efb6cbea0ef68bbfc05882bd65507 - build: py312hb5f3cee_2 + md5: e3954e8ada1c877c31b6d281868a36da + sha256: 32d30ac0771ec7af08a348acf8a51cb56b6f627c0c96fb92abb26df69f91f717 + build: py311h9601e46_2 arch: x86_64 subdir: win-64 build_number: 2 license: MIT license_family: MIT - size: 1583192 - timestamp: 1699114017195 + size: 1598898 + timestamp: 1699114244458 - platform: linux-64 name: genson version: 1.2.2 @@ -10479,81 +10563,81 @@ package: category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-2.4-py312h7900ff3_3.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-2.4-py311h38be061_3.conda hash: - md5: 50f62bdb9b60b13c2f6ae69957342e4d - sha256: c211a79cff8aa001a6e14e923c37278231dca7f0970d8db155c4b9e48ac87a5a - build: py312h7900ff3_3 + md5: 41d52d822edf991bf0e6b08c1921a8ec + sha256: 976f7bf3c3a49c3066f36b67c12ae06b31542e53b843bb4362f31c9e449c6c46 + build: py311h38be061_3 arch: x86_64 subdir: linux-64 build_number: 3 license: BSD-3-Clause license_family: BSD - size: 18033 - timestamp: 1695397448370 + size: 18389 + timestamp: 1695397377176 - platform: osx-64 name: jsonpointer version: '2.4' category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-2.4-py312hb401068_3.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/jsonpointer-2.4-py311h6eed73b_3.conda hash: - md5: 637aa8f6c1c61f659f1496e9b2dc7552 - sha256: 883f6d635e58f49359f393e853e4e0043731fb0ce671283a2024db02a1ebc8f6 - build: py312hb401068_3 + md5: ed1c23d0e55abd27d8b9e31c58105140 + sha256: b0ba738e1dbf3b69558557cd1e63310364e045b8c8e7f73fdce7e71928b5f22a + build: py311h6eed73b_3 arch: x86_64 subdir: osx-64 build_number: 3 license: BSD-3-Clause license_family: BSD - size: 18184 - timestamp: 1695397820416 + size: 18557 + timestamp: 1695397765266 - platform: osx-arm64 name: jsonpointer version: '2.4' category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-2.4-py312h81bd7bf_3.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/jsonpointer-2.4-py311h267d04e_3.conda hash: - md5: 327361b24f5348cab04ad9b1f74e831d - sha256: 6cb2d17da9083e05f5ead7902a5cd6ec9567cd3da972c65c03f090515c9fa176 - build: py312h81bd7bf_3 + md5: b6008a5b9180e58a235f5e45432dfe2e + sha256: 807d6c44f3e34139bfd25db4409381a6ce37fad2902c58f10fa7e1c30a64333d + build: py311h267d04e_3 arch: aarch64 subdir: osx-arm64 build_number: 3 license: BSD-3-Clause license_family: BSD - size: 18542 - timestamp: 1695397720755 + size: 18841 + timestamp: 1695397944650 - platform: win-64 name: jsonpointer version: '2.4' category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-2.4-py312h2e8e312_3.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/win-64/jsonpointer-2.4-py311h1ea47a8_3.conda hash: - md5: 9d9572e257bf4559f20629efb0d3511d - sha256: 98d86d5ccb3a95da2cd96b394c157aa6fef0d4908b8878c3e2b5931f6bc5fd57 - build: py312h2e8e312_3 + md5: db8fc59f9215e668e602f769d0bf67bb + sha256: 13042586b08e8caa60615e7c42d05601f9421e8bda5df932e3ef9d2401bf2435 + build: py311h1ea47a8_3 arch: x86_64 subdir: win-64 build_number: 3 license: BSD-3-Clause license_family: BSD - size: 34602 - timestamp: 1695397923441 + size: 34654 + timestamp: 1695397742357 - platform: linux-64 name: jsonschema version: 4.17.3 @@ -10973,21 +11057,21 @@ package: manager: conda dependencies: - platformdirs >=2.5 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - traitlets >=5.3 - url: https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.5.0-py312h7900ff3_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.5.0-py311h38be061_0.conda hash: - md5: b0db32b94447bb0300deff1a74406653 - sha256: 3c93fc1b2de9a184f073e87806ad9b1a12f55f028171570190299cde9a021eb0 - build: py312h7900ff3_0 + md5: cee83be29258275f75029125e186ab6d + sha256: 60bfaec278b3ea4462abd8321b47412864c54bd63575e2698da81c5755e617c1 + build: py311h38be061_0 arch: x86_64 subdir: linux-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 91916 - timestamp: 1698673784826 + size: 93811 + timestamp: 1698673782880 - platform: osx-64 name: jupyter_core version: 5.5.0 @@ -10995,21 +11079,21 @@ package: manager: conda dependencies: - platformdirs >=2.5 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - traitlets >=5.3 - url: https://conda.anaconda.org/conda-forge/osx-64/jupyter_core-5.5.0-py312hb401068_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/jupyter_core-5.5.0-py311h6eed73b_0.conda hash: - md5: 5b0e6b098a2237f805bbd15c082bd327 - sha256: 2e3c41898cb0ce9f2edae0d622f53e76bbe9329712f68547b9337fa649890e75 - build: py312hb401068_0 + md5: d7ee59df3fd2eec8dd60c1fcfa29a73d + sha256: d570b1554e3fd90085db1eb23ba61d595f1e588865b603ab193c73a2db50b64d + build: py311h6eed73b_0 arch: x86_64 subdir: osx-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 92013 - timestamp: 1698674097105 + size: 94066 + timestamp: 1698675917939 - platform: osx-arm64 name: jupyter_core version: 5.5.0 @@ -11017,22 +11101,22 @@ package: manager: conda dependencies: - platformdirs >=2.5 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 - traitlets >=5.3 - url: https://conda.anaconda.org/conda-forge/osx-arm64/jupyter_core-5.5.0-py312h81bd7bf_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/jupyter_core-5.5.0-py311h267d04e_0.conda hash: - md5: 1bc6be6e906d8046c50809770aaefb6e - sha256: b87b64b4a6851f56736b2574f1264669a3d8c9b105b0be32d2b46f15c2247110 - build: py312h81bd7bf_0 + md5: e8e88dea6f85c4efad941afd8c972376 + sha256: 447426241b1d8dc1a468ecd4501469f39e2f6967a9c8698edbe20615ba8735ad + build: py311h267d04e_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 92369 - timestamp: 1698674061824 + size: 93517 + timestamp: 1698674151360 - platform: win-64 name: jupyter_core version: 5.5.0 @@ -11040,22 +11124,22 @@ package: manager: conda dependencies: - platformdirs >=2.5 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - pywin32 >=300 - traitlets >=5.3 - url: https://conda.anaconda.org/conda-forge/win-64/jupyter_core-5.5.0-py312h2e8e312_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/jupyter_core-5.5.0-py311h1ea47a8_0.conda hash: - md5: 7efc892ee9ec1db65f2480cc79bb01ee - sha256: 7b3de5dd7484ddc4316c6cbd67521f257e5fceb8df3b079222b8616714de3a47 - build: py312h2e8e312_0 + md5: 8204454e085013b1b6908f04c63eaa36 + sha256: 2cddd12760fa4a14eb5f448e7e3f961b835b8c7ef4bc47e89a9fdd03f4ffac04 + build: py311h1ea47a8_0 arch: x86_64 subdir: win-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 108300 - timestamp: 1698674327608 + size: 110149 + timestamp: 1698674340148 - platform: linux-64 name: jupyter_events version: 0.6.3 @@ -11817,88 +11901,92 @@ package: category: main manager: conda dependencies: + - importlib_metadata >=4.11.4 - jaraco.classes - jeepney >=0.4.2 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - secretstorage >=3.2 - url: https://conda.anaconda.org/conda-forge/linux-64/keyring-24.2.0-py312h7900ff3_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/keyring-24.2.0-py311h38be061_1.conda hash: - md5: 5901a81eb641bfba071eaaa02bcc2c3c - sha256: 295f97b1f85ed8c912452177f2fa0021197f9e193c8e221bdb1b90359c939fd5 - build: py312h7900ff3_1 + md5: 656d1107cb4934fd950eea244affd3c5 + sha256: 495b04b64d897361b4336e6954ef66a2287191344c573d37c4217738b75bbc44 + build: py311h38be061_1 arch: x86_64 subdir: linux-64 build_number: 1 license: MIT license_family: MIT - size: 75994 - timestamp: 1696001657727 + size: 77805 + timestamp: 1696001739370 - platform: osx-64 name: keyring version: 24.2.0 category: main manager: conda dependencies: + - importlib_metadata >=4.11.4 - jaraco.classes - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/keyring-24.2.0-py312hb401068_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/keyring-24.2.0-py311h6eed73b_1.conda hash: - md5: 2fb87c768752d4b0d5260b70e41c63fa - sha256: 70a244ed8b733e6f0592948d9576642d50f6e77e998a2de40a4f5510457bbb1f - build: py312hb401068_1 + md5: dc0383887b837540194b65204521b8b3 + sha256: dedbbb7d109ad054eb80419aaa9aae6f86d39c892bc278aa04a3980c3bddbbea + build: py311h6eed73b_1 arch: x86_64 subdir: osx-64 build_number: 1 license: MIT license_family: MIT - size: 76183 - timestamp: 1696001887488 + size: 78006 + timestamp: 1696001763015 - platform: osx-arm64 name: keyring version: 24.2.0 category: main manager: conda dependencies: + - importlib_metadata >=4.11.4 - jaraco.classes - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/keyring-24.2.0-py312h81bd7bf_1.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/keyring-24.2.0-py311h267d04e_1.conda hash: - md5: 7c9bfe21f83c74479f383da1fea24353 - sha256: ef2e26fb7194d7ffccb6ca5e98111ea09b7805cc6471b0a214dc19da8cdc5716 - build: py312h81bd7bf_1 + md5: cf1ad9e696467ea813f92994a7d1ccd4 + sha256: a5b5a9a00d041f72fe52d51b39c640ecad831eda6b1f876909f9b3d3cebcd229 + build: py311h267d04e_1 arch: aarch64 subdir: osx-arm64 build_number: 1 license: MIT license_family: MIT - size: 76248 - timestamp: 1696001986857 + size: 78562 + timestamp: 1696001946737 - platform: win-64 name: keyring version: 24.2.0 category: main manager: conda dependencies: + - importlib_metadata >=4.11.4 - jaraco.classes - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - pywin32-ctypes >=0.2.0 - url: https://conda.anaconda.org/conda-forge/win-64/keyring-24.2.0-py312h2e8e312_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/keyring-24.2.0-py311h1ea47a8_1.conda hash: - md5: 163792b60799da39316da9131714eaee - sha256: 633ee7ef0be1fe7880037d976cf58bc55179c72c1751c8ffe6923f074a5a77c7 - build: py312h2e8e312_1 + md5: d48701e08cf146d16560cbcf52e27d4d + sha256: ee5ebe93d9a141f19b3001c44d4007e6cdd52cfb8003d0c53c9ce17ee9121290 + build: py311h1ea47a8_1 arch: x86_64 subdir: win-64 build_number: 1 license: MIT license_family: MIT - size: 92566 - timestamp: 1696000990525 + size: 93917 + timestamp: 1696002026395 - platform: linux-64 name: keyutils version: 1.6.1 @@ -11925,20 +12013,20 @@ package: dependencies: - libgcc-ng >=12 - libstdcxx-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py312h8572e83_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda hash: - md5: c1e71f2bc05d8e8e033aefac2c490d05 - sha256: 2ffd3f6726392591c6794ab130f6701f5ffba0ec8658ef40db5a95ec8d583143 - build: py312h8572e83_1 + md5: 2c65bdf442b0d37aad080c8a4e0d452f + sha256: 723b0894d2d2b05a38f9c5a285d5a0a5baa27235ceab6531dbf262ba7c6955c1 + build: py311h9547e67_1 arch: x86_64 subdir: linux-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 72099 - timestamp: 1695380122482 + size: 73273 + timestamp: 1695380140676 - platform: osx-64 name: kiwisolver version: 1.4.5 @@ -11946,20 +12034,20 @@ package: manager: conda dependencies: - libcxx >=15.0.7 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.5-py312h49ebfd2_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.5-py311h5fe6e05_1.conda hash: - md5: 21f174a5cfb5964069c374171a979157 - sha256: 11d9daa79051a7ae52881d11f48816366fd3d46018281431abe507da7b45f69c - build: py312h49ebfd2_1 + md5: 24305b23f7995de72bbd53b7c01242a2 + sha256: 586a4d0a17e6cfd9f8fdee56106d263ee40ca156832774d6e899f82ad68ac8d0 + build: py311h5fe6e05_1 arch: x86_64 subdir: osx-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 60227 - timestamp: 1695380392812 + size: 60694 + timestamp: 1695380246398 - platform: osx-arm64 name: kiwisolver version: 1.4.5 @@ -11967,44 +12055,44 @@ package: manager: conda dependencies: - libcxx >=15.0.7 - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.5-py312h389731b_1.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.5-py311he4fd1f5_1.conda hash: - md5: 77eeca70c1c4f4187d6b199015c99ee5 - sha256: ee1a2189dc405f59c27ee1f061076d8761684c0fcd38cccc215630d8debf9f85 - build: py312h389731b_1 + md5: 4c871d65040b8c7bbb914df7f8f11492 + sha256: 907af50734789d47b3e8b2148dde763699dc746c64e5849baf6bd720c8cd0235 + build: py311he4fd1f5_1 arch: aarch64 subdir: osx-arm64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 61747 - timestamp: 1695380538266 + size: 61946 + timestamp: 1695380538042 - platform: win-64 name: kiwisolver version: 1.4.5 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.5-py312h0d7def4_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.5-py311h005e61a_1.conda hash: - md5: 77c9d46fc8680bb08f4e1ebb6669e44e - sha256: 07021ffc3bbf42922694c23634e028950547d088717b448b46296b3ca5a26068 - build: py312h0d7def4_1 + md5: de0b3f37405f8386ac8be18fdc06ff92 + sha256: 8fdd1bff75c24ac6a2a13be4db1c9abcfa39ab50b81539e8bd01131141df271a + build: py311h005e61a_1 arch: x86_64 subdir: win-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 55576 - timestamp: 1695380565733 + size: 55822 + timestamp: 1695380386563 - platform: linux-64 name: krb5 version: 1.21.2 @@ -18452,13 +18540,13 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py312h98912ed_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_1.conda hash: - md5: 79d118a8f1da01773dd5b334af5ce8d4 - sha256: 2da8fc396399cd3dec8e1464d6b592adca0498e353dc3cdfac34f7eb563956c9 - build: py312h98912ed_1 + md5: 71120b5155a0c500826cf81536721a15 + sha256: e1a9930f35e39bf65bc293e24160b83ebf9f800f02749f65358e1c04882ee6b0 + build: py311h459d7ec_1 arch: x86_64 subdir: linux-64 build_number: 1 @@ -18466,21 +18554,21 @@ package: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD - size: 26655 - timestamp: 1695367675021 + size: 27174 + timestamp: 1695367575909 - platform: osx-64 name: markupsafe version: 2.1.3 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.3-py312h104f124_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.3-py311h2725bcf_1.conda hash: - md5: 75ef15f68d5ed9890b0047faac90e3c2 - sha256: 8133ad1fe532ac2c06e02b9cdd1cc0a744c6eadc231a3726ed2f584d1034e661 - build: py312h104f124_1 + md5: 52ee86f482b552e547e2b1d6c01adf55 + sha256: 5a8f8caa89eeba6ea6e9e96d3e7c109b675bc3c6ed4b109b8931757da2411d48 + build: py311h2725bcf_1 arch: x86_64 subdir: osx-64 build_number: 1 @@ -18488,22 +18576,22 @@ package: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD - size: 25397 - timestamp: 1695367877868 + size: 25917 + timestamp: 1695367980802 - platform: osx-arm64 name: markupsafe version: 2.1.3 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.3-py312h02f2b3b_1.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.3-py311heffc1b2_1.conda hash: - md5: b96439c0c4c8b5e098629d1a4211a996 - sha256: 5d1505cbc95f7c41c229e7e7db61e1faf9fcd174d8f09debbf113fe7ee174062 - build: py312h02f2b3b_1 + md5: 5a7b68cb9eea46bea31aaf2d11d0dd2f + sha256: 307c1e3b2e4a2a992a6c94975910adff88cc523e2c9a41e81b2d506d8c9e7359 + build: py311heffc1b2_1 arch: aarch64 subdir: osx-arm64 build_number: 1 @@ -18511,24 +18599,24 @@ package: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD - size: 26318 - timestamp: 1695368020481 + size: 26764 + timestamp: 1695368008221 - platform: win-64 name: markupsafe version: 2.1.3 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.3-py312he70551f_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.3-py311ha68e1ae_1.conda hash: - md5: 1615e2aa0daf737f06e0d1a3b39d74a8 - sha256: 013cc2303b0bdfc4c3f43a363b8a208ce3971c727ebd870198db5c6c1f36c7c0 - build: py312he70551f_1 + md5: bc93b9d445824cfce3933b5dcc1087b4 + sha256: 435c4c2df8d98cd49d8332d22b6f4847fc4b594500f0cdf0f9437274c668642b + build: py311ha68e1ae_1 arch: x86_64 subdir: win-64 build_number: 1 @@ -18536,8 +18624,8 @@ package: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD - size: 28973 - timestamp: 1695367885602 + size: 29466 + timestamp: 1695367841578 - platform: linux-64 name: matplotlib version: 3.8.1 @@ -18546,21 +18634,21 @@ package: dependencies: - matplotlib-base >=3.8.1,<3.8.2.0a0 - pyqt >=5.10 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tornado >=5 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.1-py312h7900ff3_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.1-py311h38be061_0.conda hash: - md5: 0e03f9e54c27035d4a5f9a4c64cd7a1e - sha256: 49f8bd23ea598cade963783a8bc16a84c1f3bf4ff74e15ab62cb57c63f3b4095 - build: py312h7900ff3_0 + md5: 8a21cbbb87357c701fa44f4cfa4e23d7 + sha256: cbbd4cf75001616f675dfdec103e4580c41221ece4237f2af8b5a775c6ee63dd + build: py311h38be061_0 arch: x86_64 subdir: linux-64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 8443 - timestamp: 1698868842552 + size: 8433 + timestamp: 1698868770040 - platform: osx-64 name: matplotlib version: 3.8.1 @@ -18568,21 +18656,21 @@ package: manager: conda dependencies: - matplotlib-base >=3.8.1,<3.8.2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tornado >=5 - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.1-py312hb401068_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.1-py311h6eed73b_0.conda hash: - md5: 4f126c98b24e3276ba80f95efb696737 - sha256: ed3a0bacdd55003f4461c810c733cd6acb1444ecff88ec2571b8fc0f00e6153f - build: py312hb401068_0 + md5: ecb3b48ca1bfb16ea92f42971f6db317 + sha256: f53c5672ee053fc026d50320537ef8ee9c52f8e2194f751e43e6d921f1c3faca + build: py311h6eed73b_0 arch: x86_64 subdir: osx-64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 8509 - timestamp: 1698869072321 + size: 8540 + timestamp: 1698869065085 - platform: osx-arm64 name: matplotlib version: 3.8.1 @@ -18590,21 +18678,21 @@ package: manager: conda dependencies: - matplotlib-base >=3.8.1,<3.8.2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tornado >=5 - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.1-py312h1f38498_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.1-py311ha1ab1f8_0.conda hash: - md5: b88ebb3336d5505734e78686fca3e018 - sha256: 4d0519e9f864d855d12f6e9ed8f01ecacce88b8d14e7cb27d174204c7f2b9a9c - build: py312h1f38498_0 + md5: 797f33cafe2b7fed2ab1ce7e261c4c81 + sha256: bcf6e3eea9a8693e477b1b4ceeda6e124dc2cfd6e6c8313f82982d73332b36d2 + build: py311ha1ab1f8_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 8607 - timestamp: 1698869193101 + size: 8589 + timestamp: 1698869242307 - platform: win-64 name: matplotlib version: 3.8.1 @@ -18613,21 +18701,21 @@ package: dependencies: - matplotlib-base >=3.8.1,<3.8.2.0a0 - pyqt >=5.10 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tornado >=5 - url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.1-py312h2e8e312_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.1-py311h1ea47a8_0.conda hash: - md5: 0ff81663c589522d5e174abb020849fc - sha256: 2166e0f9fc394b92d87f01039f7bdeaedf23d3c0bab52b729c276522c14d9fc3 - build: py312h2e8e312_0 + md5: 1839b8c39f09d94b734d5e627eeb79ea + sha256: d236fcbbecd9d99bf254a7a7105bcddb754552be8d2237574d8cfb4edca0d76c + build: py311h1ea47a8_0 arch: x86_64 subdir: win-64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 8842 - timestamp: 1698869464882 + size: 8809 + timestamp: 1698869468994 - platform: linux-64 name: matplotlib-base version: 3.8.1 @@ -18643,26 +18731,26 @@ package: - libgcc-ng >=12 - libstdcxx-ng >=12 - numpy >=1.21,<2 - - numpy >=1.26.0,<2.0a0 + - numpy >=1.23.5,<2.0a0 - packaging >=20.0 - pillow >=8 - pyparsing >=2.3.1 - - python >=3.12,<3.13.0a0 + - python >=3.11,<3.12.0a0 - python-dateutil >=2.7 - - python_abi 3.12.* *_cp312 + - python_abi 3.11.* *_cp311 - tk >=8.6.13,<8.7.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.1-py312he5832f3_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.1-py311h54ef318_0.conda hash: - md5: 8c5aef130bf0c6590202719cff450402 - sha256: 870ec5a60225eadcb4615c41b5c692c77f9748a9e429ff6aa807b1849eb0deb8 - build: py312he5832f3_0 + md5: 201fdabdb86bb8fb6e99fa3f0dab8122 + sha256: 9340ef0ba720e550c702fd25611884c79bfc419a85027d69900be5aa2ddbe3a9 + build: py311h54ef318_0 arch: x86_64 subdir: linux-64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 7813796 - timestamp: 1698868817347 + size: 7828462 + timestamp: 1698868747853 - platform: osx-64 name: matplotlib-base version: 3.8.1 @@ -18679,25 +18767,25 @@ package: - kiwisolver >=1.3.1 - libcxx >=16.0.6 - numpy >=1.21,<2 - - numpy >=1.26.0,<2.0a0 + - numpy >=1.23.5,<2.0a0 - packaging >=20.0 - pillow >=8 - pyparsing >=2.3.1 - - python >=3.12,<3.13.0a0 + - python >=3.11,<3.12.0a0 - python-dateutil >=2.7 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.1-py312h1fe5000_0.conda + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.1-py311hd316c10_0.conda hash: - md5: f384d9472c380eea6a14ab5dc6cb77c4 - sha256: dd95501a0d7fc578e3438952bde8c664aa53b7ab0958a31eac1543fac5d12f1d - build: py312h1fe5000_0 + md5: 8952515c597009d2dfadf9ecaec30447 + sha256: 5976a3c061b7918ac84a7e38fec1af297fe29b5e2ec9405f43feb55f77b4f6fb + build: py311hd316c10_0 arch: x86_64 subdir: osx-64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 7711925 - timestamp: 1698869034419 + size: 8059734 + timestamp: 1698869029832 - platform: osx-arm64 name: matplotlib-base version: 3.8.1 @@ -18713,26 +18801,26 @@ package: - kiwisolver >=1.3.1 - libcxx >=16.0.6 - numpy >=1.21,<2 - - numpy >=1.26.0,<2.0a0 + - numpy >=1.23.5,<2.0a0 - packaging >=20.0 - pillow >=8 - pyparsing >=2.3.1 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython - python-dateutil >=2.7 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.1-py312hba9b818_0.conda + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.1-py311hfdba5f6_0.conda hash: - md5: 8a6a25faa366216bf78a4a22eb3f5772 - sha256: 773bf54a6d84234bc1c7abb22a8b4545fd0b8c2c3818a2818664f57c2fa4295e - build: py312hba9b818_0 + md5: 7b2974aa0ecc495f1cb9f269fadf9981 + sha256: 2d61f4697a9906c4f56b8ffdcdd66edf64f7db9c5084827848f43390c203ee24 + build: py311hfdba5f6_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 7699618 - timestamp: 1698869142345 + size: 7711426 + timestamp: 1698869195412 - platform: win-64 name: matplotlib-base version: 3.8.1 @@ -18746,28 +18834,28 @@ package: - freetype >=2.12.1,<3.0a0 - kiwisolver >=1.3.1 - numpy >=1.21,<2 - - numpy >=1.26.0,<2.0a0 + - numpy >=1.23.5,<2.0a0 - packaging >=20.0 - pillow >=8 - pyparsing >=2.3.1 - - python >=3.12,<3.13.0a0 + - python >=3.11,<3.12.0a0 - python-dateutil >=2.7 - - python_abi 3.12.* *_cp312 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.1-py312h26ecaf7_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.1-py311h6e989c2_0.conda hash: - md5: 218eaaffeca3bb344fcac0038f79c765 - sha256: a039faed2dfe6805d2bc0cdb6d5e45bcd5ab8aeea1818f78c63e2e2438ac972e - build: py312h26ecaf7_0 + md5: d4e4b5785fdfd969303cdf55256378e0 + sha256: c153b558ff258c2ab2f654c7557f89e3804f7928ca2dfa8c77acfac6f0cab44d + build: py311h6e989c2_0 arch: x86_64 subdir: win-64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 7660592 - timestamp: 1698869417798 + size: 7828413 + timestamp: 1698869423233 - platform: linux-64 name: matplotlib-inline version: 0.1.6 @@ -19493,101 +19581,101 @@ package: timestamp: 1600387789153 - platform: linux-64 name: mypy - version: 1.6.1 + version: 1.7.0 category: main manager: conda dependencies: - libgcc-ng >=12 - mypy_extensions >=1.0.0 - psutil >=4.0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - typing_extensions >=4.1.0 - url: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.6.1-py312h98912ed_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.7.0-py311h459d7ec_0.conda hash: - md5: 27d6ce6c7539c9493030aa5cba62ec32 - sha256: df633e6eebffc3ed3a2a2883b12409ee3e63e8019c02ba87667d9480f03da378 - build: py312h98912ed_0 + md5: 220a9ebafcc0f1b1f2c0b9c4da26687e + sha256: d1e526e0a943b4ded2bff07dfad38209b54bbd6cebc461e212ccc2ecb8f9c51d + build: py311h459d7ec_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 16035506 - timestamp: 1697636057072 + size: 17536667 + timestamp: 1699638313158 - platform: osx-64 name: mypy - version: 1.6.1 + version: 1.7.0 category: main manager: conda dependencies: - mypy_extensions >=1.0.0 - psutil >=4.0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - typing_extensions >=4.1.0 - url: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.6.1-py312h41838bb_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.7.0-py311he705e18_0.conda hash: - md5: ef810fadf3d876440850ff35bd9a4c54 - sha256: 8cc191852626be8b97655aeb74a1362c262eab0ca3e8d6f922104a57f185c5bb - build: py312h41838bb_0 + md5: 693b52d72447772c2d85e7016b8711aa + sha256: 1bb6dd753dcbf487ef0b82755379e6ca23cf45cde3786bfec99028dbaa8afcd8 + build: py311he705e18_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 9966565 - timestamp: 1697636286117 + size: 11857181 + timestamp: 1699638473833 - platform: osx-arm64 name: mypy - version: 1.6.1 + version: 1.7.0 category: main manager: conda dependencies: - mypy_extensions >=1.0.0 - psutil >=4.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 - typing_extensions >=4.1.0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.6.1-py312he37b823_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.7.0-py311h05b510d_0.conda hash: - md5: 9d7dcf739655f43bdd1628de2b9c0b01 - sha256: 68d42272a73cd73e5c98db038fd6bfa94e24cf086b6e7f21a6be5359ea4fe00c - build: py312he37b823_0 + md5: 19960a9945b980ef34f30c1d90d28c93 + sha256: 6a77b884c89e0176f6ecf6965d2d737774cdbf208acd1b4310a37a2c4d660a05 + build: py311h05b510d_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 9281179 - timestamp: 1697636574313 + size: 9642540 + timestamp: 1699638565018 - platform: win-64 name: mypy - version: 1.6.1 + version: 1.7.0 category: main manager: conda dependencies: - mypy_extensions >=1.0.0 - psutil >=4.0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - typing_extensions >=4.1.0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/mypy-1.6.1-py312he70551f_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/mypy-1.7.0-py311ha68e1ae_0.conda hash: - md5: c8a2276a4957d6058c37d11d22f35329 - sha256: 860627fb8ec3173cd9c9e5903776b12735193f3dde7bbaa28ebf3ad4d7a41592 - build: py312he70551f_0 + md5: c58cf58cc73b8e67bcdb84ab4e7a1d91 + sha256: 0f537dc06b0210760aa50cd685fcd138d1490c1f339fc2d92365ddf4f1aede9e + build: py311ha68e1ae_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 8042073 - timestamp: 1697636464855 + size: 9820922 + timestamp: 1699638398847 - platform: linux-64 name: mypy_extensions version: 1.0.0 @@ -20298,81 +20386,81 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.2.14-py312h4b3b743_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.2.14-py311h46250e7_1.conda hash: - md5: 41bf8d6d36ad4d33b6f8cf741648cddd - sha256: 056579eeca71e809549f9b6786b71385ae71d9150e3a3caf35eb9a829ee366d0 - build: py312h4b3b743_1 + md5: 8faffafe1f60438f96710edef4fdafe5 + sha256: 31e5270ba8ec992dedd02a36ba56d786729b8e372c171170c611d79a6e5c458d + build: py311h46250e7_1 arch: x86_64 subdir: linux-64 build_number: 1 license: MIT license_family: MIT - size: 621567 - timestamp: 1695423328803 + size: 623877 + timestamp: 1695423349623 - platform: osx-64 name: nh3 version: 0.2.14 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/nh3-0.2.14-py312hc405983_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/nh3-0.2.14-py311h299eb51_1.conda hash: - md5: 03a6d5a5b02ad0ae5ec84cc6d9cb757c - sha256: e9cb4df75971b2463645c013c4d88c74acf6f98ad2e5ac03e584975b5c393fae - build: py312hc405983_1 + md5: 37047d1fc213d1dc07a2e140fc60e95e + sha256: e9b2e7be185fa7aeeba8207f39ee9cc5f361cc455febbbe7b63126ff217be135 + build: py311h299eb51_1 arch: x86_64 subdir: osx-64 build_number: 1 license: MIT license_family: MIT - size: 547702 - timestamp: 1695423763386 + size: 548514 + timestamp: 1695423816927 - platform: osx-arm64 name: nh3 version: 0.2.14 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.2.14-py312h0002256_1.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.2.14-py311h0563b04_1.conda hash: - md5: 3f1e6655316e5ed6124f4a4f095d2a05 - sha256: cec13149621338e43da27aac0795326c07d1d9c2b640b42cfb2bc99c2983a9d8 - build: py312h0002256_1 + md5: 5a8f322ffa65f7c06fd539f3851b6eba + sha256: 59c3cd5df65671a5ffc586a4cb89f4d1a343dcb0289437403203327947348794 + build: py311h0563b04_1 arch: aarch64 subdir: osx-arm64 build_number: 1 license: MIT license_family: MIT - size: 609888 - timestamp: 1695423938984 + size: 609961 + timestamp: 1695423915817 - platform: win-64 name: nh3 version: 0.2.14 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/win-64/nh3-0.2.14-py312h426fad5_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/win-64/nh3-0.2.14-py311h633b200_1.conda hash: - md5: 27029a8cd7698df4bd7a171a156c5f7a - sha256: 404739aab4d8250da13b9d59da288ac4d5843c2a9cd7976b0cd4ef8bd9be42b2 - build: py312h426fad5_1 + md5: b06c8f68899f0971c10c0b641d7c017e + sha256: 5de65e0d0dda06821f20c167de150284f337d5b34a1aa7f4ce04892b4d640022 + build: py311h633b200_1 arch: x86_64 subdir: win-64 build_number: 1 license: MIT license_family: MIT - size: 500452 - timestamp: 1695424134011 + size: 502204 + timestamp: 1695424156734 - platform: linux-64 name: nodeenv version: 1.8.0 @@ -20678,13 +20766,13 @@ package: - libgcc-ng >=12 - liblapack >=3.9.0,<4.0a0 - libstdcxx-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py312heda63a1_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py311h64a7726_0.conda hash: - md5: 9b4f35e4d83e2a8b17868b65beb438d9 - sha256: 83c8770959c096639973dd91dae7001adf8ec4cea374c125388c22314e92cf3a - build: py312heda63a1_0 + md5: bf16a9f625126e378302f08e7ed67517 + sha256: 0aab5cef67cc2a1cd584f6e9cc6f2065c7a28c142d7defcb8096e8f719d9b3bf + build: py311h64a7726_0 arch: x86_64 subdir: linux-64 build_number: 0 @@ -20692,8 +20780,8 @@ package: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD - size: 7452952 - timestamp: 1695291296202 + size: 8039946 + timestamp: 1694920380273 - platform: osx-64 name: numpy version: 1.26.0 @@ -20704,13 +20792,13 @@ package: - libcblas >=3.9.0,<4.0a0 - libcxx >=15.0.7 - liblapack >=3.9.0,<4.0a0 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.0-py312h5df92dc_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.0-py311hc44ba51_0.conda hash: - md5: aec65f472e6633e23844b555bf640a3f - sha256: 537ad31f441b60e6f7f8776a5b6b6a2158b051a6d423b84b6aa3bf75bed35d33 - build: py312h5df92dc_0 + md5: f95605c5b73f5f6a0f5f1b0aabfc2f39 + sha256: 517cb22d5594fdb934523dd1951929961f686b5d994c684201acbf282433ec9b + build: py311hc44ba51_0 arch: x86_64 subdir: osx-64 build_number: 0 @@ -20718,8 +20806,8 @@ package: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD - size: 7010122 - timestamp: 1695291869411 + size: 7616817 + timestamp: 1694920728660 - platform: osx-arm64 name: numpy version: 1.26.0 @@ -20730,14 +20818,14 @@ package: - libcblas >=3.9.0,<4.0a0 - libcxx >=15.0.7 - liblapack >=3.9.0,<4.0a0 - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.0-py312h696b312_0.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.0-py311hb8f3215_0.conda hash: - md5: 6281cf23af141e1bc06f6c705e4cc281 - sha256: 3cdffc4a7775a0159f4e259814dfc86e80590ddd13114468e1abe5b0bcada96a - build: py312h696b312_0 + md5: 97f8632bf2ad5c179ff68fc90c71c2ae + sha256: fca5ee1363f22a160c97e92d6400d4636f4b05987b08085e4f79fb6efb75fd0a + build: py311hb8f3215_0 arch: aarch64 subdir: osx-arm64 build_number: 0 @@ -20745,8 +20833,8 @@ package: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD - size: 6149084 - timestamp: 1695291913048 + size: 6780798 + timestamp: 1694920700859 - platform: win-64 name: numpy version: 1.26.0 @@ -20756,16 +20844,16 @@ package: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.0-py312h8753938_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.0-py311h0b4df5a_0.conda hash: - md5: 341c2575404e3f96ea2cf78f152563dc - sha256: 3d61870e3ccaffee2371a4a93ddc7ee64c16df154a9dd6e5c93c8cb4b1e657ec - build: py312h8753938_0 + md5: a65e57fff208fd1d0f632e0afa8985d4 + sha256: 3da6bcf524a4418d7d0dbc084c23c74e1f2fc4b19c34a5805f5e201e5d7fcd8f + build: py311h0b4df5a_0 arch: x86_64 subdir: win-64 build_number: 0 @@ -20773,8 +20861,8 @@ package: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD - size: 6454001 - timestamp: 1695291651104 + size: 7085715 + timestamp: 1694920741486 - platform: linux-64 name: openapi-schema-validator version: 0.2.3 @@ -21402,110 +21490,106 @@ package: timestamp: 1696202521121 - platform: linux-64 name: pandas - version: 2.1.2 + version: 2.1.3 category: main manager: conda dependencies: - libgcc-ng >=12 - libstdcxx-ng >=12 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 - python-dateutil >=2.8.1 - python-tzdata >=2022a - - python_abi 3.12.* *_cp312 + - python_abi 3.11.* *_cp311 - pytz >=2020.1 - url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.2-py312hfb8ada1_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.3-py311h320fe9a_0.conda hash: - md5: 53c435c54c12d902c6e0c7979711fac4 - sha256: 3803cf6ab2a8dc7247514a6a65a19821f5039e1d8a097b85c1adf5e95d65384f - build: py312hfb8ada1_0 + md5: 3ea3486e16d559dfcb539070ed330a1e + sha256: d69759f8e5f3dcae2562e177cdfde5a45e4cd38db732301812aa558c1c80db57 + build: py311h320fe9a_0 arch: x86_64 subdir: linux-64 build_number: 0 license: BSD-3-Clause - license_family: BSD - size: 14676378 - timestamp: 1698376343634 + size: 14913343 + timestamp: 1699670668363 - platform: osx-64 name: pandas - version: 2.1.2 + version: 2.1.3 category: main manager: conda dependencies: - __osx >=10.9 - libcxx >=16.0.6 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 - python-dateutil >=2.8.1 - python-tzdata >=2022a - - python_abi 3.12.* *_cp312 + - python_abi 3.11.* *_cp311 - pytz >=2020.1 - url: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.1.2-py312haf8ecfc_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.1.3-py311h1eadf79_0.conda hash: - md5: 33f2969aade3bd3b4547213076407ca2 - sha256: d1e64e1106e38f7b6cb805f3c05cc5cb24554a5f2c43cdcdc6309d22ed541d38 - build: py312haf8ecfc_0 + md5: 0a1ea4be8bcc907018694b5d04ac3036 + sha256: 2ca591570ce60be45eae8e5d39a07f08390e9ecc18997f66cb3d712953c09724 + build: py311h1eadf79_0 arch: x86_64 subdir: osx-64 build_number: 0 license: BSD-3-Clause - license_family: BSD - size: 13992457 - timestamp: 1698442848959 + size: 14349057 + timestamp: 1699671155233 - platform: osx-arm64 name: pandas - version: 2.1.2 + version: 2.1.3 category: main manager: conda dependencies: - __osx >=10.9 - libcxx >=16.0.6 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython - python-dateutil >=2.8.1 - python-tzdata >=2022a - - python_abi 3.12.* *_cp312 + - python_abi 3.11.* *_cp311 - pytz >=2020.1 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.1.2-py312h9e53831_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.1.3-py311h6e08293_0.conda hash: - md5: b5679ff30089add51c6004649a8c91b0 - sha256: c15121e879b6361937931512a87ff86c56a5398fecc1b6cf4a419d8b49fcaf92 - build: py312h9e53831_0 + md5: 0d0ecc6bac2b7a4007bf4d96b125d674 + sha256: eacddc0866e26372578fdeb5059e6f7edf4c6c8f59f494a8d5e64caa032b2600 + build: py311h6e08293_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: BSD-3-Clause - license_family: BSD - size: 13862650 - timestamp: 1698376585365 + size: 14268243 + timestamp: 1699670980750 - platform: win-64 name: pandas - version: 2.1.2 + version: 2.1.3 category: main manager: conda dependencies: - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 - python-dateutil >=2.8.1 - python-tzdata >=2022a - - python_abi 3.12.* *_cp312 + - python_abi 3.11.* *_cp311 - pytz >=2020.1 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/pandas-2.1.2-py312h2ab9e98_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/pandas-2.1.3-py311hf63dbb6_0.conda hash: - md5: 7a9d64a8cb9173d13807b9c23342c58f - sha256: 58d3c4047053175c229855588e3a0dba1e751d2baf0688d1bdc68fc9006be8ff - build: py312h2ab9e98_0 + md5: 8b00388ee5e71f4aa4364bf2264ee6c6 + sha256: 998f48aedd7c01de4d9d519f9148ee90c09d0fd25221a40d7c6222e5362f73d5 + build: py311hf63dbb6_0 arch: x86_64 subdir: win-64 build_number: 0 license: BSD-3-Clause - license_family: BSD - size: 13498028 - timestamp: 1698376797033 + size: 13825386 + timestamp: 1699670895483 - platform: linux-64 name: pandas-stubs version: 2.1.1.230928 @@ -22405,20 +22489,20 @@ package: - libxcb >=1.15,<1.16.0a0 - libzlib >=1.2.13,<1.3.0a0 - openjpeg >=2.5.0,<3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tk >=8.6.13,<8.7.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.1.0-py312hf3581a9_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.1.0-py311ha6c5da5_0.conda hash: - md5: c04d3de9d831a69a5fdfab1413ec2fb6 - sha256: b8ca07308602b12c533f09e00d1ecb75288367d1f1506e34d0f12dd7abb01726 - build: py312hf3581a9_0 + md5: 83a988daf5c49e57f7d2086fb6781fe8 + sha256: 5b037243f76644fe2e565aa6a3764039dba47cddf8bbef8ef01643775a459b60 + build: py311ha6c5da5_0 arch: x86_64 subdir: linux-64 build_number: 0 license: HPND - size: 46418602 - timestamp: 1697423804634 + size: 46400469 + timestamp: 1697423839735 - platform: osx-64 name: pillow version: 10.1.0 @@ -22433,20 +22517,20 @@ package: - libxcb >=1.15,<1.16.0a0 - libzlib >=1.2.13,<1.3.0a0 - openjpeg >=2.5.0,<3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tk >=8.6.13,<8.7.0a0 - url: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.1.0-py312h0c70c2f_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.1.0-py311hea5c87a_0.conda hash: - md5: 50fc3446a464ff986aa4496e1eebf60b - sha256: b108b032f4ef7ddc34e12d357977c5a0eaf87ca916cc5fd9596d8ecd582820b3 - build: py312h0c70c2f_0 + md5: ffff517d90b21a5d44ef907a5a01f695 + sha256: 44bb951ae60cc96ab9273592ede9ee94a422857e857e52c55c261ad5f1525686 + build: py311hea5c87a_0 arch: x86_64 subdir: osx-64 build_number: 0 license: HPND - size: 45453994 - timestamp: 1697423996936 + size: 46474850 + timestamp: 1697423945362 - platform: osx-arm64 name: pillow version: 10.1.0 @@ -22461,21 +22545,21 @@ package: - libxcb >=1.15,<1.16.0a0 - libzlib >=1.2.13,<1.3.0a0 - openjpeg >=2.5.0,<3.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 - tk >=8.6.13,<8.7.0a0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.1.0-py312hac22aec_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.1.0-py311hb9c5795_0.conda hash: - md5: bd269d9481143d3dda73a1c136d8844a - sha256: 3fa3a5a45ce000c3dc37419d38a469272984b2d5d600e5c24ea4cab192ddae97 - build: py312hac22aec_0 + md5: 90fd1f60da9f3d5eccdece0945043037 + sha256: 9699ba6886e94e32eb949009195ed78c2c949f74450235af491cd4cbe390d7b4 + build: py311hb9c5795_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: HPND - size: 47015006 - timestamp: 1697424032123 + size: 45850858 + timestamp: 1697424033737 - platform: win-64 name: pillow version: 10.1.0 @@ -22490,23 +22574,23 @@ package: - libxcb >=1.15,<1.16.0a0 - libzlib >=1.2.13,<1.3.0a0 - openjpeg >=2.5.0,<3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tk >=8.6.13,<8.7.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/pillow-10.1.0-py312he768995_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/pillow-10.1.0-py311h4dd8a23_0.conda hash: - md5: 8a75d2c04292df2214c72254dcdfb90a - sha256: 4499a36519aace44a4c838963b78fd9a136c10a48b903ee5daa34157ab018d94 - build: py312he768995_0 + md5: c03c410ca23313c36381a128737ac25f + sha256: 494426ecfcbf5f177b5350dfdb5ca93a529a1873247c38beda25a70ad369fe36 + build: py311h4dd8a23_0 arch: x86_64 subdir: win-64 build_number: 0 license: HPND - size: 46459057 - timestamp: 1697424191106 + size: 46022436 + timestamp: 1697424195333 - platform: linux-64 name: pip version: 23.3.1 @@ -24002,84 +24086,84 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py312h98912ed_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py311h459d7ec_1.conda hash: - md5: 2cbc379aed0482f51e7a3477e8a91ecc - sha256: ef5af757dd7a5f5ee97df4189937a1536b7a6f43565caaae5261c39d35d03f1e - build: py312h98912ed_1 + md5: 490d7fa8675afd1aa6f1b2332d156a45 + sha256: e92d2120fc4b98fe838b3d52d4907fae97808bdd504fb84aa33aea8c4be7bc61 + build: py311h459d7ec_1 arch: x86_64 subdir: linux-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 481280 - timestamp: 1695367314196 + size: 498698 + timestamp: 1695367306421 - platform: osx-64 name: psutil version: 5.9.5 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/psutil-5.9.5-py312h104f124_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/psutil-5.9.5-py311h2725bcf_1.conda hash: - md5: 3f9a16e777cc6efcf5ef6a04492f7db4 - sha256: 44f4472eb794c1f702a402229df7cbd246c607f3c6b69b6d643c5224ea839adf - build: py312h104f124_1 + md5: 16221cd0488a32152a6b3f1a301ccf19 + sha256: 2eee900e0e5a103cff0159cdd81d401b67ccfb919be6cd868fc34c22dab981f1 + build: py311h2725bcf_1 arch: x86_64 subdir: osx-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 489190 - timestamp: 1695367517429 + size: 506611 + timestamp: 1695367402674 - platform: osx-arm64 name: psutil version: 5.9.5 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-5.9.5-py312h02f2b3b_1.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-5.9.5-py311heffc1b2_1.conda hash: - md5: da7fbd956111473b106daf37d1a45b5f - sha256: 6e86f17a5a6fb6bcf48b0b3aa455b530faee306809ae6e4107ff072fccdc5c9d - build: py312h02f2b3b_1 + md5: a40123b40642b8b08b3830a3f6bc7fd9 + sha256: a12a525d3bcaed04e0885b2bd00f4f626c80c19d7c0ae8bb7cf7121aefb39e52 + build: py311heffc1b2_1 arch: aarch64 subdir: osx-arm64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 491988 - timestamp: 1695367619913 + size: 506971 + timestamp: 1695367619126 - platform: win-64 name: psutil version: 5.9.5 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/psutil-5.9.5-py312he70551f_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/psutil-5.9.5-py311ha68e1ae_1.conda hash: - md5: 631c25a1f7fed57b0ccecdde40a8707b - sha256: b12f26ff47a30b7af9250693943c93ae8cef502beb013b173f07746df0da942f - build: py312he70551f_1 + md5: f64b2d9577e753fea9662dae11339ac2 + sha256: e5c09eee9902e0c56d89f88210009b34d819d241ac5b7dde38266324a85fde51 + build: py311ha68e1ae_1 arch: x86_64 subdir: win-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 498865 - timestamp: 1695367605546 + size: 516106 + timestamp: 1695367685028 - platform: linux-64 name: pthread-stubs version: '0.4' @@ -24350,22 +24434,22 @@ package: - libgcc-ng >=12 - libparquet 14.0.1 h352af49_1_cpu - libstdcxx-ng >=12 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.1-py312h176e3d2_1_cpu.conda + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-14.0.1-py311h39c9aba_1_cpu.conda hash: - md5: d3c80e206062fded59159a29dab920a2 - sha256: 2929558d9fcf2be0ddf491705ba5934f253dc73bf4d999cd09414399ae5c9b90 - build: py312h176e3d2_1_cpu + md5: ee5e344d03f1fe29c52f7cc55a755ac0 + sha256: 1846ed170dca8ad173a5e461760d0455832caa4fa630e28b98fd3c1d0360c70b + build: py311h39c9aba_1_cpu arch: x86_64 subdir: linux-64 build_number: 1 constrains: - apache-arrow-proc =*=cpu license: Apache-2.0 - size: 4482781 - timestamp: 1699524823799 + size: 4506977 + timestamp: 1699524233524 - platform: osx-64 name: pyarrow version: 14.0.1 @@ -24382,22 +24466,22 @@ package: - libarrow-substrait 14.0.1 h8ec153b_1_cpu - libcxx >=15.0.7 - libparquet 14.0.1 h27bd29f_1_cpu - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.1-py312h10f8022_1_cpu.conda + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-14.0.1-py311h98a0319_1_cpu.conda hash: - md5: 315d737cfe65e6de30bf40ea8ca38138 - sha256: b1dcf2b70c7ca5563d5576ed174a76774fffc1cebc14eb4a00da4e31281b1c15 - build: py312h10f8022_1_cpu + md5: e24dad73fe9135e0109e7a8e69bfe159 + sha256: 2ad952aeffd3b4b8339ba187982e15e74e0d126d4297e86a2b89e0f4e9aa60c5 + build: py311h98a0319_1_cpu arch: x86_64 subdir: osx-64 build_number: 1 constrains: - apache-arrow-proc =*=cpu license: Apache-2.0 - size: 3974235 - timestamp: 1699527412371 + size: 4004259 + timestamp: 1699525854316 - platform: osx-arm64 name: pyarrow version: 14.0.1 @@ -24414,23 +24498,23 @@ package: - libarrow-substrait 14.0.1 h594d712_1_cpu - libcxx >=15.0.7 - libparquet 14.0.1 heaab74a_1_cpu - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.1-py312h01ffab7_1_cpu.conda + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-14.0.1-py311h637fcfe_1_cpu.conda hash: - md5: af7ede22023f83a80f22b753fff90b0f - sha256: 68593aab672286874b5bcf73e4be647df418cb4dfdb617a9c7fa152f566dfe7e - build: py312h01ffab7_1_cpu + md5: 2e1207c4a320d41c7676e46f33306483 + sha256: d674b26018f29e37d3794124c79981c295642b389b9c3a55073cdeae71d0d606 + build: py311h637fcfe_1_cpu arch: aarch64 subdir: osx-arm64 build_number: 1 constrains: - apache-arrow-proc =*=cpu license: Apache-2.0 - size: 4031321 - timestamp: 1699527504724 + size: 4073439 + timestamp: 1699526918604 - platform: win-64 name: pyarrow version: 14.0.1 @@ -24445,25 +24529,25 @@ package: - libarrow-gandiva 14.0.1 hb2eaab1_1_cpu - libarrow-substrait 14.0.1 hd4c9904_1_cpu - libparquet 14.0.1 h7ec3a38_1_cpu - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.1-py312h85e32bb_1_cpu.conda + url: https://conda.anaconda.org/conda-forge/win-64/pyarrow-14.0.1-py311h6a6099b_1_cpu.conda hash: - md5: 01085bea09ebce9bfd2e693849d44b68 - sha256: 2da99fc0f6180eb063e40c1860e714e19f35e2d91890df1050d215b6bc9eabc4 - build: py312h85e32bb_1_cpu + md5: 970851b5d18431596fb0058025dbc239 + sha256: f94c7f1b6b69d501b0014efbe4cbf0ebf25ec6438eb67161a4ad796068692003 + build: py311h6a6099b_1_cpu arch: x86_64 subdir: win-64 build_number: 1 constrains: - apache-arrow-proc =*=cpu license: Apache-2.0 - size: 3406833 - timestamp: 1699525907715 + size: 3474672 + timestamp: 1699525415355 - platform: linux-64 name: pycparser version: '2.21' @@ -24546,93 +24630,185 @@ package: timestamp: 1636257201998 - platform: linux-64 name: pydantic - version: 1.10.13 + version: 2.4.2 category: main manager: conda dependencies: - - libgcc-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - typing-extensions >=4.2.0 - url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-1.10.13-py312h98912ed_1.conda + - annotated-types >=0.4.0 + - pydantic-core 2.10.1 + - python >=3.7 + - typing-extensions >=4.6.1 + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.4.2-pyhd8ed1ab_1.conda hash: - md5: 9abab3ae2788e0fe4f989e2b65a8b148 - sha256: b7c44d3d89af5ce0d3766b9fe3b4b1e272c9f458494b2424adbab3dd29514037 - build: py312h98912ed_1 + md5: aad1d187156725d52e1f8ee7756c20f6 + sha256: dc6330364f92de95a315a19e842a26605d6ca5c7d346e77811d42ad0438e32d8 + build: pyhd8ed1ab_1 arch: x86_64 subdir: linux-64 build_number: 1 license: MIT license_family: MIT - size: 2176572 - timestamp: 1697791429815 + noarch: python + size: 273801 + timestamp: 1697789747756 - platform: osx-64 name: pydantic - version: 1.10.13 + version: 2.4.2 category: main manager: conda dependencies: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - typing-extensions >=4.2.0 - url: https://conda.anaconda.org/conda-forge/osx-64/pydantic-1.10.13-py312h41838bb_1.conda + - annotated-types >=0.4.0 + - pydantic-core 2.10.1 + - python >=3.7 + - typing-extensions >=4.6.1 + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.4.2-pyhd8ed1ab_1.conda hash: - md5: d2fff399f77fc93f60859be930f7d3f3 - sha256: 34400cadfb59b2f2846337e3aa80f5403bc6b38a229b7bd8502d164b61ff7d54 - build: py312h41838bb_1 + md5: aad1d187156725d52e1f8ee7756c20f6 + sha256: dc6330364f92de95a315a19e842a26605d6ca5c7d346e77811d42ad0438e32d8 + build: pyhd8ed1ab_1 arch: x86_64 subdir: osx-64 build_number: 1 license: MIT license_family: MIT - size: 1831496 - timestamp: 1697791662162 + noarch: python + size: 273801 + timestamp: 1697789747756 - platform: osx-arm64 name: pydantic - version: 1.10.13 + version: 2.4.2 category: main manager: conda dependencies: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - typing-extensions >=4.2.0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-1.10.13-py312he37b823_1.conda + - annotated-types >=0.4.0 + - pydantic-core 2.10.1 + - python >=3.7 + - typing-extensions >=4.6.1 + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.4.2-pyhd8ed1ab_1.conda hash: - md5: 19d29a990bdc7b8b8878898ff3e7bfaa - sha256: 0d85db6f73d636e557ce179c32ed55d11fd5205d7b8a783a4eec4f7e673e39f7 - build: py312he37b823_1 + md5: aad1d187156725d52e1f8ee7756c20f6 + sha256: dc6330364f92de95a315a19e842a26605d6ca5c7d346e77811d42ad0438e32d8 + build: pyhd8ed1ab_1 arch: aarch64 subdir: osx-arm64 build_number: 1 license: MIT license_family: MIT - size: 1786936 - timestamp: 1697791847732 + noarch: python + size: 273801 + timestamp: 1697789747756 - platform: win-64 name: pydantic - version: 1.10.13 + version: 2.4.2 + category: main + manager: conda + dependencies: + - annotated-types >=0.4.0 + - pydantic-core 2.10.1 + - python >=3.7 + - typing-extensions >=4.6.1 + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.4.2-pyhd8ed1ab_1.conda + hash: + md5: aad1d187156725d52e1f8ee7756c20f6 + sha256: dc6330364f92de95a315a19e842a26605d6ca5c7d346e77811d42ad0438e32d8 + build: pyhd8ed1ab_1 + arch: x86_64 + subdir: win-64 + build_number: 1 + license: MIT + license_family: MIT + noarch: python + size: 273801 + timestamp: 1697789747756 +- platform: linux-64 + name: pydantic-core + version: 2.10.1 category: main manager: conda dependencies: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - typing-extensions >=4.2.0 + - libgcc-ng >=12 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - typing-extensions >=4.6.0 + url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.10.1-py311h46250e7_0.conda + hash: + md5: 36ee4237f8f9f97adb057974e8fee4c5 + sha256: 871ec291dd2be9a38768c63ac94f3f959a9084aa75dd09b5657fc1c6a7a73e2f + build: py311h46250e7_0 + arch: x86_64 + subdir: linux-64 + build_number: 0 + license: MIT + license_family: MIT + size: 1591970 + timestamp: 1695733315193 +- platform: osx-64 + name: pydantic-core + version: 2.10.1 + category: main + manager: conda + dependencies: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - typing-extensions >=4.6.0 + url: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.10.1-py311h299eb51_0.conda + hash: + md5: 580ad4783a19b4d9ec0640dc4d81f28e + sha256: 56fc2f264b078de740ae087fee48b9d32eb045da5676a2d4ef085080c243e727 + build: py311h299eb51_0 + arch: x86_64 + subdir: osx-64 + build_number: 0 + license: MIT + license_family: MIT + size: 1494311 + timestamp: 1695733841693 +- platform: osx-arm64 + name: pydantic-core + version: 2.10.1 + category: main + manager: conda + dependencies: + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - typing-extensions >=4.6.0 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.10.1-py311h0563b04_0.conda + hash: + md5: 2aebd3db2e26ea6f0925f33677f91073 + sha256: fbeb2fa52c11a48e925a72c847931f826eacb9a0abcbe4cca2c8da976f28641a + build: py311h0563b04_0 + arch: aarch64 + subdir: osx-arm64 + build_number: 0 + license: MIT + license_family: MIT + size: 1404989 + timestamp: 1695733821422 +- platform: win-64 + name: pydantic-core + version: 2.10.1 + category: main + manager: conda + dependencies: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - typing-extensions >=4.6.0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/pydantic-1.10.13-py312he70551f_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.10.1-py311hc37eb10_0.conda hash: - md5: fe9a72b7910a5731be071c435d37830e - sha256: 933fd92d1e0b998b06121e48bc4c16c20fceb7ac1a7ca90cddb05469f442abfa - build: py312he70551f_1 + md5: 03f6bd3dfa06738a8b1d23c34bd80395 + sha256: 0434aa3f7dc0f9bb9ec31f91398d10a1f73fa23fa05fb5052f483a6a3a20d19d + build: py311hc37eb10_0 arch: x86_64 subdir: win-64 - build_number: 1 + build_number: 0 license: MIT license_family: MIT - size: 1457792 - timestamp: 1697791605607 + size: 1577312 + timestamp: 1695734312960 - platform: linux-64 name: pygments version: 2.16.1 @@ -24720,21 +24896,21 @@ package: manager: conda dependencies: - libffi >=3.4,<4.0a0 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - setuptools - url: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-10.0-py312h6b66c34_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-10.0-py311hf110eff_0.conda hash: - md5: fd7c92dee0538319e99bdcc0fd42ba47 - sha256: 04249ee7fb56bfa49999d285eeeb78ec8a946c7883955c2d4c327f5af5501327 - build: py312h6b66c34_0 + md5: d26705887703d13c655a6098516e06e2 + sha256: 031b8c48866f1f97a4a12d6a3ea0dc94cb6a735918871460b26f4779f5a01125 + build: py311hf110eff_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 466428 - timestamp: 1695560687687 + size: 465753 + timestamp: 1695560684232 - platform: osx-arm64 name: pyobjc-core version: '10.0' @@ -24742,22 +24918,22 @@ package: manager: conda dependencies: - libffi >=3.4,<4.0a0 - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 - setuptools - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-10.0-py312h6168cce_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-10.0-py311hb702dc4_0.conda hash: - md5: cf98c421b2a25646ba0690eaabd47cde - sha256: 61fe85421c029cb229743703c34663dc6bd1ea789a45d250cbf45ff44d41bab7 - build: py312h6168cce_0 + md5: 5c441ab09e2d9faf6e875ea9c446b445 + sha256: d3bb68f8da77bffad5fa690d2cc1aeb0be0608ed0b6e08a96d8fc3613f2e7135 + build: py311hb702dc4_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 473326 - timestamp: 1695560768775 + size: 473740 + timestamp: 1695560759149 - platform: osx-64 name: pyobjc-framework-cocoa version: '10.0' @@ -24766,20 +24942,20 @@ package: dependencies: - libffi >=3.4,<4.0a0 - pyobjc-core 10.0.* - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-10.0-py312h6b66c34_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-10.0-py311hf110eff_1.conda hash: - md5: ea11ff8f5de0a351043b2fb412ec890c - sha256: 928d72e7754f2671801bf8e080189ec4d30a36b4edac79d3ae4d07af8aecdd98 - build: py312h6b66c34_1 + md5: 8fb67274a648901045368717d6221aed + sha256: 54530c1b3bfc361e027adbd8f9d9a23e7c102c7f58c04a169da1457f82975724 + build: py311hf110eff_1 arch: x86_64 subdir: osx-64 build_number: 1 license: MIT license_family: MIT - size: 365872 - timestamp: 1695716725136 + size: 369966 + timestamp: 1695716863742 - platform: osx-arm64 name: pyobjc-framework-cocoa version: '10.0' @@ -24788,21 +24964,21 @@ package: dependencies: - libffi >=3.4,<4.0a0 - pyobjc-core 10.0.* - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-10.0-py312h6168cce_1.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-10.0-py311hb702dc4_1.conda hash: - md5: 9f644d7ce8ea243551387746b7ee6918 - sha256: e0e2d8103a5c8d575fef6dad97bec72a7cb06f3053982dc8328dca95672f6b18 - build: py312h6168cce_1 + md5: ee9430e4e9b69a6270c966bb7439c9a0 + sha256: 31a7542b8ced5cb3bc236be0b5777dab4bc0e57fbfc5423e9d0ae09ce8eae16c + build: py311hb702dc4_1 arch: aarch64 subdir: osx-arm64 build_number: 1 license: MIT license_family: MIT - size: 369650 - timestamp: 1695716991307 + size: 374853 + timestamp: 1695717128436 - platform: linux-64 name: pyogrio version: 0.7.2 @@ -24813,22 +24989,22 @@ package: - libgcc-ng >=12 - libgdal >=3.7.2,<3.8.0a0 - libstdcxx-ng >=12 - - numpy >=1.26.0,<2.0a0 + - numpy >=1.23.5,<2.0a0 - packaging - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.7.2-py312hc770a3a_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.7.2-py311hbac4ec9_0.conda hash: - md5: 3e1da726cc25f1005c0544af09f0ec3e - sha256: fa2ada5c57c160265f7856f7fbc1b19d7e600490f48ddae9b2c0b46b911f965c - build: py312hc770a3a_0 + md5: 32ece393a98d3c626b4df46b33f7e6ec + sha256: 52508f64db7cdd9fc25cfcb754d1297bfeef1440894dc2d78b5e8963315a733d + build: py311hbac4ec9_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 655552 - timestamp: 1698734508344 + size: 664732 + timestamp: 1698734484198 - platform: osx-64 name: pyogrio version: 0.7.2 @@ -24839,22 +25015,22 @@ package: - gdal - libcxx >=16.0.6 - libgdal >=3.7.2,<3.8.0a0 - - numpy >=1.26.0,<2.0a0 + - numpy >=1.23.5,<2.0a0 - packaging - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/pyogrio-0.7.2-py312h8683509_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/pyogrio-0.7.2-py311hf14a637_0.conda hash: - md5: 61c7d2e07f9e42af53c8fd1912b7924f - sha256: 85220c4a062382a0db46c134e4de4cfb6784ac9fd3bd58c92e50072f8ae18dda - build: py312h8683509_0 + md5: ee6ca8be940a54acc542d1b17dcde540 + sha256: 93b86410bafb37404e516f5c3606f00e6b5ce634458c6e7f367e53fcb9be8f8a + build: py311hf14a637_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 598303 - timestamp: 1698734652389 + size: 605372 + timestamp: 1698734743438 - platform: osx-arm64 name: pyogrio version: 0.7.2 @@ -24865,23 +25041,23 @@ package: - gdal - libcxx >=16.0.6 - libgdal >=3.7.2,<3.8.0a0 - - numpy >=1.26.0,<2.0a0 + - numpy >=1.23.5,<2.0a0 - packaging - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyogrio-0.7.2-py312h0aea21f_0.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyogrio-0.7.2-py311h45231e3_0.conda hash: - md5: 921fc2177aa488e424c05e2d6601e1b9 - sha256: f92bbee9dee5a51ab8243ff748dfe4774df2f554816134e4c55da552f2c6e629 - build: py312h0aea21f_0 + md5: b4b270c5ebd3d712e08d84cd6bfbb470 + sha256: 1d1cfb64c4fbb8b14c07036dea51632c4725f7be57f79078bd5c38a1bf5cad3b + build: py311h45231e3_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 594481 - timestamp: 1698734869641 + size: 602571 + timestamp: 1698734769702 - platform: win-64 name: pyogrio version: 0.7.2 @@ -24890,25 +25066,25 @@ package: dependencies: - gdal - libgdal >=3.7.2,<3.8.0a0 - - numpy >=1.26.0,<2.0a0 + - numpy >=1.23.5,<2.0a0 - packaging - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/pyogrio-0.7.2-py312h49f85ea_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/pyogrio-0.7.2-py311h03c997e_0.conda hash: - md5: 2318c526be2b57edf6bda6bdf7be9078 - sha256: 40dc1bfd5f5ba41a32ea999f00380a2b2c8b5906b712859b458faf8eeb35d32d - build: py312h49f85ea_0 + md5: db81e56ad811acd096a598b649a7b903 + sha256: 0d71c1a53f4852fca8f589d7c1b62090d11748fe8af95e8b659f4fa8036d3868 + build: py311h03c997e_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 811158 - timestamp: 1698734946689 + size: 822552 + timestamp: 1698735262251 - platform: linux-64 name: pyparsing version: 3.1.1 @@ -24998,20 +25174,20 @@ package: - certifi - libgcc-ng >=12 - proj >=9.3.0,<9.3.1.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312hb113631_4.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h1facc83_4.conda hash: - md5: fb0591cebf692e8e9829f23cfe0ee383 - sha256: 3b64c77aa430110cb3c6c4756295391bf25c9b9ddd4770127415ca8997a54c57 - build: py312hb113631_4 + md5: 75d504c6787edc377ebdba087a26a61b + sha256: 4eb94c421b5c635b770e5fbd2774cf1dd4570ad69baf1c248f978943df352896 + build: py311h1facc83_4 arch: x86_64 subdir: linux-64 build_number: 4 license: MIT license_family: MIT - size: 544184 - timestamp: 1699268227404 + size: 551801 + timestamp: 1699268320734 - platform: osx-64 name: pyproj version: 3.6.1 @@ -25020,20 +25196,20 @@ package: dependencies: - certifi - proj >=9.3.0,<9.3.1.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/pyproj-3.6.1-py312h2025670_4.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/pyproj-3.6.1-py311he36daed_4.conda hash: - md5: b2130ed2a4d54577ef35626423f3b232 - sha256: ada9be924df0f25d091b9a63594620431b0184c1594c0f9911b6048c3d8391a5 - build: py312h2025670_4 + md5: 28930c73c9c05d44d053620d44397b79 + sha256: d1d44bb257545006b128d30b4454c42e3f7cd133a1c53998afcf7253529f8263 + build: py311he36daed_4 arch: x86_64 subdir: osx-64 build_number: 4 license: MIT license_family: MIT - size: 482498 - timestamp: 1699268544482 + size: 488697 + timestamp: 1699268417495 - platform: osx-arm64 name: pyproj version: 3.6.1 @@ -25042,21 +25218,21 @@ package: dependencies: - certifi - proj >=9.3.0,<9.3.1.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyproj-3.6.1-py312h33684bb_4.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyproj-3.6.1-py311h20a9b75_4.conda hash: - md5: 4bfc7162ce21ab011422b2c7a80eb39b - sha256: 49da8ca06968a4f4fe6f480709cb3fd346f0cf59f6bb5815e5bbc46d4f46ba34 - build: py312h33684bb_4 + md5: c55fab7aa4252057e5e5efa90bd10cbe + sha256: 9d9923063e21aac5831b3dca820be3a824366f6871c839ea545f9b5e7358c844 + build: py311h20a9b75_4 arch: aarch64 subdir: osx-arm64 build_number: 4 license: MIT license_family: MIT - size: 487092 - timestamp: 1699268630477 + size: 493085 + timestamp: 1699268531169 - platform: win-64 name: pyproj version: 3.6.1 @@ -25065,23 +25241,23 @@ package: dependencies: - certifi - proj >=9.3.0,<9.3.1.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/pyproj-3.6.1-py312hb4fa1d0_4.conda + url: https://conda.anaconda.org/conda-forge/win-64/pyproj-3.6.1-py311h517f58c_4.conda hash: - md5: 721dac746d22ed44e6499ec24ce2b241 - sha256: 5edc111864819a114853c3a5e74a3208cac6ad6846b2601d6f72fe0a075a6e2a - build: py312hb4fa1d0_4 + md5: dae3c70f429ba572c615a54571904a55 + sha256: 084f0685616b53903238d941611cfdfe6ba49650307220a78ec9f7d9d89c0056 + build: py311h517f58c_4 arch: x86_64 subdir: win-64 build_number: 4 license: MIT license_family: MIT - size: 725079 - timestamp: 1699268689992 + size: 737448 + timestamp: 1699268741548 - platform: linux-64 name: pyqt version: 5.15.9 @@ -25090,49 +25266,49 @@ package: dependencies: - libgcc-ng >=12 - libstdcxx-ng >=12 - - pyqt5-sip 12.12.2 py312h30efb56_5 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - pyqt5-sip 12.12.2 py311hb755f60_5 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - qt-main >=5.15.8,<5.16.0a0 - sip >=6.7.11,<6.8.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py312h949fe66_5.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py311hf0fb5b6_5.conda hash: - md5: f6548a564e2d01b2a42020259503945b - sha256: 22ccc59c03872fc680be597a1783d2c77e6b2d16953e2ec67df91f073820bebe - build: py312h949fe66_5 + md5: ec7e45bc76d9d0b69a74a2075932b8e8 + sha256: 74fcdb8772c7eaf654b32922f77d9a8a1350b3446111c69a32ba4d15be74905a + build: py311hf0fb5b6_5 arch: x86_64 subdir: linux-64 build_number: 5 license: GPL-3.0-only license_family: GPL - size: 5263946 - timestamp: 1695421350577 + size: 5315719 + timestamp: 1695420475603 - platform: win-64 name: pyqt version: 5.15.9 category: main manager: conda dependencies: - - pyqt5-sip 12.12.2 py312h53d5487_5 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - pyqt5-sip 12.12.2 py311h12c1d0e_5 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - qt-main >=5.15.8,<5.16.0a0 - sip >=6.7.11,<6.8.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/pyqt-5.15.9-py312he09f080_5.conda + url: https://conda.anaconda.org/conda-forge/win-64/pyqt-5.15.9-py311h125bc19_5.conda hash: - md5: fb0861092c40e5d054e984abd88e5ea8 - sha256: c524cafaf98661f3bd5819494b41563fe5a851f6e44a7d08631c99f1dfb961c7 - build: py312he09f080_5 + md5: 29d36acae7ccbcb1f0ec4a39841b3197 + sha256: 4608b9caafc4fa16d887f5af08e1bafe95f4cb07596ca8f5af184bf5de8f2c4c + build: py311h125bc19_5 arch: x86_64 subdir: win-64 build_number: 5 license: GPL-3.0-only license_family: GPL - size: 3894083 - timestamp: 1695421066159 + size: 3906427 + timestamp: 1695422270104 - platform: linux-64 name: pyqt5-sip version: 12.12.2 @@ -25142,22 +25318,22 @@ package: - libgcc-ng >=12 - libstdcxx-ng >=12 - packaging - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - sip - toml - url: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py312h30efb56_5.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py311hb755f60_5.conda hash: - md5: 8a2a122dc4fe14d8cff38f1cf426381f - sha256: c7154e1933360881b99687d580c4b941fb0cc6ad9574762d409a28196ef5e240 - build: py312h30efb56_5 + md5: e4d262cc3600e70b505a6761d29f6207 + sha256: cf6936273d92e5213b085bfd9ce1a37defb46b317b6ee991f2712bf4a25b8456 + build: py311hb755f60_5 arch: x86_64 subdir: linux-64 build_number: 5 license: GPL-3.0-only license_family: GPL - size: 85809 - timestamp: 1695418132533 + size: 85162 + timestamp: 1695418076285 - platform: win-64 name: pyqt5-sip version: 12.12.2 @@ -25165,25 +25341,25 @@ package: manager: conda dependencies: - packaging - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - sip - toml - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.12.2-py312h53d5487_5.conda + url: https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.12.2-py311h12c1d0e_5.conda hash: - md5: dbaa69d84f7da6ac3ec20de2a9529a4b - sha256: 56242d5203e7231ee5bdd25df417dfc60a4f38e335f922f7e00f8c518ba87bd1 - build: py312h53d5487_5 + md5: 1b53a20f311bd99a1e55b31b7219106f + sha256: 7130493794e4c65f4e78258619a6ef9d022ba9f9b0f61e70d2973d9bc5f10e11 + build: py311h12c1d0e_5 arch: x86_64 subdir: win-64 build_number: 5 license: GPL-3.0-only license_family: GPL - size: 79366 - timestamp: 1695418564486 + size: 79724 + timestamp: 1695418442619 - platform: linux-64 name: pyrsistent version: 0.20.0 @@ -25191,84 +25367,84 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.20.0-py312h98912ed_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.20.0-py311h459d7ec_0.conda hash: - md5: e69fbe5174c917efb19b381471828f45 - sha256: 117fe1b5d36936931fae412536de3252b5068bd21ea48115ac52fe3adebf7a43 - build: py312h98912ed_0 + md5: f0bf96e61d58d4908a2f4ca68edde998 + sha256: d38086adb82427e87b68c5131fbbbaa70cd11fbdb9ed9b4e4ad7f327e0ad028a + build: py311h459d7ec_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 122192 - timestamp: 1698754175533 + size: 124761 + timestamp: 1698754143681 - platform: osx-64 name: pyrsistent version: 0.20.0 category: main manager: conda dependencies: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/pyrsistent-0.20.0-py312h41838bb_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/pyrsistent-0.20.0-py311he705e18_0.conda hash: - md5: 59941193db795a09283db7be3b3b3404 - sha256: 66756dd416d8e7b3dd97ca94d4e9a91abdfa48a964ca422457c56028b852e53b - build: py312h41838bb_0 + md5: f6b9d6f39bc3532e6ba449c06a47bbbc + sha256: 46f9daac23a122aaeb55628199e2519fe84dc221a497605e246a5be273631e7e + build: py311he705e18_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 119154 - timestamp: 1698753368561 + size: 122492 + timestamp: 1698754197864 - platform: osx-arm64 name: pyrsistent version: 0.20.0 category: main manager: conda dependencies: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyrsistent-0.20.0-py312he37b823_0.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyrsistent-0.20.0-py311h05b510d_0.conda hash: - md5: 453b7bdd7de542954a220dbc97feb7f7 - sha256: 2d7ec60072a9348540c0de552f5b23310326c4708d685a594e74bc4aac6cce34 - build: py312he37b823_0 + md5: 332853e9bff566a413f1dc1c3d6e19a7 + sha256: 724a65a47a32aca2967e7bbfb3178c6bf24bddba8fe0b3db8fa0efdaef754e69 + build: py311h05b510d_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 119500 - timestamp: 1698754330559 + size: 123370 + timestamp: 1698754370383 - platform: win-64 name: pyrsistent version: 0.20.0 category: main manager: conda dependencies: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/pyrsistent-0.20.0-py312he70551f_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/pyrsistent-0.20.0-py311ha68e1ae_0.conda hash: - md5: 9ee63772f931f505d4d54a6656a96db8 - sha256: 02f41fadf10e4d725991e56375ae92172ae915f7d6329f865cf4edac6f6618de - build: py312he70551f_0 + md5: 714feda9c353fa1ced16f11dc1fbf62a + sha256: 5851aea7ab4cf9d4535aeb2fd0941eddc7a9e9907e61857a1668a8ffb87c7791 + build: py311ha68e1ae_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 114503 - timestamp: 1698754544996 + size: 117865 + timestamp: 1698754395322 - platform: linux-64 name: pysnooper version: 1.2.0 @@ -25736,7 +25912,7 @@ package: timestamp: 1684499962909 - platform: linux-64 name: python - version: 3.12.0 + version: 3.11.6 category: main manager: conda dependencies: @@ -25755,22 +25931,22 @@ package: - tk >=8.6.13,<8.7.0a0 - tzdata - xz >=5.2.6,<6.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-hab00c5b_0_cpython.conda + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.6-hab00c5b_0_cpython.conda hash: - md5: 7f97faab5bebcc2580f4f299285323da - sha256: 5398ebae6a1ccbfd3f76361eac75f3ac071527a8072627c4bf9008c689034f48 + md5: b0dfbe2fcbfdb097d321bfd50ecddab1 + sha256: 84f13bd70cff5dcdaee19263b2d4291d5793856a718efc1b63a9cfa9eb6e2ca1 build: hab00c5b_0_cpython arch: x86_64 subdir: linux-64 build_number: 0 constrains: - - python_abi 3.12.* *_cp312 + - python_abi 3.11.* *_cp311 license: Python-2.0 - size: 32123473 - timestamp: 1696324522323 + size: 30720625 + timestamp: 1696331287478 - platform: osx-64 name: python - version: 3.12.0 + version: 3.11.6 category: main manager: conda dependencies: @@ -25785,22 +25961,22 @@ package: - tk >=8.6.13,<8.7.0a0 - tzdata - xz >=5.2.6,<6.0a0 - url: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.0-h30d4d87_0_cpython.conda + url: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.6-h30d4d87_0_cpython.conda hash: - md5: d11dc8f4551011fb6baa2865f1ead48f - sha256: 0a1ed3983acbd0528bef5216179e46170f024f4409032875b27865568fef46a1 + md5: 4d66c5fc01e9be526afe5d828d4de24d + sha256: e3ed331204fbeb03a9a2c2fa834e74997ad4f732ba2124b36f327d38b0cded93 build: h30d4d87_0_cpython arch: x86_64 subdir: osx-64 build_number: 0 constrains: - - python_abi 3.12.* *_cp312 + - python_abi 3.11.* *_cp311 license: Python-2.0 - size: 14529683 - timestamp: 1696323482650 + size: 15393521 + timestamp: 1696330855485 - platform: osx-arm64 name: python - version: 3.12.0 + version: 3.11.6 category: main manager: conda dependencies: @@ -25815,22 +25991,22 @@ package: - tk >=8.6.13,<8.7.0a0 - tzdata - xz >=5.2.6,<6.0a0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.0-h47c9636_0_cpython.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.6-h47c9636_0_cpython.conda hash: - md5: ed8ae98b1b510de68392971b9367d18c - sha256: eb66f8f249caa9d5a956c3a407f079e4779d652ebfc2a4b4f50dcea078e84fa8 + md5: 2271df1db9534f5cac7c2d0820c3359d + sha256: 77054fa9a8fc30f71a18f599ee2897905a3c515202b614fa0f793add7a04a155 build: h47c9636_0_cpython arch: aarch64 subdir: osx-arm64 build_number: 0 constrains: - - python_abi 3.12.* *_cp312 + - python_abi 3.11.* *_cp311 license: Python-2.0 - size: 13306758 - timestamp: 1696322682581 + size: 14626958 + timestamp: 1696329727433 - platform: win-64 name: python - version: 3.12.0 + version: 3.11.6 category: main manager: conda dependencies: @@ -25846,19 +26022,19 @@ package: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - xz >=5.2.6,<6.0a0 - url: https://conda.anaconda.org/conda-forge/win-64/python-3.12.0-h2628c8c_0_cpython.conda + url: https://conda.anaconda.org/conda-forge/win-64/python-3.11.6-h2628c8c_0_cpython.conda hash: - md5: defd5d375853a2caff36a19d2d81a28e - sha256: 90553586879bf328f2f9efb8d8faa958ecba822faf379f0a20c3461467b9b955 + md5: 80b761856b20383615a3fe8b1b13eef8 + sha256: 7fb38fda8296b2651ef727bb57603f0952c07fc533b172044395744a2641a00a build: h2628c8c_0_cpython arch: x86_64 subdir: win-64 build_number: 0 constrains: - - python_abi 3.12.* *_cp312 + - python_abi 3.11.* *_cp311 license: Python-2.0 - size: 16140836 - timestamp: 1696321871976 + size: 18121128 + timestamp: 1696329396864 - platform: linux-64 name: python-dateutil version: 2.8.2 @@ -26185,84 +26361,84 @@ package: timestamp: 1680081272948 - platform: linux-64 name: python_abi - version: '3.12' + version: '3.11' category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda + url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda hash: - md5: dccc2d142812964fcc6abdc97b672dff - sha256: 182a329de10a4165f6e8a3804caf751f918f6ea6176dd4e5abcdae1ed3095bf6 - build: 4_cp312 + md5: d786502c97404c94d7d58d258a445a65 + sha256: 0be3ac1bf852d64f553220c7e6457e9c047dfb7412da9d22fbaa67e60858b3cf + build: 4_cp311 arch: x86_64 subdir: linux-64 build_number: 4 constrains: - - python 3.12.* *_cpython + - python 3.11.* *_cpython license: BSD-3-Clause license_family: BSD size: 6385 - timestamp: 1695147396604 + timestamp: 1695147338551 - platform: osx-64 name: python_abi - version: '3.12' + version: '3.11' category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-4_cp312.conda + url: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.11-4_cp311.conda hash: - md5: 87201ac4314b911b74197e588cca3639 - sha256: 82c154d95c1637604671a02a89e72f1382e89a4269265a03506496bd928f6f14 - build: 4_cp312 + md5: fef7a52f0eca6bae9e8e2e255bc86394 + sha256: f56dfe2a57b3b27bad3f9527f943548e8b2526e949d9d6fc0a383020d9359afe + build: 4_cp311 arch: x86_64 subdir: osx-64 build_number: 4 constrains: - - python 3.12.* *_cpython + - python 3.11.* *_cpython license: BSD-3-Clause license_family: BSD - size: 6496 - timestamp: 1695147498447 + size: 6478 + timestamp: 1695147518012 - platform: osx-arm64 name: python_abi - version: '3.12' + version: '3.11' category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-4_cp312.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-4_cp311.conda hash: - md5: bbb3a02c78b2d8219d7213f76d644a2a - sha256: db25428e4f24f8693ffa39f3ff6dfbb8fd53bc298764b775b57edab1c697560f - build: 4_cp312 + md5: 8d3751bc73d3bbb66f216fa2331d5649 + sha256: 4837089c477b9b84fa38a17f453e6634e68237267211b27a8a2f5ccd847f4e55 + build: 4_cp311 arch: aarch64 subdir: osx-arm64 build_number: 4 constrains: - - python 3.12.* *_cpython + - python 3.11.* *_cpython license: BSD-3-Clause license_family: BSD - size: 6508 - timestamp: 1695147497048 + size: 6492 + timestamp: 1695147509940 - platform: win-64 name: python_abi - version: '3.12' + version: '3.11' category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-4_cp312.conda + url: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.11-4_cp311.conda hash: - md5: 17f4ccf6be9ded08bd0a376f489ac1a6 - sha256: 488f8519d04b48f59bd6fde21ebe2d7a527718ff28aac86a8b53aa63658bdef6 - build: 4_cp312 + md5: 70513332c71b56eace4ee6441e66c012 + sha256: 67c2aade3e2160642eec0742384e766b20c766055e3d99335681e3e05d88ed7b + build: 4_cp311 arch: x86_64 subdir: win-64 build_number: 4 constrains: - - python 3.12.* *_cpython + - python 3.11.* *_cpython license: BSD-3-Clause license_family: BSD - size: 6785 - timestamp: 1695147430513 + size: 6755 + timestamp: 1695147711935 - platform: linux-64 name: pytz version: 2023.3.post1 @@ -26349,67 +26525,67 @@ package: category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/pywin32-306-py312h53d5487_2.conda + url: https://conda.anaconda.org/conda-forge/win-64/pywin32-306-py311h12c1d0e_2.conda hash: - md5: f44c8f35c3f99eca30d6f5b68ddb0f42 - sha256: d0ff1cd887b626a125f8323760736d8fab496bf2a400e825cce55361e7631264 - build: py312h53d5487_2 + md5: 25df0fc55722ea1a94494f41302e2d1c + sha256: 79d942817bdaf384602113e5fcb9158dc45cae4044bed308918a5db97f141fdb + build: py311h12c1d0e_2 arch: x86_64 subdir: win-64 build_number: 2 license: PSF-2.0 license_family: PSF - size: 6127499 - timestamp: 1695974557413 + size: 6124285 + timestamp: 1695974706892 - platform: win-64 name: pywin32-ctypes version: 0.2.2 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/win-64/pywin32-ctypes-0.2.2-py312h2e8e312_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/win-64/pywin32-ctypes-0.2.2-py311h1ea47a8_1.conda hash: - md5: 93a37178188cd6521e5410763a18aaf4 - sha256: 238fffa911c4b78fd2153cfd1d0d376326379c98821da4b0cd12a3c6fbf3e9a6 - build: py312h2e8e312_1 + md5: e1270294a55b716f9b76900340e8fc82 + sha256: 75a80bda3a87ae9387e8860be7a5271a67846d8929fe8c99799ed40eb085130a + build: py311h1ea47a8_1 arch: x86_64 subdir: win-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 55871 - timestamp: 1695395307212 + size: 57331 + timestamp: 1695395348158 - platform: win-64 name: pywinpty version: 2.0.12 category: main manager: conda dependencies: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - winpty - url: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.12-py312h53d5487_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.12-py311h12c1d0e_0.conda hash: - md5: 9d6df56b1b0e5ba19160932e6bac356f - sha256: d7ed8a8a798a4c43581cefa370d91b90aff2a279d0256c4b04331a4e357c3625 - build: py312h53d5487_0 + md5: 6561b01d9a25270af769d3defd007cc5 + sha256: 611a59e4b078054ca8cf49e6fd18509345e5d3b1fc79d464dfe584d35a93e933 + build: py311h12c1d0e_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 219627 - timestamp: 1696657555549 + size: 220505 + timestamp: 1696657577118 - platform: linux-64 name: pyyaml version: 6.0.1 @@ -26417,88 +26593,88 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - yaml >=0.2.5,<0.3.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda hash: - md5: e3fd78d8d490af1d84763b9fe3f2e552 - sha256: 7f347a10a7121b08d79d21cd4f438c07c23479ea0c74dfb89d6dc416f791bb7f - build: py312h98912ed_1 + md5: 52719a74ad130de8fb5d047dc91f247a + sha256: 28729ef1ffa7f6f9dfd54345a47c7faac5d34296d66a2b9891fb147f4efe1348 + build: py311h459d7ec_1 arch: x86_64 subdir: linux-64 build_number: 1 license: MIT license_family: MIT - size: 196583 - timestamp: 1695373632212 + size: 200626 + timestamp: 1695373818537 - platform: osx-64 name: pyyaml version: 6.0.1 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - yaml >=0.2.5,<0.3.0a0 - url: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.1-py312h104f124_1.conda + url: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.1-py311h2725bcf_1.conda hash: - md5: 260ed90aaf06061edabd7209638cf03b - sha256: 04aa180782cb675b960c0bf4aad439b4a7a08553c6af74d0b8e5df9a0c7cc4f4 - build: py312h104f124_1 + md5: 9283f991b5e5856a99f8aabba9927df5 + sha256: 8ce2ba443414170a2570514d0ce6d03625a847e91af9763d48dc58c338e6f7f3 + build: py311h2725bcf_1 arch: x86_64 subdir: osx-64 build_number: 1 license: MIT license_family: MIT - size: 185636 - timestamp: 1695373742454 + size: 188606 + timestamp: 1695373840022 - platform: osx-arm64 name: pyyaml version: 6.0.1 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 - yaml >=0.2.5,<0.3.0a0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.1-py312h02f2b3b_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.1-py311heffc1b2_1.conda hash: - md5: a0c843e52a1c4422d8657dd76e9eb994 - sha256: b6b4027b89c17b9bbd8089aec3e44bc29f802a7d5668d5a75b5358d7ed9705ca - build: py312h02f2b3b_1 + md5: d310bfbb8230b9175c0cbc10189ad804 + sha256: b155f5c27f0e2951256774628c4b91fdeee3267018eef29897a74e3d1316c8b0 + build: py311heffc1b2_1 arch: aarch64 subdir: osx-arm64 build_number: 1 license: MIT license_family: MIT - size: 182705 - timestamp: 1695373895409 + size: 187795 + timestamp: 1695373829282 - platform: win-64 name: pyyaml version: 6.0.1 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - yaml >=0.2.5,<0.3.0a0 - url: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.1-py312he70551f_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.1-py311ha68e1ae_1.conda hash: - md5: f91e0baa89ba21166916624ba7bfb422 - sha256: a72fa8152791b4738432f270e70b3a9a4d583ef059a78aa1c62f4b4ab7b15494 - build: py312he70551f_1 + md5: 2b4128962cd665153e946f2a88667a3b + sha256: 4fb0770fc70381a8ab3ced33413ad9dc5e82d4c535b593edd580113ce8760298 + build: py311ha68e1ae_1 arch: x86_64 subdir: win-64 build_number: 1 license: MIT license_family: MIT - size: 167932 - timestamp: 1695374097139 + size: 175469 + timestamp: 1695374086205 - platform: linux-64 name: pyzmq version: 25.1.1 @@ -26508,20 +26684,20 @@ package: - libgcc-ng >=12 - libsodium >=1.0.18,<1.0.19.0a0 - libstdcxx-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - zeromq >=4.3.5,<4.4.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.1-py312h886d080_2.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.1-py311h34ded2d_2.conda hash: - md5: b07238948c49747387d699dd5dd596df - sha256: 9e64958131e6f2d2d3739604279befba4b1a25ecde6288f34a172ee1d4742c5b - build: py312h886d080_2 + md5: ea365280db99687905b4d76cf6a3568c + sha256: a5ed6592f32b0caf3883a2f863e8a6258845310d4eebeab2eaf1c5abed04d6b8 + build: py311h34ded2d_2 arch: x86_64 subdir: linux-64 build_number: 2 license: BSD-3-Clause AND LGPL-3.0-or-later - size: 528805 - timestamp: 1698062675674 + size: 538751 + timestamp: 1698062661477 - platform: osx-64 name: pyzmq version: 25.1.1 @@ -26529,20 +26705,20 @@ package: manager: conda dependencies: - libsodium >=1.0.18,<1.0.19.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - zeromq >=4.3.5,<4.4.0a0 - url: https://conda.anaconda.org/conda-forge/osx-64/pyzmq-25.1.1-py312hb81df1d_2.conda + url: https://conda.anaconda.org/conda-forge/osx-64/pyzmq-25.1.1-py311he3804a1_2.conda hash: - md5: 5281d541e2d1e91ba1737753c6e92ce3 - sha256: 5731a8fd358385db210d9f8d50e24ff3eb43d79fb8df4e6d23f76eb9d9ea4047 - build: py312hb81df1d_2 + md5: 9b1ea037c51fcdb06bd2d95804270860 + sha256: 7a9af16e04752c50675ca99ab06888aaf8305efb5d292f62f7268ad911c967f4 + build: py311he3804a1_2 arch: x86_64 subdir: osx-64 build_number: 2 license: BSD-3-Clause AND LGPL-3.0-or-later - size: 493208 - timestamp: 1698062750981 + size: 498175 + timestamp: 1698062892008 - platform: osx-arm64 name: pyzmq version: 25.1.1 @@ -26550,21 +26726,21 @@ package: manager: conda dependencies: - libsodium >=1.0.18,<1.0.19.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 - zeromq >=4.3.5,<4.4.0a0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-25.1.1-py312h2105c20_2.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-25.1.1-py311he9c0408_2.conda hash: - md5: 94728e562dbf6815a72be38c2eea1d31 - sha256: 3ff6e9f69e76f165492a4215526bf879ec021603e7de2b86431162b230d196e3 - build: py312h2105c20_2 + md5: 51b7458a36011c4982261478fcc62026 + sha256: 03b78fe912c02547b284bc3404194bb4c1d9a2680e4b46f45c131a0d13d10b48 + build: py311he9c0408_2 arch: aarch64 subdir: osx-arm64 build_number: 2 license: BSD-3-Clause AND LGPL-3.0-or-later - size: 499382 - timestamp: 1698062889773 + size: 507069 + timestamp: 1698062904960 - platform: win-64 name: pyzmq version: 25.1.1 @@ -26572,23 +26748,23 @@ package: manager: conda dependencies: - libsodium >=1.0.18,<1.0.19.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - zeromq >=4.3.5,<4.3.6.0a0 - url: https://conda.anaconda.org/conda-forge/win-64/pyzmq-25.1.1-py312h1ac6f91_2.conda + url: https://conda.anaconda.org/conda-forge/win-64/pyzmq-25.1.1-py311h9250fbb_2.conda hash: - md5: b4c52a487df561ae97c8c67a8b1d5b37 - sha256: 1ec5be6b13227604e4395d2187f52cf6ad803ab7feb8baa24afce65af9e8165e - build: py312h1ac6f91_2 + md5: e2e285b5528875d9008c0f1527f8436e + sha256: 11e347a6756cef1454322de743fc1c7aff634a5d0161dd57261c5c610cae2a40 + build: py311h9250fbb_2 arch: x86_64 subdir: win-64 build_number: 2 license: BSD-3-Clause AND LGPL-3.0-or-later - size: 483243 - timestamp: 1698063163763 + size: 491918 + timestamp: 1698063170497 - platform: linux-64 name: qt-main version: 5.15.8 @@ -27663,20 +27839,20 @@ package: manager: conda dependencies: - libspatialindex >=1.9.3,<1.9.4.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/rtree-1.1.0-py312hb0aae1a_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/rtree-1.1.0-py311h3bb2b0f_0.conda hash: - md5: ec71270f74810599a7c05cd0ed9b4e63 - sha256: 7144dae2a033196f2a9414e8ed38ef05ed47e3f8a86ab0742e5ddeaa2fb40d0e - build: py312hb0aae1a_0 + md5: 341bbb97186f23835d2d0456d96c5aba + sha256: 555d5b653283380ed397f4bbfa47ab7c62c2173ca06f9dadc5eb0b1bd99c95a7 + build: py311h3bb2b0f_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 61276 - timestamp: 1697503351382 + size: 62552 + timestamp: 1697503426564 - platform: osx-64 name: rtree version: 1.1.0 @@ -27684,20 +27860,20 @@ package: manager: conda dependencies: - libspatialindex >=1.9.3,<1.9.4.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/rtree-1.1.0-py312h8974cf7_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/rtree-1.1.0-py311hbc1f44b_0.conda hash: - md5: 9ba4d0650108193429a3f81d9529404f - sha256: 2c827a3fe65641790946f170442a8bf977911acceab3c7a9a7368fe645083f8f - build: py312h8974cf7_0 + md5: 4cf922188989b372f053537cea29a5ec + sha256: 7421188ce73f9c1cfe4ba8d476570f04994c42e7a33a4ffa52dcd325f58d577c + build: py311hbc1f44b_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 62310 - timestamp: 1697503644928 + size: 62672 + timestamp: 1697503665618 - platform: osx-arm64 name: rtree version: 1.1.0 @@ -27705,21 +27881,21 @@ package: manager: conda dependencies: - libspatialindex >=1.9.3,<1.9.4.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/rtree-1.1.0-py312h22f7183_0.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/rtree-1.1.0-py311hd698ff7_0.conda hash: - md5: 83f1320920b41cc90bccd8d43db3bec8 - sha256: 8400720fac52072aab57d89879d864d9f4f56f2f6ac1f8adcae724792e7fe29e - build: py312h22f7183_0 + md5: 957242aceae3dcf8049feabf99c18814 + sha256: 3bfa6f07272e4a1311433097e3e2c071926f476b9c8bd38e9520053479fe3b14 + build: py311hd698ff7_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 62001 - timestamp: 1697503661629 + size: 63362 + timestamp: 1697503597550 - platform: win-64 name: rtree version: 1.1.0 @@ -27727,20 +27903,20 @@ package: manager: conda dependencies: - libspatialindex >=1.9.3,<1.9.4.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/win-64/rtree-1.1.0-py312h72b5f30_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/win-64/rtree-1.1.0-py311hcacb13a_0.conda hash: - md5: c685acd130484537c08301b80077b32b - sha256: 66a76f830964f5b5d36c14ce4318dc6aff6c048224a21595f83740e013519dbd - build: py312h72b5f30_0 + md5: d02d32b82431af0097bb0bce78720ad8 + sha256: 97db7dd5cc1b36379468084796bbd49c7428f9f81677294f940a364505f6272c + build: py311hcacb13a_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 62578 - timestamp: 1697503653077 + size: 63487 + timestamp: 1697503620756 - platform: linux-64 name: ruamel.yaml version: 0.18.5 @@ -27748,92 +27924,92 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ruamel.yaml.clib >=0.1.2 - setuptools - url: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.5-py312h98912ed_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.5-py311h459d7ec_0.conda hash: - md5: 631213fb6dee32d9004779c5b6de3c49 - sha256: 4ee323188e58fd2672f1d04c5dc184f3c5f0192bb6510856aa99031f9c0b9e3e - build: py312h98912ed_0 + md5: 1101ec27377f8e45d8431a5f21d744f1 + sha256: c92e7bbb1d02286bcd3d3292208006f796ae45df82af3deec940339493415c04 + build: py311h459d7ec_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 271907 - timestamp: 1699007513506 + size: 277088 + timestamp: 1699007549765 - platform: osx-64 name: ruamel.yaml version: 0.18.5 category: main manager: conda dependencies: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ruamel.yaml.clib >=0.1.2 - setuptools - url: https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml-0.18.5-py312h41838bb_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml-0.18.5-py311he705e18_0.conda hash: - md5: 0dcf9f224125a95634f9f29dca9fd7a8 - sha256: 458073e1940f3b2dc50a0d75dd05aeef977bf290671892817094a2a6d91cd98c - build: py312h41838bb_0 + md5: b8e2686abf5f980d52579b28441953f9 + sha256: afdaab0d0f5a288b31450c3da260381da5916c61f122a0b3f5dea76d1ca863bb + build: py311he705e18_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 272434 - timestamp: 1699007799926 + size: 278639 + timestamp: 1699007661916 - platform: osx-arm64 name: ruamel.yaml version: 0.18.5 category: main manager: conda dependencies: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 - ruamel.yaml.clib >=0.1.2 - setuptools - url: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml-0.18.5-py312he37b823_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml-0.18.5-py311h05b510d_0.conda hash: - md5: bbda05ac095a271419f91ef133eddac3 - sha256: 8f4744a698de42cfec04afe6e2246a07bdf7098366b1626e7c7aed24778b84e8 - build: py312he37b823_0 + md5: c51813780ac52059c1e472546022e7a5 + sha256: 33c770e213c233e80b48256d17ce0e7bfe504576f2778307826cf1fd1db058d6 + build: py311h05b510d_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 272570 - timestamp: 1699007959545 + size: 277914 + timestamp: 1699007830042 - platform: win-64 name: ruamel.yaml version: 0.18.5 category: main manager: conda dependencies: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ruamel.yaml.clib >=0.1.2 - setuptools - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml-0.18.5-py312he70551f_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml-0.18.5-py311ha68e1ae_0.conda hash: - md5: e4d62d455007c8ffc251431a52bd9319 - sha256: 66c6aaa56b8fe507861741ce3152ac973429a12eb533ebe163a6e2b5c3290929 - build: py312he70551f_0 + md5: c21c5fda85131862a99f9550aea3bfca + sha256: 1714147dd16e2340a43cb616adfb68c408237e4f8d1b0d3cb1da0c302715f2be + build: py311ha68e1ae_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 270789 - timestamp: 1699007702255 + size: 277863 + timestamp: 1699007733106 - platform: linux-64 name: ruamel.yaml.clib version: 0.2.7 @@ -27841,84 +28017,84 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py312h98912ed_2.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py311h459d7ec_2.conda hash: - md5: 17591efb6a03e1dea6567cb15c619d1c - sha256: 79c06eba98ed5f2ef44b41140c0eba5bf263ddc556dce57017a9c748d377e3d0 - build: py312h98912ed_2 + md5: 56bc3fe5180c0b23e05c7a5708153ac7 + sha256: cfd060725d39f136618547ecb8a593d82d460725fb447849815c26418c360c35 + build: py311h459d7ec_2 arch: x86_64 subdir: linux-64 build_number: 2 license: MIT license_family: MIT - size: 134659 - timestamp: 1695996979046 + size: 134322 + timestamp: 1695997009048 - platform: osx-64 name: ruamel.yaml.clib version: 0.2.7 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml.clib-0.2.7-py312h104f124_2.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml.clib-0.2.7-py311h2725bcf_2.conda hash: - md5: 07c5b620686d2fa9629374e8b4cf29ec - sha256: 22ff425b0de25ff28920174acf600732dede397ba2a5dd0953a7ef8b1c8308d2 - build: py312h104f124_2 + md5: cd953388469a8890dda83779d6ef6ffd + sha256: b529c2caf941ac1050d160f0b9c53202d634954dd7cc7f1469731e1bb6f2cccc + build: py311h2725bcf_2 arch: x86_64 subdir: osx-64 build_number: 2 license: MIT license_family: MIT - size: 118792 - timestamp: 1695997338028 + size: 117447 + timestamp: 1695997294294 - platform: osx-arm64 name: ruamel.yaml.clib version: 0.2.7 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.7-py312h02f2b3b_2.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.7-py311heffc1b2_2.conda hash: - md5: 39478f82c46bd2fa4e974ef11cf2c0ae - sha256: e3b93abf4255fe1880435328e523b7147c5cf5859c731f643e00e0e598bb891c - build: py312h02f2b3b_2 + md5: c167b931a12c70f9c1fbf927da7ff0be + sha256: 0c2d1a27afa009d3630b5944ac5fd10df95b92ab5c91c7390ddfc93ee5488349 + build: py311heffc1b2_2 arch: aarch64 subdir: osx-arm64 build_number: 2 license: MIT license_family: MIT - size: 113319 - timestamp: 1695997421799 + size: 113666 + timestamp: 1695997356455 - platform: win-64 name: ruamel.yaml.clib version: 0.2.7 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml.clib-0.2.7-py312he70551f_2.conda + url: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml.clib-0.2.7-py311ha68e1ae_2.conda hash: - md5: ef47a90d50c6d69c9697038f9c01a6cb - sha256: 27d45cc83b3f563d0e3f613225cce046781cef758127b9edd10e5e4503972413 - build: py312he70551f_2 + md5: a19abbda796a7003308e1cba9b0c9905 + sha256: 04d216c2f45f39987b0eb046a68702849668fb01c411de42af264809b838c3b9 + build: py311ha68e1ae_2 arch: x86_64 subdir: win-64 build_number: 2 license: MIT license_family: MIT - size: 95111 - timestamp: 1695997251086 + size: 97998 + timestamp: 1695997456870 - platform: linux-64 name: ruff version: 0.1.5 @@ -27927,20 +28103,20 @@ package: dependencies: - libgcc-ng >=12 - libstdcxx-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.1.5-py312h9118e91_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.1.5-py311h7145743_0.conda hash: - md5: 2e2cb56137053970a885157905d6e9cf - sha256: b775431fbb2da9dcf3c4de070738565c3dda0d0cb84bb4e5d7892c81eaa4924b - build: py312h9118e91_0 + md5: fb689551fcdea23b9edbe3aefea691b0 + sha256: 957be00fcff45d338024a7623f4016de3e59265f005e1216c5b2d178f82a1ace + build: py311h7145743_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 4832209 - timestamp: 1699507697400 + size: 4837715 + timestamp: 1699507498365 - platform: osx-64 name: ruff version: 0.1.5 @@ -27949,20 +28125,20 @@ package: dependencies: - __osx >=10.9 - libcxx >=16.0.6 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.1.5-py312hde94f14_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.1.5-py311hec6fdf1_0.conda hash: - md5: 2b74e5920fd7a4a9cee52f930a5d46b1 - sha256: ac50dea60681c922487a57c2991c0c27222c7464c2abd6894915c278bcc2dbe4 - build: py312hde94f14_0 + md5: ff29608b152cbd76c422ad3f97004876 + sha256: ec15e79d5131afdd4592f7c1a878df0b7a8e022d5b644ab9fcb8d431915b4082 + build: py311hec6fdf1_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 4587294 - timestamp: 1699508051210 + size: 4589293 + timestamp: 1699508029856 - platform: osx-arm64 name: ruff version: 0.1.5 @@ -27971,44 +28147,44 @@ package: dependencies: - __osx >=10.9 - libcxx >=16.0.6 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.1.5-py312h6267552_0.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.1.5-py311h6fc163c_0.conda hash: - md5: 2cdcc0e70bac01459ea476f601f88973 - sha256: 0eb116cc02b720ebd128c921086255a21709a9c702892ebbfa0a9216539bdf2b - build: py312h6267552_0 + md5: 24659c389d8601c8076fb9401f3c59ed + sha256: a496efea6c4723c7a0e9ef11f38c8237c913ff3b6911085f1793885d102101a5 + build: py311h6fc163c_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 4352351 - timestamp: 1699508088217 + size: 4352507 + timestamp: 1699508211540 - platform: win-64 name: ruff version: 0.1.5 category: main manager: conda dependencies: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/ruff-0.1.5-py312h60fbdae_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/ruff-0.1.5-py311hc14472d_0.conda hash: - md5: 0c9a42fcc3a43981469e40943c54cf61 - sha256: 3f71f687e38c4c03a656afbe81e009aa69b7a86678ba05d7f5bb54e9536bd699 - build: py312h60fbdae_0 + md5: d76d37dff16a88d763749ecbbe01b53d + sha256: fe3d7b09bb772e45e4a4a31274f4feca0ec4b165560b49f64ac1ff7f143c35be + build: py311hc14472d_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 4746907 - timestamp: 1699508620199 + size: 4748020 + timestamp: 1699508487043 - platform: linux-64 name: s2n version: 1.3.56 @@ -28039,23 +28215,23 @@ package: - joblib >=1.1.1 - libgcc-ng >=12 - libstdcxx-ng >=12 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - scipy - threadpoolctl >=2.0.0 - url: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.3.2-py312h394d371_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.3.2-py311hc009520_1.conda hash: - md5: 2eefaf33e0b88b81c470ef13e8846b12 - sha256: d322f190ee65842c36b7d67f14bc1bd5e96a6bbbc9ad98fd4185127b5dcb9db8 - build: py312h394d371_1 + md5: 6b92d3d0680eae9d1d9860a721f7fb51 + sha256: 638253cba17e44081674b2dd7bee2025c202e91b653182da511ca57de942689d + build: py311hc009520_1 arch: x86_64 subdir: linux-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 9472762 - timestamp: 1698225320408 + size: 9575097 + timestamp: 1698225284583 - platform: osx-64 name: scikit-learn version: 1.3.2 @@ -28066,23 +28242,23 @@ package: - joblib >=1.1.1 - libcxx >=16.0.6 - llvm-openmp >=16.0.6 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - scipy - threadpoolctl >=2.0.0 - url: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.3.2-py312h5e37b4f_1.conda + url: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.3.2-py311h66081b9_1.conda hash: - md5: db81a28a7ac776fcad4ba25ea70330a0 - sha256: 529f7f0d93ea23b378f7e3732ae3488a428ea0fbb49452a88ab791eb30559f9e - build: py312h5e37b4f_1 + md5: a7053f3e86b6b9139593a027c54e3097 + sha256: 0b4aee092d4689d07aa95ed1d1071eeb74a5e011d34bc9ebd9b27e9b2166db7e + build: py311h66081b9_1 arch: x86_64 subdir: osx-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 8548276 - timestamp: 1698225745377 + size: 8805008 + timestamp: 1698226061893 - platform: osx-arm64 name: scikit-learn version: 1.3.2 @@ -28093,24 +28269,24 @@ package: - joblib >=1.1.1 - libcxx >=16.0.6 - llvm-openmp >=16.0.6 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 - scipy - threadpoolctl >=2.0.0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.3.2-py312h6f466fd_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.3.2-py311ha25ca4d_1.conda hash: - md5: 782e2eb59822c1a18d43fd19b1f54d6a - sha256: e8a985ee3482db446a9f7403a0c39e113ef7396b1eb92e0812923b38ab5715e4 - build: py312h6f466fd_1 + md5: dea73952c589de24ec577c41fac181c5 + sha256: 589bca23648b8969b16a36f87d7114a12fbe88d665cde32427c7126e5b34e63c + build: py311ha25ca4d_1 arch: aarch64 subdir: osx-arm64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 8613837 - timestamp: 1698226181627 + size: 8840075 + timestamp: 1698225663288 - platform: win-64 name: scikit-learn version: 1.3.2 @@ -28118,26 +28294,26 @@ package: manager: conda dependencies: - joblib >=1.1.1 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - scipy - threadpoolctl >=2.0.0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.3.2-py312hcacafb1_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.3.2-py311h142b183_1.conda hash: - md5: 163f0f1d3cd69264f15d827135cdc0f9 - sha256: d04023630f6fd5e6910a073a938f1d589936637782fd244f003d9088cf953259 - build: py312hcacafb1_1 + md5: a24599e0d80cf658b7d942c82907caef + sha256: 55893f59edf4bc55c6911b82207dc3d0052e28ebbef94ed0643f887a2c231fd7 + build: py311h142b183_1 arch: x86_64 subdir: win-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 8151994 - timestamp: 1698225934981 + size: 8328461 + timestamp: 1698225997015 - platform: linux-64 name: scipy version: 1.11.3 @@ -28151,22 +28327,22 @@ package: - libgfortran5 >=12.3.0 - liblapack >=3.9.0,<4.0a0 - libstdcxx-ng >=12 - - numpy >=1.26.0,<1.28 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.3-py312heda63a1_1.conda + - numpy >=1.23.5,<1.28 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.3-py311h64a7726_1.conda hash: - md5: c89108be4deb842ced096623aa932fd0 - sha256: f913f07ce861be04e05097fe962682d43fdc891f069f24fc2a2d7f916d849225 - build: py312heda63a1_1 + md5: e4b4d3b764e2d029477d0db88248a8b5 + sha256: 13ea70afe49a3c92fb9b82a6efcfa23a05ca8f24ec2dff22597d651e0e2b4767 + build: py311h64a7726_1 arch: x86_64 subdir: linux-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 15961550 - timestamp: 1696468446611 + size: 16002963 + timestamp: 1696468652023 - platform: osx-64 name: scipy version: 1.11.3 @@ -28180,22 +28356,22 @@ package: - libgfortran5 >=12.3.0 - libgfortran5 >=13.2.0 - liblapack >=3.9.0,<4.0a0 - - numpy >=1.26.0,<1.28 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.11.3-py312h2c2f0bb_1.conda + - numpy >=1.23.5,<1.28 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.11.3-py311h16c3c4d_1.conda hash: - md5: 0671c0db4a12dd2c176db00022a223fb - sha256: 58ed25d047733f2cdce791f75a8652bf4830d9e9421ff3cf35fc30924c5ab2e0 - build: py312h2c2f0bb_1 + md5: 77164acef9bc09545bd3324a8f986be5 + sha256: 78270d60ea00482b4f64a4b2d5d4e432f48125f6b76780e2094c8363ad48b611 + build: py311h16c3c4d_1 arch: x86_64 subdir: osx-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 15646530 - timestamp: 1696469066773 + size: 16243071 + timestamp: 1696469112175 - platform: osx-arm64 name: scipy version: 1.11.3 @@ -28209,23 +28385,23 @@ package: - libgfortran5 >=12.3.0 - libgfortran5 >=13.2.0 - liblapack >=3.9.0,<4.0a0 - - numpy >=1.26.0,<1.28 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.11.3-py312h44883eb_1.conda + - numpy >=1.23.5,<1.28 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.11.3-py311h93d07a4_1.conda hash: - md5: 09dc8bfd193d4f0cdf2f5ce619e6ba66 - sha256: a1de458f94a9aecb79620ada349c7530135b4616a378684b1bd423d46170eb10 - build: py312h44883eb_1 + md5: 1c687552b288a801a7851166f2494768 + sha256: 6347f47c02eef02afe1e5534c88269f73b2da28cdff8c826b210e529b8bd1f07 + build: py311h93d07a4_1 arch: aarch64 subdir: osx-arm64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 14831141 - timestamp: 1696469685812 + size: 15110473 + timestamp: 1696469388055 - platform: win-64 name: scipy version: 1.11.3 @@ -28235,25 +28411,25 @@ package: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 - - numpy >=1.26.0,<1.28 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - numpy >=1.23.5,<1.28 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/scipy-1.11.3-py312h8753938_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/scipy-1.11.3-py311h0b4df5a_1.conda hash: - md5: b70c6ed21d69694aac4316e77ed67f3b - sha256: 54a3d553d791fe63bed3ed2c3b68f5ba5dc7559f11185eac1af0c3b8439a117c - build: py312h8753938_1 + md5: 67910f5db4ee7b8bbf39250c167d3a34 + sha256: 1fc5493e5c6706c3e1a925090478f1c8306f493602cb8a4d935de8aa361be36c + build: py311h0b4df5a_1 arch: x86_64 subdir: win-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 14655959 - timestamp: 1696469803046 + size: 14873188 + timestamp: 1696469599650 - platform: linux-64 name: secretstorage version: 3.3.3 @@ -28263,20 +28439,20 @@ package: - cryptography - dbus - jeepney >=0.6 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py312h7900ff3_2.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py311h38be061_2.conda hash: - md5: 39067833cbb620066d492f8bd6f11dbf - sha256: 0479e3f8c8e90049a6d92d4c7e67916c6d6cdafd11a1a31c54c785cce44aeb20 - build: py312h7900ff3_2 + md5: 30a57eaa8e72cb0c2c84d6d7db32010c + sha256: 45e7d85a3663993e8bffdb7c6040561923c848e3262228b163042663caa4485e + build: py311h38be061_2 arch: x86_64 subdir: linux-64 build_number: 2 license: BSD-3-Clause license_family: BSD - size: 31766 - timestamp: 1695551875966 + size: 32421 + timestamp: 1695551942931 - platform: linux-64 name: semver version: 2.13.0 @@ -28532,21 +28708,21 @@ package: dependencies: - geos >=3.12.0,<3.12.1.0a0 - libgcc-ng >=12 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py312h1cd15a4_0.conda + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311he06c224_0.conda hash: - md5: 30c8f6b56ed67287c18ce608113602bc - sha256: 33bc9471da3e7cdd7f2cbd8954486866495136b53a45915b7797e6b9bef26c55 - build: py312h1cd15a4_0 + md5: c90e2469d7512f3bba893533a82d7a02 + sha256: 2a02e516c57a2122cf9acaec54b75a821ad5f959a7702b17cb8df2c3fe31ef20 + build: py311he06c224_0 arch: x86_64 subdir: linux-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 564253 - timestamp: 1697191786076 + size: 574587 + timestamp: 1697191790758 - platform: osx-64 name: shapely version: 2.0.2 @@ -28554,21 +28730,21 @@ package: manager: conda dependencies: - geos >=3.12.0,<3.12.1.0a0 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.2-py312hbe61eff_0.conda + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.2-py311h359915d_0.conda hash: - md5: 00dec9e62c5a7c43a29506edb6048689 - sha256: 83078c15984a67a5901f24aab84ebc3a4848d27ea30b8a4084880c3c4acd1cb2 - build: py312hbe61eff_0 + md5: 5569c5122a7938835a8a7c498aaded67 + sha256: 240cca365e75d5f5aa09ee62c95813288d3652f666a1ab227015195316b8f9fe + build: py311h359915d_0 arch: x86_64 subdir: osx-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 533274 - timestamp: 1697191765372 + size: 543102 + timestamp: 1697191795638 - platform: osx-arm64 name: shapely version: 2.0.2 @@ -28576,22 +28752,22 @@ package: manager: conda dependencies: - geos >=3.12.0,<3.12.1.0a0 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.2-py312hf679d78_0.conda + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.2-py311h4826c84_0.conda hash: - md5: f0074bdb7085b1f1626a986496fc5af6 - sha256: b32a86631919a3c7cd5c17b74e3f70ad4913efd4aab648519f512f63b62c9229 - build: py312hf679d78_0 + md5: a9de7ff7899a7067646aa7053eb5737c + sha256: 3d08d9553565704fef53d0c9cb901bb2f40337f0a590b3ea714d363a34ee2250 + build: py311h4826c84_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 527635 - timestamp: 1697191764696 + size: 541397 + timestamp: 1697191908684 - platform: win-64 name: shapely version: 2.0.2 @@ -28599,24 +28775,24 @@ package: manager: conda dependencies: - geos >=3.12.0,<3.12.1.0a0 - - numpy >=1.26.0,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/shapely-2.0.2-py312h92c3dd1_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/shapely-2.0.2-py311h72efec2_0.conda hash: - md5: 1daded226f8faf6053dde92c192b7ab5 - sha256: 9f527a8507cd9425c64776775a79e584f27c59c38216260b34695ce31db640f2 - build: py312h92c3dd1_0 + md5: 617eaf53ee620cdb0f3b5928c054e6af + sha256: 23adfdb0f4911fd58845485d318e647161b8c2b316c5c0f40ca40295d09e96e3 + build: py311h72efec2_0 arch: x86_64 subdir: win-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 532148 - timestamp: 1697191979002 + size: 543280 + timestamp: 1697191896614 - platform: linux-64 name: sip version: 6.7.12 @@ -28627,21 +28803,21 @@ package: - libstdcxx-ng >=12 - packaging - ply - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tomli - url: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py312h30efb56_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py311hb755f60_0.conda hash: - md5: 32633871002ee9902f747d2236e0d122 - sha256: baf6e63e213bb11e369a51e511b44217546a11f8470242bbaa8fac45cb4a39c3 - build: py312h30efb56_0 + md5: 02336abab4cb5dd794010ef53c54bd09 + sha256: 71a0ee22522b232bf50d4d03d012e53cd5d1251d09dffc1c72d7c33a1086fe6f + build: py311hb755f60_0 arch: x86_64 subdir: linux-64 build_number: 0 license: GPL-3.0-only license_family: GPL - size: 576283 - timestamp: 1697300599736 + size: 585197 + timestamp: 1697300605264 - platform: win-64 name: sip version: 6.7.12 @@ -28650,24 +28826,24 @@ package: dependencies: - packaging - ply - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tomli - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/sip-6.7.12-py312h53d5487_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/sip-6.7.12-py311h12c1d0e_0.conda hash: - md5: a5d3d1363d6d0b4827d6b940414a5b76 - sha256: 2347c2e7d5e7282b991d5d4f7448d9e6fe8c26e5d6df0d09f0e60b11b7d19586 - build: py312h53d5487_0 + md5: c29f20b2860d1824535135d76d022394 + sha256: 1129ac093d0c04ca07603fab9dfd2ee1e9a760eb94b31450e2cef1ffffa6a31a + build: py311h12c1d0e_0 arch: x86_64 subdir: win-64 build_number: 0 license: GPL-3.0-only license_family: GPL - size: 589657 - timestamp: 1697301028797 + size: 595071 + timestamp: 1697300986959 - platform: linux-64 name: six version: 1.16.0 @@ -30058,84 +30234,84 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py312h98912ed_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py311h459d7ec_1.conda hash: - md5: 5bd63a3bf512694536cee3e48463a47c - sha256: 970d4e3e0b9b34dc8383055a956d4a9158a9f527264bc7ece769ba284d2395ff - build: py312h98912ed_1 + md5: a700fcb5cedd3e72d0c75d095c7a6eda + sha256: 3f0640415c6f50c6b31b5ce41a870ac48c130fda8921aae11afea84c54a6ba84 + build: py311h459d7ec_1 arch: x86_64 subdir: linux-64 build_number: 1 license: Apache-2.0 license_family: Apache - size: 829585 - timestamp: 1695373731705 + size: 843714 + timestamp: 1695373626426 - platform: osx-64 name: tornado version: 6.3.3 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.3.3-py312h104f124_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.3.3-py311h2725bcf_1.conda hash: - md5: 6835d4940d6fbd41e1a32d58dfae8f06 - sha256: 7f4f2a3a43c0bf62025b46f28366598aa04e0d4a32c87bfe4a275b4df562eba3 - build: py312h104f124_1 + md5: daf5f053a40c2b0b8f86b605e302b7a4 + sha256: e3e4c12236b0a59e6568a9dc839116776eda408ca12bc0ad4e7a9dba4d66912f + build: py311h2725bcf_1 arch: x86_64 subdir: osx-64 build_number: 1 license: Apache-2.0 license_family: Apache - size: 827934 - timestamp: 1695373724352 + size: 843855 + timestamp: 1695373925218 - platform: osx-arm64 name: tornado version: 6.3.3 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.3.3-py312h02f2b3b_1.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.3.3-py311heffc1b2_1.conda hash: - md5: 3ec18cacdeb6f7a87fee073b28bc7118 - sha256: f59281be797e9cfa2f1cfd5bff89a8268823e98fe49aaa6bede9a91b27e887ab - build: py312h02f2b3b_1 + md5: a3a94203d225faec0d6bd000ea30b0a1 + sha256: 65e96fcaa2fad8013fdfd1c7cbdc4684b253541c10091fa7acd55b4a3daa87e6 + build: py311heffc1b2_1 arch: aarch64 subdir: osx-arm64 build_number: 1 license: Apache-2.0 license_family: Apache - size: 826881 - timestamp: 1695374110756 + size: 843751 + timestamp: 1695373818353 - platform: win-64 name: tornado version: 6.3.3 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/tornado-6.3.3-py312he70551f_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/tornado-6.3.3-py311ha68e1ae_1.conda hash: - md5: a3bebd12ad9b94a4b9c46f8fd197e883 - sha256: 196ceac8b914e71706c2a45907c20ef10ae097e0c2775950ad232065659026d6 - build: py312he70551f_1 + md5: ec581b55f82fd6a4a96770c74d48e456 + sha256: 669091a38b2cb226198a6018a2784d4a4b55eb6416b14a4521a84882e02f47be + build: py311ha68e1ae_1 arch: x86_64 subdir: win-64 build_number: 1 license: Apache-2.0 license_family: Apache - size: 829792 - timestamp: 1695373970360 + size: 845683 + timestamp: 1695374005077 - platform: linux-64 name: traitlets version: 5.13.0 @@ -31089,20 +31265,20 @@ package: - cffi - libgcc-ng >=12 - libstdcxx-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda hash: - md5: 52c9e25ee0a32485a102eeecdb7eef52 - sha256: f9a4384d466f4d8b5b497d951329dd4407ebe02f8f93456434e9ab789d6e23ce - build: py312h8572e83_4 + md5: 586da7df03b68640de14dc3e8bcbf76f + sha256: c2d33e998f637b594632eba3727529171a06eb09896e36aa42f1ebcb03779472 + build: py311h9547e67_4 arch: x86_64 subdir: linux-64 build_number: 4 license: MIT license_family: MIT - size: 14050 - timestamp: 1695549556745 + size: 13961 + timestamp: 1695549513130 - platform: osx-64 name: ukkonen version: 1.0.1 @@ -31111,20 +31287,20 @@ package: dependencies: - cffi - libcxx >=15.0.7 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py312h49ebfd2_4.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py311h5fe6e05_4.conda hash: - md5: 4e6b5a8025cd8fd97b3cfe103ffce6b1 - sha256: efca19a5e73e4aacfc5e90a5389272b2508e41dc4adab9eb5353c5200ba37041 - build: py312h49ebfd2_4 + md5: 8f750b84128d48dc8376572c5eace61e + sha256: b273782a1277042a54e12411beebd378d2a2a69e503bcf147766e98628e91c91 + build: py311h5fe6e05_4 arch: x86_64 subdir: osx-64 build_number: 4 license: MIT license_family: MIT - size: 13246 - timestamp: 1695549689363 + size: 13193 + timestamp: 1695549883822 - platform: osx-arm64 name: ukkonen version: 1.0.1 @@ -31133,21 +31309,21 @@ package: dependencies: - cffi - libcxx >=15.0.7 - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py312h389731b_4.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py311he4fd1f5_4.conda hash: - md5: 6407429e0969b58b8717dbb4c6c15513 - sha256: 7336cf66feba973207f4903c20b05c3c82e351246df4b6113f72d92b9ee55b81 - build: py312h389731b_4 + md5: 5d5ab5c5af32931e03608034f4a5fd75 + sha256: 384fc81a34e248019d43a115386f77859ab63e0e6f12dade486d76359703743f + build: py311he4fd1f5_4 arch: aarch64 subdir: osx-arm64 build_number: 4 license: MIT license_family: MIT - size: 13948 - timestamp: 1695549890285 + size: 13958 + timestamp: 1695549884615 - platform: win-64 name: ukkonen version: 1.0.1 @@ -31155,23 +31331,23 @@ package: manager: conda dependencies: - cffi - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.0.1-py312h0d7def4_4.conda + url: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.0.1-py311h005e61a_4.conda hash: - md5: 57cfbb8ce3a1800bd343bf6afba6f878 - sha256: f5f7550991ca647f69b67b9188c7104a3456122611dd6a6e753cff555e45dfd9 - build: py312h0d7def4_4 + md5: d9988836cc20c90e05901ab05962f496 + sha256: ef774047df25201a6425fe1ec194505a3cac9ba02e96953360442f59364d12b3 + build: py311h005e61a_4 arch: x86_64 subdir: win-64 build_number: 4 license: MIT license_family: MIT - size: 17235 - timestamp: 1695549871621 + size: 17225 + timestamp: 1695549858085 - platform: linux-64 name: uri-template version: 1.3.0 @@ -31577,85 +31753,85 @@ package: category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - pyyaml >=3.10 - url: https://conda.anaconda.org/conda-forge/linux-64/watchdog-3.0.0-py312h7900ff3_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/watchdog-3.0.0-py311h38be061_1.conda hash: - md5: 6efb26e8a58a6a56f4fee7f21f892532 - sha256: 4cdaa1b5553412f9c2b9ecfe580154ede063f8b9b103e6d39c5a407741d75cc4 - build: py312h7900ff3_1 + md5: 1901b9f3ca3782f31450fd7158d2fe8a + sha256: c1fd4f6bd6f3c4009fe2f97d3ed8edd2f2a46058293e0176b06fa181eb66558f + build: py311h38be061_1 arch: x86_64 subdir: linux-64 build_number: 1 license: Apache-2.0 license_family: APACHE - size: 134413 - timestamp: 1695395379159 + size: 138066 + timestamp: 1695395380738 - platform: osx-64 name: watchdog version: 3.0.0 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - pyyaml >=3.10 - url: https://conda.anaconda.org/conda-forge/osx-64/watchdog-3.0.0-py312h388f535_1.conda + url: https://conda.anaconda.org/conda-forge/osx-64/watchdog-3.0.0-py311h5ef12f2_1.conda hash: - md5: fba613e83c36e18f5501647800d3ed3b - sha256: 779601fbda1dc19b7d391e4102389add38da595b8e0f9e59c04c913dbf24e0a1 - build: py312h388f535_1 + md5: 32c15f3306fd2e9a9c2876f2fc33d5ed + sha256: e3c40135edb9399277f8afc7b5344b507e40a46cef2ade2d3185f951c884c72b + build: py311h5ef12f2_1 arch: x86_64 subdir: osx-64 build_number: 1 license: Apache-2.0 license_family: APACHE - size: 142946 - timestamp: 1695395691197 + size: 145907 + timestamp: 1695395842364 - platform: osx-arm64 name: watchdog version: 3.0.0 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 - pyyaml >=3.10 - url: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-3.0.0-py312h02f2b3b_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-3.0.0-py311heffc1b2_1.conda hash: - md5: b46d14ac225275964abb4b58d94d47c7 - sha256: 545e660efb86da41d31ead3038c2e9f25a67c082ad3109246de2d649c3d036c7 - build: py312h02f2b3b_1 + md5: 67202ddda794d7ff7ca6b6e45337073d + sha256: 3fd810c89bb56b70518f1e60b7d3769ca13ab8a55e572cc90bba61f7a2a3e8b5 + build: py311heffc1b2_1 arch: aarch64 subdir: osx-arm64 build_number: 1 license: Apache-2.0 license_family: APACHE - size: 144329 - timestamp: 1695395632282 + size: 147013 + timestamp: 1695395641979 - platform: win-64 name: watchdog version: 3.0.0 category: main manager: conda dependencies: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - pyyaml >=3.10 - url: https://conda.anaconda.org/conda-forge/win-64/watchdog-3.0.0-py312h2e8e312_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/watchdog-3.0.0-py311h1ea47a8_1.conda hash: - md5: a56e5763430a9f6d78da401c831e629d - sha256: ea8ec6802b91338ec1f24d46742e7f50da0533004f080f0c5646209c0a82070e - build: py312h2e8e312_1 + md5: dc9bf2e5cbb5288f126606e67b2b410a + sha256: c05b8ee23e7b2992901688cfbb00a18706b2269d2518c87f72e1147209e27faf + build: py311h1ea47a8_1 arch: x86_64 subdir: win-64 build_number: 1 license: Apache-2.0 license_family: APACHE - size: 151305 - timestamp: 1695395846556 + size: 154457 + timestamp: 1695395884217 - platform: linux-64 name: wcwidth version: 0.2.9 @@ -32104,80 +32280,80 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.16.0-py312h98912ed_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.16.0-py311h459d7ec_0.conda hash: - md5: fa957a1c7bee7e47ad44633caf7be8bc - sha256: dc8431b343961347ad93b33d2d8270e8c15d8825382f4f2540835c94aba2de05 - build: py312h98912ed_0 + md5: 6669b5529d206c1f880b642cdd17ae05 + sha256: 6587e0b7d42368f767172b239a755fcf6363d91348faf9b7ab5743585369fc58 + build: py311h459d7ec_0 arch: x86_64 subdir: linux-64 build_number: 0 license: BSD-2-Clause - size: 62482 - timestamp: 1699532968076 + size: 63465 + timestamp: 1699532930817 - platform: osx-64 name: wrapt version: 1.16.0 category: main manager: conda dependencies: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.16.0-py312h41838bb_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.16.0-py311he705e18_0.conda hash: - md5: d87798aa7210da2c5eaf96c0346dca00 - sha256: 9ed208c4c844c50f161764df7ed7a226c42822917c892ab7c8f67eec6ca96dff - build: py312h41838bb_0 + md5: 5ef2eefe4fca7c786bbbdd4f1de464ed + sha256: e5546a52c0c0ed8a78dbac1cfec9a639f37fb3a86ea8ade8ff44aa7459dc6796 + build: py311he705e18_0 arch: x86_64 subdir: osx-64 build_number: 0 license: BSD-2-Clause - size: 59057 - timestamp: 1699533259706 + size: 59558 + timestamp: 1699533106157 - platform: osx-arm64 name: wrapt version: 1.16.0 category: main manager: conda dependencies: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - url: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.16.0-py312he37b823_0.conda + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.16.0-py311h05b510d_0.conda hash: - md5: 86726ebb1f6da39c68f306ae624ee4ed - sha256: 25824dd9a22f2c1e8f205eb55c906b28b2f4748a68cb8e3d95ffdf73f08cbac9 - build: py312he37b823_0 + md5: 35f87feb986222d2ada633b45df0bbc9 + sha256: c071b132b8415ccd1452e0b8002aa79ea59a4fd0b0ac0d3b2fd0ab6b19b3390c + build: py311h05b510d_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: BSD-2-Clause - size: 59676 - timestamp: 1699533197501 + size: 60998 + timestamp: 1699533434768 - platform: win-64 name: wrapt version: 1.16.0 category: main manager: conda dependencies: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.16.0-py312he70551f_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.16.0-py311ha68e1ae_0.conda hash: - md5: cea7b1aa961de6a8ac90584b5968a01d - sha256: e4b5ac6c897e68a798dfe13a1499dc9b555c48b468aa477d456807f2a7366c30 - build: py312he70551f_0 + md5: b96598823313b647148417455f2fa659 + sha256: e8209b3ebdde15834b59101fd14a7f293d868d2fbad2dcd634357cc3406f1052 + build: py311ha68e1ae_0 arch: x86_64 subdir: win-64 build_number: 0 license: BSD-2-Clause - size: 61358 - timestamp: 1699533495284 + size: 62017 + timestamp: 1699533574835 - platform: linux-64 name: xarray version: 2023.10.1 diff --git a/pixi.toml b/pixi.toml index 00b7aeb23..7576fc5d8 100644 --- a/pixi.toml +++ b/pixi.toml @@ -77,9 +77,7 @@ tests = { depends_on = ["lint", "test-ribasim-python", "test-ribasim-core"] } generate-schema = { cmd = "julia --project=docs docs/gen_schema.jl", depends_on = [ "instantiate-julia", ] } -generate-python = """\ - datamodel-codegen --use-title-as-name --use-double-quotes --disable-timestamp --use-default --strict-nullable --input-file-type=jsonschema --input docs/schema/root.schema.json --output python/ribasim/ribasim/models.py && \ - datamodel-codegen --use-title-as-name --use-double-quotes --disable-timestamp --use-default --strict-nullable --input-file-type=jsonschema --input docs/schema/Config.schema.json --output python/ribasim/ribasim/config.py""" +generate-python = "datamodel-codegen --use-title-as-name --use-double-quotes --disable-timestamp --use-default --strict-nullable --input-file-type=jsonschema --input docs/schema/root.schema.json --output python/ribasim/ribasim/models.py" codegen = { depends_on = ["generate-schema", "generate-python", "lint"] } # Publish build-ribasim-python-wheel = { cmd = "rm --recursive --force dist && python -m build && twine check dist/*", cwd = "python/ribasim" } @@ -108,7 +106,7 @@ pandera = "*" pip = "*" pre-commit = "*" pyarrow = "*" -pydantic = "~=1.0" +pydantic = ">=2" pyogrio = "*" pytest = "*" pytest-cov = "*" diff --git a/python/ribasim/pyproject.toml b/python/ribasim/pyproject.toml index 1a7286ae4..b46d35c05 100644 --- a/python/ribasim/pyproject.toml +++ b/python/ribasim/pyproject.toml @@ -19,7 +19,7 @@ dependencies = [ "pandas", "pandera != 0.16.0", "pyarrow", - "pydantic ~= 1.0", + "pydantic ~= 2.0", "pyogrio", "shapely >= 2.0", "tomli", diff --git a/python/ribasim/ribasim/__init__.py b/python/ribasim/ribasim/__init__.py index fa164971e..1183c1bf5 100644 --- a/python/ribasim/ribasim/__init__.py +++ b/python/ribasim/ribasim/__init__.py @@ -2,36 +2,43 @@ from ribasim import models, utils -from ribasim.config import Allocation, Config, Logging, Solver -from ribasim.geometry.edge import Edge -from ribasim.geometry.node import Node -from ribasim.model import Model -from ribasim.node_types.basin import Basin -from ribasim.node_types.discrete_control import DiscreteControl -from ribasim.node_types.flow_boundary import FlowBoundary -from ribasim.node_types.fractional_flow import FractionalFlow -from ribasim.node_types.level_boundary import LevelBoundary -from ribasim.node_types.linear_resistance import LinearResistance -from ribasim.node_types.manning_resistance import ManningResistance -from ribasim.node_types.outlet import Outlet -from ribasim.node_types.pid_control import PidControl -from ribasim.node_types.pump import Pump -from ribasim.node_types.tabulated_rating_curve import TabulatedRatingCurve -from ribasim.node_types.terminal import Terminal -from ribasim.node_types.user import User +from ribasim.config import ( + Allocation, + Basin, + DiscreteControl, + FlowBoundary, + FractionalFlow, + LevelBoundary, + LinearResistance, + Logging, + ManningResistance, + Outlet, + PidControl, + Pump, + Solver, + TabulatedRatingCurve, + Terminal, + User, +) +from ribasim.geometry.edge import Edge, EdgeSchema +from ribasim.geometry.node import Node, NodeSchema +from ribasim.model import Database, Model __all__ = [ "models", "utils", - "Config", + "Allocation", "Basin", + "Database", "Edge", + "EdgeSchema", "FractionalFlow", "LevelBoundary", "LinearResistance", "ManningResistance", "Model", "Node", + "NodeSchema", "Pump", "Outlet", "FlowBoundary", @@ -42,5 +49,4 @@ "DiscreteControl", "PidControl", "User", - "Allocation", ] diff --git a/python/ribasim/ribasim/config.py b/python/ribasim/ribasim/config.py index 553e4c340..35a30c331 100644 --- a/python/ribasim/ribasim/config.py +++ b/python/ribasim/ribasim/config.py @@ -1,12 +1,39 @@ # generated by datamodel-codegen: # filename: Config.schema.json -from __future__ import annotations - -from datetime import datetime -from typing import List, Optional, Union - -from pydantic import BaseModel, Field +from enum import Enum +from pathlib import Path +from typing import Dict, List, Optional + +from pydantic import Field + +from ribasim.input_base import BaseModel, NodeModel, TableModel + +# These schemas are autogenerated +from ribasim.schemas import ( # type: ignore + BasinProfileSchema, + BasinStateSchema, + BasinStaticSchema, + BasinTimeSchema, + DiscreteControlConditionSchema, + DiscreteControlLogicSchema, + FlowBoundaryStaticSchema, + FlowBoundaryTimeSchema, + FractionalFlowStaticSchema, + LevelBoundaryStaticSchema, + LevelBoundaryTimeSchema, + LinearResistanceStaticSchema, + ManningResistanceStaticSchema, + OutletStaticSchema, + PidControlStaticSchema, + PidControlTimeSchema, + PumpStaticSchema, + TabulatedRatingCurveStaticSchema, + TabulatedRatingCurveTimeSchema, + TerminalStaticSchema, + UserStaticSchema, + UserTimeSchema, +) class Allocation(BaseModel): @@ -14,9 +41,23 @@ class Allocation(BaseModel): use_allocation: bool = False +class Compression(str, Enum): + zstd = "zstd" + lz4 = "lz4" + + +class Results(BaseModel): + basin: Path = Path("results/basin.arrow") + flow: Path = Path("results/flow.arrow") + control: Path = Path("results/control.arrow") + outstate: Optional[str] = None + compression: Compression = Compression.zstd + compression_level: int = 6 + + class Solver(BaseModel): algorithm: str = "QNDF" - saveat: Union[float, List[float]] = [] + saveat: float | List[float] = [] adaptive: bool = True dt: Optional[float] = None dtmin: Optional[float] = None @@ -29,168 +70,136 @@ class Solver(BaseModel): autodiff: bool = True +class Verbosity(str, Enum): + debug = "debug" + info = "info" + warn = "warn" + error = "error" + + class Logging(BaseModel): - verbosity: str = "info" + verbosity: Verbosity = Verbosity.info timing: bool = False -class Results(BaseModel): - basin: str = "results/basin.arrow" - flow: str = "results/flow.arrow" - control: str = "results/control.arrow" - allocation: str = "results/allocation.arrow" - outstate: Optional[str] = None - compression: str = "zstd" - compression_level: int = 6 - +class Terminal(NodeModel): + static: TableModel[TerminalStaticSchema] = Field( + default_factory=TableModel[TerminalStaticSchema] + ) -class Terminal(BaseModel): - static: Optional[str] = None +class PidControl(NodeModel): + static: TableModel[PidControlStaticSchema] = Field( + default_factory=TableModel[PidControlStaticSchema] + ) + time: TableModel[PidControlTimeSchema] = Field( + default_factory=TableModel[PidControlTimeSchema] + ) -class PidControl(BaseModel): - static: Optional[str] = None - time: Optional[str] = None + _sort_keys: Dict[str, List[str]] = {"time": ["time", "node_id"]} -class LevelBoundary(BaseModel): - static: Optional[str] = None - time: Optional[str] = None +class LevelBoundary(NodeModel): + static: TableModel[LevelBoundaryStaticSchema] = Field( + default_factory=TableModel[LevelBoundaryStaticSchema] + ) + time: TableModel[LevelBoundaryTimeSchema] = Field( + default_factory=TableModel[LevelBoundaryTimeSchema] + ) + _sort_keys: Dict[str, List[str]] = {"time": ["time", "node_id"]} -class Pump(BaseModel): - static: Optional[str] = None +class Pump(NodeModel): + static: TableModel[PumpStaticSchema] = Field( + default_factory=TableModel[PumpStaticSchema] + ) -class TabulatedRatingCurve(BaseModel): - static: Optional[str] = None - time: Optional[str] = None +class TabulatedRatingCurve(NodeModel): + static: TableModel[TabulatedRatingCurveStaticSchema] = Field( + default_factory=TableModel[TabulatedRatingCurveStaticSchema] + ) + time: TableModel[TabulatedRatingCurveTimeSchema] = Field( + default_factory=TableModel[TabulatedRatingCurveTimeSchema] + ) + _sort_keys: Dict[str, List[str]] = { + "static": ["node_id", "level"], + "time": ["time", "node_id", "level"], + } -class User(BaseModel): - static: Optional[str] = None - time: Optional[str] = None +class User(NodeModel): + static: TableModel[UserStaticSchema] = Field( + default_factory=TableModel[UserStaticSchema] + ) + time: TableModel[UserTimeSchema] = Field(default_factory=TableModel[UserTimeSchema]) -class FlowBoundary(BaseModel): - static: Optional[str] = None - time: Optional[str] = None + _sort_keys: Dict[str, List[str]] = { + "static": ["node_id", "priority"], + "time": ["node_id", "priority", "time"], + } -class Basin(BaseModel): - profile: Optional[str] = None - state: Optional[str] = None - static: Optional[str] = None - time: Optional[str] = None +class FlowBoundary(NodeModel): + static: TableModel[FlowBoundaryStaticSchema] = Field( + default_factory=TableModel[FlowBoundaryStaticSchema] + ) + time: TableModel[FlowBoundaryTimeSchema] = Field( + default_factory=TableModel[FlowBoundaryTimeSchema] + ) + _sort_keys: Dict[str, List[str]] = {"time": ["time", "node_id"]} -class ManningResistance(BaseModel): - static: Optional[str] = None +class Basin(NodeModel): + profile: TableModel[BasinProfileSchema] = Field( + default_factory=TableModel[BasinProfileSchema] + ) + state: TableModel[BasinStateSchema] = Field( + default_factory=TableModel[BasinStateSchema] + ) + static: TableModel[BasinStaticSchema] = Field( + default_factory=TableModel[BasinStaticSchema] + ) + time: TableModel[BasinTimeSchema] = Field( + default_factory=TableModel[BasinTimeSchema] + ) -class DiscreteControl(BaseModel): - condition: Optional[str] = None - logic: Optional[str] = None + _sort_keys: Dict[str, List[str]] = { + "profile": ["node_id", "level"], + "time": ["time", "node_id"], + } -class Outlet(BaseModel): - static: Optional[str] = None +class ManningResistance(NodeModel): + static: TableModel[ManningResistanceStaticSchema] = Field( + default_factory=TableModel[ManningResistanceStaticSchema] + ) -class LinearResistance(BaseModel): - static: Optional[str] = None +class DiscreteControl(NodeModel): + condition: TableModel[DiscreteControlConditionSchema] = Field( + default_factory=TableModel[DiscreteControlConditionSchema] + ) + logic: TableModel[DiscreteControlLogicSchema] = Field( + default_factory=TableModel[DiscreteControlLogicSchema] + ) -class FractionalFlow(BaseModel): - static: Optional[str] = None +class Outlet(NodeModel): + static: TableModel[OutletStaticSchema] = Field( + default_factory=TableModel[OutletStaticSchema] + ) -class Config(BaseModel): - starttime: datetime - endtime: datetime - relative_dir: str = "." - input_dir: str = "." - results_dir: str = "." - database: str - allocation: Allocation = Field( - default_factory=lambda: Allocation.parse_obj( - {"timestep": None, "use_allocation": False} - ) - ) - solver: Solver = Field( - default_factory=lambda: Solver.parse_obj( - { - "algorithm": "QNDF", - "saveat": [], - "adaptive": True, - "dt": None, - "dtmin": None, - "dtmax": None, - "force_dtmin": False, - "abstol": 1e-06, - "reltol": 1e-05, - "maxiters": 1000000000, - "sparse": True, - "autodiff": True, - } - ) - ) - logging: Logging = Field( - default_factory=lambda: Logging.parse_obj( - {"verbosity": {"level": 0}, "timing": False} - ) - ) - results: Results = Field( - default_factory=lambda: Results.parse_obj( - { - "basin": "results/basin.arrow", - "flow": "results/flow.arrow", - "control": "results/control.arrow", - "allocation": "results/allocation.arrow", - "outstate": None, - "compression": "zstd", - "compression_level": 6, - } - ) - ) - terminal: Terminal = Field( - default_factory=lambda: Terminal.parse_obj({"static": None}) +class LinearResistance(NodeModel): + static: TableModel[LinearResistanceStaticSchema] = Field( + default_factory=TableModel[LinearResistanceStaticSchema] ) - pid_control: PidControl = Field( - default_factory=lambda: PidControl.parse_obj({"static": None, "time": None}) - ) - level_boundary: LevelBoundary = Field( - default_factory=lambda: LevelBoundary.parse_obj({"static": None, "time": None}) - ) - pump: Pump = Field(default_factory=lambda: Pump.parse_obj({"static": None})) - tabulated_rating_curve: TabulatedRatingCurve = Field( - default_factory=lambda: TabulatedRatingCurve.parse_obj( - {"static": None, "time": None} - ) - ) - user: User = Field( - default_factory=lambda: User.parse_obj({"static": None, "time": None}) - ) - flow_boundary: FlowBoundary = Field( - default_factory=lambda: FlowBoundary.parse_obj({"static": None, "time": None}) - ) - basin: Basin = Field( - default_factory=lambda: Basin.parse_obj( - {"profile": None, "state": None, "static": None, "time": None} - ) - ) - manning_resistance: ManningResistance = Field( - default_factory=lambda: ManningResistance.parse_obj({"static": None}) - ) - discrete_control: DiscreteControl = Field( - default_factory=lambda: DiscreteControl.parse_obj( - {"condition": None, "logic": None} - ) - ) - outlet: Outlet = Field(default_factory=lambda: Outlet.parse_obj({"static": None})) - linear_resistance: LinearResistance = Field( - default_factory=lambda: LinearResistance.parse_obj({"static": None}) - ) - fractional_flow: FractionalFlow = Field( - default_factory=lambda: FractionalFlow.parse_obj({"static": None}) + + +class FractionalFlow(NodeModel): + static: TableModel[FractionalFlowStaticSchema] = Field( + default_factory=TableModel[FractionalFlowStaticSchema] ) diff --git a/python/ribasim/ribasim/geometry/edge.py b/python/ribasim/ribasim/geometry/edge.py index 0d3c47bc7..64b0b50b6 100644 --- a/python/ribasim/ribasim/geometry/edge.py +++ b/python/ribasim/ribasim/geometry/edge.py @@ -1,33 +1,34 @@ -from typing import Any, Dict, Union +from typing import Any -import geopandas as gpd import matplotlib.pyplot as plt import numpy as np +import pandas as pd import pandera as pa import shapely -from geopandas import GeoDataFrame from matplotlib.axes import Axes from numpy.typing import NDArray -from pandera.typing import DataFrame, Series +from pandera.typing import Series from pandera.typing.geopandas import GeoSeries -from ribasim.input_base import TableModel -from ribasim.types import FilePath +from ribasim.input_base import SpatialTableModel __all__ = ("Edge",) -class StaticSchema(pa.SchemaModel): +class EdgeSchema(pa.SchemaModel): name: Series[str] = pa.Field(default="") - from_node_id: Series[int] = pa.Field(coerce=True) - to_node_id: Series[int] = pa.Field(coerce=True) - geometry: GeoSeries[Any] + from_node_id: Series[int] = pa.Field(default=0, coerce=True) + to_node_id: Series[int] = pa.Field(default=0, coerce=True) + allocation_network_id: Series[pd.Int64Dtype] = pa.Field( + default=pd.NA, nullable=True, coerce=True + ) + geometry: GeoSeries[Any] = pa.Field(default=None, nullable=True) class Config: add_missing_columns = True -class Edge(TableModel): +class Edge(SpatialTableModel[EdgeSchema]): """ Defines the connections between nodes. @@ -37,51 +38,8 @@ class Edge(TableModel): Table describing the flow connections. """ - static: DataFrame[StaticSchema] - - class Config: - validate_assignment = True - - @classmethod - def _layername(cls, field) -> str: - return cls.get_input_type() - - def write_layer(self, path: FilePath) -> None: - """ - Write the contents of the input to a database. - - Parameters - ---------- - path : FilePath - """ - self.sort() - dataframe = self.static - name = self._layername(dataframe) - - gdf = gpd.GeoDataFrame(data=dataframe) - if "geometry" in gdf.columns: - gdf = gdf.set_geometry("geometry") - else: - gdf["geometry"] = None - gdf.to_file(path, layer=name, driver="GPKG") - - return - - @classmethod - def _kwargs_from_database( - cls, path: FilePath - ) -> Dict[str, Union[DataFrame[Any], GeoDataFrame, None]]: - kwargs = {} - - field = "static" - layername = cls._layername(field) - df = gpd.read_file(path, layer=layername, engine="pyogrio", fid_as_index=True) - kwargs[field] = df - - return kwargs - def get_where_edge_type(self, edge_type: str) -> NDArray[np.bool_]: - return (self.static.edge_type == edge_type).to_numpy() + return (self.df.edge_type == edge_type).to_numpy() def plot(self, **kwargs) -> Axes: ax = kwargs.get("ax", None) @@ -115,13 +73,13 @@ def plot(self, **kwargs) -> Axes: where_flow = self.get_where_edge_type("flow") where_control = self.get_where_edge_type("control") - self.static[where_flow].plot(**kwargs_flow) + self.df[where_flow].plot(**kwargs_flow) if where_control.any(): - self.static[where_control].plot(**kwargs_control) + self.df[where_control].plot(**kwargs_control) # Determine the angle for every caret marker and where to place it. - coords = shapely.get_coordinates(self.static.geometry).reshape(-1, 2, 2) + coords = shapely.get_coordinates(self.df.geometry).reshape(-1, 2, 2) x, y = np.mean(coords, axis=1).T dx, dy = np.diff(coords, axis=1)[:, 0, :].T angle = np.degrees(np.arctan2(dy, dx)) - 90 @@ -130,7 +88,7 @@ def plot(self, **kwargs) -> Axes: # right is tedious. color = [] - for i in range(len(self.static)): + for i in range(len(self.df)): if where_flow[i]: color.append(color_flow) elif where_control[i]: @@ -149,6 +107,3 @@ def plot(self, **kwargs) -> Axes: ) return ax - - def sort(self): - self.static = self.static.sort_index() diff --git a/python/ribasim/ribasim/geometry/node.py b/python/ribasim/ribasim/geometry/node.py index 2995abe66..052966f12 100644 --- a/python/ribasim/ribasim/geometry/node.py +++ b/python/ribasim/ribasim/geometry/node.py @@ -1,54 +1,35 @@ -from typing import Any, Dict, Union +from typing import Any -import geopandas as gpd import matplotlib.pyplot as plt import numpy as np import pandas as pd import pandera as pa -from geopandas import GeoDataFrame -from pandera.typing import DataFrame, Series +from pandera.typing import Series from pandera.typing.geopandas import GeoSeries -from ribasim.input_base import TableModel -from ribasim.types import FilePath +from ribasim.input_base import SpatialTableModel __all__ = ("Node",) -class StaticSchema(pa.SchemaModel): +class NodeSchema(pa.SchemaModel): name: Series[str] = pa.Field(default="") - type: Series[str] - geometry: GeoSeries[Any] + type: Series[str] = pa.Field(default="") + allocation_network_id: Series[pd.Int64Dtype] = pa.Field( + default=pd.NA, nullable=True, coerce=True + ) + geometry: GeoSeries[Any] = pa.Field(default=None, nullable=True) class Config: add_missing_columns = True -class Node(TableModel): - """ - The Ribasim nodes as Point geometries. - - Parameters - ---------- - static : geopandas.GeoDataFrame - Table with node ID, type and geometry. - """ - - static: DataFrame[StaticSchema] - - class Config: - validate_assignment = True - - @classmethod - def _layername(cls, field) -> str: - return cls.get_input_type() - - @classmethod - def hasfid(cls): - return True +class Node(SpatialTableModel[NodeSchema]): + """The Ribasim nodes as Point geometries.""" @staticmethod - def get_node_ids_and_types(*nodes): + def node_ids_and_types(*nodes): + # TODO Not sure if this staticmethod belongs here data_types = {"node_id": int, "node_type": str} node_type = pd.DataFrame( {col: pd.Series(dtype=dtype) for col, dtype in data_types.items()} @@ -58,17 +39,14 @@ def get_node_ids_and_types(*nodes): if not node: continue - for table_type in ["static", "time", "condition"]: - if hasattr(node, table_type): - table = getattr(node, table_type) - if table is not None: - node_type_table = pd.DataFrame( - data={ - "node_id": table.node_id, - "node_type": len(table) * [node.get_input_type()], - } - ) - node_type = node_type._append(node_type_table) + ids, types = node.node_ids_and_types() + node_type_table = pd.DataFrame( + data={ + "node_id": ids, + "node_type": types, + } + ) + node_type = node_type._append(node_type_table) node_type = node_type.drop_duplicates(subset="node_id") node_type = node_type.sort_values("node_id") @@ -78,38 +56,6 @@ def get_node_ids_and_types(*nodes): return node_id, node_type - def write_layer(self, path: FilePath) -> None: - """ - Write the contents of the input to a database. - - Parameters - ---------- - path : FilePath - """ - self.sort() - dataframe = self.static - name = self._layername(dataframe) - - gdf = gpd.GeoDataFrame(data=dataframe) - gdf = gdf.set_geometry("geometry") - - gdf.to_file(path, layer=name, driver="GPKG") - - return - - @classmethod - def _kwargs_from_database( - cls, path: FilePath - ) -> Dict[str, Union[GeoDataFrame, DataFrame[Any], None]]: - kwargs = {} - - field = "static" - layername = cls._layername(field) - df = gpd.read_file(path, layer=layername, engine="pyogrio", fid_as_index=True) - kwargs[field] = df - - return kwargs - def plot(self, ax=None, zorder=None) -> Any: """ Plot the nodes. Each node type is given a separate marker. @@ -161,7 +107,7 @@ def plot(self, ax=None, zorder=None) -> Any: "": "k", } - for nodetype, df in self.static.groupby("type"): + for nodetype, df in self.df.groupby("type"): assert isinstance(nodetype, str) marker = MARKERS[nodetype] color = COLORS[nodetype] @@ -174,13 +120,8 @@ def plot(self, ax=None, zorder=None) -> Any: label=nodetype, ) - geometry = self.static["geometry"] - for text, xy in zip( - self.static.index, np.column_stack((geometry.x, geometry.y)) - ): + geometry = self.df["geometry"] + for text, xy in zip(self.df.index, np.column_stack((geometry.x, geometry.y))): ax.annotate(text=text, xy=xy, xytext=(2.0, 2.0), textcoords="offset points") return ax - - def sort(self): - self.static = self.static.sort_index() diff --git a/python/ribasim/ribasim/input_base.py b/python/ribasim/ribasim/input_base.py index cba18a57a..998007e0a 100644 --- a/python/ribasim/ribasim/input_base.py +++ b/python/ribasim/ribasim/input_base.py @@ -1,12 +1,34 @@ import re -import textwrap +from abc import ABC, abstractmethod from contextlib import closing +from contextvars import ContextVar +from pathlib import Path from sqlite3 import Connection, connect -from typing import Any, Dict, Set, Union - +from typing import ( + Any, + Callable, + Dict, + Generator, + Generic, + List, + Set, + Tuple, + Type, + TypeVar, +) + +import geopandas as gpd import pandas as pd -from pandas import DataFrame -from pydantic import BaseModel +import pandera as pa +from pandera.typing import DataFrame +from pydantic import BaseModel as PydanticBaseModel +from pydantic import ( + ConfigDict, + DirectoryPath, + Field, + model_serializer, + model_validator, +) from ribasim.types import FilePath @@ -14,6 +36,14 @@ delimiter = " / " +gpd.options.io_engine = "pyogrio" + +context_file_loading: ContextVar[Dict[str, Any]] = ContextVar( + "file_loading", default={} +) + +TableT = TypeVar("TableT", bound=pa.DataFrameModel) + def esc_id(identifier: str) -> str: """Escape SQLite identifiers.""" @@ -30,65 +60,153 @@ def exists(connection: Connection, name: str) -> bool: return result is not None -class TableModel(BaseModel): - class Config: - validate_assignment = True +TABLES = ["profile", "state", "static", "time", "logic", "condition"] + + +class BaseModel(PydanticBaseModel): + """Overrides Pydantic BaseModel to set our own config.""" + + model_config = ConfigDict( + validate_assignment=True, + validate_default=True, + use_enum_values=True, + extra="allow", + ) @classmethod - def get_input_type(cls): - return cls.__name__ + def fields(cls) -> List[str]: + """Return the names of the fields contained in the Model.""" + return list(cls.model_fields.keys()) + + +class FileModel(BaseModel, ABC): + """Base class to represent models with a file representation. + It therefore always has a `filepath` and if it is given on + initialization, it will parse that file. + + This class extends the `model_validator` option of Pydantic, + so when when a Path is given to a field with type `FileModel`, + it doesn't error, but actually initializes the `FileModel`. + + Attributes + ---------- + filepath (Optional[Path]): + The path of this FileModel. + """ + + filepath: Path | None = Field(default=None, exclude=True, repr=False) + + @model_validator(mode="before") @classmethod - def get_toml_key(cls): - """Get the class name in snake case, e.g. FlowBoundary -> flow_boundary.""" - name_camel_case = cls.__name__ + def check_filepath(cls, value: Any) -> Any: + # Enable initialization with a Path. + if isinstance(value, (Dict,)): + # Pydantic Model init requires a dict + filepath = value.get("filepath", None) + if filepath is not None: + filepath = Path(filepath) + data = cls._load(filepath) + value.update(data) + return value + elif isinstance(value, (Path, str)): + # Pydantic Model init requires a dict + data = cls._load(Path(value)) + data["filepath"] = value + return data + else: + return value - # Insert underscore before capital letters - name_snake_case = re.sub(r"(? None: + """Save this instance to disk. - # Convert to lowercase - name_snake_case = name_snake_case.lower() + This method needs to be implemented by any class deriving from + FileModel. - return name_snake_case + Args: + save_settings (ModelSaveSettings): The model save settings. + """ + raise NotImplementedError() @classmethod - def fields(cls): - """Return the input fields.""" - return cls.__fields__.keys() + @abstractmethod + def _load(cls, filepath: Path | None) -> Dict[str, Any]: + """Load the data at filepath and returns it as a dictionary. - def __repr__(self) -> str: - content = [f""] - for field in self.fields(): - attr = getattr(self, field) - if isinstance(attr, pd.DataFrame): - colnames = "(" + ", ".join(attr.columns) + ")" - if len(colnames) > 50: - colnames = textwrap.indent( - textwrap.fill(colnames, width=50), prefix=" " - ) - entry = f"{field}: DataFrame(rows={len(attr)})\n{colnames}" - else: - entry = f"{field}: DataFrame(rows={len(attr)}) {colnames}" - else: - entry = f"{field}: {attr}" - content.append(textwrap.indent(entry, prefix=" ")) - return "\n".join(content) + If a derived FileModel does not load data from disk, this should + return an empty dictionary. - def get_node_IDs(self) -> Set[int]: - node_IDs: Set[int] = set() - for name in self.fields(): - attr = getattr(self, name) - if isinstance(attr, pd.DataFrame): - if "node_id" in attr: - node_IDs.update(attr["node_id"]) + Args + ---- + filepath (Path): Path to the data to load. - return node_IDs + Returns + ------- + Dict: The data stored at filepath + """ + raise NotImplementedError() + + +class TableModel(FileModel, Generic[TableT]): + df: DataFrame[TableT] | None = Field(default=None, exclude=True, repr=False) + + @model_serializer + def set_model(self) -> Path | None: + return self.filepath @classmethod - def _layername(cls, field) -> str: - return f"{cls.get_input_type()}{delimiter}{field}" + def tablename(cls) -> str: + """Retrieve tablename based on attached Schema. + + NodeSchema -> Schema + TabularRatingCurveStaticSchema -> TabularRatingCurve / Static + """ + names: List[str] = re.sub("([A-Z]+)", r" \1", str(cls.tableschema())).split() + if len(names) > 2: + return f"{''.join(names[:-2])}{delimiter}{names[-2].lower()}" + else: + return names[0] + + @model_validator(mode="before") + @classmethod + def check_dataframe(cls, value: Any) -> Any: + # Enable initialization with a DataFrame. + if isinstance(value, (pd.DataFrame, gpd.GeoDataFrame)): + value = {"df": value} - def write_table(self, connection: Connection) -> None: + return value + + def node_ids(self) -> Set[int]: + node_ids: Set[int] = set() + if self.df is not None and "node_id" in self.df.columns: + node_ids.update(self.df["node_id"]) + + return node_ids + + @classmethod + def _load(cls, filepath: Path | None) -> Dict[str, Any]: + db = context_file_loading.get().get("database") + if filepath is not None: + adf = cls._from_arrow(filepath) + # TODO Store filepath? + return {"df": adf} + elif db is not None: + ddf = cls._from_db(db, cls.tablename()) + return {"df": ddf} + else: + return {} + + def _save( + self, directory: DirectoryPath, sort_keys: List[str] = ["node_id"] + ) -> None: + # TODO directory could be used to save an arrow file + db_path = context_file_loading.get().get("database") + if self.df is not None and db_path is not None: + self.sort(sort_keys) + self._write_table(db_path) + + def _write_table(self, temp_path: Path) -> None: """ Write the contents of the input to a database. @@ -97,103 +215,134 @@ def write_table(self, connection: Connection) -> None: connection : Connection SQLite connection to the database. """ - self.sort() - sql = "INSERT INTO gpkg_contents (table_name, data_type, identifier) VALUES (?, ?, ?)" - for field in self.fields(): - dataframe = getattr(self, field) - if dataframe is None: - continue - name = self._layername(field) - - dataframe.to_sql(name, connection, index=False, if_exists="replace") - with closing(connection.cursor()) as cursor: - cursor.execute(sql, (name, "attributes", name)) + table = self.tablename() + if self.df is not None: # double check to make mypy happy + with closing(connect(temp_path)) as connection: + self.df.to_sql(table, connection, index=False, if_exists="replace") - return + # Set geopackage attribute table + with closing(connection.cursor()) as cursor: + sql = "INSERT INTO gpkg_contents (table_name, data_type, identifier) VALUES (?, ?, ?)" + cursor.execute(sql, (table, "attributes", table)) + connection.commit() @classmethod - def _kwargs_from_database(cls, path: FilePath) -> Dict[str, Union[DataFrame, None]]: - kwargs = {} + def _from_db(cls, path: FilePath, table: str) -> pd.DataFrame | None: with connect(path) as connection: - for key in cls.fields(): - layername = cls._layername(key) + if exists(connection, table): + query = f"select * from {esc_id(table)}" + df = pd.read_sql_query(query, connection, parse_dates=["time"]) + else: + df = None - if exists(connection, layername): - query = f"select * from {esc_id(layername)}" - df = pd.read_sql_query(query, connection, parse_dates=["time"]) - else: - df = None + return df - kwargs[key] = df + @classmethod + def _from_arrow(cls, path: FilePath) -> pd.DataFrame: + return pd.read_feather(path) - return kwargs + def sort(self, sort_keys: List[str] = ["node_id"]): + """Sort all input tables as required. - @classmethod - def _kwargs_from_toml(cls, config: Dict[str, Any]) -> Dict[str, pd.DataFrame]: - return {key: pd.read_feather(path) for key, path in config.items()} + Tables are sorted by "node_id", unless otherwise specified. + Sorting is done automatically before writing the table. + """ + if self.df is not None: + self.df.sort_values(sort_keys, ignore_index=True, inplace=True) @classmethod - def from_database(cls, path: FilePath): + def tableschema(cls) -> TableT: + """Retrieve Pandera Schema. + + The type of the field `df` is known to always be an Optional[DataFrame[TableT]]] """ - Initialize input from a database. + optionalfieldtype = cls.model_fields["df"].annotation + fieldtype = optionalfieldtype.__args__[0] # type: ignore + T: TableT = fieldtype.__args__[0] + return T - The database tables are searched for the relevant table names. + def record(self): + """Retrieve Pydantic Record used in Pandera Schema.""" + T = self.tableschema() + return T.Config.dtype.type - Parameters - ---------- - path : Path - Path to the database. + def columns(self): + """Retrieve column names.""" + return list(self.record().model_fields.keys()) - Returns - ------- - ribasim_input - """ - kwargs = cls._kwargs_from_database(path) - return cls(**kwargs) +class SpatialTableModel(TableModel[TableT], Generic[TableT]): @classmethod - def from_config(cls, config: Dict[str, Any]): - """ - Initialize input from a TOML configuration file. + def _from_db(cls, path: FilePath, table: str): + with connect(path) as connection: + if exists(connection, table): + df = gpd.read_file(path, layer=table, fid_as_index=True) + else: + print(f"Can't read from {path}:{table}") + df = None - The database tables are searched for the relevant table names. Arrow - tables will also be read if specified. If a table is present in both - the database and as an Arrow table, the data of the Arrow table is - used. + return df + + def _write_table(self, path: FilePath) -> None: + """ + Write the contents of the input to a database. Parameters ---------- - config : Dict[str, Any] - - Returns - ------- - ribasim_input + path : FilePath """ - database = config["database"] - kwargs = cls._kwargs_from_database(database) - input_content = config.get(cls.get_input_type(), None) - if input_content: - kwargs.update(**cls._kwargs_from_toml(config)) - - if all(v is None for v in kwargs.values()): - return None - else: - return cls(**kwargs) + + gdf = gpd.GeoDataFrame(data=self.df) + gdf = gdf.set_geometry("geometry") + + gdf.to_file(path, layer=self.tablename(), driver="GPKG") + + def sort(self, sort_keys: List[str] = ["node_id"]): + self.df.sort_index(inplace=True) + + +class NodeModel(BaseModel): + """Base class to handle combining the tables for a single node type.""" + + _sort_keys: Dict[str, List[str]] = {} + + @model_serializer(mode="wrap") + def set_modeld( + self, serializer: Callable[[Type["NodeModel"]], Dict[str, Any]] + ) -> Dict[str, Any]: + content = serializer(self) + return dict(filter(lambda x: x[1], content.items())) @classmethod - def hasfid(cls): - return False + def get_input_type(cls): + return cls.__name__ - def sort(self): - """Sort all input tables as required. + @classmethod + def _layername(cls, field: str) -> str: + return f"{cls.get_input_type()}{delimiter}{field}" - Tables are sorted by "node_id", unless otherwise specified. - Sorting is done automatically before writing the table. - """ + def add(*args, **kwargs): + # TODO This is the new API + pass + + def tables(self) -> Generator[TableModel[Any], Any, None]: + for key in self.fields(): + attr = getattr(self, key) + if isinstance(attr, TableModel): + yield attr + + def node_ids(self): + node_ids: Set[int] = set() + for table in self.tables(): + node_ids.update(table.node_ids()) + return node_ids + + def node_ids_and_types(self) -> Tuple[List[int], List[str]]: + ids = self.node_ids() + return list(ids), len(ids) * [self.get_input_type()] + + def _save(self, directory: DirectoryPath): for field in self.fields(): - dataframe = getattr(self, field) - if dataframe is None: - continue - else: - dataframe.sort_values("node_id", ignore_index=True, inplace=True) - return + getattr(self, field)._save( + directory, sort_keys=self._sort_keys.get("field", ["node_id"]) + ) diff --git a/python/ribasim/ribasim/model.py b/python/ribasim/ribasim/model.py index 7632cc3be..0e9de75b9 100644 --- a/python/ribasim/ribasim/model.py +++ b/python/ribasim/ribasim/model.py @@ -1,43 +1,87 @@ import datetime -import inspect import shutil -from contextlib import closing from pathlib import Path -from sqlite3 import connect -from typing import Any, Optional, Type, cast +from typing import Any, Dict import matplotlib.pyplot as plt import numpy as np import pandas as pd import tomli import tomli_w -from pydantic import BaseModel - -from ribasim import geometry, node_types -from ribasim.config import Allocation, Logging, Solver +from pydantic import DirectoryPath, Field, model_serializer, model_validator + +from ribasim.config import ( + Allocation, + Basin, + DiscreteControl, + FlowBoundary, + FractionalFlow, + LevelBoundary, + LinearResistance, + Logging, + ManningResistance, + Outlet, + PidControl, + Pump, + Results, + Solver, + TabulatedRatingCurve, + Terminal, + User, +) from ribasim.geometry.edge import Edge from ribasim.geometry.node import Node - -# Do not import from ribasim namespace: will create import errors. -# E.g. not: from ribasim import Basin -from ribasim.input_base import TableModel -from ribasim.node_types.basin import Basin -from ribasim.node_types.discrete_control import DiscreteControl -from ribasim.node_types.flow_boundary import FlowBoundary -from ribasim.node_types.fractional_flow import FractionalFlow -from ribasim.node_types.level_boundary import LevelBoundary -from ribasim.node_types.linear_resistance import LinearResistance -from ribasim.node_types.manning_resistance import ManningResistance -from ribasim.node_types.outlet import Outlet -from ribasim.node_types.pid_control import PidControl -from ribasim.node_types.pump import Pump -from ribasim.node_types.tabulated_rating_curve import TabulatedRatingCurve -from ribasim.node_types.terminal import Terminal -from ribasim.node_types.user import User +from ribasim.input_base import FileModel, NodeModel, TableModel, context_file_loading from ribasim.types import FilePath -class Model(BaseModel): +class Database(FileModel, NodeModel): + node: Node = Field(default_factory=Node) + edge: Edge = Field(default_factory=Edge) + + def n_nodes(self): + if self.node.df is not None: + n = len(self.node.df) + else: + n = 0 + + return n + + @classmethod + def _load(cls, filepath: Path | None) -> Dict[str, Any]: + if filepath is not None: + context_file_loading.get()["database"] = filepath + return {} + + @classmethod + def _layername(cls, field: str) -> str: + return field.capitalize() + + def _save(self, directory): + # We write all tables to a temporary database with a dot prefix, + # and at the end move this over the target file. + # This does not throw a PermissionError if the file is open in QGIS. + directory = Path(directory) + db_path = directory / "database.gpkg" + db_path = db_path.resolve() + temp_path = db_path.with_stem(".database") + + # avoid adding tables to existing model + temp_path.unlink(missing_ok=True) + context_file_loading.get()["database"] = temp_path + + self.node._save(directory) + self.edge._save(directory) + + shutil.move(temp_path, db_path) + context_file_loading.get()["database"] = db_path + + @model_serializer + def set_modelname(self) -> str: + return "database.gpkg" + + +class Model(FileModel): """ A full Ribasim model schematisation with all input. @@ -80,42 +124,41 @@ class Model(BaseModel): Starting time of the simulation. endtime : Union[str, datetime.datetime] End time of the simulation. - allocation : Optional[Allocation] - Allocation settings. solver : Optional[Solver] Solver settings. logging : Optional[logging] Logging settings. """ - node: Node - edge: Edge - basin: Basin - fractional_flow: Optional[FractionalFlow] - level_boundary: Optional[LevelBoundary] - flow_boundary: Optional[FlowBoundary] - linear_resistance: Optional[LinearResistance] - manning_resistance: Optional[ManningResistance] - tabulated_rating_curve: Optional[TabulatedRatingCurve] - pump: Optional[Pump] - outlet: Optional[Outlet] - terminal: Optional[Terminal] - discrete_control: Optional[DiscreteControl] - pid_control: Optional[PidControl] - user: Optional[User] starttime: datetime.datetime endtime: datetime.datetime - allocation: Optional[Allocation] - solver: Optional[Solver] - logging: Optional[Logging] - class Config: - validate_assignment = True - - @classmethod - def fields(cls): - """Return the names of the fields contained in the Model.""" - return cls.__fields__.keys() + update_timestep: float = 86400 + relative_dir: str = "." + input_dir: str = "." + results_dir: str = "." + + database: Database = Field(default_factory=Database) + results: Results = Results() + solver: Solver = Solver() + logging: Logging = Logging() + + allocation: Allocation = Field(default_factory=Allocation) + basin: Basin = Field(default_factory=Basin) + fractional_flow: FractionalFlow = Field(default_factory=FractionalFlow) + level_boundary: LevelBoundary = Field(default_factory=LevelBoundary) + flow_boundary: FlowBoundary = Field(default_factory=FlowBoundary) + linear_resistance: LinearResistance = Field(default_factory=LinearResistance) + manning_resistance: ManningResistance = Field(default_factory=ManningResistance) + tabulated_rating_curve: TabulatedRatingCurve = Field( + default_factory=TabulatedRatingCurve + ) + pump: Pump = Field(default_factory=Pump) + outlet: Outlet = Field(default_factory=Outlet) + terminal: Terminal = Field(default_factory=Terminal) + discrete_control: DiscreteControl = Field(default_factory=DiscreteControl) + pid_control: PidControl = Field(default_factory=PidControl) + user: User = Field(default_factory=User) def __repr__(self) -> str: first = [] @@ -135,153 +178,82 @@ def _repr_html(self): def _write_toml(self, directory: FilePath): directory = Path(directory) - content = { - "starttime": self.starttime, - "endtime": self.endtime, - "database": "database.gpkg", - } - if self.solver is not None: - section = {k: v for k, v in self.solver.dict().items() if v is not None} - content["solver"] = section - - if self.allocation is not None: - section = {k: v for k, v in self.allocation.dict().items() if v is not None} - content["allocation"] = section - - # TODO This should be rewritten as self.dict(exclude_unset=True, exclude_defaults=True) - # after we make sure that we have a (sub)model that's only the config, instead - # the mix of models and config it is now. - if self.logging is not None: - section = {k: v for k, v in self.logging.dict().items() if v is not None} - content["logging"] = section - - with open(directory / "ribasim.toml", "wb") as f: - tomli_w.dump(content, f) - return - - def _write_tables(self, directory: FilePath) -> None: - """Write the input to database tables.""" - # We write all tables to a temporary database with a dot prefix, - # and at the end move this over the target file. - # This does not throw a PermissionError if the file is open in QGIS. - directory = Path(directory) - db_path = directory / "database.gpkg" - temp_path = db_path.with_stem(".database.gpkg") - # avoid adding tables to existing model - temp_path.unlink(missing_ok=True) - # write to database using geopandas - self.node.write_layer(temp_path) - self.edge.write_layer(temp_path) + content = self.model_dump(exclude_unset=True, exclude_none=True) + # Filter empty dicts (default Nodes) + content = dict(filter(lambda x: x[1], content.items())) - # write to database using sqlite3 - with closing(connect(temp_path)) as connection: - for name in self.fields(): - input_entry = getattr(self, name) - is_geometry = isinstance(input_entry, Node) or isinstance( - input_entry, Edge - ) - if isinstance(input_entry, TableModel) and not is_geometry: - input_entry.write_table(connection) - connection.commit() - - shutil.move(temp_path, db_path) - return - - @staticmethod - def get_node_types(): - node_names_all, node_cls_all = list( - zip(*inspect.getmembers(node_types, inspect.isclass)) - ) - return node_names_all, node_cls_all - - def validate_model_node_types(self): - """Check whether all node types in the node field are valid.""" - - node_names_all, _ = Model.get_node_types() - - invalid_node_types = set() + fn = directory / "ribasim.toml" + with open(fn, "wb") as f: + tomli_w.dump(content, f) + return fn - # Check node types - for node_type in self.node.static["type"]: - if node_type not in node_names_all: - invalid_node_types.add(node_type) + def _save(self, directory: DirectoryPath): + for sub in self.nodes().values(): + sub._save(directory) - if len(invalid_node_types) > 0: - invalid_node_types = ", ".join(invalid_node_types) - raise TypeError( - f"Invalid node types detected: [{invalid_node_types}]. Choose from: {', '.join(node_names_all)}." - ) + def nodes(self): + return { + k: getattr(self, k) + for k in self.model_fields.keys() + if isinstance(getattr(self, k), (NodeModel,)) + } - def validate_model_node_field_IDs(self): + def validate_model_node_field_ids(self): """Check whether the node IDs of the node_type fields are valid.""" - _, node_cls_all = Model.get_node_types() - - node_names_all_snake_case = [cls.get_toml_key() for cls in node_cls_all] + n_nodes = self.database.n_nodes() # Check node IDs of node fields - node_IDs_all = [] - n_nodes = len(self.node.static) - - for name in self.fields(): - if name in node_names_all_snake_case: - if node_field := getattr(self, name): - node_IDs_field = node_field.get_node_IDs() - node_IDs_all.append(list(node_IDs_field)) + all_node_ids = set[int]() + for node in self.nodes().values(): + all_node_ids.update(node.node_ids()) - node_IDs_all = np.concatenate(node_IDs_all) - node_IDs_unique, node_ID_counts = np.unique(node_IDs_all, return_counts=True) + unique, counts = np.unique(list(all_node_ids), return_counts=True) - node_IDs_positive_integers = np.greater(node_IDs_unique, 0) & np.equal( - node_IDs_unique.astype(int), node_IDs_unique + node_ids_positive_integers = np.greater(unique, 0) & np.equal( + unique.astype(int), unique ) - if not node_IDs_positive_integers.all(): + if not node_ids_positive_integers.all(): raise ValueError( - f"Node IDs must be positive integers, got {node_IDs_unique[~node_IDs_positive_integers]}." + f"Node IDs must be positive integers, got {unique[~node_ids_positive_integers]}." ) - if (node_ID_counts > 1).any(): + if (counts > 1).any(): raise ValueError( - f"These node IDs were assigned to multiple node types: {node_IDs_unique[(node_ID_counts > 1)]}." + f"These node IDs were assigned to multiple node types: {unique[(counts > 1)]}." ) - if not np.array_equal(node_IDs_unique, np.arange(n_nodes) + 1): - node_IDs_missing = set(np.arange(n_nodes) + 1) - set(node_IDs_unique) - node_IDs_over = set(node_IDs_unique) - set(np.arange(n_nodes) + 1) + if not np.array_equal(unique, np.arange(n_nodes) + 1): + node_ids_missing = set(np.arange(n_nodes) + 1) - set(unique) + node_ids_over = set(unique) - set(np.arange(n_nodes) + 1) msg = [ - f"Expected node IDs from 1 to {n_nodes} (the number of rows in self.node.static)." + f"Expected node IDs from 1 to {n_nodes} (the number of rows in self.database.node.df)." ] - if len(node_IDs_missing) > 0: - msg.append(f"These node IDs are missing: {node_IDs_missing}.") + if len(node_ids_missing) > 0: + msg.append(f"These node IDs are missing: {node_ids_missing}.") - if len(node_IDs_over) > 0: - msg.append(f"These node IDs are unexpected: {node_IDs_over}.") + if len(node_ids_over) > 0: + msg.append(f"These node IDs are unexpected: {node_ids_over}.") raise ValueError(" ".join(msg)) - def validate_model_node_IDs(self): + def validate_model_node_ids(self): """Check whether the node IDs in the node field correspond to the node IDs on the node type fields.""" - _, node_cls_all = Model.get_node_types() - - node_names_all_snake_case = [cls.get_toml_key() for cls in node_cls_all] - error_messages = [] - for name in self.fields(): - if name in node_names_all_snake_case: - if attr := getattr(self, name): - node_IDs_field = attr.get_node_IDs() - node_IDs_from_node_field = self.node.static.loc[ - self.node.static["type"] == attr.get_input_type() - ].index + for node in self.nodes().values(): + node_ids_field = node.node_ids() + node_ids_from_node_field = self.database.node.df.loc[ + self.database.node.df["type"] == node.get_input_type() + ].index - if not set(node_IDs_from_node_field) == set(node_IDs_field): - error_messages.append( - f"The node IDs in the field {name} {node_IDs_field} do not correspond with the node IDs in the field node {node_IDs_from_node_field.tolist()}." - ) + if not set(node_ids_from_node_field) == set(node_ids_field): + error_messages.append( + f"The node IDs in the field {node} {node_ids_field} do not correspond with the node IDs in the field node {node_ids_from_node_field.tolist()}." + ) if len(error_messages) > 0: raise ValueError("\n".join(error_messages)) @@ -290,16 +262,14 @@ def validate_model(self): """Validate the model. Checks: - - Whether all node types in the node field are valid - Whether the node IDs of the node_type fields are valid - Whether the node IDs in the node field correspond to the node IDs on the node type fields """ - self.validate_model_node_types() - self.validate_model_node_field_IDs() - self.validate_model_node_IDs() + self.validate_model_node_field_ids() + self.validate_model_node_ids() - def write(self, directory: FilePath) -> None: + def write(self, directory: FilePath) -> Path: """ Write the contents of the model to a database and a TOML configuration file. @@ -310,15 +280,37 @@ def write(self, directory: FilePath) -> None: directory: FilePath """ self.validate_model() - + context_file_loading.set({}) directory = Path(directory) directory.mkdir(parents=True, exist_ok=True) - self._write_toml(directory) - self._write_tables(directory) - return + self._save(directory) + fn = self._write_toml(directory) + + context_file_loading.set({}) + return fn + + @classmethod + def _load(cls, filepath: Path | None) -> Dict[str, Any]: + context_file_loading.set({}) + + if filepath is not None: + with open(filepath, "rb") as f: + config = tomli.load(f) + + # Convert relative path to absolute path + config["database"] = filepath.parent / config["database"] + return config + else: + return {} - @staticmethod - def from_toml(path: FilePath) -> "Model": + @model_validator(mode="after") + def reset_contextvar(self) -> "Model": + # Drop database info + context_file_loading.set({}) + return self + + @classmethod + def from_toml(cls, path: Path | str) -> "Model": """ Initialize a model from the TOML configuration file. @@ -331,48 +323,33 @@ def from_toml(path: FilePath) -> "Model": ------- model : Model """ - - path = Path(path) - with open(path, "rb") as f: - config = tomli.load(f) - - kwargs: dict[str, Any] = {} - config["database"] = path.parent / config["database"] - - for module in [geometry, node_types]: - for _, node_type_cls in inspect.getmembers(module, inspect.isclass): - cls_casted = cast(Type[TableModel], node_type_cls) - kwargs[node_type_cls.get_toml_key()] = cls_casted.from_config(config) - - kwargs["starttime"] = config["starttime"] - kwargs["endtime"] = config["endtime"] - kwargs["solver"] = config.get("solver") - - return Model(**kwargs) + kwargs = cls._load(Path(path)) + return cls(**kwargs) def plot_control_listen(self, ax): x_start, x_end = [], [] y_start, y_end = [], [] - if self.discrete_control: - condition = self.discrete_control.condition - + condition = self.discrete_control.condition.df + if condition is not None: for node_id in condition.node_id.unique(): data_node_id = condition[condition.node_id == node_id] for listen_feature_id in data_node_id.listen_feature_id: - point_start = self.node.static.iloc[node_id - 1].geometry + point_start = self.database.node.df.iloc[node_id - 1].geometry x_start.append(point_start.x) y_start.append(point_start.y) - point_end = self.node.static.iloc[listen_feature_id - 1].geometry + point_end = self.database.node.df.iloc[ + listen_feature_id - 1 + ].geometry x_end.append(point_end.x) y_end.append(point_end.y) - if self.pid_control: - static = self.pid_control.static - time = self.pid_control.time - node_static = self.node.static + if self.pid_control.static.df is not None: + static = self.pid_control.static.df + time = self.pid_control.time.df + node_static = self.database.node.static.df for table in [static, time]: if table is None: @@ -419,34 +396,22 @@ def plot(self, ax=None) -> Any: if ax is None: _, ax = plt.subplots() ax.axis("off") - self.edge.plot(ax=ax, zorder=2) + self.database.edge.plot(ax=ax, zorder=2) self.plot_control_listen(ax) - self.node.plot(ax=ax, zorder=3) + self.database.node.plot(ax=ax, zorder=3) ax.legend(loc="lower left", bbox_to_anchor=(1, 0.5)) return ax - def sort(self): - """ - Sort all input tables as required. - - Tables are sorted by "node_id", unless otherwise specified. - Sorting is done automatically before writing the table. - """ - for name in self.fields(): - input_entry = getattr(self, name) - if isinstance(input_entry, TableModel): - input_entry.sort() - def print_discrete_control_record(self, path: FilePath) -> None: path = Path(path) df_control = pd.read_feather(path) - node_types, node_clss = Model.get_node_types() - + node_attrs, node_instances = zip(*self.nodes().items()) + node_clss = [node_cls.get_input_type() for node_cls in node_instances] truth_dict = {"T": ">", "F": "<"} - if not self.discrete_control: + if self.discrete_control.condition.df is None: raise ValueError("This model has no control input.") for index, row in df_control.iterrows(): @@ -458,8 +423,11 @@ def print_discrete_control_record(self, path: FilePath) -> None: out = f"{enumeration}At {datetime} the control node with ID {control_node_id} reached truth state {truth_state}:\n" - conditions = self.discrete_control.condition[ - self.discrete_control.condition.node_id == control_node_id + if self.discrete_control.condition.df is None: + return + + conditions = self.discrete_control.condition.df[ + self.discrete_control.condition.df.node_id == control_node_id ] for truth_value, (index, condition) in zip( @@ -467,7 +435,7 @@ def print_discrete_control_record(self, path: FilePath) -> None: ): var = condition["variable"] listen_feature_id = condition["listen_feature_id"] - listen_node_type = self.node.static.loc[listen_feature_id, "type"] + listen_node_type = self.database.node.df.loc[listen_feature_id, "type"] symbol = truth_dict[truth_value] greater_than = condition["greater_than"] feature_type = "edge" if var == "flow" else "node" @@ -477,19 +445,17 @@ def print_discrete_control_record(self, path: FilePath) -> None: padding = len(enumeration) * " " out += f'\n{padding}This yielded control state "{control_state}":\n' - affect_node_ids = self.edge.static[ - self.edge.static.from_node_id == control_node_id + affect_node_ids = self.database.edge.df[ + self.database.edge.df.from_node_id == control_node_id ].to_node_id for affect_node_id in affect_node_ids: - affect_node_type = self.node.static.loc[affect_node_id, "type"] - affect_node_type_snake_case = node_clss[ - node_types.index(affect_node_type) - ].get_toml_key() + affect_node_type = self.database.node.df.loc[affect_node_id, "type"] + nodeattr = node_attrs[node_clss.index(affect_node_type)] out += f"\tFor node ID {affect_node_id} ({affect_node_type}): " - static = getattr(self, affect_node_type_snake_case).static + static = getattr(self, nodeattr).static.df row = static[ (static.node_id == affect_node_id) & (static.control_state == control_state) diff --git a/python/ribasim/ribasim/node_types/__init__.py b/python/ribasim/ribasim/node_types/__init__.py deleted file mode 100644 index a202a0883..000000000 --- a/python/ribasim/ribasim/node_types/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -from ribasim.node_types.basin import Basin -from ribasim.node_types.discrete_control import DiscreteControl -from ribasim.node_types.flow_boundary import FlowBoundary -from ribasim.node_types.fractional_flow import FractionalFlow -from ribasim.node_types.level_boundary import LevelBoundary -from ribasim.node_types.linear_resistance import LinearResistance -from ribasim.node_types.manning_resistance import ManningResistance -from ribasim.node_types.outlet import Outlet -from ribasim.node_types.pid_control import PidControl -from ribasim.node_types.pump import Pump -from ribasim.node_types.tabulated_rating_curve import TabulatedRatingCurve -from ribasim.node_types.terminal import Terminal -from ribasim.node_types.user import User - -__all__ = [ - "Basin", - "FractionalFlow", - "LevelBoundary", - "LinearResistance", - "ManningResistance", - "Pump", - "Outlet", - "FlowBoundary", - "TabulatedRatingCurve", - "Terminal", - "DiscreteControl", - "PidControl", - "User", -] diff --git a/python/ribasim/ribasim/node_types/basin.py b/python/ribasim/ribasim/node_types/basin.py deleted file mode 100644 index e87b7170b..000000000 --- a/python/ribasim/ribasim/node_types/basin.py +++ /dev/null @@ -1,44 +0,0 @@ -from typing import Optional - -from pandera.typing import DataFrame - -from ribasim.input_base import TableModel -from ribasim.schemas import ( # type: ignore - BasinProfileSchema, - BasinStateSchema, - BasinStaticSchema, - BasinTimeSchema, -) - -__all__ = ("Basin",) - - -class Basin(TableModel): - """ - Input for a (sub-)basin: an area of land where all flowing surface water converges to a single point. - - Parameters - ---------- - profile : pandas.DataFrame - Table describing the geometry. - static : pandas.DataFrame, optional - Table describing the constant fluxes. - time : pandas.DataFrame, optional - Table describing the time-varying fluxes. - state : pandas.DataFrame, optional - Table describing the initial condition. - """ - - profile: DataFrame[BasinProfileSchema] - static: Optional[DataFrame[BasinStaticSchema]] = None - time: Optional[DataFrame[BasinTimeSchema]] = None - state: Optional[DataFrame[BasinStateSchema]] = None - - def sort(self): - self.profile.sort_values(["node_id", "level"], ignore_index=True, inplace=True) - if self.static is not None: - self.static.sort_values("node_id", ignore_index=True, inplace=True) - if self.time is not None: - self.time.sort_values(["time", "node_id"], ignore_index=True, inplace=True) - if self.state is not None: - self.state.sort_values("node_id", ignore_index=True, inplace=True) diff --git a/python/ribasim/ribasim/node_types/discrete_control.py b/python/ribasim/ribasim/node_types/discrete_control.py deleted file mode 100644 index 99c3fe4b6..000000000 --- a/python/ribasim/ribasim/node_types/discrete_control.py +++ /dev/null @@ -1,25 +0,0 @@ -from pandera.typing import DataFrame - -from ribasim.input_base import TableModel -from ribasim.schemas import ( # type: ignore - DiscreteControlConditionSchema, - DiscreteControlLogicSchema, -) - -__all__ = ("DiscreteControl",) - - -class DiscreteControl(TableModel): - """ - Defines the control logic. - - Parameters - ---------- - condition : pandas.DataFrame - Table with the information of control conditions. - logic : pandas.Dataframe - Table with the information of truth state to control state mapping. - """ - - condition: DataFrame[DiscreteControlConditionSchema] - logic: DataFrame[DiscreteControlLogicSchema] diff --git a/python/ribasim/ribasim/node_types/flow_boundary.py b/python/ribasim/ribasim/node_types/flow_boundary.py deleted file mode 100644 index e53520fd7..000000000 --- a/python/ribasim/ribasim/node_types/flow_boundary.py +++ /dev/null @@ -1,33 +0,0 @@ -from typing import Optional - -from pandera.typing import DataFrame - -from ribasim.input_base import TableModel -from ribasim.schemas import ( # type: ignore - FlowBoundaryStaticSchema, - FlowBoundaryTimeSchema, -) - -__all__ = ("FlowBoundary",) - - -class FlowBoundary(TableModel): - """ - Sets a precribed flow like a one-sided pump. - - Parameters - ---------- - static : pandas.DataFrame - Table with the constant flows. - time : pandas.DataFrame - Table with time-varying flow rates. - """ - - static: Optional[DataFrame[FlowBoundaryStaticSchema]] = None - time: Optional[DataFrame[FlowBoundaryTimeSchema]] = None - - def sort(self): - if self.static is not None: - self.static.sort_values("node_id", ignore_index=True, inplace=True) - if self.time is not None: - self.time.sort_values(["time", "node_id"], ignore_index=True, inplace=True) diff --git a/python/ribasim/ribasim/node_types/fractional_flow.py b/python/ribasim/ribasim/node_types/fractional_flow.py deleted file mode 100644 index e24eecde5..000000000 --- a/python/ribasim/ribasim/node_types/fractional_flow.py +++ /dev/null @@ -1,19 +0,0 @@ -from pandera.typing import DataFrame - -from ribasim.input_base import TableModel -from ribasim.schemas import FractionalFlowStaticSchema # type: ignore - -__all__ = ("FractionalFlow",) - - -class FractionalFlow(TableModel): - """ - Receives a fraction of the flow. The fractions must sum to 1.0 for a furcation. - - Parameters - ---------- - static : pandas.DataFrame - Table with the constant flow fractions. - """ - - static: DataFrame[FractionalFlowStaticSchema] diff --git a/python/ribasim/ribasim/node_types/level_boundary.py b/python/ribasim/ribasim/node_types/level_boundary.py deleted file mode 100644 index 3437acf7b..000000000 --- a/python/ribasim/ribasim/node_types/level_boundary.py +++ /dev/null @@ -1,31 +0,0 @@ -from typing import Optional - -from pandera.typing import DataFrame - -from ribasim.input_base import TableModel -from ribasim.schemas import ( # type: ignore - LevelBoundaryStaticSchema, - LevelBoundaryTimeSchema, -) - -__all__ = ("LevelBoundary",) - - -class LevelBoundary(TableModel): - """ - Stores water at a given level unaffected by flow, like an infinitely large basin. - - Parameters - ---------- - static : pandas.DataFrame - Table with the constant water levels. - """ - - static: Optional[DataFrame[LevelBoundaryStaticSchema]] = None - time: Optional[DataFrame[LevelBoundaryTimeSchema]] = None - - def sort(self): - if self.static is not None: - self.static.sort_values("node_id", ignore_index=True, inplace=True) - if self.time is not None: - self.time.sort_values(["time", "node_id"], ignore_index=True, inplace=True) diff --git a/python/ribasim/ribasim/node_types/linear_resistance.py b/python/ribasim/ribasim/node_types/linear_resistance.py deleted file mode 100644 index ec93a53e1..000000000 --- a/python/ribasim/ribasim/node_types/linear_resistance.py +++ /dev/null @@ -1,20 +0,0 @@ -from pandera.typing import DataFrame - -from ribasim.input_base import TableModel -from ribasim.schemas import LinearResistanceStaticSchema # type: ignore - -__all__ = ("LinearResistance",) - - -class LinearResistance(TableModel): - """ - Flow through this connection linearly depends on the level difference - between the two connected basins. - - Parameters - ---------- - static : pd.DataFrame - Table with the constant resistances. - """ - - static: DataFrame[LinearResistanceStaticSchema] diff --git a/python/ribasim/ribasim/node_types/manning_resistance.py b/python/ribasim/ribasim/node_types/manning_resistance.py deleted file mode 100644 index 50dc43fe3..000000000 --- a/python/ribasim/ribasim/node_types/manning_resistance.py +++ /dev/null @@ -1,20 +0,0 @@ -from pandera.typing import DataFrame - -from ribasim.input_base import TableModel -from ribasim.schemas import ManningResistanceStaticSchema # type: ignore - -__all__ = ("ManningResistance",) - - -class ManningResistance(TableModel): - """ - Flow through this connection is estimated by conservation of energy and the - Manning-Gauckler formula to estimate friction losses. - - Parameters - ---------- - static : pd.DataFrame - Table with the constant Manning parameters. - """ - - static: DataFrame[ManningResistanceStaticSchema] diff --git a/python/ribasim/ribasim/node_types/outlet.py b/python/ribasim/ribasim/node_types/outlet.py deleted file mode 100644 index 46fb70c22..000000000 --- a/python/ribasim/ribasim/node_types/outlet.py +++ /dev/null @@ -1,23 +0,0 @@ -from pandera.typing import DataFrame - -from ribasim.input_base import TableModel -from ribasim.schemas import OutletStaticSchema # type: ignore - -__all__ = ("Outlet",) - - -class Outlet(TableModel): - """ - Conducts water from a source node to a destination node. - The set flow rate will be used unless the intake storage is less than 10m3, - in which case the flow rate will be linearly reduced to 0 m3/s. - Negative flow rates are not supported. - Note that the intake must always be a Basin. - - Parameters - ---------- - static : pd.DataFrame - Table with constant flow rates. - """ - - static: DataFrame[OutletStaticSchema] diff --git a/python/ribasim/ribasim/node_types/pid_control.py b/python/ribasim/ribasim/node_types/pid_control.py deleted file mode 100644 index f70dbf3e3..000000000 --- a/python/ribasim/ribasim/node_types/pid_control.py +++ /dev/null @@ -1,34 +0,0 @@ -from typing import Optional - -from pandera.typing import DataFrame - -from ribasim.input_base import TableModel -from ribasim.schemas import PidControlStaticSchema, PidControlTimeSchema # type: ignore - -__all__ = ("PidControl",) - - -class PidControl(TableModel): - """ - Controller based on PID (Proportional, integral, derivative) which - controls the level of a single basin with a pump. - - Parameters - ---------- - static: pandas.DataFrame - Table with data for this node type. - time : pandas.DataFrame, optional - Table with time-varying data for this node type. - """ - - static: Optional[DataFrame[PidControlStaticSchema]] = None - time: Optional[DataFrame[PidControlTimeSchema]] = None - - class Config: - validate_assignment = True - - def sort(self): - if self.static is not None: - self.static.sort_values("node_id", ignore_index=True, inplace=True) - if self.time is not None: - self.time.sort_values(["time", "node_id"], ignore_index=True, inplace=True) diff --git a/python/ribasim/ribasim/node_types/pump.py b/python/ribasim/ribasim/node_types/pump.py deleted file mode 100644 index d2a966a25..000000000 --- a/python/ribasim/ribasim/node_types/pump.py +++ /dev/null @@ -1,23 +0,0 @@ -from pandera.typing import DataFrame - -from ribasim.input_base import TableModel -from ribasim.schemas import PumpStaticSchema # type: ignore - -__all__ = ("Pump",) - - -class Pump(TableModel): - """ - Pump water from a source node to a destination node. - The set flow rate will be pumped unless the intake storage is less than 10m3, - in which case the flow rate will be linearly reduced to 0 m3/s. - Negative flow rates are not supported. - Note that the intake must always be a Basin. - - Parameters - ---------- - static : pd.DataFrame - Table with constant flow rates. - """ - - static: DataFrame[PumpStaticSchema] diff --git a/python/ribasim/ribasim/node_types/tabulated_rating_curve.py b/python/ribasim/ribasim/node_types/tabulated_rating_curve.py deleted file mode 100644 index cb88f888d..000000000 --- a/python/ribasim/ribasim/node_types/tabulated_rating_curve.py +++ /dev/null @@ -1,37 +0,0 @@ -from typing import Optional - -from pandera.typing import DataFrame - -from ribasim.input_base import TableModel -from ribasim.schemas import ( # type: ignore - TabulatedRatingCurveStaticSchema, - TabulatedRatingCurveTimeSchema, -) - -__all__ = ("TabulatedRatingCurve",) - - -class TabulatedRatingCurve(TableModel): - """ - Linearly interpolates discharge between a tabulation of level and discharge. - - Parameters - ---------- - static : pd.DataFrame - Table with constant rating curves. - time : pandas.DataFrame, optional - Table with time-varying rating curves. - """ - - static: Optional[DataFrame[TabulatedRatingCurveStaticSchema]] = None - time: Optional[DataFrame[TabulatedRatingCurveTimeSchema]] = None - - def sort(self): - if self.static is not None: - self.static.sort_values( - ["node_id", "level"], ignore_index=True, inplace=True - ) - if self.time is not None: - self.time.sort_values( - ["time", "node_id", "level"], ignore_index=True, inplace=True - ) diff --git a/python/ribasim/ribasim/node_types/terminal.py b/python/ribasim/ribasim/node_types/terminal.py deleted file mode 100644 index 3eb47e2a2..000000000 --- a/python/ribasim/ribasim/node_types/terminal.py +++ /dev/null @@ -1,19 +0,0 @@ -from pandera.typing import DataFrame - -from ribasim.input_base import TableModel -from ribasim.schemas import TerminalStaticSchema # type: ignore - -__all__ = ("Terminal",) - - -class Terminal(TableModel): - """ - Water sink without state or properties. - - Parameters - ---------- - static : pd.DataFrame - Table with only node IDs of this type. - """ - - static: DataFrame[TerminalStaticSchema] diff --git a/python/ribasim/ribasim/node_types/user.py b/python/ribasim/ribasim/node_types/user.py deleted file mode 100644 index 2dda210b5..000000000 --- a/python/ribasim/ribasim/node_types/user.py +++ /dev/null @@ -1,53 +0,0 @@ -from typing import Optional - -import pandera as pa -from pandera.engines.pandas_engine import PydanticModel -from pandera.typing import DataFrame - -from ribasim import models -from ribasim.input_base import TableModel - -__all__ = ("User",) - - -class StaticSchema(pa.SchemaModel): - class Config: - """Config with dataframe-level data type.""" - - dtype = PydanticModel(models.UserStatic) - - -class TimeSchema(pa.SchemaModel): - class Config: - """Config with dataframe-level data type.""" - - dtype = PydanticModel(models.UserTime) - - -class User(TableModel): - """ - User node type with demand and priority. - - Parameters - ---------- - static: pandas.DataFrame - table with static data for this node type. - time: pandas.DataFrame - table with static data for this node type (only demand can be transient). - """ - - static: Optional[DataFrame[StaticSchema]] = None - time: Optional[DataFrame[TimeSchema]] = None - - class Config: - validate_assignment = True - - def sort(self): - if self.static is not None: - self.static.sort_values( - ["node_id", "priority"], ignore_index=True, inplace=True - ) - if self.time is not None: - self.time.sort_values( - ["node_id", "priority", "time"], ignore_index=True, inplace=True - ) diff --git a/python/ribasim/ribasim/schemas.py b/python/ribasim/ribasim/schemas.py index c7c44ab0c..d8a859a43 100644 --- a/python/ribasim/ribasim/schemas.py +++ b/python/ribasim/ribasim/schemas.py @@ -22,7 +22,11 @@ def gen_schema(name, cls): "Config": type( f"{cname}.Config", (), - {"dtype": PydanticModel(cls), "coerce": True}, + { + "dtype": PydanticModel(cls), + "coerce": True, + "add_missing_columns": True, + }, ) }, ) diff --git a/python/ribasim/ribasim/utils.py b/python/ribasim/ribasim/utils.py index 6a3db761e..be5c684da 100644 --- a/python/ribasim/ribasim/utils.py +++ b/python/ribasim/ribasim/utils.py @@ -26,7 +26,7 @@ def geometry_from_connectivity( edge_geometry : np.ndarray Array of shapely LineStrings. """ - geometry = node.static["geometry"] + geometry = node.df["geometry"] from_points = shapely.get_coordinates(geometry.loc[from_id]) to_points = shapely.get_coordinates(geometry.loc[to_id]) n = len(from_points) @@ -56,8 +56,8 @@ def connectivity_from_geometry( from_node_id : np.ndarray of int to_node_id : np.ndarray of int """ - node_index = node.static.index - node_xy = shapely.get_coordinates(node.static.geometry.values) + node_index = node.df.index + node_xy = shapely.get_coordinates(node.df.geometry.values) edge_xy = shapely.get_coordinates(lines) xy = np.vstack([node_xy, edge_xy]) diff --git a/python/ribasim/tests/test_edge.py b/python/ribasim/tests/test_edge.py index 7230dfe3a..ea41a575c 100644 --- a/python/ribasim/tests/test_edge.py +++ b/python/ribasim/tests/test_edge.py @@ -23,6 +23,7 @@ def test_validation(edge): with pytest.raises(ValidationError): df = gpd.GeoDataFrame( - data={"from_node_id": [1, 1], "to_node_id": [2, 3]}, geometry=[None, None] + data={"from_node_id": [1, 1], "to_node_id": [None, 3]}, + geometry=[None, None], ) - Edge(static=df) + Edge(df=df) diff --git a/python/ribasim/tests/test_io.py b/python/ribasim/tests/test_io.py index e821cb4e5..072f99e8c 100644 --- a/python/ribasim/tests/test_io.py +++ b/python/ribasim/tests/test_io.py @@ -9,6 +9,8 @@ def assert_equal(a, b): """Like pandas.testing.assert_frame_equal, but ignoring the index.""" + if a is None and b is None: + return True # TODO support assert basic == model, ignoring the index for all but node a = a.reset_index(drop=True) @@ -25,28 +27,30 @@ def assert_equal(a, b): def test_basic(basic, tmp_path): model_orig = basic model_orig.write(tmp_path / "basic") - model_loaded = ribasim.Model.from_toml(tmp_path / "basic/ribasim.toml") + model_loaded = ribasim.Model(filepath=tmp_path / "basic/ribasim.toml") - index_a = model_orig.node.static.index.to_numpy(int) - index_b = model_loaded.node.static.index.to_numpy(int) + index_a = model_orig.database.node.df.index.to_numpy(int) + index_b = model_loaded.database.node.df.index.to_numpy(int) assert_array_equal(index_a, index_b) - assert_equal(model_orig.node.static, model_loaded.node.static) - assert_equal(model_orig.edge.static, model_loaded.edge.static) - assert model_loaded.basin.time is None + assert_equal(model_orig.database.node.df, model_loaded.database.node.df) + assert_equal(model_orig.database.edge.df, model_loaded.database.edge.df) + assert model_loaded.basin.time.df is None def test_basic_transient(basic_transient, tmp_path): model_orig = basic_transient model_orig.write(tmp_path / "basic_transient") - model_loaded = ribasim.Model.from_toml(tmp_path / "basic_transient/ribasim.toml") + model_loaded = ribasim.Model(filepath=tmp_path / "basic_transient/ribasim.toml") + print(model_loaded.database.node) + print(model_loaded.database.edge) - assert_equal(model_orig.node.static, model_loaded.node.static) - assert_equal(model_orig.edge.static, model_loaded.edge.static) + assert_equal(model_orig.database.node.df, model_loaded.database.node.df) + assert_equal(model_orig.database.edge.df, model_loaded.database.edge.df) time = model_loaded.basin.time - assert model_orig.basin.time.time[0] == time.time[0] - assert_equal(model_orig.basin.time, time) - assert time.shape == (1468, 8) + assert model_orig.basin.time.df.time[0] == time.df.time[0] + assert_equal(model_orig.basin.time.df, time.df) + assert time.df.shape == (1468, 8) def test_pydantic(): @@ -63,7 +67,4 @@ def test_repr(): pump_1 = Pump(static=static_data) - assert ( - repr(pump_1) - == "\n static: DataFrame(rows=3)\n (node_id, active, flow_rate, min_flow_rate,\n max_flow_rate, control_state, remarks)" - ) + assert repr(pump_1) == "Pump(static=TableModel[PumpStaticSchema]())" diff --git a/python/ribasim/tests/test_model.py b/python/ribasim/tests/test_model.py index b3a1895ef..08d12cfa8 100644 --- a/python/ribasim/tests/test_model.py +++ b/python/ribasim/tests/test_model.py @@ -27,9 +27,10 @@ def test_solver(): Solver(saveat="a") +@pytest.mark.xfail(reason="Needs refactor") def test_invalid_node_type(basic): # Add entry with invalid node type - basic.node.static = basic.node.static._append( + basic.node.static = basic.node.df._append( {"type": "InvalidNodeType", "geometry": Point(0, 0)}, ignore_index=True ) @@ -44,42 +45,48 @@ def test_invalid_node_id(basic): model = basic # Add entry with invalid node ID - model.pump.static = model.pump.static._append( + df = model.pump.static.df._append( {"flow_rate": 1, "node_id": -1, "remarks": "", "active": True}, ignore_index=True, ) + # Currently can't handle mixed NaN and None in a DataFrame + df = df.where(pd.notna(df), None) + model.pump.static.df = df with pytest.raises( ValueError, match=re.escape("Node IDs must be positive integers, got [-1]."), ): - model.validate_model_node_field_IDs() + model.validate_model_node_field_ids() +@pytest.mark.xfail(reason="Should be reimplemented by the .add() API.") def test_node_id_duplicate(basic): model = basic # Add duplicate node ID - model.pump.static = model.pump.static._append( + df = model.pump.static.df._append( {"flow_rate": 1, "node_id": 1, "remarks": "", "active": True}, ignore_index=True ) - + # Currently can't handle mixed NaN and None in a DataFrame + df = df.where(pd.notna(df), None) + model.pump.static.df = df with pytest.raises( ValueError, match=re.escape("These node IDs were assigned to multiple node types: [1]."), ): - model.validate_model_node_field_IDs() + model.validate_model_node_field_ids() def test_node_ids_misassigned(basic): model = basic # Misassign node IDs - model.pump.static.loc[0, "node_id"] = 8 - model.fractional_flow.static.loc[1, "node_id"] = 7 + model.pump.static.df.loc[0, "node_id"] = 8 + model.fractional_flow.static.df.loc[1, "node_id"] = 7 - with pytest.raises(ValueError, match="The node IDs in the field fractional_flow.+"): - model.validate_model_node_IDs() + with pytest.raises(ValueError, match="The node IDs in the field static.+"): + model.validate_model_node_ids() def test_node_ids_unsequential(basic): @@ -95,13 +102,13 @@ def test_node_ids_unsequential(basic): } ) - basin.static["node_id"] = [1, 3, 6, 1000] + basin.static.df["node_id"] = [1, 3, 6, 1000] with pytest.raises(ValueError) as excinfo: - model.validate_model_node_field_IDs() + model.validate_model_node_field_ids() assert ( - "Expected node IDs from 1 to 17 (the number of rows in self.node.static). These node IDs are missing: {9}. These node IDs are unexpected: {1000}." + "Expected node IDs from 1 to 17 (the number of rows in self.database.node.df). These node IDs are missing: {9}. These node IDs are unexpected: {1000}." in str(excinfo.value) ) diff --git a/python/ribasim/tests/test_utils.py b/python/ribasim/tests/test_utils.py index 7b8d78498..6ff4c74ac 100644 --- a/python/ribasim/tests/test_utils.py +++ b/python/ribasim/tests/test_utils.py @@ -15,7 +15,7 @@ def test_utils(): node_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1]) node = Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, diff --git a/python/ribasim_testmodels/ribasim_testmodels/allocation.py b/python/ribasim_testmodels/ribasim_testmodels/allocation.py index b593a837b..a72bdef96 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/allocation.py +++ b/python/ribasim_testmodels/ribasim_testmodels/allocation.py @@ -22,7 +22,7 @@ def user_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -35,7 +35,7 @@ def user_model(): to_id = np.array([2, 3, 4, 4], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -110,8 +110,7 @@ def user_model(): solver = ribasim.Solver(algorithm="Tsit5") model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, user=user, terminal=terminal, @@ -164,7 +163,7 @@ def subnetwork_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type, "allocation_network_id": 1}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -181,7 +180,7 @@ def subnetwork_model(): allocation_network_id[0] = 1 lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -219,8 +218,8 @@ def subnetwork_model(): data={ "node_id": 1, "flow_rate": np.arange(10, 0, -1), - "time": [f"2020-{i}-1 00:00:00" for i in range(1, 11)], - } + "time": pd.to_datetime([f"2020-{i}-1 00:00:00" for i in range(1, 11)]), + }, ) ) @@ -268,8 +267,7 @@ def subnetwork_model(): allocation = ribasim.Allocation(use_allocation=True, timestep=86400) model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, user=user, flow_boundary=flow_boundary, @@ -346,7 +344,7 @@ def looped_subnetwork_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type, "allocation_network_id": 1}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -425,7 +423,7 @@ def looped_subnetwork_model(): ) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -517,8 +515,7 @@ def looped_subnetwork_model(): ) model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, flow_boundary=flow_boundary, user=user, @@ -551,7 +548,7 @@ def minimal_subnetwork_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type, "allocation_network_id": 1}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -572,7 +569,7 @@ def minimal_subnetwork_model(): allocation_network_id[0] = 1 lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -656,8 +653,10 @@ def minimal_subnetwork_model(): allocation = ribasim.Allocation(use_allocation=True, timestep=86400) model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database( + node=node, + edge=edge, + ), basin=basin, flow_boundary=flow_boundary, pump=pump, diff --git a/python/ribasim_testmodels/ribasim_testmodels/backwater.py b/python/ribasim_testmodels/ribasim_testmodels/backwater.py index 2a5ae844a..b22f73429 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/backwater.py +++ b/python/ribasim_testmodels/ribasim_testmodels/backwater.py @@ -18,7 +18,7 @@ def backwater_model(): n_basin = counts[0] node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(node_xy)) + 1, name="fid"), geometry=node_xy, @@ -31,7 +31,7 @@ def backwater_model(): to_id = ids[1:] lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -93,8 +93,7 @@ def backwater_model(): ) model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, level_boundary=level_boundary, flow_boundary=flow_boundary, diff --git a/python/ribasim_testmodels/ribasim_testmodels/basic.py b/python/ribasim_testmodels/ribasim_testmodels/basic.py index 708a26dd1..2bb2fc41e 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/basic.py +++ b/python/ribasim_testmodels/ribasim_testmodels/basic.py @@ -144,7 +144,7 @@ def basic_model() -> ribasim.Model: ) node_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1]) - node_id, node_type = ribasim.Node.get_node_ids_and_types( + node_id, node_type = ribasim.Node.node_ids_and_types( basin, level_boundary, flow_boundary, @@ -158,7 +158,7 @@ def basic_model() -> ribasim.Model: # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(node_id, name="fid"), geometry=node_xy, @@ -175,7 +175,7 @@ def basic_model() -> ribasim.Model: ) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -190,8 +190,10 @@ def basic_model() -> ribasim.Model: # Setup a model: model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database( + node=node, + edge=edge, + ), basin=basin, level_boundary=level_boundary, flow_boundary=flow_boundary, @@ -237,7 +239,7 @@ def basic_transient_model() -> ribasim.Model: "urban_runoff": 0.0, } ) - basin_ids = model.basin.static["node_id"].to_numpy() + basin_ids = model.basin.static.df["node_id"].to_numpy() forcing = ( pd.concat( [timeseries.assign(node_id=id) for id in basin_ids], ignore_index=True @@ -256,7 +258,6 @@ def basic_transient_model() -> ribasim.Model: model.basin.time = forcing model.basin.state = state - model.logging = None return model @@ -337,11 +338,11 @@ def tabulated_rating_curve_model() -> ribasim.Model: ) node_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1]) - node_id, node_type = ribasim.Node.get_node_ids_and_types(basin, rating_curve) + node_id, node_type = ribasim.Node.node_ids_and_types(basin, rating_curve) # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(node_id, name="fid"), geometry=node_xy, @@ -354,7 +355,7 @@ def tabulated_rating_curve_model() -> ribasim.Model: to_id = np.array([2, 3, 4, 4], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -367,8 +368,7 @@ def tabulated_rating_curve_model() -> ribasim.Model: # Setup a model: model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, tabulated_rating_curve=rating_curve, starttime="2020-01-01 00:00:00", @@ -395,7 +395,7 @@ def outlet_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -408,7 +408,7 @@ def outlet_model(): to_id = np.array([2, 3], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -470,8 +470,7 @@ def outlet_model(): ) model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, outlet=outlet, level_boundary=level_boundary, diff --git a/python/ribasim_testmodels/ribasim_testmodels/bucket.py b/python/ribasim_testmodels/ribasim_testmodels/bucket.py index f46b9931c..ef88998f8 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/bucket.py +++ b/python/ribasim_testmodels/ribasim_testmodels/bucket.py @@ -17,7 +17,7 @@ def bucket_model() -> ribasim.Model: node_type = ["Basin"] # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -30,7 +30,7 @@ def bucket_model() -> ribasim.Model: to_id = np.array([], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -70,8 +70,7 @@ def bucket_model() -> ribasim.Model: basin = ribasim.Basin(profile=profile, static=static, state=state) model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, starttime="2020-01-01 00:00:00", endtime="2021-01-01 00:00:00", diff --git a/python/ribasim_testmodels/ribasim_testmodels/discrete_control.py b/python/ribasim_testmodels/ribasim_testmodels/discrete_control.py index 9c8acc9de..60f58e35b 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/discrete_control.py +++ b/python/ribasim_testmodels/ribasim_testmodels/discrete_control.py @@ -35,7 +35,7 @@ def pump_discrete_control_model() -> ribasim.Model: # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -51,7 +51,7 @@ def pump_discrete_control_model() -> ribasim.Model: lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"from_node_id": from_id, "to_node_id": to_id, "edge_type": edge_type}, geometry=lines, crs="EPSG:28992", @@ -136,8 +136,7 @@ def pump_discrete_control_model() -> ribasim.Model: # Setup a model: model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, linear_resistance=linear_resistance, pump=pump, @@ -174,7 +173,7 @@ def flow_condition_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -187,7 +186,7 @@ def flow_condition_model(): to_id = np.array([2, 3, 4, 3], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -275,8 +274,7 @@ def flow_condition_model(): # Setup a model: model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, pump=pump, flow_boundary=flow_boundary, @@ -316,7 +314,7 @@ def level_boundary_condition_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -329,7 +327,7 @@ def level_boundary_condition_model(): to_id = np.array([2, 3, 4, 5, 4], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -422,8 +420,7 @@ def level_boundary_condition_model(): ) model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, outlet=outlet, level_boundary=level_boundary, @@ -465,7 +462,7 @@ def tabulated_rating_curve_control_model() -> ribasim.Model: # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -478,7 +475,7 @@ def tabulated_rating_curve_control_model() -> ribasim.Model: to_id = np.array([2, 3, 2], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -555,8 +552,7 @@ def tabulated_rating_curve_control_model() -> ribasim.Model: # Setup a model: model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, tabulated_rating_curve=rating_curve, terminal=terminal, @@ -600,7 +596,7 @@ def level_setpoint_with_minmax_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -613,7 +609,7 @@ def level_setpoint_with_minmax_model(): to_id = np.array([3, 4, 2, 1, 5, 6, 2, 3], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -695,8 +691,7 @@ def level_setpoint_with_minmax_model(): discrete_control = ribasim.DiscreteControl(condition=condition, logic=logic) model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, pump=pump, level_boundary=level_boundary, diff --git a/python/ribasim_testmodels/ribasim_testmodels/dutch_waterways.py b/python/ribasim_testmodels/ribasim_testmodels/dutch_waterways.py index dc7cfffb3..397617902 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/dutch_waterways.py +++ b/python/ribasim_testmodels/ribasim_testmodels/dutch_waterways.py @@ -197,7 +197,7 @@ def dutch_waterways_model(): discrete_control = ribasim.DiscreteControl(condition=condition, logic=logic) # Set up the nodes: - node_id, node_type = ribasim.Node.get_node_ids_and_types( + node_id, node_type = ribasim.Node.node_ids_and_types( basin, linear_resistance, pump, @@ -260,7 +260,7 @@ def dutch_waterways_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type, "name": node_name}, index=pd.Index(node_id, name="fid"), geometry=node_xy, @@ -313,7 +313,7 @@ def dutch_waterways_model(): lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -327,8 +327,7 @@ def dutch_waterways_model(): ) model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, linear_resistance=linear_resistance, pump=pump, diff --git a/python/ribasim_testmodels/ribasim_testmodels/equations.py b/python/ribasim_testmodels/ribasim_testmodels/equations.py index 9c4be85d2..3719cdcc4 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/equations.py +++ b/python/ribasim_testmodels/ribasim_testmodels/equations.py @@ -21,7 +21,7 @@ def linear_resistance_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -34,7 +34,7 @@ def linear_resistance_model(): to_id = np.array([2, 3], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -91,8 +91,7 @@ def linear_resistance_model(): # Setup a model: model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, level_boundary=level_boundary, linear_resistance=linear_resistance, @@ -118,7 +117,7 @@ def rating_curve_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -131,7 +130,7 @@ def rating_curve_model(): to_id = np.array([2, 3], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -199,8 +198,7 @@ def rating_curve_model(): # Setup a model: model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, terminal=terminal, tabulated_rating_curve=rating_curve, @@ -228,7 +226,7 @@ def manning_resistance_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -241,7 +239,7 @@ def manning_resistance_model(): to_id = np.array([2, 3], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -296,8 +294,7 @@ def manning_resistance_model(): # Setup a model: model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, manning_resistance=manning_resistance, starttime="2020-01-01 00:00:00", @@ -335,7 +332,7 @@ def misc_nodes_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -348,7 +345,7 @@ def misc_nodes_model(): to_id = np.array([2, 3, 4, 5, 6, 7], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -436,8 +433,7 @@ def misc_nodes_model(): # Setup a model: model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, flow_boundary=flow_boundary, pump=pump, @@ -468,7 +464,7 @@ def pid_control_equation_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -481,7 +477,7 @@ def pid_control_equation_model(): to_id = np.array([2, 3, 2], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -555,8 +551,7 @@ def pid_control_equation_model(): ) model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, pump=pump, terminal=terminal, diff --git a/python/ribasim_testmodels/ribasim_testmodels/invalid.py b/python/ribasim_testmodels/ribasim_testmodels/invalid.py index c94860665..9d9a4baac 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/invalid.py +++ b/python/ribasim_testmodels/ribasim_testmodels/invalid.py @@ -17,7 +17,7 @@ def invalid_qh_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -30,7 +30,7 @@ def invalid_qh_model(): to_id = np.array([], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -85,8 +85,10 @@ def invalid_qh_model(): ) model = ribasim.Model( - edge=edge, - node=node, + database=ribasim.Database( + edge=edge, + node=node, + ), basin=basin, tabulated_rating_curve=rating_curve, starttime="2020-01-01 00:00:00", @@ -122,7 +124,7 @@ def invalid_fractional_flow_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -136,7 +138,7 @@ def invalid_fractional_flow_model(): to_id = np.array([7, 2, 3, 5, 4, 6], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -186,8 +188,7 @@ def invalid_fractional_flow_model(): ) model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, fractional_flow=fractional_flow, tabulated_rating_curve=rating_curve, @@ -215,7 +216,7 @@ def invalid_discrete_control_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -228,7 +229,7 @@ def invalid_discrete_control_model(): to_id = np.array([2, 3, 3, 2], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -314,8 +315,7 @@ def invalid_discrete_control_model(): discrete_control = ribasim.DiscreteControl(condition=condition, logic=logic) model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, pump=pump, flow_boundary=flow_boundary, @@ -344,7 +344,7 @@ def invalid_edge_types_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -357,7 +357,7 @@ def invalid_edge_types_model(): to_id = np.array([2, 3], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -402,8 +402,7 @@ def invalid_edge_types_model(): # Setup a model: model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, pump=pump, starttime="2020-01-01 00:00:00", diff --git a/python/ribasim_testmodels/ribasim_testmodels/pid_control.py b/python/ribasim_testmodels/ribasim_testmodels/pid_control.py index 367cfb3a2..832233524 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/pid_control.py +++ b/python/ribasim_testmodels/ribasim_testmodels/pid_control.py @@ -33,7 +33,7 @@ def pid_control_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -47,7 +47,7 @@ def pid_control_model(): lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -144,8 +144,7 @@ def pid_control_model(): # Setup a model: model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, flow_boundary=flow_boundary, level_boundary=level_boundary, @@ -187,7 +186,7 @@ def discrete_control_of_pid_control_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -201,7 +200,7 @@ def discrete_control_of_pid_control_model(): lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -318,8 +317,7 @@ def discrete_control_of_pid_control_model(): # Setup a model: model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, outlet=outlet, tabulated_rating_curve=rating_curve, diff --git a/python/ribasim_testmodels/ribasim_testmodels/time.py b/python/ribasim_testmodels/ribasim_testmodels/time.py index a483df3f0..1fd6ea424 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/time.py +++ b/python/ribasim_testmodels/ribasim_testmodels/time.py @@ -22,7 +22,7 @@ def flow_boundary_time_model(): # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -35,7 +35,7 @@ def flow_boundary_time_model(): to_id = np.array([2, 2], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -92,8 +92,7 @@ def flow_boundary_time_model(): ) model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database(node=node, edge=edge), basin=basin, flow_boundary=flow_boundary, starttime="2020-01-01 00:00:00", diff --git a/python/ribasim_testmodels/ribasim_testmodels/trivial.py b/python/ribasim_testmodels/ribasim_testmodels/trivial.py index dcb00ee08..816ce6bea 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/trivial.py +++ b/python/ribasim_testmodels/ribasim_testmodels/trivial.py @@ -23,7 +23,7 @@ def trivial_model() -> ribasim.Model: ] # Make sure the feature id starts at 1: explicitly give an index. node = ribasim.Node( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={"type": node_type}, index=pd.Index(np.arange(len(xy)) + 1, name="fid"), geometry=node_xy, @@ -36,7 +36,7 @@ def trivial_model() -> ribasim.Model: to_id = np.array([2, 3], dtype=np.int64) lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id) edge = ribasim.Edge( - static=gpd.GeoDataFrame( + df=gpd.GeoDataFrame( data={ "from_node_id": from_id, "to_node_id": to_id, @@ -97,8 +97,10 @@ def trivial_model() -> ribasim.Model: ) model = ribasim.Model( - node=node, - edge=edge, + database=ribasim.Database( + node=node, + edge=edge, + ), basin=basin, terminal=terminal, tabulated_rating_curve=rating_curve, diff --git a/qgis/resources.py b/qgis/resources.py index a87374c6b..6a557b860 100644 --- a/qgis/resources.py +++ b/qgis/resources.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - # Resource object code # # Created by: The Resource Compiler for PyQt5 (Qt v5.15.2) diff --git a/utils/generate-testmodels.py b/utils/generate-testmodels.py index 02ebac8a6..9233b94df 100644 --- a/utils/generate-testmodels.py +++ b/utils/generate-testmodels.py @@ -19,5 +19,6 @@ ) for model_name, model_constructor in ribasim_testmodels.constructors.items(): + print(f"Generating {model_name}") model = model_constructor() model.write(datadir / model_name)