From 047b16be597370c4fe95c20922cef67b2d4dc764 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Wed, 29 May 2024 00:29:20 +0100 Subject: [PATCH 01/92] refactor: add `hads_resample_and_reproject` to improve `hads` reprojection --- python/clim_recal/resample.py | 44 ++-- python/clim_recal/utils/core.py | 6 +- python/clim_recal/utils/gdal_formats.py | 8 + python/clim_recal/utils/xarray.py | 326 ++++++++++++++++++------ python/pdm.lock | 6 +- python/tests/test_resample.py | 114 +++++++-- 6 files changed, 375 insertions(+), 129 deletions(-) diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index f23595bb..20394876 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -24,6 +24,7 @@ from rich import print from tqdm.rich import trange from xarray import Dataset, open_dataset +from xarray.core.types import T_Dataset from clim_recal.debiasing.debias_wrapper import VariableOptions @@ -32,10 +33,13 @@ from .utils.gdal_formats import TIF_EXTENSION_STR from .utils.xarray import ( BRITISH_NATIONAL_GRID_EPSG, + DEFAULT_RELATIVE_GRID_DATA_PATH, + HADS_RAW_X_COLUMN_NAME, + HADS_RAW_Y_COLUMN_NAME, NETCDF_EXTENSION_STR, apply_geo_func, cpm_reproject_with_standard_calendar, - interpolate_coords, + hads_resample_and_reproject, ) logger = getLogger(__name__) @@ -56,8 +60,8 @@ RAW_CPM_PATH: Final[PathLike] = CLIMATE_DATA_MOUNT_PATH / "Raw/UKCP2.2" RAW_HADS_TASMAX_PATH: Final[PathLike] = RAW_HADS_PATH / "tasmax/day" RAW_CPM_TASMAX_PATH: Final[PathLike] = RAW_CPM_PATH / "tasmax/01/latest" -REPROJECTED_CPM_TASMAX_01_LATEST_INPUT_PATH: Final[PathLike] = ( - CLIMATE_DATA_MOUNT_PATH / "Reprojected_infill/UKCP2.2/tasmax/01/latest" +REPROJECTED_CPM_TASMAX_05_LATEST_INPUT_PATH: Final[PathLike] = ( + CLIMATE_DATA_MOUNT_PATH / "Reprojected_infill/UKCP2.2/tasmax/05/latest" ) CPRUK_RESOLUTION: Final[int] = 2200 @@ -70,12 +74,9 @@ CPRUK_XDIM: Final[str] = "grid_longitude" CPRUK_YDIM: Final[str] = "grid_latitude" -HADS_XDIM: Final[str] = "projection_x_coordinate" -HADS_YDIM: Final[str] = "projection_y_coordinate" +HADS_XDIM: Final[str] = HADS_RAW_X_COLUMN_NAME +HADS_YDIM: Final[str] = HADS_RAW_Y_COLUMN_NAME -DEFAULT_RELATIVE_GRID_DATA_PATH: Final[Path] = ( - Path().absolute() / "../data/rcp85_land-cpm_uk_2.2km_grid.nc" -) CPM_START_DATE: Final[date] = date(1980, 12, 1) CPM_END_DATE: Final[date] = date(2060, 11, 30) @@ -108,7 +109,7 @@ class ResamblerBase: input_path: PathLike | None = RAW_HADS_TASMAX_PATH output_path: PathLike = RESAMPLING_OUTPUT_PATH / HADS_OUTPUT_LOCAL_PATH variable_name: VariableOptions = VariableOptions.default() - grid: PathLike | Dataset = DEFAULT_RELATIVE_GRID_DATA_PATH + grid: PathLike | T_Dataset = DEFAULT_RELATIVE_GRID_DATA_PATH input_files: Iterable[PathLike] | None = None cpus: int | None = None crop: PathLike | GeoDataFrame | None = None @@ -234,8 +235,8 @@ def _range_call( step: int, override_export_path: Path | None = None, source_to_index: Iterable | None = None, - ) -> list[Path | Dataset]: - export_paths: list[Path | Dataset] = [] + ) -> list[Path | T_Dataset]: + export_paths: list[Path | T_Dataset] = [] if stop is None: stop = len(self) for index in trange(start, stop, step): @@ -352,7 +353,7 @@ class HADsResampler(ResamblerBase): input_path: PathLike | None = RAW_HADS_TASMAX_PATH output_path: PathLike = RESAMPLING_OUTPUT_PATH / HADS_OUTPUT_LOCAL_PATH variable_name: VariableOptions = VariableOptions.default() - grid: PathLike | Dataset = DEFAULT_RELATIVE_GRID_DATA_PATH + grid: PathLike | T_Dataset = DEFAULT_RELATIVE_GRID_DATA_PATH input_files: Iterable[PathLike] | None = None cpus: int | None = None crop: PathLike | GeoDataFrame | None = None @@ -371,7 +372,7 @@ def to_reprojection( override_export_path: Path | None = None, return_results: bool = False, source_to_index: Sequence | None = None, - ) -> Path | Dataset: + ) -> Path | T_Dataset: source_path: Path = self._get_source_path( index=index, source_to_index=source_to_index ) @@ -380,7 +381,8 @@ def to_reprojection( ) return apply_geo_func( source_path=source_path, - func=interpolate_coords, + # func=interpolate_coords, + func=hads_resample_and_reproject, export_folder=path, # Leaving in case we return to using warp # export_path_as_output_path_kwarg=True, @@ -432,19 +434,19 @@ class CPMResampler(ResamblerBase): >>> if not is_data_mounted: ... pytest.skip(mount_doctest_skip_message) >>> cpm_resampler: CPMResampler = CPMResampler( - ... input_path=REPROJECTED_CPM_TASMAX_01_LATEST_INPUT_PATH, + ... input_path=REPROJECTED_CPM_TASMAX_05_LATEST_INPUT_PATH, ... output_path=resample_test_cpm_output_path, ... input_file_extension=TIF_EXTENSION_STR, ... ) >>> cpm_resampler >>> pprint(cpm_resampler.input_files) - (...Path('.../tasmax/01/latest/tasmax_...-cpm_uk_2.2km_01_day_19801201-19811130.tif'), - ...Path('.../tasmax/01/latest/tasmax_...-cpm_uk_2.2km_01_day_19811201-19821130.tif'), - ..., - ...Path('.../tasmax/01/latest/tasmax_...-cpm_uk_2.2km_01_day_20791201-20801130.tif')) + (...Path('.../tasmax/05/latest/tasmax_...-cpm_uk_2.2km_05_day_19801201-19811130.tif'), + ...Path('.../tasmax/05/latest/tasmax_...-cpm_uk_2.2km_05_day_19811201-19821130.tif'), + ... + ...Path('.../tasmax/05/latest/tasmax_...-cpm_uk_2.2km_05_day_20791201-20801130.tif')) """ @@ -465,7 +467,7 @@ def to_reprojection( override_export_path: Path | None = None, return_results: bool = False, source_to_index: Sequence | None = None, - ) -> Path | Dataset: + ) -> Path | T_Dataset: source_path: Path = self._get_source_path( index=index, source_to_index=source_to_index ) diff --git a/python/clim_recal/utils/core.py b/python/clim_recal/utils/core.py index 79efa06f..d1f5cc85 100644 --- a/python/clim_recal/utils/core.py +++ b/python/clim_recal/utils/core.py @@ -664,6 +664,7 @@ def results_path( time: datetime | None = None, extension: str | None = None, mkdir: bool = False, + dot_pre_extension: bool = True, ) -> Path: """Return `Path`: `path`/`name`_`time`.`extension`. @@ -679,7 +680,10 @@ def results_path( time = datetime.now() file_name: str = f"{name}_{time_str(time)}" if extension: - file_name += f".{extension}" + if dot_pre_extension: + file_name += f".{extension}" + else: + file_name += extension return path / file_name diff --git a/python/clim_recal/utils/gdal_formats.py b/python/clim_recal/utils/gdal_formats.py index dd3905ab..ea8c9341 100644 --- a/python/clim_recal/utils/gdal_formats.py +++ b/python/clim_recal/utils/gdal_formats.py @@ -1,5 +1,13 @@ from typing import Final, Literal +CPM_RAW_PROJ4: Final[ + str +] = "+proj=ob_tran +o_proj=longlat +o_lon_p=0 +o_lat_p=37.5 +lon_0=357.5 +R=6371229 +no_defs=True" + +HADS_RAW_PROJ4: Final[ + str +] = "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +a=6377563.396 +rf=299.324961266495 +units=m +no_defs=True" + GDALFormatsType = Literal[ "VRT", "DERIVED", diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index c336b859..b0ececf6 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -3,13 +3,14 @@ from logging import getLogger from os import PathLike from pathlib import Path -from typing import Any, Callable, Final, Iterable, Literal +from typing import Any, Callable, Final, Iterable, Literal, Sequence import numpy as np import rioxarray # nopycln: import from cftime._cftime import Datetime360Day from geopandas import GeoDataFrame, read_file -from numpy import array, random +from matplotlib import pyplot as plt +from numpy import array, ndarray, random from numpy.typing import NDArray from osgeo.gdal import Dataset as GDALDataset from osgeo.gdal import GDALWarpAppOptions, Warp, WarpOptions @@ -17,7 +18,13 @@ from xarray import CFTimeIndex, DataArray, Dataset, cftime_range, open_dataset from xarray.backends.api import ENGINES from xarray.coding.calendar_ops import convert_calendar -from xarray.core.types import CFCalendar, InterpOptions +from xarray.core.types import ( + CFCalendar, + InterpOptions, + T_DataArray, + T_DataArrayOrSet, + T_Dataset, +) from .core import ( CLI_DATE_FORMAT_STR, @@ -26,6 +33,7 @@ climate_data_mount_path, date_range_generator, date_range_to_str, + results_path, time_str, ) from .gdal_formats import ( @@ -41,7 +49,7 @@ ChangeDayType = set[tuple[int, int]] # MONTH_DAY_DROP: DropDayType = {(1, 31), (4, 1), (6, 1), (8, 1), (10, 1), (12, 1)} -"""A `set` of tuples of month and day numbers for `enforce_date_changes`.""" +# """A `set` of tuples of month and day numbers for `enforce_date_changes`.""" BRITISH_NATIONAL_GRID_EPSG: Final[str] = "EPSG:27700" @@ -102,6 +110,10 @@ DEFAULT_CALENDAR_ALIGN: Final[ConvertCalendarAlignOptions] = "year" NETCDF4_XARRAY_ENGINE: Final[str] = "netcdf4" +DEFAULT_RELATIVE_GRID_DATA_PATH: Final[Path] = ( + Path().absolute() / "../data/rcp85_land-cpm_uk_2.2km_grid.nc" +) + CPM_365_OR_366_INTERMEDIATE_NC: Final[str] = "cpm-365-or-366.nc" CPM_365_OR_366_SIMPLIFIED_NC: Final[str] = "cpm-365-or-366-simplified.nc" @@ -109,13 +121,18 @@ CPM_365_OR_366_27700_FINAL: Final[str] = "cpm-365-or-366-27700-final.nc" CPM_LOCAL_INTERMEDIATE_PATH: Final[Path] = Path("cpm-intermediate-files") +HADS_RAW_X_COLUMN_NAME: Final[str] = "projection_x_coordinate" +HADS_RAW_Y_COLUMN_NAME: Final[str] = "projection_y_coordinate" +HADS_DROP_VARS_AFTER_PROJECTION: Final[tuple[str, ...]] = ("longitude", "latitude") + +# TODO: CHECK IF I GOT THESE BACKWARDS FINAL_RESAMPLE_LAT_COL: Final[str] = "x" FINAL_RESAMPLE_LON_COL: Final[str] = "y" def cpm_xarray_to_standard_calendar( - cpm_xr_time_series: Dataset | PathLike, include_bnds_index: bool = False -) -> Dataset: + cpm_xr_time_series: T_Dataset | PathLike, include_bnds_index: bool = False +) -> T_Dataset: """Convert a CPM `nc` file of 360 day calendars to standard calendar. Parameters @@ -131,7 +148,7 @@ def cpm_xarray_to_standard_calendar( """ if isinstance(cpm_xr_time_series, PathLike): cpm_xr_time_series = open_dataset(cpm_xr_time_series, decode_coords="all") - cpm_to_std_calendar: Dataset = convert_xr_calendar( + cpm_to_std_calendar: T_Dataset = convert_xr_calendar( cpm_xr_time_series, interpolate_na=True, check_cftime_cols=("time_bnds",) ) cpm_to_std_calendar[ @@ -142,7 +159,9 @@ def cpm_xarray_to_standard_calendar( cpm_to_std_calendar["year"] = cpm_to_std_calendar.year.interpolate_na( "time", fill_value="extrapolate" ) - yyyymmdd_fix: DataArray = cpm_to_std_calendar.time.dt.strftime(CLI_DATE_FORMAT_STR) + yyyymmdd_fix: T_DataArray = cpm_to_std_calendar.time.dt.strftime( + CLI_DATE_FORMAT_STR + ) cpm_to_std_calendar["yyyymmdd"] = yyyymmdd_fix assert cpm_xr_time_series.rio.crs == cpm_to_std_calendar.rio.crs if include_bnds_index: @@ -233,8 +252,8 @@ def __post_init__(self) -> None: def __repr__(self): """Summary of config.""" return ( - f"" ) @property @@ -290,17 +309,21 @@ def final_nc_path(self) -> Path: def cpm_reproject_with_standard_calendar( - cpm_xr_time_series: Dataset | PathLike, + cpm_xr_time_series: T_Dataset | PathLike, variable_name: str, output_path: PathLike, file_name_prefix: str = "", subfolder: PathLike = CPM_LOCAL_INTERMEDIATE_PATH, subfolder_time_stamp: bool = False, - final_x_coord_label: str = FINAL_RESAMPLE_LON_COL, - final_y_coord_label: str = FINAL_RESAMPLE_LAT_COL, -) -> Dataset: + source_x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, + source_y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, +) -> T_Dataset: """Convert raw `cpm_xr_time_series` to an 365/366 days and 27700 coords. + Notes + ----- + Currently makes UTM coordinate structure + Parameters ---------- cpm_xr_time_series @@ -318,63 +341,75 @@ def cpm_reproject_with_standard_calendar( if isinstance(cpm_xr_time_series, PathLike): cpm_xr_time_series = open_dataset(cpm_xr_time_series, decode_coords="all") - intermediate_files: IntermediateCPMFilesManager = IntermediateCPMFilesManager( - file_name_prefix=file_name_prefix, - variable_name=variable_name, - output_path=Path(output_path), - subfolder_path=Path(subfolder), - subfolder_time_stamp=subfolder_time_stamp, - time_series_start=cpm_xr_time_series.time.values[0], - time_series_end=cpm_xr_time_series.time.values[-1], + intermediate_file_configs: IntermediateCPMFilesManager = ( + IntermediateCPMFilesManager( + file_name_prefix=file_name_prefix, + variable_name=variable_name, + output_path=Path(output_path), + subfolder_path=Path(subfolder), + subfolder_time_stamp=subfolder_time_stamp, + time_series_start=cpm_xr_time_series.time.values[0], + time_series_end=cpm_xr_time_series.time.values[-1], + ) ) - expanded_calendar: Dataset = cpm_xarray_to_standard_calendar(cpm_xr_time_series) - subset_within_ensemble: DataArray = expanded_calendar[variable_name][0] - subset_within_ensemble.to_netcdf(intermediate_files.intermediate_nc_path) - simplified_netcdf: Dataset = open_dataset( - intermediate_files.intermediate_nc_path, decode_coords="all" + expanded_calendar: T_Dataset = cpm_xarray_to_standard_calendar(cpm_xr_time_series) + # Index through the first ensemble + subset_within_ensemble: T_DataArray = expanded_calendar[variable_name][0] + + subset_within_ensemble.to_netcdf(intermediate_file_configs.intermediate_nc_path) + simplified_netcdf: T_Dataset = open_dataset( + intermediate_file_configs.intermediate_nc_path, decode_coords="all" + ) + simplified_netcdf["grid_longitude_bnds"] = expanded_calendar.grid_longitude_bnds + simplified_netcdf["grid_latitude_bnds"] = expanded_calendar.grid_latitude_bnds + simplified_netcdf[variable_name].to_netcdf( + intermediate_file_configs.simplified_nc_path ) - simplified_netcdf[variable_name].to_netcdf(intermediate_files.simplified_nc_path) warped_to_22700_path = gdal_warp_wrapper( - input_path=intermediate_files.simplified_nc_path, - output_path=intermediate_files.intermediate_warp_path, + input_path=intermediate_file_configs.simplified_nc_path, + output_path=intermediate_file_configs.intermediate_warp_path, copy_metadata=True, format=None, ) - assert warped_to_22700_path == intermediate_files.intermediate_warp_path - warped_to_22700 = open_dataset(intermediate_files.intermediate_warp_path) + assert warped_to_22700_path == intermediate_file_configs.intermediate_warp_path + warped_to_22700 = open_dataset(intermediate_file_configs.intermediate_warp_path) assert warped_to_22700.rio.crs == BRITISH_NATIONAL_GRID_EPSG assert len(warped_to_22700.time) == len(expanded_calendar.time) # Commenting these out in prep for addressing # https://github.com/alan-turing-institute/clim-recal/issues/151 - # warped_to_22700_y_axis_inverted: Dataset = warped_to_22700.reindex( - # y=list(reversed(warped_to_22700.y)) + # warped_to_22700_y_axis_inverted: T_Dataset = warped_to_22700.reindex( + # y=warped_to_22700.y * -1 # ) # # warped_to_22700_y_axis_inverted = warped_to_22700_y_axis_inverted.rename( - # {"x": final_x_coord_label, "y": final_y_coord_label} + # {"x": source_x_coord_column_name, "y": source_y_coord_column_name} # ) - warped_to_22700_y_axis_inverted.to_netcdf(intermediate_files.final_nc_path) - final_results = open_dataset(intermediate_files.final_nc_path, decode_coords="all") + # warped_to_22700_y_axis_inverted.to_netcdf(intermediate_file_configs.final_nc_path) + warped_to_22700.to_netcdf(intermediate_file_configs.final_nc_path) + final_results = open_dataset( + intermediate_file_configs.final_nc_path, decode_coords="all" + ) assert (final_results.time == expanded_calendar.time).all() return final_results def interpolate_coords( - xr_time_series: Dataset, + xr_time_series: T_Dataset, variable_name: str, - x_grid: NDArray, - y_grid: NDArray, - xr_time_series_x_column_name: str = FINAL_RESAMPLE_LON_COL, - xr_time_series_y_column_name: str = FINAL_RESAMPLE_LAT_COL, + x_grid: NDArray | None = None, + y_grid: NDArray | None = None, + x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, + y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, + reference_coords: T_Dataset | PathLike = DEFAULT_RELATIVE_GRID_DATA_PATH, method: str = "linear", engine: XArrayEngineType = NETCDF4_XARRAY_ENGINE, **kwargs, -) -> Dataset: +) -> T_Dataset: """Reproject `xr_time_series` to `x_resolution`/`y_resolution`. Notes @@ -387,20 +422,157 @@ def interpolate_coords( xr_time_series = open_dataset( xr_time_series, decode_coords="all", engine=engine ) - assert isinstance(xr_time_series, Dataset) - # crs = crs if crs else xr_time_series.rio.crs - # Code commented out below relates to a method following this discussion: - # https://github.com/corteva/rioxarray/discussions/762 - # if x_resolution and y_resolution: - # kwargs['resolution'] = (x_resolution, y_resolution) - # return xr_time_series.rio.reproject(dst_crs=crs, **kwargs) - kwargs[xr_time_series_x_column_name] = x_grid - kwargs[xr_time_series_y_column_name] = y_grid - return xr_time_series[[variable_name]].interp(method=method, **kwargs) + + try: + assert isinstance(xr_time_series, Dataset) + except: + ValueError(f"'xr_time_series' must be an 'xr.Dataset' instance.") + + if x_grid is None or y_grid is None: + try: + assert x_grid is None and y_grid is None + except: + raise ValueError(f"Both 'x_grid' and 'y_grid' must be set or none") + if isinstance(reference_coords, PathLike | str): + reference_coords = open_dataset( + reference_coords, decode_coords="all", engine=engine + ) + try: + assert isinstance(reference_coords, Dataset) + except: + ValueError(f"'reference_coords' must be an 'xr.Dataset' instance.") + + x_grid = ( + reference_coords[x_coord_column_name].values if x_grid is None else x_grid + ) + y_grid = ( + reference_coords[y_coord_column_name].values if y_grid is None else y_grid + ) + try: + assert x_coord_column_name in reference_coords.coords + assert y_coord_column_name in reference_coords.coords + assert x_coord_column_name in xr_time_series.coords + assert y_coord_column_name in xr_time_series.coords + except AssertionError: + raise ValueError( + f"At least one of\n" + f"'x_coord_column_name': '{x_coord_column_name}'\n" + f"'y_coord_column_name': '{y_coord_column_name}'\n" + f"not in 'reference_coords' and/or 'xr_time_series'." + ) + + try: + assert isinstance(x_grid, ndarray) + assert isinstance(y_grid, ndarray) + except: + raise ValueError( + f"Both must be 'ndarray' instances.\n" + f"'x_grid': {x_grid}\n'y_grid': {y_grid}" + ) + kwargs[x_coord_column_name] = x_grid + kwargs[y_coord_column_name] = y_grid + reprojected: T_Dataset = xr_time_series[variable_name].interp( + method=method, **kwargs + ) + # Ensure original `rio.crs` is kept in returned `Dataset` + if x_grid is None and y_grid is None: + reprojected.rio.write_crs(reference_coords.rio.crs, inplace=True) + else: + reprojected.rio.write_crs(xr_time_series.rio.crs, inplace=True) + return reprojected + + +def hads_resample_and_reproject( + hads_xr_time_series: T_Dataset | PathLike, + variable_name: str, + x_grid: NDArray | None = None, + y_grid: NDArray | None = None, + method: str = "linear", + source_x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, + source_y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, + final_x_coord_column_name: str = "lon", + final_y_coord_column_name: str = "lat", + final_crs: str | None = BRITISH_NATIONAL_GRID_EPSG, + vars_to_drop: Sequence[str] | None = HADS_DROP_VARS_AFTER_PROJECTION, +) -> T_Dataset: + """Resample `HADs` `xarray` time series to 2.2km.""" + if isinstance(hads_xr_time_series, PathLike): + hads_xr_time_series = open_dataset(hads_xr_time_series, decode_coords="all") + + interpolated_hads: T_Dataset = interpolate_coords( + hads_xr_time_series, + variable_name=variable_name, + x_grid=x_grid, + y_grid=y_grid, + x_coord_column_name=source_x_coord_column_name, + y_coord_column_name=source_y_coord_column_name, + method=method, + ) + if vars_to_drop: + interpolated_hads = interpolated_hads.drop_vars(vars_to_drop) + interpolated_hads = interpolated_hads.rename( + { + source_x_coord_column_name: final_x_coord_column_name, + source_y_coord_column_name: final_y_coord_column_name, + } + ) + if final_crs: + interpolated_hads.rio.write_crs(final_crs, inplace=True) + return interpolated_hads + + +def plot_xarray( + da: T_DataArrayOrSet, path: PathLike, time_stamp: bool = False, **kwargs +) -> Path: + """Plot `da` with `**kwargs` to `path`. + + Parameters + ---------- + da + `xarray` objec to plot. + path + File to write plot to. + time_stamp + Whather to add a `datetime` `str` of time of writing in file name. + kwargs + Additional parameters to pass to `plot`. + + Examples + -------- + >>> example_path: Path = ( + ... getfixture('tmp_path') / 'test-path/example.png') + >>> image_path: Path = plot_xarray( + ... xarray_spatial_4_days, example_path) + >>> example_path == image_path + True + >>> example_time_stamped: Path = ( + ... example_path.parent / 'example-stamped.png') + >>> timed_image_path: Path = plot_xarray( + ... xarray_spatial_4_days, example_time_stamped, + ... time_stamp=True) + >>> example_time_stamped != timed_image_path + True + >>> print(timed_image_path) + /.../test-path/example-stamped_...-...-..._...png + """ + da.plot(**kwargs) + path = Path(path) + path.parent.mkdir(exist_ok=True, parents=True) + if time_stamp: + path = results_path( + name=path.stem, + path=path.parent, + mkdir=True, + extension=path.suffix, + dot_pre_extension=False, + ) + plt.savefig(path) + plt.close() + return Path(path) def crop_nc( - xr_time_series: Dataset | PathLike, + xr_time_series: T_Dataset | PathLike, crop_geom: PathLike | GeoDataFrame, invert=False, final_crs: str = BRITISH_NATIONAL_GRID_EPSG, @@ -409,7 +581,7 @@ def crop_nc( xr_spatial_xdim: str = "grid_longitude", xr_spatial_ydim: str = "grid_latitude", **kwargs, -) -> Dataset: +) -> T_Dataset: """Crop `xr_time_series` with `crop_path` `shapefile`. Parameters @@ -482,8 +654,8 @@ def crop_nc( def ensure_xr_dataset( - xr_time_series: Dataset | DataArray, default_name="to_convert" -) -> Dataset: + xr_time_series: T_DataArrayOrSet, default_name="to_convert" +) -> T_Dataset: """Return `xr_time_series` as a `xarray.Dataset` instance. Parameters @@ -533,7 +705,7 @@ def convert_xr_calendar( check_cftime_cols: tuple[str] | None = None, cftime_range_gen_kwargs: dict[str, Any] | None = None, **kwargs, -) -> Dataset | DataArray: +) -> T_DataArrayOrSet: """Convert cpm 360 day time series to a standard 365/366 day time series. Notes @@ -598,7 +770,7 @@ def convert_xr_calendar( -------- # Note a new doctest needs to be written to deal # with default `year` vs `date` parameters - >>> xr_360_to_365_datetime64: Dataset = convert_xr_calendar( + >>> xr_360_to_365_datetime64: T_Dataset = convert_xr_calendar( ... xarray_spatial_4_years_360_day, align_on="date") >>> xr_360_to_365_datetime64.sel( ... time=slice("1981-01-30", "1981-02-01"), @@ -607,7 +779,7 @@ def convert_xr_calendar( Coordinates: * time (time) datetime64[ns] ...1981-01-30 1981-01-31 1981-02-01 space >> xr_360_to_365_datetime64_interp: Dataset = convert_xr_calendar( + >>> xr_360_to_365_datetime64_interp: T_Dataset = convert_xr_calendar( ... xarray_spatial_4_years_360_day, interpolate_na=True) >>> xr_360_to_365_datetime64_interp.sel( ... time=slice("1981-01-30", "1981-02-01"), @@ -631,7 +803,7 @@ def convert_xr_calendar( xr_time_series = open_dataset(xr_time_series, engine=engine) if ensure_output_type_is_dataset: xr_time_series = ensure_xr_dataset(xr_time_series) - calendar_converted_ts: Dataset | DataArray = convert_calendar( + calendar_converted_ts: T_DataArrayOrSet = convert_calendar( xr_time_series, calendar, align_on=align_on, @@ -658,8 +830,8 @@ def convert_xr_calendar( def interpolate_xr_ts_nans( - xr_ts: Dataset, - original_xr_ts: Dataset | None = None, + xr_ts: T_Dataset, + original_xr_ts: T_Dataset | None = None, check_cftime_cols: tuple[str] | None = None, interpolate_method: InterpOptions = DEFAULT_INTERPOLATION_METHOD, keep_crs: bool = True, @@ -667,7 +839,7 @@ def interpolate_xr_ts_nans( limit: int = 1, cftime_range_gen_kwargs: dict[str, Any] | None = None, **kwargs, -) -> Dataset: +) -> T_Dataset: """Interpolate `nan` values in a `Dataset` time series. Notes @@ -709,7 +881,7 @@ def interpolate_xr_ts_nans( # Without this the `nan` values don't get filled kwargs["fill_value"] = "extrapolate" - interpolated_ts: Dataset = xr_ts.interpolate_na( + interpolated_ts: T_Dataset = xr_ts.interpolate_na( dim="time", method=interpolate_method, keep_attrs=keep_attrs, @@ -839,7 +1011,7 @@ def apply_geo_func( export_path = Path(export_folder) / export_path.name if export_path_as_output_path_kwarg: kwargs["output_path"] = export_path - results: Dataset | Path | GDALDataset = func(source_path, **kwargs) + results: T_Dataset | Path | GDALDataset = func(source_path, **kwargs) if to_netcdf or to_raster: if isinstance(results, Path): results = open_dataset(results) @@ -937,7 +1109,7 @@ def xarray_example( # If useful, add lat/lon (currently not working) # lat: list[float] = [coord[0] for coord in coordinates.values()] # lon: list[float] = [coord[1] for coord in coordinates.values()] - da: DataArray = DataArray( + da: T_DataArray = DataArray( random_data, name=name, coords={ @@ -1010,7 +1182,7 @@ def file_name_to_start_end_dates( return start_date, end_date -def generate_360_to_standard(array_to_expand: DataArray) -> DataArray: +def generate_360_to_standard(array_to_expand: T_DataArray) -> DataArray: """Return `array_to_expand` 360 days expanded to 365 or 366 days. This may be dropped if `cpm_reproject_with_standard_calendar` is successful. @@ -1038,7 +1210,7 @@ def correct_int_time_datafile( new_index_name: str = "time", replace_index: str | None = "band", data_attribute_name: str = "band_data", -) -> Dataset: +) -> T_Dataset: """Load a `Dataset` from path and generate `time` index. Notes @@ -1052,13 +1224,13 @@ def correct_int_time_datafile( ... glasgow_example_cropped_cpm_rainfall_path) >>> assert False """ - xr_dataset: Dataset = open_dataset(xr_dataset_path) + xr_dataset: T_Dataset = open_dataset(xr_dataset_path) metric_name: str = str(xr_dataset_path).split("_")[0] start_date, end_date = file_name_to_start_end_dates(xr_dataset_path) dates_index: DatetimeIndex = date_range(start_date, end_date) intermediate_new_index: str = new_index_name + "_standard" # xr_intermediate_date = xr_dataset.assign_coords({intermediate_new_index: dates_index}) - xr_dataset[intermediate_new_index]: Dataset = dates_index + xr_dataset[intermediate_new_index]: T_Dataset = dates_index xr_360_datetime = xr_dataset[intermediate_new_index].convert_calendar( "360_day", align_on="year", dim=intermediate_new_index ) @@ -1071,21 +1243,21 @@ def correct_int_time_datafile( assert len(xr_360_datetime[intermediate_new_index]) == 360 # xr_with_datetime['time'] = xr_360_datetime assert False - xr_bands_time_indexed: DataArray = xr_intermediate_date[ + xr_bands_time_indexed: T_DataArray = xr_intermediate_date[ data_attribute_name ].expand_dims(dim={new_index_name: xr_intermediate_date[new_index_name]}) - # xr_365_data_array: DataArray = convert_xr_calendar(xr_bands_time_indexed) - xr_365_dataset: Dataset = Dataset({metric_name: xr_bands_time_indexed}) - partial_fix_365_dataset: Dataset = convert_xr_calendar(xr_365_dataset.time) + # xr_365_data_array: T_DataArray = convert_xr_calendar(xr_bands_time_indexed) + xr_365_dataset: T_Dataset = Dataset({metric_name: xr_bands_time_indexed}) + partial_fix_365_dataset: T_Dataset = convert_xr_calendar(xr_365_dataset.time) assert False -def cftime_range_gen(time_data_array: DataArray, **kwargs) -> NDArray: +def cftime_range_gen(time_data_array: T_DataArray, **kwargs) -> NDArray: """Convert a banded time index a banded standard (Gregorian).""" assert hasattr(time_data_array, "time") time_bnds_fix_range_start: CFTimeIndex = cftime_range( time_data_array.time.dt.strftime(ISO_DATE_FORMAT_STR).values[0], - time_data_array.time.dt.strftime(ISO_DATE_FORMAT_STR).values[-1], + time_data_array.time.dt.strftime(ISO_DATE_FORMAT_STR).values[0], **kwargs, ) time_bnds_fix_range_end: CFTimeIndex = time_bnds_fix_range_start + timedelta(days=1) diff --git a/python/pdm.lock b/python/pdm.lock index 21cb0518..8f878af9 100644 --- a/python/pdm.lock +++ b/python/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.4.1" -content_hash = "sha256:fa0184edcb8174bb0e77f1f414227bd968c3f628b7663d4cd46256121f733310" +content_hash = "sha256:e16ddaa6a94f3b279112089e7a38addc0cfe7a1cc7f48fc23deb078c4e3b59cb" [[package]] name = "affine" @@ -841,12 +841,12 @@ files = [ [[package]] name = "gdal" -version = "3.8.3" +version = "3.8.5" requires_python = ">=3.6.0" summary = "GDAL: Geospatial Data Abstraction Library" groups = ["default"] files = [ - {file = "GDAL-3.8.3.tar.gz", hash = "sha256:eae2587c581d6609289e44f30afe30edcc25fbc640b5d6aba2f3c3e81def55be"}, + {file = "GDAL-3.8.5.tar.gz", hash = "sha256:ad8addd58ba9c62aefc7f65d345c168736798f137e5c8f247af76fcf4862d371"}, ] [[package]] diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index cb58b704..4a6ea309 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -6,9 +6,11 @@ import pytest from geopandas import GeoDataFrame, read_file from matplotlib import pyplot as plt +from numpy.testing import assert_allclose from numpy.typing import NDArray from osgeo.gdal import Dataset as GDALDataset -from xarray import DataArray, Dataset, open_dataset +from xarray import open_dataset +from xarray.core.types import T_DataArray, T_Dataset from clim_recal.resample import ( BRITISH_NATIONAL_GRID_EPSG, @@ -58,6 +60,8 @@ crop_nc, file_name_to_start_end_dates, gdal_warp_wrapper, + hads_resample_and_reproject, + plot_xarray, xarray_example, ) @@ -112,21 +116,57 @@ [10.645899, 10.508448, 10.546778, 10.547998, 10.553614], dtype="float32" ) +# Initial HADS projection test results matched this, leaving to +# double check before merge to main +# FINAL_HADS_JAN_10_430_X_370_390_Y: Final[NDArray] = np.array( +# ( np.nan, np.nan, np.nan, np.nan, np.nan, +# np.nan, np.nan, np.nan, np.nan, 4.99268164, +# 4.82281839, 4.55366184, 4.45834185, 4.27357187, 4.1575218, +# 4.07316193, 3.97350405, 3.84286826, 3.81615739, 3.84426594), +# ) + +FINAL_HADS_JAN_10_430_X_230_250_Y: Final[NDArray] = np.array( + ( + np.nan, + np.nan, + np.nan, + np.nan, + np.nan, + np.nan, + np.nan, + np.nan, + np.nan, + np.nan, + np.nan, + 3.39634549, + 2.97574018, + 2.63433646, + 2.62451613, + 2.53676574, + 2.42130933, + 2.66667496, + 2.60239203, + 2.5052739, + ) +) + @pytest.mark.mount @pytest.fixture(scope="session") -def tasmax_cpm_1980_raw() -> Dataset: +def tasmax_cpm_1980_raw() -> T_Dataset: + # Backup path if furture rehydration issues + # return open_dataset("/Volumes/vmfileshare/ClimateData/Raw/UKCP2.2/tasmin/05/latest/tasmin_rcp85_land-cpm_uk_2.2km_05_day_19801201-19811130.nc", decode_coords="all") return open_dataset(UKCP_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") @pytest.mark.mount @pytest.fixture(scope="session") -def tasmax_hads_1980_raw() -> Dataset: +def tasmax_hads_1980_raw() -> T_Dataset: return open_dataset(HADS_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") @pytest.fixture(scope="session") -def reference_final_coord_grid() -> Dataset: +def reference_final_coord_grid() -> T_Dataset: return open_dataset(DEFAULT_RELATIVE_GRID_DATA_PATH, decode_coords="all") @@ -214,7 +254,7 @@ def test_leap_year_days() -> None: """Test covering a leap year of 366 days.""" start_date_str: str = "2024-03-01" end_date_str: str = "2025-03-01" - xarray_2024_2025: DataArray = xarray_example( + xarray_2024_2025: T_DataArray = xarray_example( start_date=start_date_str, end_date=end_date_str, inclusive=True, @@ -376,7 +416,7 @@ def test_time_gaps_360_to_standard_calendar( # align_on: ConvertCalendarAlignOptions = 'date' # Create a base - base: Dataset = xarray_example( + base: T_Dataset = xarray_example( start_date, end_date, as_dataset=True, inclusive=inclusive_date_range ) @@ -385,7 +425,7 @@ def test_time_gaps_360_to_standard_calendar( assert len(base.time) == gen_date_count # Convert to `360_day` calendar example - dates_360: Dataset = base.convert_calendar( + dates_360: T_Dataset = base.convert_calendar( calendar="360_day", align_on=align_on, use_cftime=use_cftime, @@ -398,7 +438,7 @@ def test_time_gaps_360_to_standard_calendar( with pytest.raises(ValueError): convert_xr_calendar(dates_360, align_on=align_on, use_cftime=use_cftime) else: - dates_converted: Dataset = convert_xr_calendar( + dates_converted: T_Dataset = convert_xr_calendar( dates_360, align_on=align_on, use_cftime=use_cftime ) assert len(dates_converted.time) == converted_days @@ -421,12 +461,12 @@ def test_convert_cpm_calendar(interpolate_na: bool) -> None: creating the `na_values` `bool` as the inverse of `interpolate_na`. """ any_na_values_in_tasmax: bool = not interpolate_na - raw_nc: Dataset = open_dataset( + raw_nc: T_Dataset = open_dataset( UKCP_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all", engine=NETCDF4_XARRAY_ENGINE ) assert len(raw_nc.time) == 360 assert len(raw_nc.time_bnds) == 360 - converted: Dataset = convert_xr_calendar(raw_nc, interpolate_na=interpolate_na) + converted: T_Dataset = convert_xr_calendar(raw_nc, interpolate_na=interpolate_na) assert len(converted.time) == 365 assert len(converted.time_bnds) == 365 assert ( @@ -514,7 +554,7 @@ def test_geo_warp_format_type_crop( parent_path=data_path, ) ) - xarray_pre_warp: Dataset = open_dataset( + xarray_pre_warp: T_Dataset = open_dataset( max_temp_data_path, decode_coords="all", engine=NETCDF4_XARRAY_ENGINE ) xarray_pre_warp.isel(time=0).tasmax.plot() @@ -538,7 +578,7 @@ def test_geo_warp_format_type_crop( output_bounds=uk_rotated_grid_bounds, ) assert xarray_warped is not None - read_exported: Dataset = open_dataset(warp_test_file_path, decode_coords="all") + read_exported: T_Dataset = open_dataset(warp_test_file_path, decode_coords="all") read_exported.Band1.plot() plt.savefig(warp_test_fig_path) @@ -552,7 +592,7 @@ def test_geo_warp_format_type_crop( @pytest.mark.slow @pytest.mark.parametrize("include_bnds_index", (True, False)) def test_cpm_xarray_to_standard_calendar( - tasmax_cpm_1980_raw: Dataset, + tasmax_cpm_1980_raw: T_Dataset, include_bnds_index: bool, ) -> None: """Test 360 raw to 365/366 calendar conversion. @@ -604,21 +644,23 @@ def test_cpm_xarray_to_standard_calendar( @pytest.mark.mount @pytest.mark.slow def test_cpm_warp_steps( - tasmax_cpm_1980_raw: Dataset, + tasmax_cpm_1980_raw: T_Dataset, test_runs_output_path: Path, + caplog: pytest.LogCaptureFixture, + variable_name: str = "tasmax", ) -> None: """Test all steps around calendar and warping CPM RAW data.""" # file_name_prefix: str = "test-1980" output_path: Path = test_runs_output_path / "test-cpm-warp" test_intermediate_files = IntermediateCPMFilesManager( - variable_name="tasmax", + variable_name=variable_name, output_path=output_path, time_series_start=tasmax_cpm_1980_raw.time.values[0], time_series_end=tasmax_cpm_1980_raw.time.values[-1], ) projected = cpm_reproject_with_standard_calendar( tasmax_cpm_1980_raw, - variable_name="tasmax", + variable_name=variable_name, output_path=output_path, # file_name_prefix=file_name_prefix, ) @@ -633,10 +675,11 @@ def test_cpm_warp_steps( assert test_intermediate_files.intermediate_files_folder.name.startswith( CPM_LOCAL_INTERMEDIATE_PATH.name ) - final_results: Dataset = open_dataset( + final_results: T_Dataset = open_dataset( test_intermediate_files.final_nc_path, decode_coords="all" ) assert (final_results.time == projected.time).all() + assert False @pytest.mark.xfail(reason="test not complete") @@ -687,14 +730,14 @@ def test_crop_nc( end_year=1981, parent_path=data_fixtures_path, ) - xarray_pre_crop: Dataset = open_dataset(max_temp_1981_path, decode_coords="all") + xarray_pre_crop: T_Dataset = open_dataset(max_temp_1981_path, decode_coords="all") xarray_pre_crop.isel(time=0).tasmax.plot() plt.savefig(pre_crop_test_fig_path) assert str(xarray_pre_crop.rio.crs) != BRITISH_NATIONAL_GRID_EPSG assert xarray_pre_crop.rio.bounds() == uk_rotated_grid_bounds - cropped: Dataset = crop_nc( + cropped: T_Dataset = crop_nc( xr_time_series=max_temp_1981_path, crop_geom=glasgow_shape_file_path, enforce_xarray_spatial_dims=True, @@ -739,7 +782,7 @@ def test_ukcp_manager(resample_test_cpm_output_path, config: str) -> None: paths = test_config.range_to_reprojection( stop=1, source_to_index=tuple(test_config) ) - export: Dataset = open_dataset(paths[0]) + export: T_Dataset = open_dataset(paths[0]) assert export.dims["time"] == 365 assert export.dims[FINAL_RESAMPLE_LON_COL] == 492 assert export.dims[FINAL_RESAMPLE_LAT_COL] == 608 # previously 603 @@ -773,7 +816,7 @@ def test_hads_manager(resample_test_hads_output_path, range: bool) -> None: paths = test_config.range_to_reprojection(stop=1) else: paths = [test_config.to_reprojection()] - export: Dataset = open_dataset(paths[0]) + export: T_Dataset = open_dataset(paths[0]) assert len(export.time) == 31 assert not np.isnan(export.tasmax[0][200:300].values).all() assert ( @@ -787,9 +830,9 @@ def test_hads_manager(resample_test_hads_output_path, range: bool) -> None: @pytest.mark.parametrize("data_type", ("hads", "cpm")) def test_interpolate_coords( data_type: str, - reference_final_coord_grid: Dataset, - tasmax_cpm_1980_raw: Dataset, - tasmax_hads_1980_raw: Dataset, + reference_final_coord_grid: T_Dataset, + tasmax_cpm_1980_raw: T_Dataset, + tasmax_hads_1980_raw: T_Dataset, ) -> None: """Test reprojecting raw spatial files. @@ -797,7 +840,7 @@ def test_interpolate_coords( ----- Still seems to run even when `-m "not mount"` is specified. """ - reprojected_xr_time_series: Dataset + reprojected_xr_time_series: T_Dataset kwargs: dict[str, Any] = dict( variable_name="tasmax", x_grid=reference_final_coord_grid.projection_x_coordinate, @@ -813,6 +856,7 @@ def test_interpolate_coords( assert reprojected_xr_time_series.dims["time"] == 31 # assert reprojected_xr_time_series.dims[HADS_XDIM] == 528 # assert reprojected_xr_time_series.dims[HADS_YDIM] == 651 + assert reprojected_xr_time_series.rio.crs else: # We are now using gdal_warp_wrapper. See test_cpm_warp_steps reprojected_xr_time_series = interpolate_coords( @@ -827,6 +871,22 @@ def test_interpolate_coords( assert reprojected_xr_time_series.dims[HADS_YDIM] == 651 +@pytest.mark.mount +def test_hads_resample_and_reproject( + tasmax_hads_1980_raw: T_Dataset, +) -> None: + variable_name: str = "tasmax" + reprojected: T_Dataset = hads_resample_and_reproject( + tasmax_hads_1980_raw, + variable_name=variable_name, + ) + plot_xarray( + reprojected, path="tests/runs/reample-hads/tasmas-1980.png", time_stamp=True + ) + assert_allclose(reprojected[10][430][230:250], FINAL_HADS_JAN_10_430_X_230_250_Y) + assert False + + @pytest.mark.mount @pytest.mark.parametrize("strict_fail_bool", (True, False)) @pytest.mark.parametrize("manager", (HADsResamplerManager, CPMResamplerManager)) @@ -861,7 +921,7 @@ def test_execute_resample_configs(multiprocess: bool, tmp_path) -> None: resamplers: tuple[ HADsResampler | CPMResampler, ... ] = test_config.execute_resample_configs(multiprocess=multiprocess) - export: Dataset = open_dataset(resamplers[0][0]) + export: T_Dataset = open_dataset(resamplers[0][0]) assert len(export.time) == 31 assert not np.isnan(export.tasmax[0][200:300].values).all() assert ( @@ -893,7 +953,7 @@ def test_execute_resample_configs(multiprocess: bool, tmp_path) -> None: # 'tests/data/tasmax_rcp85_land-cpm_uk_2.2km_01_day_19821201-19831130.nc', # crop_geom=glasgow_shape_file_path, invert=True) # assert cropped.rio.bounds == result_bounds -# ts_to_crop: dict[Path, Dataset] = {} +# ts_to_crop: dict[Path, T_Dataset] = {} # for path in ukcp_tasmax_raw_5_years_paths: # assert path.exists() # ts_to_crop[path] = open_dataset(path, decode_coords="all") From 72d2770d17afc9a1b216ee502cd52ab1c051dc5f Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Wed, 29 May 2024 00:59:12 +0100 Subject: [PATCH 02/92] tests: fix `test_resample.py` import of `interpolate_coords` --- python/tests/test_resample.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 4a6ea309..356bc6d1 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -27,7 +27,6 @@ HADsResampler, HADsResamplerManager, cpm_reproject_with_standard_calendar, - interpolate_coords, ) from clim_recal.utils.core import ( CLI_DATE_FORMAT_STR, @@ -61,6 +60,7 @@ file_name_to_start_end_dates, gdal_warp_wrapper, hads_resample_and_reproject, + interpolate_coords, plot_xarray, xarray_example, ) From 36647d5c0215286edb25e4152f9290a0d2d3c506 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Wed, 29 May 2024 09:54:57 +0100 Subject: [PATCH 03/92] test: add plotting in `test_hads_resample_reproject` backup local path --- python/conftest.py | 26 ++++++++++++++++++++----- python/tests/test_resample.py | 36 +++++++++++++++++++++++++++++------ 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/python/conftest.py b/python/conftest.py index e6820d02..77865478 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -56,12 +56,13 @@ CLIMATE_DATA_MOUNT_PATH_LINUX: Final[Path] = Path("/mnt/vmfileshare/ClimateData") CLIMATE_DATA_MOUNT_PATH_MACOS: Final[Path] = Path("/Volumes/vmfileshare/ClimateData") -TEST_PATH: Final[Path] = Path().absolute() -TEST_DATA_PATH: Final[Path] = TEST_PATH / "tests" +TEST_RUN_PATH: Final[Path] = Path().absolute() +TEST_FILE_PATH: Final[Path] = TEST_RUN_PATH / "tests" TEST_RESULTS_PATH: Final[Path] = results_path( - name="test-run-results", path=TEST_DATA_PATH, mkdir=True + name="test-run-results", path=TEST_FILE_PATH, mkdir=True ) PYTHON_DIR_NAME: Final[Path] = Path("python") +TEST_DATA_PATH: Final[Path] = TEST_FILE_PATH / "data" CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT: Final[tuple[str, ...]] = ( "python", @@ -224,8 +225,8 @@ def conda_lock_file_manager() -> CondaLockFileManager: @pytest.fixture def data_fixtures_path(tmp_path: Path) -> Iterator[Path]: - yield copytree(TEST_DATA_PATH, tmp_path / TEST_DATA_PATH.name) - rmtree(tmp_path / TEST_DATA_PATH.name) + yield copytree(TEST_FILE_PATH, tmp_path / TEST_FILE_PATH.name) + rmtree(tmp_path / TEST_FILE_PATH.name) @pytest.mark.mount @@ -242,6 +243,21 @@ def test_runs_output_path(path=TEST_RESULTS_PATH) -> Iterator[Path]: rmtree(path, ignore_errors=True) +@pytest.fixture(scope="session") +def local_cache_path() -> Path: + return TEST_DATA_PATH + + +@pytest.fixture(scope="session") +def local_hads_cache_path(local_cache_path: Path) -> Path: + return local_cache_path / "hadsuk" + + +@pytest.fixture(scope="session") +def local_cpm_cache_path(local_cache_path: Path) -> Path: + return local_cache_path / "ukcp" + + @pytest.fixture def glasgow_epsg_27700_bounds() -> BoundsTupleType: """Boundaries of Glasgow in EPSG:27700 coords. diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 356bc6d1..87e4e63e 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -156,13 +156,18 @@ def tasmax_cpm_1980_raw() -> T_Dataset: # Backup path if furture rehydration issues # return open_dataset("/Volumes/vmfileshare/ClimateData/Raw/UKCP2.2/tasmin/05/latest/tasmin_rcp85_land-cpm_uk_2.2km_05_day_19801201-19811130.nc", decode_coords="all") + # return open_dataset(local_cpm_cache_path / UKCP_RAW_TASMAX_1980_FILE, decode_coorda="all") return open_dataset(UKCP_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") @pytest.mark.mount @pytest.fixture(scope="session") -def tasmax_hads_1980_raw() -> T_Dataset: - return open_dataset(HADS_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") +def tasmax_hads_1980_raw(local_hads_cache_path) -> T_Dataset: + # return open_dataset(HADS_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") + # Using below to manage issues with server mount + return open_dataset( + local_hads_cache_path / HADS_RAW_TASMAX_1980_FILE, decode_coords="all" + ) @pytest.fixture(scope="session") @@ -876,15 +881,34 @@ def test_hads_resample_and_reproject( tasmax_hads_1980_raw: T_Dataset, ) -> None: variable_name: str = "tasmax" + output_path: Path = Path("tests/runs/reample-hads") + # The the first index is the first time point of a month, in this case January + plot_xarray( + tasmax_hads_1980_raw[0], + path=output_path / "tasmas-1980-JAN-1-raw.png", + time_stamp=True, + ) + + assert tasmax_hads_1980_raw.dims["time"] == 31 + assert tasmax_hads_1980_raw.dims["projection_x_coordinate"] == 900 + assert tasmax_hads_1980_raw.dims["projection_y_coordinate"] == 1450 reprojected: T_Dataset = hads_resample_and_reproject( tasmax_hads_1980_raw, variable_name=variable_name, ) - plot_xarray( - reprojected, path="tests/runs/reample-hads/tasmas-1980.png", time_stamp=True - ) + # The the first index is the first time point of a month, in this case January + plot_xarray(reprojected[0], path=output_path / "tasmas-1980.png", time_stamp=True) assert_allclose(reprojected[10][430][230:250], FINAL_HADS_JAN_10_430_X_230_250_Y) - assert False + assert reprojected.rio.crs.to_epsg() == int(BRITISH_NATIONAL_GRID_EPSG[5:]) + export_netcdf_path: Path = results_path( + "tasmax-1980-converted", path=output_path, extension="nc" + ) + reprojected.to_netcdf(export_netcdf_path) + read_from_export: T_Dataset = open_dataset(export_netcdf_path, decode_coords="all") + assert read_from_export.dims["time"] == 31 + assert read_from_export.dims["lat"] == 651 + assert read_from_export.dims["lon"] == 528 + assert reprojected.rio.crs == read_from_export.rio.crs == BRITISH_NATIONAL_GRID_EPSG @pytest.mark.mount From 8d5e6d4701e07fe25ea1d7ff6c17a34a8b0f3b54 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Wed, 29 May 2024 11:05:34 +0100 Subject: [PATCH 04/92] test: add comments to `test_hads_resample_reproject` --- python/tests/test_resample.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 87e4e63e..dec6b01a 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -906,8 +906,8 @@ def test_hads_resample_and_reproject( reprojected.to_netcdf(export_netcdf_path) read_from_export: T_Dataset = open_dataset(export_netcdf_path, decode_coords="all") assert read_from_export.dims["time"] == 31 - assert read_from_export.dims["lat"] == 651 - assert read_from_export.dims["lon"] == 528 + assert read_from_export.dims["lon"] == 528 # replaces projection_x_coordinate + assert read_from_export.dims["lat"] == 651 # replaces projection_y_coordinate assert reprojected.rio.crs == read_from_export.rio.crs == BRITISH_NATIONAL_GRID_EPSG From 3ed140b9c31b173a207b1b98d72de5dc9360e4a5 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Wed, 29 May 2024 13:32:32 +0100 Subject: [PATCH 05/92] feat(test): add `tasmax_hads_1980_raw_mount_or_local_cache` `fixture` to work if `mount` fails --- python/pyproject.toml | 1 + python/tests/test_resample.py | 34 +++++++++++++++++++++++++++------- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index d3d5f706..4c5e4985 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -97,4 +97,5 @@ markers = [ "docker: requires running via docker jupyterlab.", "multiprocess: uses multiprocessing.", "darwin: requires darwin (macOS) operating system.", + "localcache: uses local copies of mount files.", ] diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index dec6b01a..a2310810 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -162,12 +162,28 @@ def tasmax_cpm_1980_raw() -> T_Dataset: @pytest.mark.mount @pytest.fixture(scope="session") -def tasmax_hads_1980_raw(local_hads_cache_path) -> T_Dataset: - # return open_dataset(HADS_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") +def tasmax_hads_1980_raw() -> T_Dataset: + return open_dataset(HADS_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") # Using below to manage issues with server mount - return open_dataset( - local_hads_cache_path / HADS_RAW_TASMAX_1980_FILE, decode_coords="all" - ) + # return open_dataset( + # local_hads_cache_path / HADS_RAW_TASMAX_1980_FILE, decode_coords="all" + # ) + + +@pytest.mark.localcache +@pytest.fixture(scope="session", params=("mount", "localcache")) +def tasmax_hads_1980_raw_mount_or_local_cache( + request: pytest.FixtureRequest, local_hads_cache_path +) -> T_Dataset: + if request.param == "mount": + return open_dataset(HADS_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") + # Using below to manage issues with server mount + elif request.param == "localcache": + return open_dataset( + local_hads_cache_path / HADS_RAW_TASMAX_1980_FILE, decode_coords="all" + ) + else: + raise ValueError(f"only 'mount' and 'localcache' params are supported") @pytest.fixture(scope="session") @@ -877,14 +893,18 @@ def test_interpolate_coords( @pytest.mark.mount +@pytest.mark.parametrize( + "tasmax_hads_1980_raw_mount_or_local_cache", ("mount", "localcache"), indirect=True +) def test_hads_resample_and_reproject( - tasmax_hads_1980_raw: T_Dataset, + tasmax_hads_1980_raw_mount_or_local_cache: T_Dataset, ) -> None: variable_name: str = "tasmax" output_path: Path = Path("tests/runs/reample-hads") + tasmax_hads_1980_raw = tasmax_hads_1980_raw_mount_or_local_cache # The the first index is the first time point of a month, in this case January plot_xarray( - tasmax_hads_1980_raw[0], + tasmax_hads_1980_raw.tasmax[0], path=output_path / "tasmas-1980-JAN-1-raw.png", time_stamp=True, ) From 8daf648a7cb0212a5d01ff9af3b3bb19312a4daf Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Wed, 29 May 2024 13:35:17 +0100 Subject: [PATCH 06/92] feat(test): set default `pytest` conf to exclude `localcache` `mark` tests --- python/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index 4c5e4985..a192186c 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -77,7 +77,7 @@ addopts = """ --ignore=clim_recal/debiasing/python-cmethods --ignore=clim_recal/debiasing/preprocess_data.py --ignore=clim_recal/debiasing/run_cmethods.py - -m "not server and not mount" + -m "not server and not mount and not localcache" --pdbcls=IPython.terminal.debugger:TerminalPdb --cov=clim_recal --cov-report=term:skip-covered From 1acbc7e204a352b562af6efd5d0bf80cba0131fe Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Thu, 30 May 2024 02:30:09 +0100 Subject: [PATCH 07/92] fix: `interpolate_coords` conditional error prevented `rio.crs` config --- .conda-linux-64.lock | 87 +- conda-lock.yml | 1391 +++++++++++++++-------------- python/clim_recal/utils/xarray.py | 37 +- python/pdm.lock | 18 +- python/pyproject.toml | 1 + python/tests/test_resample.py | 4 +- 6 files changed, 822 insertions(+), 716 deletions(-) diff --git a/.conda-linux-64.lock b/.conda-linux-64.lock index a02f0f76..387f8b64 100644 --- a/.conda-linux-64.lock +++ b/.conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 3f8bc1ed2ed3e8b1f9829aa120ca7daf89a0310c9099aeb5fabb4c7f2c1d4bbd +# input_hash: fc1a2dad7b75533eecc939adf85e8193120dab7b74e221e0e3adb78dc0263375 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://repo.anaconda.com/pkgs/main/linux-64/blas-1.0-openblas.conda#9ddfcaef10d79366c90128f5dc444be8 @@ -20,7 +20,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://repo.anaconda.com/pkgs/main/noarch/fonts-conda-ecosystem-1-hd3eb1b0_0.conda#76790b62a799de73c4364f7cdc445583 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.17-h4ab18f5_0.conda#97d60c6b52391872febd35fab0a30159 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.19-h4ab18f5_0.conda#c6dedd5eab2236f4abb59ade9fb7fd44 https://repo.anaconda.com/pkgs/main/linux-64/bzip2-1.0.8-h5eee18b_6.conda#f21a3ff51c1b271977f53ce956a69297 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://repo.anaconda.com/pkgs/main/linux-64/expat-2.6.2-h6a678d5_0.conda#55049db2772dae035f6b8a95f72b5970 @@ -31,7 +31,7 @@ https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1 https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h7ab15ed_0.conda#9961b1f100c3b6852bd97c9233d06979 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_h59595ed_0.conda#682bdbe046a68f749769b492f3625c5c +https://repo.anaconda.com/pkgs/main/linux-64/libabseil-20240116.2-cxx17_h6a678d5_0.conda#7abc574a536f223fe96be4fb7f4207bf https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://repo.anaconda.com/pkgs/main/linux-64/libbrotlicommon-1.0.9-h5eee18b_8.conda#1e9edf233add622312356a40a7d0f8de https://repo.anaconda.com/pkgs/main/linux-64/libcrc32c-1.1.2-h6a678d5_0.conda#daf778296b4ada0649ecad5e5e320cd0 @@ -49,12 +49,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://repo.anaconda.com/pkgs/main/linux-64/libxcb-1.15-h7f8727e_0.conda#ada518dcadd6aaee9aae47ba9a671553 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 https://repo.anaconda.com/pkgs/main/linux-64/lz4-c-1.9.4-h6a678d5_1.conda#2ee58861f2b92b868ce761abb831819d https://repo.anaconda.com/pkgs/main/linux-64/lzo-2.10-h7b6447c_2.conda#65722a7644f424de73fea6e87edd7653 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 https://repo.anaconda.com/pkgs/main/linux-64/nspr-4.35-h6a678d5_0.conda#208fff5d60133bcff6998a70c9f5203b -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda#c0f3abb4a16477208bbd43a39bd56f18 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda#12ea6d0d4ed54530eaed18e4835c1f7c https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/tzcode-2024a-h3f72095_0.conda#32146e34aaec3745a08b6f49af3f41b0 @@ -66,10 +66,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_10 https://repo.anaconda.com/pkgs/main/linux-64/xorg-xproto-7.0.31-h27cfd23_1007.conda#287ea0f32c5f1c209e5030ead360b613 https://repo.anaconda.com/pkgs/main/linux-64/xz-5.4.6-h5eee18b_1.conda#1562802f843297ee776a50b9329597ed https://repo.anaconda.com/pkgs/main/linux-64/yaml-0.2.5-h7b6447c_0.conda#39fdbf4db769e494ffb06d95680c83d8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.12-h2ba76a8_0.conda#da9257187c044a2a8f52507fea68a4c3 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-h36a0aea_4.conda#ce9d15eeabc21f9936410382e20c2908 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-h36a0aea_0.conda#2555c5ffa3a60fde5a940c5c9f4327cc -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-h36a0aea_4.conda#bd99b76853edcc6fae6a901900bba995 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.14-h88a6e22_1.conda#7ed63b0e816dd1635903506ef5d2c079 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-h83b837d_6.conda#3e572eacd0ce99a59e1bb9c260ad5b20 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-h83b837d_2.conda#f40c698b4ea90f7fedd187c6639c818b +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-h83b837d_6.conda#7995cb937bdac5913c8904fed6b3729d https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://repo.anaconda.com/pkgs/main/linux-64/libbrotlidec-1.0.9-h5eee18b_8.conda#2595e6d66d6b9254e18d63458dc27486 https://repo.anaconda.com/pkgs/main/linux-64/libbrotlienc-1.0.9-h5eee18b_8.conda#d9ee310f619a8dc00178fd2ae1667c88 @@ -77,7 +77,6 @@ https://repo.anaconda.com/pkgs/main/linux-64/libedit-3.1.20230828-h5eee18b_0.con https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h8917695_15.conda#20c3c14bc491f30daecaa6f73e2223ae https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b @@ -85,23 +84,24 @@ https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 https://repo.anaconda.com/pkgs/main/linux-64/readline-8.2-h5eee18b_0.conda#be42180685cce6e6b0329201d9f48efb -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.13-he19d79f_0.conda#51db7e9c0cd527aea7691e7405df33bf +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.15-he19d79f_0.conda#4c7cc3fa1d2c5a63f9e2b1e2980a1672 https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.13.0-hd2e6256_0.conda#18f9348f064632785d54dbd1db9344bb https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://repo.anaconda.com/pkgs/main/linux-64/zeromq-4.3.5-h6a678d5_0.conda#354c934a4a5500f4c455c630f2702dbc -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.8-h96d4d28_0.conda#417d99cf69a0e6f40251815ca7622273 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.8-h21d4f22_5.conda#f9dd6e8a46f55f49eae5380d3b922b71 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://repo.anaconda.com/pkgs/main/linux-64/brotli-bin-1.0.9-h5eee18b_8.conda#9820670bfb9cae1e93a2646676bc1b7b https://repo.anaconda.com/pkgs/main/linux-64/freetype-2.12.1-h4a9f257_0.conda#bdc7b5952e9c5dca01bc2f4ccef2f974 https://repo.anaconda.com/pkgs/main/linux-64/gdbm-1.18-hd4cb3f1_4.conda#1c82981848be10bfc91000a0afcefee3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.2-h2aa1ff5_1.conda#3bf887827d1968275978361a6e405e4f +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda#72724f6a78ecb15559396966226d5838 https://repo.anaconda.com/pkgs/main/linux-64/libkml-1.3.0-h096b73e_7.conda#23f3c95c535e38ee050f9f4bc8eb6bcc https://repo.anaconda.com/pkgs/main/linux-64/libopenblas-0.3.21-h043d6bf_0.conda#7f7324dcc3c4761a14f3e4ac443235a7 +https://repo.anaconda.com/pkgs/main/linux-64/libprotobuf-4.25.3-he621ea3_0.conda#b5bac9ee75a731feb80bfc8c40d1958f https://repo.anaconda.com/pkgs/main/linux-64/libssh2-1.11.0-h251f7ec_0.conda#ce46cf257d73fe85c18c78597196f0d8 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://repo.anaconda.com/pkgs/main/linux-64/minizip-4.0.3-hf59b114_0.conda#e1efccc2d4cfe54c7119600ea6dcdbe7 @@ -111,14 +111,14 @@ https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.45.3-h5eee18b_0.conda#acf9 https://repo.anaconda.com/pkgs/main/linux-64/tk-8.6.14-h39e8969_0.conda#78dbc5e3c69143ebc037fc5d5b22e597 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-h161de36_10.conda#a7a334cb2d24e31a9bf0e7e3d01b14cb -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.1-h63f54a0_13.conda#dd5266145d7b778c9e9a0508a503e564 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-ha47c788_12.conda#8420d8e495a1468f593128e5fbf6748a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.1-h29d6fba_17.conda#c20a29ff47043ba1ec24f45dc68930bf https://repo.anaconda.com/pkgs/main/linux-64/brotli-1.0.9-h5eee18b_8.conda#b5d5a0d366e8dc1b21c75b8703aaa96a https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://repo.anaconda.com/pkgs/main/linux-64/freexl-2.0.0-hf309648_0.conda#09960bea3a0c12d03b8288e943e799bb https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.conda#a965aeaf060289528a3fbe09326edae2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 @@ -129,8 +129,8 @@ https://repo.anaconda.com/pkgs/main/linux-64/annotated-types-0.6.0-py312h06a4308 https://repo.anaconda.com/pkgs/main/noarch/appdirs-1.4.4-pyhd3eb1b0_0.conda#5673d98d06171cb6eed03a6736845c4d https://repo.anaconda.com/pkgs/main/linux-64/async-lru-2.0.4-py312h06a4308_0.conda#2806b5842bb2478e127c99feb82a6a88 https://repo.anaconda.com/pkgs/main/linux-64/attrs-23.1.0-py312h06a4308_0.conda#e8016c6839c63842d4a32bace7359ad8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.20-h5f1c8d9_0.conda#418775183961dc1ee1c326a473118f98 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-hcc7299c_2.conda#7003778c651fa3ba815cfdf065d769af +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.22-h96bc93b_2.conda#de2b7c9aa9b279cca5542134b7a2b86a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-h759edc4_4.conda#8ced661d9dcece8698922fd8a73b6511 https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.11.1-h91d86a7_1.conda#2dbab1d281b7e1da05eee544cbdc8af6 https://conda.anaconda.org/conda-forge/noarch/beartype-0.18.5-pyhd8ed1ab_0.conda#28786996506a2f2dd7819b5f3705f4e4 https://repo.anaconda.com/pkgs/main/linux-64/blinker-1.6.2-py312h06a4308_0.conda#a308ff4a4e682fe7375bea66fec0f818 @@ -157,7 +157,7 @@ https://repo.anaconda.com/pkgs/main/noarch/executing-0.8.3-pyhd3eb1b0_0.conda#7b https://repo.anaconda.com/pkgs/main/linux-64/filelock-3.13.1-py312h06a4308_0.conda#6a0b440821945eda176c2bd78fd64a56 https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda#d427988dc3dbd0a4c136f52db356cc6a https://repo.anaconda.com/pkgs/main/linux-64/h11-0.14.0-py312h06a4308_0.conda#6e32d4e1d4c9409293e63ecf19755482 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_101.conda#7e98860d08eea82c8057abd78864fcb4 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_102.conda#d8cb3688b92e891e1e5f613517a50ca8 https://repo.anaconda.com/pkgs/main/linux-64/idna-3.7-py312h06a4308_0.conda#03cc59cdabff44c47be0fadffcef003c https://repo.anaconda.com/pkgs/main/linux-64/importlib_resources-6.1.1-py312h06a4308_1.conda#13691687030e6f6b299bd04173696daf https://repo.anaconda.com/pkgs/main/noarch/iniconfig-1.1.1-pyhd3eb1b0_0.tar.bz2#e40edff2c5708f342cef43c7f280c507 @@ -165,7 +165,7 @@ https://repo.anaconda.com/pkgs/main/noarch/jeepney-0.7.1-pyhd3eb1b0_0.conda#f115 https://repo.anaconda.com/pkgs/main/linux-64/joblib-1.4.0-py312h06a4308_0.conda#5994475da8e256a8be4b7b5f47bd37a3 https://repo.anaconda.com/pkgs/main/noarch/json5-0.9.6-pyhd3eb1b0_0.conda#4e721ee2dbfa20069719d2ee19185031 https://repo.anaconda.com/pkgs/main/linux-64/kiwisolver-1.4.4-py312h6a678d5_0.conda#47e12eaa774b108e6e17011b1d727650 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.23.0-h9be4e54_1.conda#1042d8401bb268553f98e60120cdeb40 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.24.0-h2736e30_0.conda#34aeee3fa7fca5dc21fad3ac6f4f0ab2 https://repo.anaconda.com/pkgs/main/linux-64/markupsafe-2.1.3-py312h5eee18b_0.conda#b5d2615c33773326f8207f7b58df1e2b https://repo.anaconda.com/pkgs/main/linux-64/mdurl-0.1.0-py312h06a4308_0.conda#6bea6d09fe58ac995a64ab45e75cb5e9 https://repo.anaconda.com/pkgs/main/linux-64/mistune-2.0.4-py312h06a4308_0.conda#ebad83b0f2acc0defac5485ea5e71994 @@ -177,7 +177,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/numpy-base-1.26.4-py312he1a6c75_0.c https://repo.anaconda.com/pkgs/main/linux-64/overrides-7.4.0-py312h06a4308_0.conda#b294a9b6e5b7654cc7012f3690a7c57f https://repo.anaconda.com/pkgs/main/linux-64/packaging-23.2-py312h06a4308_0.conda#6df46fc8a396077102655cc21600723d https://repo.anaconda.com/pkgs/main/noarch/pandocfilters-1.5.0-pyhd3eb1b0_0.conda#5547ced9e3bb4c513405998957b52c7b -https://conda.anaconda.org/conda-forge/linux-64/parallel-20240322-ha770c72_0.conda#5ad3f5eb0086ae5ca3cf926c0773b844 +https://conda.anaconda.org/conda-forge/linux-64/parallel-20240522-ha770c72_0.conda#95444bc23d494d0b06405bea54c7cd1f https://repo.anaconda.com/pkgs/main/noarch/parso-0.8.3-pyhd3eb1b0_0.conda#c6f0f6219bf5ce2b510ef4b75cbc3e01 https://repo.anaconda.com/pkgs/main/noarch/pastel-0.2.1-py_0.conda#81a0d5c930710445569d9a2f5137d6a2 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.conda#425bb325f970e57a047ac57c4586489d @@ -223,6 +223,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/tomli-2.0.1-py312h06a4308_1.conda#8 https://repo.anaconda.com/pkgs/main/linux-64/tomlkit-0.11.1-py312h06a4308_0.conda#b2061d65b70adf68a4f96dc4fb4ec939 https://repo.anaconda.com/pkgs/main/linux-64/toolz-0.12.0-py312h06a4308_0.conda#8340b47fa0f92e87a9416929dd52a102 https://repo.anaconda.com/pkgs/main/linux-64/tornado-6.3.3-py312h5eee18b_0.conda#a39237067b4cb774d7826be15439a342 +https://repo.anaconda.com/pkgs/main/linux-64/tqdm-4.66.4-py312he106c6f_0.conda#11d1cee87830bbb013896a43f47eafa9 https://repo.anaconda.com/pkgs/main/linux-64/traitlets-5.7.1-py312h06a4308_0.conda#10e9761815efd157b4f4fc6a216e0c61 https://repo.anaconda.com/pkgs/main/linux-64/truststore-0.8.0-py312h06a4308_0.conda#ad93bd626fc17c1606394fe258b4ed18 https://repo.anaconda.com/pkgs/main/linux-64/typing_extensions-4.11.0-py312h06a4308_0.conda#3045aa097a86bc6a13702fc3c287b5a4 @@ -236,7 +237,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/zipp-3.17.0-py312h06a4308_0.conda#0 https://repo.anaconda.com/pkgs/main/linux-64/anyio-4.2.0-py312h06a4308_0.conda#d992c4775da6f3ccb1223d71abe67de9 https://repo.anaconda.com/pkgs/main/noarch/asttokens-2.0.5-pyhd3eb1b0_0.conda#140486e2ce4f3931b44aa5f7ff8d88da https://repo.anaconda.com/pkgs/main/noarch/astunparse-1.6.3-py_0.conda#250bc9eafb39eff7fff001dae10e2d3c -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.8-h10bd90f_3.conda#f651b434355a203d2a3d0e4c4c329d9b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.9-h594631b_3.conda#47490db1dcddfb1c355251fc427746a6 https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.6.0-hf1915f5_1.conda#fd11ea65ceb397f9587b1d88a4329d73 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.5.0-h94269e2_4.conda#f364272cb4c2f4ce2341067107b82865 https://repo.anaconda.com/pkgs/main/linux-64/babel-2.11.0-py312h06a4308_0.conda#677b01819ada8c2e555e55342b1d5433 @@ -253,7 +254,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/dbus-1.13.18-hb2f20db_0.conda#6a6a6 https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.2.0-pyhd8ed1ab_0.conda#412c94a992ba8c828624c2ecb476caf7 https://conda.anaconda.org/conda-forge/noarch/findpython-0.6.1-pyhd8ed1ab_0.conda#c3562fb8edde4111bd5a11ea30cbc6a7 https://repo.anaconda.com/pkgs/main/linux-64/fonttools-4.51.0-py312h5eee18b_0.conda#592d996d4b654ac2d0b071461f5165d4 -https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.1-h6cf1f90_16.conda#aadc00cd5e330b5f7fb289446c23ab23 +https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.3-h928be8b_0.conda#c0f2468661b7cae54a7a1ff11926e372 https://repo.anaconda.com/pkgs/main/noarch/gitdb-4.0.7-pyhd3eb1b0_0.conda#bdd15a7149734880c003d98110c56b5b https://repo.anaconda.com/pkgs/main/noarch/html5lib-1.1-pyhd3eb1b0_0.conda#24c4f675dfc77f9d1ae6cd3c33731c3c https://repo.anaconda.com/pkgs/main/linux-64/httpcore-1.0.2-py312h06a4308_0.conda#a4e4dd3bd4cec11e72ffb690bafcce90 @@ -261,13 +262,13 @@ https://repo.anaconda.com/pkgs/main/linux-64/importlib-metadata-7.0.1-py312h06a4 https://repo.anaconda.com/pkgs/main/noarch/importlib-resources-6.1.1-pyhd3eb1b0_1.conda#3af35c818b28c6c6732a7acafefc9d2a https://repo.anaconda.com/pkgs/main/noarch/jaraco.classes-3.2.1-pyhd3eb1b0_0.conda#7f47c66b55e92b2724174847703df72f https://repo.anaconda.com/pkgs/main/linux-64/jedi-0.18.1-py312h06a4308_1.conda#6bbccab0eb9ae37d881f84f9f19cea8a -https://repo.anaconda.com/pkgs/main/linux-64/jinja2-3.1.3-py312h06a4308_0.conda#744b2dc3144f19bd648eaaff4c81c243 +https://repo.anaconda.com/pkgs/main/linux-64/jinja2-3.1.4-py312h06a4308_0.conda#aee50a77b632c39ab72bffc8017d19be https://repo.anaconda.com/pkgs/main/linux-64/jupyter_core-5.5.0-py312h06a4308_0.conda#36753efd1e28a61039288eddf9935794 https://repo.anaconda.com/pkgs/main/noarch/jupyterlab_pygments-0.1.2-py_0.conda#af46aff4922ca45df6ba19b313df6070 -https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-h2f55d51_0.conda#f7e7077802927590efc8bf7328208f12 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.23.0-hc7a4891_1.conda#ee99fb9107ffb579b58ee92a5fb14b06 +https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hee9dde6_1.conda#c5b7b29e2b66107553d0366538257a51 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.24.0-h3d9a0c8_0.conda#a731371833a7b1ab3a87be0fe7e6235a https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 -https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h6f065fc_5.conda#f2e2bdd5fd10493a525503b2f40c59eb +https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h5539517_6.conda#1ee26233875c04444bdb2e5a838b5634 https://repo.anaconda.com/pkgs/main/linux-64/markdown-it-py-2.2.0-py312h06a4308_1.conda#ec0d596109762df09a6ee70dd3327847 https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-inline-0.1.6-py312h06a4308_0.conda#a8e99eeb494e5945aa7e60a660670643 https://repo.anaconda.com/pkgs/main/linux-64/nodeenv-1.7.0-py312h06a4308_0.conda#23c0441e6b4e88642027f364e62f8566 @@ -278,19 +279,18 @@ https://conda.anaconda.org/conda-forge/linux-64/poppler-24.04.0-hb6cd0d7_0.conda https://repo.anaconda.com/pkgs/main/linux-64/prompt-toolkit-3.0.43-py312h06a4308_0.conda#1ccee6d6456c5a4c71d52a97e8292432 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312hb591178_6.conda#e5a041de2ecaee7e02c40cf82afa132e https://repo.anaconda.com/pkgs/main/linux-64/pytest-7.4.0-py312h06a4308_0.conda#7d983fb31c361c499cd2d98f6347e46c -https://repo.anaconda.com/pkgs/main/linux-64/python-dateutil-2.9.0post0-py312h06a4308_0.conda#b5fa4f861d9af1401d91684e34519b33 +https://repo.anaconda.com/pkgs/main/linux-64/python-dateutil-2.9.0post0-py312h06a4308_2.conda#06c8706a892aaaae74325c0b46c86d01 https://repo.anaconda.com/pkgs/main/linux-64/python-dotenv-0.21.0-py312h06a4308_0.conda#f983f4d6278453e00f637442967b29fa https://repo.anaconda.com/pkgs/main/linux-64/referencing-0.30.2-py312h06a4308_0.conda#3113fb44293d20eaae1e67a4876751c9 https://repo.anaconda.com/pkgs/main/linux-64/rfc3339-validator-0.1.4-py312h06a4308_0.conda#2b1db8c436c99c6856a78dad8f2278a1 https://repo.anaconda.com/pkgs/main/linux-64/terminado-0.17.1-py312h06a4308_0.conda#4bc05c7f0c2e64b82882f774752a0263 https://repo.anaconda.com/pkgs/main/linux-64/tinycss2-1.2.1-py312h06a4308_0.conda#53422e62ac2d242aa12575ba12c2d430 -https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda#e74cd796e70a4261f86699ee0a3a7a24 https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda#cf2c3a89f89644c53cadbfeb124914e9 https://repo.anaconda.com/pkgs/main/linux-64/typing-extensions-4.11.0-py312h06a4308_0.conda#181af932ad0824456dc3e6173c38b5c6 https://repo.anaconda.com/pkgs/main/linux-64/virtualenv-20.26.1-py312h06a4308_0.conda#9a27149f4f1db4ada607be0fb5494f1b -https://conda.anaconda.org/conda-forge/linux-64/watchdog-4.0.0-py312h7900ff3_0.conda#1b87b82dd803565550e6358c0790f3d2 +https://conda.anaconda.org/conda-forge/linux-64/watchdog-4.0.1-py312h7900ff3_0.conda#7cc94a3b5e9698eecc2c39dbf7a173db https://repo.anaconda.com/pkgs/main/linux-64/argon2-cffi-bindings-21.2.0-py312h5eee18b_0.conda#ed4180dcd3e7c19a9c06a86510ad1ae7 -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.8-h02fd9b4_10.conda#289d899cba63e36d6768988aac83fcd4 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.9-he3a8b3b_0.conda#fbe6a256dd70a505730e7c461cd37a35 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.10.0-h00ab1b0_1.conda#1e63d3866554a4d2e3d1cba5f21a2841 https://repo.anaconda.com/pkgs/main/linux-64/bottleneck-1.3.7-py312ha883a20_0.conda#51bb23c66f00f6cc89dd0dee32815e67 https://repo.anaconda.com/pkgs/main/linux-64/branca-0.6.0-py312h06a4308_0.conda#0b93373891471306c3d9173cac8d1129 @@ -298,7 +298,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/cftime-1.6.2-py312ha883a20_1.conda# https://repo.anaconda.com/pkgs/main/linux-64/contourpy-1.2.0-py312hdb19cb5_0.conda#45c70b5ee7202df3c86a586c2736bce7 https://repo.anaconda.com/pkgs/main/linux-64/cryptography-42.0.5-py312hdda0065_1.conda#f224acb5b9a99ce1b715152d1ef7a67e https://repo.anaconda.com/pkgs/main/linux-64/gitpython-3.1.37-py312h06a4308_0.conda#447f9e5b301814c2e2ad7c485f626731 -https://conda.anaconda.org/conda-forge/noarch/griffe-0.45.1-pyhd8ed1ab_0.conda#a8f62d757614919f73fd3f872b91a022 +https://conda.anaconda.org/conda-forge/noarch/griffe-0.45.2-pyhd8ed1ab_0.conda#409a74bc6c127c7a623777547d03d587 https://repo.anaconda.com/pkgs/main/linux-64/httpx-0.26.0-py312h06a4308_0.conda#1773f853d16a8002ac9c8f056acbd5ed https://repo.anaconda.com/pkgs/main/noarch/importlib_metadata-7.0.1-hd3eb1b0_0.conda#f764ec5ca8c8f808464764c83be0ead4 https://repo.anaconda.com/pkgs/main/linux-64/jsonschema-specifications-2023.7.1-py312h06a4308_0.conda#4a3e8dd4b08a13007db2038e6d0ee144 @@ -317,7 +317,7 @@ https://repo.anaconda.com/pkgs/main/noarch/snuggs-1.4.7-pyhd3eb1b0_0.conda#f84b8 https://repo.anaconda.com/pkgs/main/noarch/stack_data-0.2.0-pyhd3eb1b0_0.conda#6212968e73726f6da42e5ffcd2bea92d https://repo.anaconda.com/pkgs/main/linux-64/ukkonen-1.0.1-py312hdb19cb5_0.conda#12f014642b080b0635c43e4e0d27e690 https://repo.anaconda.com/pkgs/main/noarch/argon2-cffi-21.3.0-pyhd3eb1b0_0.conda#f00b851bc61b4c313903d31c7daecb09 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.267-h51dfee4_8.conda#188857656abd6d1a4dcc471c619b0de5 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-hba8bd5f_3.conda#720494d9f06b4aff1270cffb7acc7920 https://repo.anaconda.com/pkgs/main/linux-64/identify-2.5.5-py312h06a4308_0.conda#f41d506d423ed77f2fd4ae67020ae659 https://repo.anaconda.com/pkgs/main/linux-64/ipython-8.20.0-py312h06a4308_0.conda#acbc198f40955d3ab40f666188371988 https://repo.anaconda.com/pkgs/main/linux-64/jsonschema-4.19.2-py312h06a4308_0.conda#5f74dfc66bdbe28a628b982f2ee0c345 @@ -337,31 +337,32 @@ https://repo.anaconda.com/pkgs/main/linux-64/keyring-24.3.1-py312h06a4308_0.cond https://repo.anaconda.com/pkgs/main/linux-64/mapclassify-2.5.0-py312h06a4308_0.conda#f4a3cedfd24c1533fd3a0a54a62a62b8 https://repo.anaconda.com/pkgs/main/linux-64/nbformat-5.9.2-py312h06a4308_0.conda#17aa138ac1d11e5a75f9c0c0377b7885 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f -https://conda.anaconda.org/conda-forge/noarch/sphobjinv-2.3.1-pyhd8ed1ab_0.conda#acdf6eee61eef569196651bf644d1b23 -https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.23.0-h27f064a_0.conda#8a4a8fd1af3cfbdcb54ea7282965d91a +https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 +https://conda.anaconda.org/conda-forge/noarch/sphobjinv-2.3.1.1-pyhd8ed1ab_0.conda#3503896d50f4e463bb86c77bab85ce07 +https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.23.0-hfa691db_2.conda#f9cd15d6c7deeeb5b60d65fac59b18bc https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda#10efd02b22c39c0a46312ef7cb16d237 https://repo.anaconda.com/pkgs/main/linux-64/urllib3-1.26.18-py312h06a4308_0.conda#37ba59346fdec674be0d3ec112225bf3 https://repo.anaconda.com/pkgs/main/linux-64/xarray-2023.6.0-py312h06a4308_0.conda#b43bba50ad0baabcb3cb1b70d3e6916a -https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.8.5-h77540a9_6.conda#754deaaecc6d717f443e6b1ebb66f075 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.8.5-h77540a9_7.conda#5937eafdfa5713c78a21cbb33a84539e https://repo.anaconda.com/pkgs/main/linux-64/nbclient-0.8.0-py312h06a4308_0.conda#27e95ee551e2a710fe0d96da0ca141fe https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.2-pyhd8ed1ab_0.conda#9bf1905bef4492b77781e058cc27db35 -https://repo.anaconda.com/pkgs/main/linux-64/requests-2.31.0-py312h06a4308_1.conda#dda64a94c6d852a3ce315dcf0e3f1797 +https://repo.anaconda.com/pkgs/main/linux-64/requests-2.32.2-py312h06a4308_0.conda#8149ef9ed40945df19d2aff5ffd5bae0 https://repo.anaconda.com/pkgs/main/linux-64/cachecontrol-0.14.0-py312h06a4308_1.conda#bf57de67bcf746306cd3e026e6d1cccc https://repo.anaconda.com/pkgs/main/linux-64/ensureconda-1.4.4-py312h06a4308_1.conda#c667ee44114bd2b67633a7cb4dfc02f2 https://repo.anaconda.com/pkgs/main/linux-64/folium-0.14.0-py312h06a4308_0.conda#2f16a00500b1165a9c9a938690ba19ac -https://conda.anaconda.org/conda-forge/linux-64/gdal-3.8.5-py312hca78659_6.conda#9392203d5f802c4278c53def10f80d69 +https://conda.anaconda.org/conda-forge/linux-64/gdal-3.8.5-py312h86af8fa_7.conda#489da43908a2583ab6a7549747a41e56 https://repo.anaconda.com/pkgs/main/linux-64/nbconvert-7.10.0-py312h06a4308_0.conda#e913ecbb1401f765ed8631ed511d6788 -https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.10-py312h061f55c_0.conda#afd2b09fc7b507cb7b8b8c38d404656b +https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.10-py312h2447d21_1.conda#e3b23e993698c5afd6ee57e009cabf4c https://repo.anaconda.com/pkgs/main/linux-64/requests-toolbelt-1.0.0-py312h06a4308_0.conda#7aa77208d296f2bb73e3e71f5614e170 https://conda.anaconda.org/conda-forge/noarch/unearth-0.15.2-pyhd8ed1ab_0.conda#dda35988bb25a59bc0545ec35fc25977 https://repo.anaconda.com/pkgs/main/linux-64/cachecontrol-with-filecache-0.14.0-py312h06a4308_1.conda#e3f673966a8bfbab947ceceb285f72d0 -https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.6-py312h66d9856_0.conda#a7e2048665753cff7f947af55f2dddb0 +https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.6-py312h39f3bbb_2.conda#027c465cb004970543b3641b4a0fef74 https://repo.anaconda.com/pkgs/main/linux-64/jupyter_server-2.10.0-py312h06a4308_0.conda#49fdb30dd562f6417cc1a621e2f24047 https://conda.anaconda.org/conda-forge/linux-64/pdm-2.12.4-py312h7900ff3_1.conda#faf91a93a76cd42d9b1fb3ff400b199f https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.15.5-pyhd8ed1ab_0.conda#cd7e6bfce5f8d758267c79d54bf108e7 https://repo.anaconda.com/pkgs/main/linux-64/conda-lock-2.5.6-py312h06a4308_0.conda#1f85a7f30fbd7e1a1061c05ba059e11f https://conda.anaconda.org/conda-forge/noarch/geopandas-0.14.4-pyhd8ed1ab_0.conda#acc01facf6f915b6289a064957a58cc1 https://repo.anaconda.com/pkgs/main/linux-64/jupyter-lsp-2.2.0-py312h06a4308_0.conda#5ec44afafeffea8c68eb56af4da94dc5 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.1-pyhd8ed1ab_0.conda#d97923b777ce837cf67e7858ac600834 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.2-pyhd8ed1ab_0.conda#d1cb7b113daaadd89e5aa6a32b28bf0d https://repo.anaconda.com/pkgs/main/linux-64/notebook-shim-0.2.3-py312h06a4308_0.conda#1f00239d617e3f323f35899f6254b39c -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.0-pyhd8ed1ab_1.conda#49af95b55515a65d14f6ea82422c321d +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.1-pyhd8ed1ab_0.conda#3e7290af6190b29c7017d6a8fb0eaeea diff --git a/conda-lock.yml b/conda-lock.yml index 5064ebfc..691e7224 100644 --- a/conda-lock.yml +++ b/conda-lock.yml @@ -15,9 +15,9 @@ version: 1 metadata: content_hash: - osx-arm64: 4807da782f2b981113d749e40dbb7e9aa87c84421194727476a886509cac61c7 - linux-64: 3f8bc1ed2ed3e8b1f9829aa120ca7daf89a0310c9099aeb5fabb4c7f2c1d4bbd - linux-aarch64: 9c6e30385696e11a3578b1352e270e0b706bdcb7dff66a622d03ca384c859b61 + osx-arm64: 9d63316589f3dd984544e62a4e75390fcd4255abf4a16dd5f40259931f3c8c33 + linux-64: fc1a2dad7b75533eecc939adf85e8193120dab7b74e221e0e3adb78dc0263375 + linux-aarch64: ad83d114512697bc85313bf884872a426d7006d8f0de105ba5697733be34e9fb channels: - url: r used_env_vars: [] @@ -477,131 +477,131 @@ package: category: main optional: false - name: aws-c-auth - version: 0.7.20 + version: 0.7.22 manager: conda platform: linux-64 dependencies: - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-http: '>=0.8.1,<0.8.2.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.20-h5f1c8d9_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.22-h96bc93b_2.conda hash: - md5: 418775183961dc1ee1c326a473118f98 - sha256: 12f53171a2cb544a83be9866bf41f7a15aa7ff032d9f91ea6fd2ca4c34c84768 + md5: de2b7c9aa9b279cca5542134b7a2b86a + sha256: ed64502dbfb2706d730a76f786e718cd149e6fbfc8c7325ddddba42dcf5af858 category: main optional: false - name: aws-c-auth - version: 0.7.20 + version: 0.7.22 manager: conda platform: linux-aarch64 dependencies: - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-http: '>=0.8.1,<0.8.2.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.20-haea164f_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.22-h38e582b_2.conda hash: - md5: d86c0927fc214cc75f852df9d199629c - sha256: 3e12105706271384634776a5ebf364f400b887600ab950ad79c2ea892f6e011a + md5: 15f1fe6feb33c71f8e7a46d6dcd8f02e + sha256: 43062295f7d21fc29b6135678d035d4b6e7c2cd9a718379b3a45696a241c2b47 category: main optional: false - name: aws-c-auth - version: 0.7.20 + version: 0.7.22 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-http: '>=0.8.1,<0.8.2.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.20-h5cf208e_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.22-hec39e38_2.conda hash: - md5: 8b6134a6e4ab346a4f7c3aaeb90073c8 - sha256: ca095f3d6678d3073b912722a53ac4489f2e78e79e7075731464b7be4210d458 + md5: 1c81dd08bafdaa47e08b031a6266104c + sha256: a0462fd4f91881b4e6e9047f82edbd0b2c55abe275be0d1572b5f90af1cdf203 category: main optional: false - name: aws-c-cal - version: 0.6.12 + version: 0.6.14 manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' libgcc-ng: '>=12' - openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.12-h2ba76a8_0.conda + openssl: '>=3.3.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.14-h88a6e22_1.conda hash: - md5: da9257187c044a2a8f52507fea68a4c3 - sha256: 1aafd1dcbfefce4e4c78fc5301d24dbdcffc3dcaae41bf43fde326d1525c1869 + md5: 7ed63b0e816dd1635903506ef5d2c079 + sha256: 5c0a5bdae01596bf46f190f32e7ceeb7a8e8160196f7565d89f861b80c18ea54 category: main optional: false - name: aws-c-cal - version: 0.6.12 + version: 0.6.14 manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' libgcc-ng: '>=12' - openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.6.12-hc544557_0.conda + openssl: '>=3.3.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.6.14-he69d4ad_1.conda hash: - md5: 5391a4b44449f773ec4e6b6db0768ecc - sha256: 8889df5424e76c59af6ea665f633b475224026b2bda40ace70073863198b3b5b + md5: d27088d391691224d8e1808e0192ed85 + sha256: ea2a82f3d2409f84ba43b12649e67d1ccfa636e4169260b9d66aaf97a05dd021 category: main optional: false - name: aws-c-cal - version: 0.6.12 + version: 0.6.14 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.6.12-h35c0bb2_0.conda + aws-c-common: '>=0.9.19,<0.9.20.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.6.14-h5db4892_1.conda hash: - md5: f3cafdf2cf60715acf0af9fcc6e314af - sha256: 7ee38b2e1a74d9300a5daa3e5d8e3721da80cfd2b8c4d0fe7d245b6c0b005345 + md5: 2c58877ab4fd2739dbb0cbf35bf96a6f + sha256: f384e001fbb2a3386d9b4f7d5dc7403624d1e9ddfcfbc4ab90421ec5721af3f2 category: main optional: false - name: aws-c-common - version: 0.9.17 + version: 0.9.19 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.17-h4ab18f5_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.19-h4ab18f5_0.conda hash: - md5: 97d60c6b52391872febd35fab0a30159 - sha256: e3a6fb2fd7079fc92022facbba5eae1b6d7d3ecd28f894bcde4cd3964280c3ee + md5: c6dedd5eab2236f4abb59ade9fb7fd44 + sha256: 96aa405ae28b8b55ec4731c135f38ce9b856d0596f32cedfbe5c62513b0f2dad category: main optional: false - name: aws-c-common - version: 0.9.17 + version: 0.9.19 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.17-h68df207_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.19-h68df207_0.conda hash: - md5: d6964495a363d9545e79443511796449 - sha256: 7dd384df039924af5d1a15ae6a54df09f092b7df3f7da34cd6696d3b362e93a8 + md5: ac4d24be95082f4c135f761946a2a8d9 + sha256: 2467db2867db26ca83f72168f6b55618de9a3fa12597f935c8fcf55dbd880800 category: main optional: false - name: aws-c-common - version: 0.9.17 + version: 0.9.19 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.17-h03532ee_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.19-h99b78c6_0.conda hash: - md5: f6f9dddf7d48c6260eed53331bc368ca - sha256: aa8320812d64a61d135eae8f14d3a33ee4a8be93d017af8f0f093818574321cc + md5: 7f42602d986d771c990361ea2dd49ce8 + sha256: c1e4f28581bee31ce0abde35e24d8b2a3e893330ffe433af02d66a5166101088 category: main optional: false - name: aws-c-compression @@ -609,12 +609,12 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-h36a0aea_4.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-h83b837d_6.conda hash: - md5: ce9d15eeabc21f9936410382e20c2908 - sha256: 7f16b562f9644e5dbc66082886d303601e9fb993dc1cf556ad4517bdf87f30aa + md5: 3e572eacd0ce99a59e1bb9c260ad5b20 + sha256: 468b9a95e6a2dda5e7a567228e0cf70d015a2300e3d73a88244be47f7d4f48e1 category: main optional: false - name: aws-c-compression @@ -622,12 +622,12 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.18-h7972eaf_4.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.18-h9de22bd_6.conda hash: - md5: 5d85b84f1e714fa1ee56ae8533dfcbb1 - sha256: 2b17a99e836b4277069cebc811af2b69d3cdaa14c665424f07e9e96090abf76b + md5: 1b6c96fa72802e49a2f0b8750c8f3707 + sha256: 77cf8c2811afb3ed97fcb40cc93a23b4b8db2e9a2c434b9922d0fbd6a3f01921 category: main optional: false - name: aws-c-compression @@ -636,11 +636,11 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.18-h35c0bb2_4.conda + aws-c-common: '>=0.9.19,<0.9.20.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.18-h5db4892_6.conda hash: - md5: 175f51c07a9a003b2d88234888dc2aa1 - sha256: 9ac120311a289b84f63b5c9b612595d088ee53fcdea6830d8a37b4f9797c0294 + md5: 20d53ad7e00c702dc798c95ab66be402 + sha256: c95b05ee3cb01f7a628a1cfa8f5b81a08f2091ba04ef6c0d09360c11ceb6fef3 category: main optional: false - name: aws-c-event-stream @@ -648,15 +648,15 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-h161de36_10.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-ha47c788_12.conda hash: - md5: a7a334cb2d24e31a9bf0e7e3d01b14cb - sha256: 31877ce699b8dfc8bad3bb82d908e9b3f3788af6ba6ab3fb141ad673c8d191d2 + md5: 8420d8e495a1468f593128e5fbf6748a + sha256: 05a09522a969456a6b1b29d6d92a67747d2829f225ecd4bd8dc8db068194ed00 category: main optional: false - name: aws-c-event-stream @@ -664,15 +664,15 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.4.2-h0672d3d_10.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.4.2-h660a530_12.conda hash: - md5: e601f2fc5cc4a9243e83c112694c00d7 - sha256: efc9d1cfef0c823b14270a7521df76264a4c202935de3770262d2a71134641e3 + md5: 1c32a945796845dd7620b7a6e176f816 + sha256: 04f4663879d548e6b6777b451dbf4c3c8fb27a5c4a0f8eae99fe4a1598b8dd06 category: main optional: false - name: aws-c-event-stream @@ -681,14 +681,14 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' libcxx: '>=16' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.4.2-h7d5773a_10.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.4.2-h5eab607_12.conda hash: - md5: 117c8e1a963c44316e3eed40592ff580 - sha256: c957e08847be2356dabea00f9f29a35bee51c8f3435812b9ffacad5c17b57586 + md5: 4c92d2c87cd2bf02506d8742f22e1fa6 + sha256: 5e76e7e040dc6e91d8d9b91f261a3da30787b44742448d7d52cda72a67ab8f19 category: main optional: false - name: aws-c-http @@ -696,15 +696,15 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-compression: '>=0.2.18,<0.2.19.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.1-h63f54a0_13.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.1-h29d6fba_17.conda hash: - md5: dd5266145d7b778c9e9a0508a503e564 - sha256: 679f62ea3e7cca58c8068f2770440636e79c645554e4c7ff52036567a755a5d2 + md5: c20a29ff47043ba1ec24f45dc68930bf + sha256: 56206b9a856257b42a6a429e26b0e1296dbd7c353e980b259b1282bd5e5a1241 category: main optional: false - name: aws-c-http @@ -712,15 +712,15 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-compression: '>=0.2.18,<0.2.19.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.1-h54e40d9_13.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.1-hb63d320_17.conda hash: - md5: b04c2320bc818736fdb3673e101a18ff - sha256: 55e117b0b5de68eb78c2629238791ad53ab8059870d1829bb483e7b9425ad6ee + md5: c64103cceb1a36f685184b7915677b1b + sha256: 2e4c8525c5d654a506d1acfcf7827917d6719a0b055a97fa548a89304c179c62 category: main optional: false - name: aws-c-http @@ -729,14 +729,14 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-compression: '>=0.2.18,<0.2.19.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.1-h00faecf_13.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.1-had10953_17.conda hash: - md5: 3ee817ca3693f0a3e05b5605939404a9 - sha256: f47540726b8c7b8d5d7e28d1e64731d1a22b35ec079a8f982740e7ec823ae1b0 + md5: ef06feb1f7b00aab3bc1bd5efe5c1d6d + sha256: 930600f5dace5eb27dbfaaf839e63444d804bae1119f8bd12216380257296530 category: main optional: false - name: aws-c-io @@ -744,14 +744,14 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' libgcc-ng: '>=12' - s2n: '>=1.4.13,<1.4.14.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.8-h96d4d28_0.conda + s2n: '>=1.4.15,<1.4.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.8-h21d4f22_5.conda hash: - md5: 417d99cf69a0e6f40251815ca7622273 - sha256: 70fba744853744151087d0bfe5cd65bdc08089cf713b6b83bf81f878c51ab1b6 + md5: f9dd6e8a46f55f49eae5380d3b922b71 + sha256: 53d71956cae757f941ff3f04e2dc9383a725a05c65f232dc69a1740961ad11a7 category: main optional: false - name: aws-c-io @@ -759,14 +759,14 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' libgcc-ng: '>=12' - s2n: '>=1.4.13,<1.4.14.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.8-h07c5ed3_0.conda + s2n: '>=1.4.15,<1.4.16.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.8-hc08e167_5.conda hash: - md5: 832ade3e36140d022f8ac8c928f9bbdd - sha256: b1121c52c16fd663e23a0d56c9dbaa29a6903ab78cb647ab6879521be398584e + md5: c1b095b1cda9e5a6882e4cfff3c231bd + sha256: 17db745ef438263f2a82707e75b28c8453f4f5dbaa13e8eb29032d6fa591e64d category: main optional: false - name: aws-c-io @@ -775,12 +775,12 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.8-h6dd71cf_0.conda + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.8-hb5a7b21_5.conda hash: - md5: 50142d1519ed7fb7bbe588084deab2ae - sha256: 949742437538cc0db5da9e21c92ccb3c32a1426980523412e5cbf6ec1990c073 + md5: c22a3d0aa06af78f388dd8313977a773 + sha256: d83243cc639b772a5c12e10eccf67bf51ce7d48291a7f20fb23a32cbf0b6452c category: main optional: false - name: aws-c-mqtt @@ -788,14 +788,14 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-http: '>=0.8.1,<0.8.2.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-hcc7299c_2.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-h759edc4_4.conda hash: - md5: 7003778c651fa3ba815cfdf065d769af - sha256: fcb732bc33d0aeead35a10eb7ee76494bfc68dcd06c9299e9c381c6e9e93ff7b + md5: 8ced661d9dcece8698922fd8a73b6511 + sha256: 663b659077570819c649b05b0a1f616373618d89ac5ad6ed93ff4b660b4172dc category: main optional: false - name: aws-c-mqtt @@ -803,14 +803,14 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-http: '>=0.8.1,<0.8.2.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.4-h0b2355d_2.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.4-hb8a7502_4.conda hash: - md5: 7ad03e93f5d584e3a974852b7c0daa4e - sha256: ce4c0b0096122c7db2644e7b972059d354317f992407b9b9c82776eeab94a954 + md5: d5e54de386ccd0ada0645bc13caffd15 + sha256: dda67f98707f836ee9b580bf4614db0f8e7daa052b2a7e53d452723022b7ec26 category: main optional: false - name: aws-c-mqtt @@ -819,69 +819,69 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-http: '>=0.8.1,<0.8.2.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.4-h92d7a41_2.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.4-h78534b8_4.conda hash: - md5: 128936f3f7c991bd9e112af42d1f9c30 - sha256: 81437ee8a65a445bec24df4cd584cb9e3d24f48cfa1a03e05f170fe125f96544 + md5: 08e6571e2f7065b279a84edfa1b8f997 + sha256: f728f0fcfa6688a088a448be35b6a3f36e4a02316d99bbf8ca09f0ba148ab2f5 category: main optional: false - name: aws-c-s3 - version: 0.5.8 + version: 0.5.9 manager: conda platform: linux-64 dependencies: - aws-c-auth: '>=0.7.20,<0.7.21.0a0' - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-auth: '>=0.7.22,<0.7.23.0a0' + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-http: '>=0.8.1,<0.8.2.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' libgcc-ng: '>=12' openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.8-h10bd90f_3.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.9-h594631b_3.conda hash: - md5: f651b434355a203d2a3d0e4c4c329d9b - sha256: e43c21ca62f56edd79d6a08e6c59eaf48b668e7dd078e815d19dc8d7f3a659bd + md5: 47490db1dcddfb1c355251fc427746a6 + sha256: b7b3c8189526c646b9bcd5dbed1da322076b0f1193a8793c64aae8347c3acca7 category: main optional: false - name: aws-c-s3 - version: 0.5.8 + version: 0.5.9 manager: conda platform: linux-aarch64 dependencies: - aws-c-auth: '>=0.7.20,<0.7.21.0a0' - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-auth: '>=0.7.22,<0.7.23.0a0' + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-http: '>=0.8.1,<0.8.2.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' libgcc-ng: '>=12' openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.5.8-h39e75e1_3.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.5.9-hca2a1cf_3.conda hash: - md5: f5c365a7fec659a22039167526262da1 - sha256: 8dccf3cd4ae7dc9f0390c02ead4eb73f7645b27aca0499655fab38e44337e5b9 + md5: 33c2cb095f9e95a264956c11b8e66a10 + sha256: aa07fb230bea84aba3b4653c0e7bab1a7d273991cbd2c6d19805ca2d4e1d6861 category: main optional: false - name: aws-c-s3 - version: 0.5.8 + version: 0.5.9 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-auth: '>=0.7.20,<0.7.21.0a0' - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-auth: '>=0.7.22,<0.7.23.0a0' + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-http: '>=0.8.1,<0.8.2.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.5.8-he1e208d_3.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.5.9-h1755d02_3.conda hash: - md5: 5a82a7ee4232cbfc526bc84c0d1becf7 - sha256: 5a74886d50c6249023fb37fe373bacfe7049560cd6ca95081546ca0559003bac + md5: 2eebcb1608b98b8c17796dbc65c91dcf + sha256: d2a13aba6c23399ccbcfeb939ecc4c6b552c0ba318734b5fb424a6c9186ec951 category: main optional: false - name: aws-c-sdkutils @@ -889,12 +889,12 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-h36a0aea_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-h83b837d_2.conda hash: - md5: 2555c5ffa3a60fde5a940c5c9f4327cc - sha256: 214fe6443dcd092287f739af2f9bc1d06e20014515363b3569fd4c74144f6a9d + md5: f40c698b4ea90f7fedd187c6639c818b + sha256: d5b350ca00f175866c2a5ef011270496a5061b39bd272a48d3e54ac06f3d890c category: main optional: false - name: aws-c-sdkutils @@ -902,12 +902,12 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.16-h7972eaf_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.16-h9de22bd_2.conda hash: - md5: 19c149b60cebab6440bfd115587e7109 - sha256: 9837d3042566f06b5512a0905e73c7f6045231f658e7bc9be72454602ee3dde3 + md5: 7fc749dd3d5154bd9bf7b38a639df653 + sha256: caa4a4995f3924732580499df00220eca72ce1e884e8d1328673e327af54c187 category: main optional: false - name: aws-c-sdkutils @@ -916,11 +916,11 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.16-h35c0bb2_0.conda + aws-c-common: '>=0.9.19,<0.9.20.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.16-h5db4892_2.conda hash: - md5: 75bc7553b500d2edc8f5eed68d04d981 - sha256: 152df9a5014a27bb33ecba29ce996cfb51e1b6ee825be40d052125f766efbb18 + md5: 743bcf65e2df26d5ee19688078ce25a2 + sha256: 3045df3148c15f606dadb76f871497ee05a4708a1609de6c0442ecc7ed3a0749 category: main optional: false - name: aws-checksums @@ -928,12 +928,12 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-h36a0aea_4.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-h83b837d_6.conda hash: - md5: bd99b76853edcc6fae6a901900bba995 - sha256: 224ead1679870e28005bfa7d27e8dd702f09837005610c6b06c52a95641da30b + md5: 7995cb937bdac5913c8904fed6b3729d + sha256: abd21f4d0e34e96538673be11d834360693748d17024d27c4054cf1ebd97069e category: main optional: false - name: aws-checksums @@ -941,12 +941,12 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.18-h7972eaf_4.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.18-h9de22bd_6.conda hash: - md5: 5c4cd53b40f29218bfbc4d1519bb29c3 - sha256: 8d0f27cde33d1f86fba4aa438eb9fa32fe350a60ddda222b5581f6f35acc5676 + md5: a31ac1531d25731eb717a08982f69731 + sha256: 8b453cc8f8949fe02f091ff377a072b612561e270521abad265c73a5a5784494 category: main optional: false - name: aws-checksums @@ -955,137 +955,137 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.18-h35c0bb2_4.conda + aws-c-common: '>=0.9.19,<0.9.20.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.18-h5db4892_6.conda hash: - md5: f0177671ec47f34998666eeb7cd227f9 - sha256: 3b7320a5b17d3d7dcf816e60f19122635219c4e1be4dd53cf9ae454b9ed2422d + md5: d28c3139c1c0193c633cb5650bf91079 + sha256: 5084ab14a49ebde68e46f87d4b85bedcf1931e2dd051d11fab725ee1ad60b0d1 category: main optional: false - name: aws-crt-cpp - version: 0.26.8 + version: 0.26.9 manager: conda platform: linux-64 dependencies: - aws-c-auth: '>=0.7.20,<0.7.21.0a0' - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-auth: '>=0.7.22,<0.7.23.0a0' + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' aws-c-http: '>=0.8.1,<0.8.2.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' aws-c-mqtt: '>=0.10.4,<0.10.5.0a0' - aws-c-s3: '>=0.5.8,<0.5.9.0a0' + aws-c-s3: '>=0.5.9,<0.5.10.0a0' aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.8-h02fd9b4_10.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.9-he3a8b3b_0.conda hash: - md5: 289d899cba63e36d6768988aac83fcd4 - sha256: fee34592ab0dc29ce8a6f56218dfb5e7699ab2fe4db525e76b80f9195fc8fea9 + md5: fbe6a256dd70a505730e7c461cd37a35 + sha256: bf77a2e96db6ea8271eb5ae1ebeaa4c50c8dcb1f0a5ec998d7601975c6185738 category: main optional: false - name: aws-crt-cpp - version: 0.26.8 + version: 0.26.9 manager: conda platform: linux-aarch64 dependencies: - aws-c-auth: '>=0.7.20,<0.7.21.0a0' - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-auth: '>=0.7.22,<0.7.23.0a0' + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' aws-c-http: '>=0.8.1,<0.8.2.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' aws-c-mqtt: '>=0.10.4,<0.10.5.0a0' - aws-c-s3: '>=0.5.8,<0.5.9.0a0' + aws-c-s3: '>=0.5.9,<0.5.10.0a0' aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.26.8-h0f6894a_10.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.26.9-h74ed545_0.conda hash: - md5: 94555f5e55313f1d398083c37e62459c - sha256: c73e26d75807d2402a423887ed19209200218c178073b411296d106f9bb622a2 + md5: c9d31ea9f2869e8927bf10287fe361c0 + sha256: 11e4055a1af742ab7ce5adea99e8e132787a0e9cab765e06924b81f44a6e4458 category: main optional: false - name: aws-crt-cpp - version: 0.26.8 + version: 0.26.9 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-auth: '>=0.7.20,<0.7.21.0a0' - aws-c-cal: '>=0.6.12,<0.6.13.0a0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-auth: '>=0.7.22,<0.7.23.0a0' + aws-c-cal: '>=0.6.14,<0.6.15.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' aws-c-http: '>=0.8.1,<0.8.2.0a0' aws-c-io: '>=0.14.8,<0.14.9.0a0' aws-c-mqtt: '>=0.10.4,<0.10.5.0a0' - aws-c-s3: '>=0.5.8,<0.5.9.0a0' + aws-c-s3: '>=0.5.9,<0.5.10.0a0' aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' libcxx: '>=16' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.26.8-h34bd0e7_10.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.26.9-h03bff2b_0.conda hash: - md5: 5bb64d59e04865edeecde2851e8592cd - sha256: 411771b09579b766d7432be6db68fadff8274ba30206f3e8b9cd05fd87ff8239 + md5: 690c2700092fbb8f5c36a08328d46e67 + sha256: 7386d9c4dc234b9d6beef421e580e8e78b46ee02ea08db3534c82a8fedc835a9 category: main optional: false - name: aws-sdk-cpp - version: 1.11.267 + version: 1.11.329 manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' - aws-crt-cpp: '>=0.26.8,<0.26.9.0a0' - libcurl: '>=8.7.1,<9.0a0' + aws-crt-cpp: '>=0.26.9,<0.26.10.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.267-h51dfee4_8.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-hba8bd5f_3.conda hash: - md5: 188857656abd6d1a4dcc471c619b0de5 - sha256: 8fb8f648d1ae7d4f2005c130686b569eec998f8fda37d0f24e50fc069428484b + md5: 720494d9f06b4aff1270cffb7acc7920 + sha256: 62867a00265380921e3fea917031906f0e27887019a1083693e28f29c21193c8 category: main optional: false - name: aws-sdk-cpp - version: 1.11.267 + version: 1.11.329 manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' - aws-crt-cpp: '>=0.26.8,<0.26.9.0a0' - libcurl: '>=8.7.1,<9.0a0' + aws-crt-cpp: '>=0.26.9,<0.26.10.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.267-he30cb05_8.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.329-h4d1146e_3.conda hash: - md5: 61e5f105b7beb1d05f971e6800b18a35 - sha256: cf73364b4f5c4c5aa762a12d2abfaaa1ef5fcce960bdadd2093d16d0c18acc70 + md5: ba2b60503e865dac121c72b590491984 + sha256: b5419b778c99327b916df2459cdc98c862c1bf94e56a36550c31c324156bd0f7 category: main optional: false - name: aws-sdk-cpp - version: 1.11.267 + version: 1.11.329 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.17,<0.9.18.0a0' + aws-c-common: '>=0.9.19,<0.9.20.0a0' aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' - aws-crt-cpp: '>=0.26.8,<0.26.9.0a0' - libcurl: '>=8.7.1,<9.0a0' + aws-crt-cpp: '>=0.26.9,<0.26.10.0a0' + libcurl: '>=8.8.0,<9.0a0' libcxx: '>=16' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.267-h108e708_8.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.329-hb37a6d0_3.conda hash: - md5: bd77e7719bc124f92dab0f8c6c682215 - sha256: 7e7c6d017b86287e4d645209a094860559188e59aba1cbe31965348aeb5be921 + md5: 4ff851b78abb8e837837f90c751b5db0 + sha256: fc73df0adaf2b795526bd175773c6bc041d08ba8e0a3490ee39738a7fd4f6a64 category: main optional: false - name: azure-core-cpp @@ -1502,7 +1502,7 @@ package: dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' lz4-c: '>=1.9.3,<1.10.0a0' snappy: '>=1.2.0,<1.3.0a0' zstd: '>=1.5.5,<1.6.0a0' @@ -1519,7 +1519,7 @@ package: dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' lz4-c: '>=1.9.3,<1.10.0a0' snappy: '>=1.2.0,<1.3.0a0' zstd: '>=1.5.5,<1.6.0a0' @@ -1536,7 +1536,7 @@ package: dependencies: __osx: '>=11.0' libcxx: '>=16' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' lz4-c: '>=1.9.3,<1.10.0a0' snappy: '>=1.2.0,<1.3.0a0' zstd: '>=1.5.5,<1.6.0a0' @@ -2215,7 +2215,7 @@ package: libgcc-ng: '>=12' libgfortran-ng: '' libgfortran5: '>=12.3.0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.4.0-hbdc6101_1.conda hash: md5: 0ba5a427a51923dcdfe1121115ac8293 @@ -2232,7 +2232,7 @@ package: libgcc-ng: '>=12' libgfortran-ng: '' libgfortran5: '>=12.3.0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-aarch64/cfitsio-4.4.0-hf28c5f1_1.conda hash: md5: f04132064f0ffe9b19d33c7982b7f20b @@ -2248,7 +2248,7 @@ package: libcurl: '>=8.7.1,<9.0a0' libgfortran: 5.* libgfortran5: '>=13.2.0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/cfitsio-4.4.0-h808cd33_1.conda hash: md5: 9413cd7e8cad79ef5bca73e1ca5a994f @@ -2537,8 +2537,8 @@ package: hash: md5: 6175699c700cc4e4bf18ffc86778e488 sha256: e7d1014296b24d45eab5270e38d281e6342f866f4013a69f01617575f264d237 - category: main - optional: false + category: dev + optional: true - name: colorama version: 0.4.6 manager: conda @@ -2549,8 +2549,8 @@ package: hash: md5: 76a1ec1d93cb2e8260d8d799f0f5e27a sha256: ac617bc5beb4653925170d6c736deab2abf67f37e84a3bba6e9efa5d71133a89 - category: main - optional: false + category: dev + optional: true - name: colorama version: 0.4.6 manager: conda @@ -2561,8 +2561,8 @@ package: hash: md5: 75c91952f4723d42ea9db4120ccba60f sha256: 1bd9c8b0b504463b3125e0e1bcedb6175236e529efdb9315a34a4e1e959d936d - category: main - optional: false + category: dev + optional: true - name: comm version: 0.2.1 manager: conda @@ -3444,17 +3444,17 @@ package: cligj: '>=0.5' gdal: '' libgcc-ng: '>=12' - libgdal: '>=3.8.4,<3.9.0a0' + libgdal: '>=3.8.5,<3.9.0a0' libstdcxx-ng: '>=12' - numpy: '>=1.26.4,<2.0a0' + numpy: '>=1.19,<3' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* shapely: '' six: '' - url: https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.6-py312h66d9856_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.6-py312h39f3bbb_2.conda hash: - md5: a7e2048665753cff7f947af55f2dddb0 - sha256: 8b9f2377852498c97397125847a012a9efe9bca35931ca97f178c0ff190a07a9 + md5: 027c465cb004970543b3641b4a0fef74 + sha256: d8ae1d5bc9f98c145bfd5c8b32f02ad7efee561b0dcdf69620e1a8e9c66d3eca category: main optional: false - name: fiona @@ -3469,17 +3469,17 @@ package: cligj: '>=0.5' gdal: '' libgcc-ng: '>=12' - libgdal: '>=3.8.4,<3.9.0a0' + libgdal: '>=3.8.5,<3.9.0a0' libstdcxx-ng: '>=12' - numpy: '>=1.26.4,<2.0a0' + numpy: '>=1.19,<3' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* shapely: '' six: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/fiona-1.9.6-py312h78df3c0_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/fiona-1.9.6-py312hfb41aa6_2.conda hash: - md5: e50602a492e7e5a6bfd366a132cd3261 - sha256: 5d4fdd81c68e413e95ee293ed14fa0f293836e922854f7af3a26e3af69639487 + md5: 8979b9cd0dcde1ff6e466f9d051e7ae2 + sha256: d5c5a80ffb5e493c1b1640e11df0e25936af02b6fa62979a33847f59df238f71 category: main optional: false - name: fiona @@ -3487,6 +3487,7 @@ package: manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' attrs: '>=19.2.0' certifi: '' click: '>=8.0,<9.dev0' @@ -3494,16 +3495,16 @@ package: cligj: '>=0.5' gdal: '' libcxx: '>=16' - libgdal: '>=3.8.4,<3.9.0a0' - numpy: '>=1.26.4,<2.0a0' + libgdal: '>=3.8.5,<3.9.0a0' + numpy: '>=1.19,<3' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* shapely: '' six: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/fiona-1.9.6-py312hd158ed5_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/fiona-1.9.6-py312h831b459_2.conda hash: - md5: 3e593b499bfe99a1d6460fc8c7ea0d23 - sha256: d6d972e7ce9208c55ae296016d92d596c7b6e5a10025c82d1631af3f331b4913 + md5: b9b2971bb07836eaaab90615c0fa7711 + sha256: 15654c44027326b1dabaa9dac41e4dd30385478af9358c072dfc9aebc1411b64 category: main optional: false - name: fmt @@ -3991,14 +3992,14 @@ package: libgdal: 3.8.5 libstdcxx-ng: '>=12' libxml2: '>=2.12.7,<3.0a0' - numpy: '>=1.26.4,<2.0a0' + numpy: '>=1.19,<3' openssl: '>=3.3.0,<4.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-64/gdal-3.8.5-py312hca78659_6.conda + url: https://conda.anaconda.org/conda-forge/linux-64/gdal-3.8.5-py312h86af8fa_7.conda hash: - md5: 9392203d5f802c4278c53def10f80d69 - sha256: e8329b303f5128d14438d87dfacdb1885fda297b25d5feff8856b529ce0ca0cd + md5: 489da43908a2583ab6a7549747a41e56 + sha256: f271bc459a94b81b512b3a5cc2cadf708117c322beae04456efc8c2f51258d52 category: main optional: false - name: gdal @@ -4011,14 +4012,14 @@ package: libgdal: 3.8.5 libstdcxx-ng: '>=12' libxml2: '>=2.12.7,<3.0a0' - numpy: '>=1.26.4,<2.0a0' + numpy: '>=1.19,<3' openssl: '>=3.3.0,<4.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-aarch64/gdal-3.8.5-py312h3625138_6.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/gdal-3.8.5-py312h0d36065_7.conda hash: - md5: 5f3fb742ceae0446ae7ff55cf68698d6 - sha256: 60a4cab6a5591d7e22cd79e85d455c39bfeb8e7b0a071374f41be3f5b6c5a701 + md5: 18263800f50e59548732ea46d097f85e + sha256: de7b9dfd20ff77c017086c0f4d0833af82462de4d125f871e4a69365c6c6ad29 category: main optional: false - name: gdal @@ -4031,14 +4032,14 @@ package: libcxx: '>=16' libgdal: 3.8.5 libxml2: '>=2.12.7,<3.0a0' - numpy: '>=1.26.4,<2.0a0' + numpy: '>=1.19,<3' openssl: '>=3.3.0,<4.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/gdal-3.8.5-py312h906a9e5_6.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/gdal-3.8.5-py312hf4c14af_7.conda hash: - md5: 210ea79bd7868fdad315d421b02ede6b - sha256: 7658850e749c8a8cd6f5e1ed0146e6b36a15c365316a9657ad24219225509323 + md5: 5ac8c6a4c68f033ee0e21ebafc188434 + sha256: 3410de57b082435626b2e7b19cda00b34d1b4ee22c15137950293381f244ac95 category: main optional: false - name: gdbm @@ -4224,25 +4225,26 @@ package: category: main optional: false - name: geotiff - version: 1.7.1 + version: 1.7.3 manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' libgcc-ng: '>=12' libjpeg-turbo: '>=3.0.0,<4.0a0' libstdcxx-ng: '>=12' libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' proj: '>=9.4.0,<9.4.1.0a0' zlib: '' - url: https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.1-h6cf1f90_16.conda + url: https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.3-h928be8b_0.conda hash: - md5: aadc00cd5e330b5f7fb289446c23ab23 - sha256: 882cf1ef5bb0f176e9bc3da5a9783e11fce467d87ebbe76c0d0aa88bfa06de46 + md5: c0f2468661b7cae54a7a1ff11926e372 + sha256: 6c516f674c0bee8de4990b47c980461f6943beeaced675f67e0ba94fa2115f4c category: main optional: false - name: geotiff - version: 1.7.1 + version: 1.7.3 manager: conda platform: linux-aarch64 dependencies: @@ -4250,30 +4252,31 @@ package: libjpeg-turbo: '>=3.0.0,<4.0a0' libstdcxx-ng: '>=12' libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' proj: '>=9.4.0,<9.4.1.0a0' zlib: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/geotiff-1.7.1-hcdff95e_16.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/geotiff-1.7.3-he2c3a67_0.conda hash: - md5: 68eaa1f95b10287b7ec67aa0d62fb95b - sha256: e8b5c7403b14a950f1493478d67f45ec8ecf4807e013c281dc347f3e664a713c + md5: 2b958fc6128429f4ae9eafac2933d171 + sha256: 286d2feac5a1cdd13507e7eb64ff92f733569487e9a5e94358ce761470fa40ec category: main optional: false - name: geotiff - version: 1.7.1 + version: 1.7.3 manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' libcxx: '>=16' libjpeg-turbo: '>=3.0.0,<4.0a0' libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' proj: '>=9.4.0,<9.4.1.0a0' zlib: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/geotiff-1.7.1-h6e650f3_16.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/geotiff-1.7.3-h9521f69_0.conda hash: - md5: 35c3027edcd4013d1c902b5167150fe4 - sha256: 25ccec6f1666dc94513f6f0932869930929f86c623974d223b5444fc136feae9 + md5: 0d1bc7bfdeee2e2fb9b683a328c4664f + sha256: 3df1801b2dab8c688e0e81b64bf5012a9c92841409216041607b45b768c29104 category: main optional: false - name: giflib @@ -4448,45 +4451,45 @@ package: category: main optional: false - name: griffe - version: 0.45.1 + version: 0.45.2 manager: conda platform: linux-64 dependencies: astunparse: '>=1.6' colorama: '>=0.4' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.45.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.45.2-pyhd8ed1ab_0.conda hash: - md5: a8f62d757614919f73fd3f872b91a022 - sha256: 30ecd1fb574447f5a2d8a09f261ac1387898c5b49df9d4430ce4e47dc6b64a69 + md5: 409a74bc6c127c7a623777547d03d587 + sha256: d1e59d459a6e2d14a77bd327523ac19caa1b03bba732622d603b6cbb70b35d6b category: dev optional: true - name: griffe - version: 0.45.1 + version: 0.45.2 manager: conda platform: linux-aarch64 dependencies: astunparse: '>=1.6' colorama: '>=0.4' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.45.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.45.2-pyhd8ed1ab_0.conda hash: - md5: a8f62d757614919f73fd3f872b91a022 - sha256: 30ecd1fb574447f5a2d8a09f261ac1387898c5b49df9d4430ce4e47dc6b64a69 + md5: 409a74bc6c127c7a623777547d03d587 + sha256: d1e59d459a6e2d14a77bd327523ac19caa1b03bba732622d603b6cbb70b35d6b category: dev optional: true - name: griffe - version: 0.45.1 + version: 0.45.2 manager: conda platform: osx-arm64 dependencies: astunparse: '>=1.6' colorama: '>=0.4' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.45.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.45.2-pyhd8ed1ab_0.conda hash: - md5: a8f62d757614919f73fd3f872b91a022 - sha256: 30ecd1fb574447f5a2d8a09f261ac1387898c5b49df9d4430ce4e47dc6b64a69 + md5: 409a74bc6c127c7a623777547d03d587 + sha256: d1e59d459a6e2d14a77bd327523ac19caa1b03bba732622d603b6cbb70b35d6b category: dev optional: true - name: h11 @@ -4575,17 +4578,17 @@ package: platform: linux-64 dependencies: libaec: '>=1.1.3,<2.0a0' - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libgfortran-ng: '' libgfortran5: '>=12.3.0' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0a0' openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_101.conda + url: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_102.conda hash: - md5: 7e98860d08eea82c8057abd78864fcb4 - sha256: e7d2591bc77d47e9f3fc57d94a817dc9385f4079d930a93475fe45aa2ba81d47 + md5: d8cb3688b92e891e1e5f613517a50ca8 + sha256: fcd864371b32e29557dddd7a9fdc60247586fbf321c06fa63dc287e3572ce99f category: main optional: false - name: hdf5 @@ -4594,17 +4597,17 @@ package: platform: linux-aarch64 dependencies: libaec: '>=1.1.3,<2.0a0' - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libgfortran-ng: '' libgfortran5: '>=12.3.0' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0a0' openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.3-nompi_ha486f32_101.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.3-nompi_hd1676c9_102.conda hash: - md5: da921a3689b1cf107694dd12e24499ee - sha256: 8b0304947bdd18d1798ddc3bd8f59c7fb425367ef1841a7f0cae0e9af957820d + md5: 66ff29661def48cd13a6cdd5691e8b77 + sha256: 3d9a6e36a42f915e5d4227bd86f872e0104a33f495a8e67340945caa0089faa8 category: main optional: false - name: hdf5 @@ -4612,17 +4615,18 @@ package: manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' libaec: '>=1.1.3,<2.0a0' - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libcxx: '>=16' libgfortran: 5.* libgfortran5: '>=13.2.0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0a0' openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.3-nompi_h751145d_101.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.3-nompi_hec07895_102.conda hash: - md5: f5b2b516eb1eabe3897e9fc5f958f4af - sha256: a3dddabbcf7be15cf363b5583c0dcaaeedf688e864894cd0531b716627c7707f + md5: 907a46a97e11629c15ff91c42d1db6d2 + sha256: 7c91f04ba94e8c20b8696d5de74c4b23bdb4a65637d1e9972b4f04212d45da13 category: main optional: false - name: html5lib @@ -5294,42 +5298,42 @@ package: category: main optional: false - name: jinja2 - version: 3.1.3 + version: 3.1.4 manager: conda platform: linux-64 dependencies: markupsafe: '>=2.0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/jinja2-3.1.3-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/jinja2-3.1.4-py312h06a4308_0.conda hash: - md5: 744b2dc3144f19bd648eaaff4c81c243 - sha256: 917380d37c66a7f6d3e2272b4f1311a15967e4b860c483601a060f04cfe1e588 + md5: aee50a77b632c39ab72bffc8017d19be + sha256: 403b776741c3ee53d8a51472e6875963363cfc5999adf1d8521382f21e1e2826 category: main optional: false - name: jinja2 - version: 3.1.3 + version: 3.1.4 manager: conda platform: linux-aarch64 dependencies: markupsafe: '>=2.0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/jinja2-3.1.3-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/jinja2-3.1.4-py312hd43f75c_0.conda hash: - md5: 507f107e1855c34a843d5f7fc7a9d352 - sha256: 9aeffda139786555cd4dc9f04e380b791186e966402c3115dbc68eee0a1ef32d + md5: 98ab0b40d930b3ed0c5d46e586334fda + sha256: ea4b41840317892560c140b89b4e7714c353d62da98cc784b8631ed1b1213ecf category: main optional: false - name: jinja2 - version: 3.1.3 + version: 3.1.4 manager: conda platform: osx-arm64 dependencies: markupsafe: '>=2.0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/jinja2-3.1.3-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/jinja2-3.1.4-py312hca03da5_0.conda hash: - md5: dfa6e58dd70dffc2937315fab073605f - sha256: de67f56da422d07b97859f11bad8ca12482d4a0c50ae5764f113206cc7ba18c4 + md5: 9a17db0423232464b5bb20d09f9ddaf2 + sha256: 251343f83009ee0e222f7463cdd76df616a1cd6dd7625778b1623c611bebcf22 category: main optional: false - name: joblib @@ -5845,7 +5849,7 @@ package: category: main optional: false - name: jupyterlab - version: 4.2.0 + version: 4.2.1 manager: conda platform: linux-64 dependencies: @@ -5865,14 +5869,14 @@ package: tomli: '>=1.2.2' tornado: '>=6.2.0' traitlets: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.0-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.1-pyhd8ed1ab_0.conda hash: - md5: 49af95b55515a65d14f6ea82422c321d - sha256: 0d0b14a5fc77ad76cd34191b888c8a5ce6060e553ed4d413bd2a2cd6651196ba + md5: 3e7290af6190b29c7017d6a8fb0eaeea + sha256: 507f87a6449a7d5d23ad24fcba41aed150770df18ae877a4fdf9da78039f1682 category: main optional: false - name: jupyterlab - version: 4.2.0 + version: 4.2.1 manager: conda platform: linux-aarch64 dependencies: @@ -5892,14 +5896,14 @@ package: tomli: '>=1.2.2' tornado: '>=6.2.0' traitlets: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.0-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.1-pyhd8ed1ab_0.conda hash: - md5: 49af95b55515a65d14f6ea82422c321d - sha256: 0d0b14a5fc77ad76cd34191b888c8a5ce6060e553ed4d413bd2a2cd6651196ba + md5: 3e7290af6190b29c7017d6a8fb0eaeea + sha256: 507f87a6449a7d5d23ad24fcba41aed150770df18ae877a4fdf9da78039f1682 category: main optional: false - name: jupyterlab - version: 4.2.0 + version: 4.2.1 manager: conda platform: osx-arm64 dependencies: @@ -5919,10 +5923,10 @@ package: tomli: '>=1.2.2' tornado: '>=6.2.0' traitlets: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.0-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.1-pyhd8ed1ab_0.conda hash: - md5: 49af95b55515a65d14f6ea82422c321d - sha256: 0d0b14a5fc77ad76cd34191b888c8a5ce6060e553ed4d413bd2a2cd6651196ba + md5: 3e7290af6190b29c7017d6a8fb0eaeea + sha256: 507f87a6449a7d5d23ad24fcba41aed150770df18ae877a4fdf9da78039f1682 category: main optional: false - name: jupyterlab_pygments @@ -5965,7 +5969,7 @@ package: category: main optional: false - name: jupyterlab_server - version: 2.27.1 + version: 2.27.2 manager: conda platform: linux-64 dependencies: @@ -5978,14 +5982,14 @@ package: packaging: '>=21.3' python: '>=3.8' requests: '>=2.31' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.2-pyhd8ed1ab_0.conda hash: - md5: d97923b777ce837cf67e7858ac600834 - sha256: 64d7713782482a28fedd590537ff8edd737a2c736c8384366fb20a83273d233c + md5: d1cb7b113daaadd89e5aa6a32b28bf0d + sha256: d4b9f9f46b3c494d678b4f003d7a2f7ac834dba641bd02332079dde5a9a85c98 category: main optional: false - name: jupyterlab_server - version: 2.27.1 + version: 2.27.2 manager: conda platform: linux-aarch64 dependencies: @@ -5998,14 +6002,14 @@ package: packaging: '>=21.3' python: '>=3.8' requests: '>=2.31' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.2-pyhd8ed1ab_0.conda hash: - md5: d97923b777ce837cf67e7858ac600834 - sha256: 64d7713782482a28fedd590537ff8edd737a2c736c8384366fb20a83273d233c + md5: d1cb7b113daaadd89e5aa6a32b28bf0d + sha256: d4b9f9f46b3c494d678b4f003d7a2f7ac834dba641bd02332079dde5a9a85c98 category: main optional: false - name: jupyterlab_server - version: 2.27.1 + version: 2.27.2 manager: conda platform: osx-arm64 dependencies: @@ -6018,10 +6022,10 @@ package: packaging: '>=21.3' python: '>=3.8' requests: '>=2.31' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.2-pyhd8ed1ab_0.conda hash: - md5: d97923b777ce837cf67e7858ac600834 - sha256: 64d7713782482a28fedd590537ff8edd737a2c736c8384366fb20a83273d233c + md5: d1cb7b113daaadd89e5aa6a32b28bf0d + sha256: d4b9f9f46b3c494d678b4f003d7a2f7ac834dba641bd02332079dde5a9a85c98 category: main optional: false - name: kealib @@ -6032,10 +6036,10 @@ package: hdf5: '>=1.14.3,<1.14.4.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-h2f55d51_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hee9dde6_1.conda hash: - md5: f7e7077802927590efc8bf7328208f12 - sha256: ee0934ff426d3cab015055808bed33eb9d20f635ec14bc421c596f4b70927102 + md5: c5b7b29e2b66107553d0366538257a51 + sha256: d607ddb5906a335cb3665dd81f3adec4af248cf398147693b470b65d887408e7 category: main optional: false - name: kealib @@ -6046,10 +6050,10 @@ package: hdf5: '>=1.14.3,<1.14.4.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/kealib-1.5.3-h4670d8b_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/kealib-1.5.3-h8e54105_1.conda hash: - md5: f1949c81436aab570e9ce976697566bf - sha256: ec7fc04e016ab828f4af334bfa98c44b46dac5147b01fc6e50a5194fcdfbd695 + md5: 1e6ad5c605e5f613b119c1afba688923 + sha256: 5174d4475ddbe6aa97ffdc23c1582ddc3f921bc6f9ee01d8bea7e74b25f4479a category: main optional: false - name: kealib @@ -6057,12 +6061,13 @@ package: manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' hdf5: '>=1.14.3,<1.14.4.0a0' - libcxx: '>=15' - url: https://conda.anaconda.org/conda-forge/osx-arm64/kealib-1.5.3-h210d843_0.conda + libcxx: '>=16' + url: https://conda.anaconda.org/conda-forge/osx-arm64/kealib-1.5.3-h848a2d4_1.conda hash: - md5: 0153b4907333b9005f48d19584e4153e - sha256: f9bae19e49eda17d32b1ca6cabe501e09b00ba10f6d061fc8a14086a8455710e + md5: dafdda3213a216870027af0c76f204c7 + sha256: f17ee2e89bce1923222148956c3b3ab2e859b60f82568a3241593239a8412546 category: main optional: false - name: keyring @@ -6325,12 +6330,12 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_h59595ed_0.conda + libgcc-ng: '>=11.2.0' + libstdcxx-ng: '>=11.2.0' + url: https://repo.anaconda.com/pkgs/main/linux-64/libabseil-20240116.2-cxx17_h6a678d5_0.conda hash: - md5: 682bdbe046a68f749769b492f3625c5c - sha256: 19b789dc38dff64eee2002675991e63f381eedf5efd5c85f2dac512ed97376d7 + md5: 7abc574a536f223fe96be4fb7f4207bf + sha256: 612c10da454d5119c603485d93e15a35b5f7d507d04ec3afcf8a7d308448efca category: main optional: false - name: libabseil @@ -6338,12 +6343,12 @@ package: manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240116.2-cxx17_h2f0025b_0.conda + libgcc-ng: '>=11.2.0' + libstdcxx-ng: '>=11.2.0' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/libabseil-20240116.2-cxx17_h419075a_0.conda hash: - md5: 8c82217c05aa59b86d0db83df2fa65b5 - sha256: 17ff1cb3680121a83b6cefc69bffd3d3c65b4ab321b30fc6f38a84f62ce7ef36 + md5: 554ca15862851da964bfc2b937b0ede1 + sha256: 331163369934b2d0ac2ba44e5e1631ea6b472f5063d1d025ca9438ee4ab33da1 category: main optional: false - name: libabseil @@ -6351,11 +6356,11 @@ package: manager: conda platform: osx-arm64 dependencies: - libcxx: '>=16' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240116.2-cxx17_hebf3989_0.conda + libcxx: '>=14.0.6' + url: https://repo.anaconda.com/pkgs/main/osx-arm64/libabseil-20240116.2-cxx17_h313beb8_0.conda hash: - md5: edc3edb68fd9cbb014ac675dc73006c2 - sha256: d96bd35e162637be3767637352195e6cdfd85d98068564f73f3450b0cb265776 + md5: f76622098b4d740d7c353a0b577bb672 + sha256: f6ad72757addc15c854c6f4e8480ad9a2be85459ec561bf6956a785ea1217d15 category: main optional: false - name: libaec @@ -6397,63 +6402,64 @@ package: category: main optional: false - name: libarchive - version: 3.7.2 + version: 3.7.4 manager: conda platform: linux-64 dependencies: bzip2: '>=1.0.8,<2.0a0' libgcc-ng: '>=12' - libxml2: '>=2.12.2,<3.0.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libxml2: '>=2.12.7,<3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' lz4-c: '>=1.9.3,<1.10.0a0' lzo: '>=2.10,<3.0a0' - openssl: '>=3.2.0,<4.0a0' + openssl: '>=3.3.0,<4.0a0' xz: '>=5.2.6,<6.0a0' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.2-h2aa1ff5_1.conda + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda hash: - md5: 3bf887827d1968275978361a6e405e4f - sha256: 340ed0bb02fe26a2b2e29cedf6559e2999b820f434e745c108e788d629ae4b17 + md5: 32ddb97f897740641d8d46a829ce1704 + sha256: c30970e5e6515c662d00bb74e7c1b09ebe0c8c92c772b952a41a5725e2dcc936 category: main optional: false - name: libarchive - version: 3.7.2 + version: 3.7.4 manager: conda platform: linux-aarch64 dependencies: bzip2: '>=1.0.8,<2.0a0' libgcc-ng: '>=12' - libxml2: '>=2.12.2,<3.0.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libxml2: '>=2.12.7,<3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' lz4-c: '>=1.9.3,<1.10.0a0' lzo: '>=2.10,<3.0a0' - openssl: '>=3.2.0,<4.0a0' + openssl: '>=3.3.0,<4.0a0' xz: '>=5.2.6,<6.0a0' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarchive-3.7.2-hd2f85e0_1.conda + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libarchive-3.7.4-h2c0effa_0.conda hash: - md5: a0f2e7adbcdf4041d6ee273d07ca171e - sha256: 5e58975163f0a76fa5b8dac3a26607037e1a71516dd7a80fb98e74b203450510 + md5: f072f6e4884e984e9d78e1523ecfed32 + sha256: 38da3dc42b58215ce73d722dae0974ad16c6cb580c3bbf00302dfc1f75cfbf6b category: main optional: false - name: libarchive - version: 3.7.2 + version: 3.7.4 manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' bzip2: '>=1.0.8,<2.0a0' libiconv: '>=1.17,<2.0a0' - libxml2: '>=2.12.2,<3.0.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libxml2: '>=2.12.7,<3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' lz4-c: '>=1.9.3,<1.10.0a0' lzo: '>=2.10,<3.0a0' - openssl: '>=3.2.0,<4.0a0' + openssl: '>=3.3.0,<4.0a0' xz: '>=5.2.6,<6.0a0' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.7.2-hcacb583_1.conda + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.7.4-h83d404f_0.conda hash: - md5: 1c8c447ce71bf5f769674b621142a73a - sha256: 307dd9984deccab782a834022a708ba070950d3d0f3b370ce9331ad1db013576 + md5: 8b604ee634caafd92f2ff2fab6a1f75a + sha256: 5301d7dc52c2e1f87b229606033c475caf87cd94ef5a5efb3af565a62b88127e category: main optional: false - name: libbrotlicommon @@ -6606,7 +6612,7 @@ package: category: main optional: false - name: libcurl - version: 8.7.1 + version: 8.8.0 manager: conda platform: linux-64 dependencies: @@ -6614,17 +6620,17 @@ package: libgcc-ng: '>=12' libnghttp2: '>=1.58.0,<2.0a0' libssh2: '>=1.11.0,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' - openssl: '>=3.2.1,<4.0a0' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda + libzlib: '>=1.2.13,<2.0.0a0' + openssl: '>=3.3.0,<4.0a0' + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda hash: - md5: 755c7f876815003337d2c61ff5d047e5 - sha256: 82a75e9a5d9ee5b2f487d850ec5d4edc18a56eb9527608a95a916c40baae3843 + md5: f21c27f076a07907e70c49bb57bd0f20 + sha256: 45aec0ffc6fe3fd4c0083b815aa102b8103380acc2b6714fb272d921acc68ab2 category: main optional: false - name: libcurl - version: 8.7.1 + version: 8.8.0 manager: conda platform: linux-aarch64 dependencies: @@ -6632,30 +6638,30 @@ package: libgcc-ng: '>=12' libnghttp2: '>=1.58.0,<2.0a0' libssh2: '>=1.11.0,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' - openssl: '>=3.2.1,<4.0a0' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.7.1-h4e8248e_0.conda + libzlib: '>=1.2.13,<2.0.0a0' + openssl: '>=3.3.0,<4.0a0' + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.8.0-h4e8248e_0.conda hash: - md5: 4e38af63e8603414534bbebdd9885021 - sha256: 2e2c716875ee48947e4e7a56823c810b5a3d98013ae44d0b55cdfd337f77d693 + md5: 75bfffa16b18674b16144780a46ac77f + sha256: 5a47624e64f7216ed2631d936755bc1d5ea09e45d7632b564083b7449baf3787 category: main optional: false - name: libcurl - version: 8.7.1 + version: 8.8.0 manager: conda platform: osx-arm64 dependencies: krb5: '>=1.21.2,<1.22.0a0' libnghttp2: '>=1.58.0,<2.0a0' libssh2: '>=1.11.0,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' - openssl: '>=3.2.1,<4.0a0' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.7.1-h2d989ff_0.conda + libzlib: '>=1.2.13,<2.0.0a0' + openssl: '>=3.3.0,<4.0a0' + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.8.0-h7b6f9a7_0.conda hash: - md5: 34b9171710f0d9bf093d55bdc36ff355 - sha256: 973ac9368efca712a8fd19fe68524d7d9a3087fd88ad6b7fcdf60c3d2e19a498 + md5: 245b30f99dc5379ebe1c78899be8d3f5 + sha256: b83aa249e7c8abc1aa56593ad50d1b4c0a52f5f3d5fd7c489c2ccfc3a548f391 category: main optional: false - name: libcxx @@ -6911,7 +6917,7 @@ package: libuuid: '>=2.38.1,<3.0a0' libwebp-base: '>=1.4.0,<2.0a0' libxml2: '>=2.12.7,<3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' lz4-c: '>=1.9.3,<1.10.0a0' openjpeg: '>=2.5.2,<3.0a0' openssl: '>=3.3.0,<4.0a0' @@ -6923,10 +6929,10 @@ package: xerces-c: '>=3.2.5,<3.3.0a0' xz: '>=5.2.6,<6.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.8.5-h77540a9_6.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.8.5-h77540a9_7.conda hash: - md5: 754deaaecc6d717f443e6b1ebb66f075 - sha256: 174342d4d0daf1928e3f7160fc7c8049776b5f1d705f97bd0d52096899cf6d8e + md5: 5937eafdfa5713c78a21cbb33a84539e + sha256: fbfe96e76cd8730d7b60b270e539181c1e12df312e9e08b0217154b7a8838f0c category: main optional: false - name: libgdal @@ -6964,7 +6970,7 @@ package: libuuid: '>=2.38.1,<3.0a0' libwebp-base: '>=1.4.0,<2.0a0' libxml2: '>=2.12.7,<3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' lz4-c: '>=1.9.3,<1.10.0a0' openjpeg: '>=2.5.2,<3.0a0' openssl: '>=3.3.0,<4.0a0' @@ -6976,10 +6982,10 @@ package: xerces-c: '>=3.2.5,<3.3.0a0' xz: '>=5.2.6,<6.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgdal-3.8.5-h3e254f6_6.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgdal-3.8.5-h3e254f6_7.conda hash: - md5: 544fe4b9226885074a8eff0f6a5a4725 - sha256: b03de6787c4732e0ead8dd410e0212b3078da53ce7d96ca0d08cdf9f3971dcce + md5: b62f422055f6f941cb36522781417f13 + sha256: 0a6337687303be3cfc6a9300b6bac9ff34773976419bd20e9cd9dbebec33d480 category: main optional: false - name: libgdal @@ -7016,7 +7022,7 @@ package: libtiff: '>=4.6.0,<4.7.0a0' libwebp-base: '>=1.4.0,<2.0a0' libxml2: '>=2.12.7,<3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' lz4-c: '>=1.9.3,<1.10.0a0' openjpeg: '>=2.5.2,<3.0a0' openssl: '>=3.3.0,<4.0a0' @@ -7028,10 +7034,10 @@ package: xerces-c: '>=3.2.5,<3.3.0a0' xz: '>=5.2.6,<6.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-3.8.5-hb08d262_6.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-3.8.5-hb08d262_7.conda hash: - md5: 11599fe25f746c7b2ddc979eb30705df - sha256: 7a32dc0e522e6511cb78d15551cc5fe4d158c07651190b6b80238e7f83a3c556 + md5: 2533c6279bb9e14a5f5b7315a191a91f + sha256: c99c1dd8b9c4ebbec3a1deb0785e601028900ed297b0f3cf6a84ec52b01bc150 category: main optional: false - name: libgfortran @@ -7114,7 +7120,7 @@ package: libffi: '>=3.4,<4.0a0' libgcc-ng: '>=12' libiconv: '>=1.17,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' pcre2: '>=10.43,<10.44.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda hash: @@ -7130,7 +7136,7 @@ package: libffi: '>=3.4,<4.0a0' libgcc-ng: '>=12' libiconv: '>=1.17,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' pcre2: '>=10.43,<10.44.0a0' url: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.80.2-h34bac0b_0.conda hash: @@ -7147,7 +7153,7 @@ package: libffi: '>=3.4,<4.0a0' libiconv: '>=1.17,<2.0a0' libintl: '>=0.22.5,<1.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' pcre2: '>=10.43,<10.44.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.2-h535f939_0.conda hash: @@ -7179,60 +7185,61 @@ package: category: main optional: false - name: libgoogle-cloud - version: 2.23.0 + version: 2.24.0 manager: conda platform: linux-64 dependencies: - libabseil: '>=20240116.1,<20240117.0a0' + libabseil: '>=20240116.2,<20240117.0a0' libcurl: '>=8.7.1,<9.0a0' libgcc-ng: '>=12' libgrpc: '>=1.62.2,<1.63.0a0' libprotobuf: '>=4.25.3,<4.25.4.0a0' libstdcxx-ng: '>=12' - openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.23.0-h9be4e54_1.conda + openssl: '>=3.3.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.24.0-h2736e30_0.conda hash: - md5: 1042d8401bb268553f98e60120cdeb40 - sha256: 680f5a9bc45aa905d9da086b16551438553649e05dd6b94b02b379b050602d5e + md5: 34aeee3fa7fca5dc21fad3ac6f4f0ab2 + sha256: 324ae4d0ad4fbd350b14ebcc8880f7dc4d8ab3952eadaa79dea96373cd254a0d category: main optional: false - name: libgoogle-cloud - version: 2.23.0 + version: 2.24.0 manager: conda platform: linux-aarch64 dependencies: - libabseil: '>=20240116.1,<20240117.0a0' + libabseil: '>=20240116.2,<20240117.0a0' libcurl: '>=8.7.1,<9.0a0' libgcc-ng: '>=12' libgrpc: '>=1.62.2,<1.63.0a0' libprotobuf: '>=4.25.3,<4.25.4.0a0' libstdcxx-ng: '>=12' - openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.23.0-hd739bbb_1.conda + openssl: '>=3.3.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.24.0-hc02380a_0.conda hash: - md5: 28b087119988d9cb764fab2384389018 - sha256: 4c3b15e81fe86819829357db217e5987658f7128dd67736214d1d310b2332066 + md5: bb6c28f9c036faeb1217e2a6c40d2dc7 + sha256: 3adb745616619ff322670e9252085b1e44817d149d70c92a263f36122a74d587 category: main optional: false - name: libgoogle-cloud - version: 2.23.0 + version: 2.24.0 manager: conda platform: osx-arm64 dependencies: - libabseil: '>=20240116.1,<20240117.0a0' + __osx: '>=11.0' + libabseil: '>=20240116.2,<20240117.0a0' libcurl: '>=8.7.1,<9.0a0' libcxx: '>=16' libgrpc: '>=1.62.2,<1.63.0a0' libprotobuf: '>=4.25.3,<4.25.4.0a0' - openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.23.0-hbebe991_1.conda + openssl: '>=3.3.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.24.0-hfe08963_0.conda hash: - md5: fdbdbd1dc8e8ba458057be0a00db8ab1 - sha256: db7c0dcebafc001ff9fe0ba618ed611721217b4ceefeef189ab79ef111056c02 + md5: 86e190704e0f94314d232632383c1d6c + sha256: 9c116fb902cacfc4cd8a4686fb1ed5525b7ea2a01371b8cd20d52fa202f75680 category: main optional: false - name: libgoogle-cloud-storage - version: 2.23.0 + version: 2.24.0 manager: conda platform: linux-64 dependencies: @@ -7240,18 +7247,18 @@ package: libcrc32c: '>=1.1.2,<1.2.0a0' libcurl: '' libgcc-ng: '>=12' - libgoogle-cloud: 2.23.0 + libgoogle-cloud: 2.24.0 libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '' - url: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.23.0-hc7a4891_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.24.0-h3d9a0c8_0.conda hash: - md5: ee99fb9107ffb579b58ee92a5fb14b06 - sha256: b85ce8b78e9262670a145a1639e253708e2a9eb9100d60ccec16f8e41d87a4bb + md5: a731371833a7b1ab3a87be0fe7e6235a + sha256: 6fb9272759da37a203d996397757d4f44c47eab90fa6432c58ebdb92a459b9e1 category: main optional: false - name: libgoogle-cloud-storage - version: 2.23.0 + version: 2.24.0 manager: conda platform: linux-aarch64 dependencies: @@ -7259,32 +7266,33 @@ package: libcrc32c: '>=1.1.2,<1.2.0a0' libcurl: '' libgcc-ng: '>=12' - libgoogle-cloud: 2.23.0 + libgoogle-cloud: 2.24.0 libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.23.0-hdb39181_1.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.24.0-haca2cfa_0.conda hash: - md5: 0cdda7751432e9ec4255e19becdac10d - sha256: 977dc600e6958b3c88a278567f279c46eb596cbaac284705bdeec8d7f7e24c39 + md5: 18c690b4967f955d4dca04e09f692d86 + sha256: 61402586bd7f2ae446baf70439541f2fd67787a9b3bc060e13130c135e998dc4 category: main optional: false - name: libgoogle-cloud-storage - version: 2.23.0 + version: 2.24.0 manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' libabseil: '' libcrc32c: '>=1.1.2,<1.2.0a0' libcurl: '' libcxx: '>=16' - libgoogle-cloud: 2.23.0 - libzlib: '>=1.2.13,<1.3.0a0' + libgoogle-cloud: 2.24.0 + libzlib: '>=1.2.13,<2.0.0a0' openssl: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.23.0-h8a76758_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.24.0-h3fa5b87_0.conda hash: - md5: 356c74978867e07e12a939a092dcf30d - sha256: 3173b65b7e36e9fa0e6ddec69f39e4dd0e7ada38dbf2c1be006fddc2e7257b0c + md5: 46def62d7a52852d120d77a0d70f76b2 + sha256: 0526b9f9b9fba41afad322ac2b2d511b2eae1e213751ed7845ff97b9fd1f245f category: main optional: false - name: libgrpc @@ -7298,7 +7306,7 @@ package: libprotobuf: '>=4.25.3,<4.25.4.0a0' libre2-11: '>=2023.9.1,<2024.0a0' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.2.1,<4.0a0' re2: '' url: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda @@ -7318,7 +7326,7 @@ package: libprotobuf: '>=4.25.3,<4.25.4.0a0' libre2-11: '>=2023.9.1,<2024.0a0' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.2.1,<4.0a0' re2: '' url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.62.2-h98a9317_0.conda @@ -7337,7 +7345,7 @@ package: libcxx: '>=16' libprotobuf: '>=4.25.3,<4.25.4.0a0' libre2-11: '>=2023.9.1,<2024.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.2.1,<4.0a0' re2: '' url: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.62.2-h9c18a4f_0.conda @@ -7754,14 +7762,14 @@ package: manager: conda platform: linux-64 dependencies: - libabseil: '>=20240116.1,<20240117.0a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda + libabseil: '>=20240116.2,<20240116.3.0a0' + libgcc-ng: '>=11.2.0' + libstdcxx-ng: '>=11.2.0' + zlib: '>=1.2.13,<1.3.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-64/libprotobuf-4.25.3-he621ea3_0.conda hash: - md5: 6945825cebd2aeb16af4c69d97c32c13 - sha256: 70e0eef046033af2e8d21251a785563ad738ed5281c74e21c31c457780845dcd + md5: b5bac9ee75a731feb80bfc8c40d1958f + sha256: faf9d9816acb4f1f4646106fd5b21270f1d34631111a495c870966dbd9472e89 category: main optional: false - name: libprotobuf @@ -7769,14 +7777,14 @@ package: manager: conda platform: linux-aarch64 dependencies: - libabseil: '>=20240116.1,<20240117.0a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-4.25.3-h648ac29_0.conda + libabseil: '>=20240116.2,<20240116.3.0a0' + libgcc-ng: '>=11.2.0' + libstdcxx-ng: '>=11.2.0' + zlib: '>=1.2.13,<1.3.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/libprotobuf-4.25.3-h94b7715_0.conda hash: - md5: a239d63913ec9e008bdbe35899f677f4 - sha256: 76775a1457b2d4de1097bec2fda16b8e6e80f761d11aa7a525fa215bff4ab87c + md5: 4d762ab8f491349fa5016ce9aca52d00 + sha256: 5d57467b328ae326209f28d1f435678bdcfc68d8a28aa23760654046c135ff9e category: main optional: false - name: libprotobuf @@ -7784,13 +7792,13 @@ package: manager: conda platform: osx-arm64 dependencies: - libabseil: '>=20240116.1,<20240117.0a0' - libcxx: '>=16' - libzlib: '>=1.2.13,<1.3.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-4.25.3-hbfab5d5_0.conda + libabseil: '>=20240116.2,<20240116.3.0a0' + libcxx: '>=14.0.6' + zlib: '>=1.2.13,<1.3.0a0' + url: https://repo.anaconda.com/pkgs/main/osx-arm64/libprotobuf-4.25.3-h514c7bf_0.conda hash: - md5: 5f70b2b945a9741cba7e6dfe735a02a7 - sha256: d754519abc3ddbdedab2a38d0639170f5347c1573eef80c707f3a8dc5dff706a + md5: 76a4b8a344012a9facc05512742ef39f + sha256: 4ccd32643dd576f42b4f45e8b10b7aec5cb012d210309117cd8ff09c43a54616 category: main optional: false - name: libre2-11 @@ -7958,17 +7966,17 @@ package: geos: '>=3.12.1,<3.12.2.0a0' libgcc-ng: '>=12' librttopo: '>=1.1.0,<1.2.0a0' - libsqlite: '>=3.45.2,<4.0a0' + libsqlite: '>=3.45.3,<4.0a0' libstdcxx-ng: '>=12' - libxml2: '>=2.12.6,<3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libxml2: '>=2.12.7,<3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' proj: '>=9.4.0,<9.4.1.0a0' sqlite: '' zlib: '' - url: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h6f065fc_5.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h5539517_6.conda hash: - md5: f2e2bdd5fd10493a525503b2f40c59eb - sha256: 4181564a6e7bc0fa854cf8f2ed55e25c166c52da501dd21b39cf5c7567e999cb + md5: 1ee26233875c04444bdb2e5a838b5634 + sha256: b7fb427a35891b750d8b891735c16f813bfc4f8642367acb4b169a36c9c75923 category: main optional: false - name: libspatialite @@ -7980,17 +7988,17 @@ package: geos: '>=3.12.1,<3.12.2.0a0' libgcc-ng: '>=12' librttopo: '>=1.1.0,<1.2.0a0' - libsqlite: '>=3.45.2,<4.0a0' + libsqlite: '>=3.45.3,<4.0a0' libstdcxx-ng: '>=12' - libxml2: '>=2.12.6,<3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libxml2: '>=2.12.7,<3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' proj: '>=9.4.0,<9.4.1.0a0' sqlite: '' zlib: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libspatialite-5.1.0-h767e56b_5.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libspatialite-5.1.0-h171d06b_6.conda hash: - md5: 616e7cbb7ef3b4fa5c8b2d878849e447 - sha256: 93dcdd6edc894a273b100005d5ef82b74bf8957a3ec291f3f18a74df6dbb7a33 + md5: 4387eef76c3f34f4fd5ea5bc150e71b0 + sha256: 554938e68cd59465af10b97f90a7461a90c4ab6c4ea90be0cf35ed4e1cb81932 category: main optional: false - name: libspatialite @@ -7998,21 +8006,22 @@ package: manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' freexl: '>=2.0.0,<3.0a0' geos: '>=3.12.1,<3.12.2.0a0' libcxx: '>=16' libiconv: '>=1.17,<2.0a0' librttopo: '>=1.1.0,<1.2.0a0' - libsqlite: '>=3.45.2,<4.0a0' - libxml2: '>=2.12.6,<3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libsqlite: '>=3.45.3,<4.0a0' + libxml2: '>=2.12.7,<3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' proj: '>=9.4.0,<9.4.1.0a0' sqlite: '' zlib: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libspatialite-5.1.0-h77c30ab_5.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libspatialite-5.1.0-h0c1f73d_6.conda hash: - md5: 1c5b04aaa5671563942915305749b5a1 - sha256: c0ea0744629435bbbd20d782be44adedbd1b41a7515e488c3eb4db2ff8b4c934 + md5: 545c929e5f6b29a5e47481f0435db889 + sha256: f3f18e03ded7d21904a5c0b920cd0c746f724ecf4c353dd0e835d4f98433c65a category: main optional: false - name: libsqlite @@ -8021,7 +8030,7 @@ package: platform: linux-64 dependencies: libgcc-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda hash: md5: b3316cbe90249da4f8e84cd66e1cc55b @@ -8034,7 +8043,7 @@ package: platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.45.3-h194ca79_0.conda hash: md5: fb35b8afbe9e92467ac7b5608d60b775 @@ -8046,7 +8055,7 @@ package: manager: conda platform: osx-arm64 dependencies: - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda hash: md5: c8c1186c7f3351f6ffddb97b1f54fc58 @@ -8127,7 +8136,7 @@ package: libjpeg-turbo: '>=3.0.0,<4.0a0' libstdcxx-ng: '>=12' libwebp-base: '>=1.3.2,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' xz: '>=5.2.6,<6.0a0' zstd: '>=1.5.5,<1.6.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda @@ -8147,7 +8156,7 @@ package: libjpeg-turbo: '>=3.0.0,<4.0a0' libstdcxx-ng: '>=12' libwebp-base: '>=1.3.2,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' xz: '>=5.2.6,<6.0a0' zstd: '>=1.5.5,<1.6.0a0' url: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.6.0-hf980d43_3.conda @@ -8166,7 +8175,7 @@ package: libdeflate: '>=1.20,<1.21.0a0' libjpeg-turbo: '>=3.0.0,<4.0a0' libwebp-base: '>=1.3.2,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' xz: '>=5.2.6,<6.0a0' zstd: '>=1.5.5,<1.6.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.6.0-h07db509_3.conda @@ -8304,7 +8313,7 @@ package: icu: '>=73.2,<74.0a0' libgcc-ng: '>=12' libiconv: '>=1.17,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' xz: '>=5.2.6,<6.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda hash: @@ -8320,7 +8329,7 @@ package: icu: '>=73.2,<74.0a0' libgcc-ng: '>=12' libiconv: '>=1.17,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' xz: '>=5.2.6,<6.0a0' url: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.7-h49dc7a2_0.conda hash: @@ -8336,7 +8345,7 @@ package: __osx: '>=11.0' icu: '>=73.2,<74.0a0' libiconv: '>=1.17,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' xz: '>=5.2.6,<6.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-ha661575_0.conda hash: @@ -8394,10 +8403,10 @@ package: platform: linux-64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda hash: - md5: f36c115f1ee199da648e0597ec2047ad - sha256: 370c7c5893b737596fd6ca0d9190c9715d89d888b8c88537ae1ef168c25e82e4 + md5: 27329162c0dc732bcf67a4e0cd488125 + sha256: 8ced4afed6322172182af503f21725d072a589a6eb918f8a58135c1e00d35980 category: main optional: false - name: libzlib @@ -8406,21 +8415,22 @@ package: platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.2.13-h31becfc_5.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.2.13-h68df207_6.conda hash: - md5: b213aa87eea9491ef7b129179322e955 - sha256: aeeefbb61e5e8227e53566d5e42dbb49e120eb99109996bf0dbfde8f180747a7 + md5: d69c6550eaf76e8e385f75e5ed60aed9 + sha256: 4dafc31c913daae67d20a95fc2cac5a6d8bf1d5810d663e23b3335f9ae6f411d category: main optional: false - name: libzlib version: 1.2.13 manager: conda platform: osx-arm64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda + dependencies: + __osx: '>=11.0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-hfb2fe0b_6.conda hash: - md5: 1a47f5236db2e06a320ffa0392f81bd8 - sha256: ab1c8aefa2d54322a63aaeeefe9cf877411851738616c4068e0dccc66b9c758a + md5: 9c4e121cd926cab631bd1c4a61d18b17 + sha256: 8b29a2386d99b8f58178951dcf19117b532cd9c4aa07623bf1667eae99755d32 category: main optional: false - name: llvm-openmp @@ -9208,7 +9218,7 @@ package: hdf5: '>=1.14.3,<1.14.4.0a0' libgcc-ng: '>=12' libnetcdf: '>=4.9.2,<4.9.3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' numpy: '>=1.19,<3' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* @@ -9229,7 +9239,7 @@ package: hdf5: '>=1.14.3,<1.14.4.0a0' libgcc-ng: '>=12' libnetcdf: '>=4.9.2,<4.9.3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' numpy: '>=1.19,<3' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* @@ -9250,7 +9260,7 @@ package: cftime: '' hdf5: '>=1.14.3,<1.14.4.0a0' libnetcdf: '>=4.9.2,<4.9.3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' numpy: '>=1.19,<3' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* @@ -9422,7 +9432,7 @@ package: libgcc-ng: '>=12' libsqlite: '>=3.45.3,<4.0a0' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' nspr: '>=4.35,<5.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda hash: @@ -9438,7 +9448,7 @@ package: libgcc-ng: '>=12' libsqlite: '>=3.45.3,<4.0a0' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' nspr: '>=4.35,<5.0a0' url: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.100-h8c4e863_0.conda hash: @@ -9454,7 +9464,7 @@ package: __osx: '>=11.0' libcxx: '>=16' libsqlite: '>=3.45.3,<4.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' nspr: '>=4.35,<5.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.100-hc6e9f88_0.conda hash: @@ -9700,10 +9710,10 @@ package: dependencies: ca-certificates: '' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda hash: - md5: c0f3abb4a16477208bbd43a39bd56f18 - sha256: fdbf05e4db88c592366c90bb82e446edbe33c6e49e5130d51c580b2629c0b5d5 + md5: 12ea6d0d4ed54530eaed18e4835c1f7c + sha256: 33dcea0ed3a61b2de6b66661cdd55278640eb99d676cd129fbff3e53641fa125 category: main optional: false - name: openssl @@ -9713,10 +9723,10 @@ package: dependencies: ca-certificates: '' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.0-h31becfc_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.0-h68df207_3.conda hash: - md5: 36ca60a3afaf2ea2c460daeebd67430e - sha256: 5aee0fc6e07ec60e01023a8d3e034773534bfd1df1a8dd83f446da03ae98b333 + md5: f2dec4814ac9649cd3d3e474cd0b9a58 + sha256: f9e595c35fe111aca838233b5d553cac61f9041c445b770458749ddd995e32a4 category: main optional: false - name: openssl @@ -9724,11 +9734,12 @@ package: manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' ca-certificates: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-hfb2fe0b_3.conda hash: - md5: 25b0e522c3131886a637e347b2ca0c0f - sha256: 51f9be8fe929c2bb3243cd0707b6dfcec27541f8284b4bd9b063c288fc46f482 + md5: 730f618b008b3c13c1e3f973408ddd67 + sha256: 6f41c163ab57e7499dff092be4498614651f0f6432e12c2b9f06859a8bc39b75 category: main optional: false - name: overrides @@ -9899,39 +9910,39 @@ package: category: main optional: false - name: parallel - version: '20240322' + version: '20240522' manager: conda platform: linux-64 dependencies: perl: '' - url: https://conda.anaconda.org/conda-forge/linux-64/parallel-20240322-ha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/parallel-20240522-ha770c72_0.conda hash: - md5: 5ad3f5eb0086ae5ca3cf926c0773b844 - sha256: d3226bc90bb52cd89bb057a8aa574208db1865b6207b35e543a73da1fea4e5ef + md5: 95444bc23d494d0b06405bea54c7cd1f + sha256: 853a34145a584b216871b7eca3c23933d4ce76ae6d38eeca75a99f234aceba38 category: main optional: false - name: parallel - version: '20240322' + version: '20240522' manager: conda platform: linux-aarch64 dependencies: perl: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/parallel-20240322-h8af1aa0_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/parallel-20240522-h8af1aa0_0.conda hash: - md5: 7671e6f40d9d110ba3c5bb9d73f7f8a4 - sha256: a817a0b6f6a04e862c32ddd94401d4ef2272f8a6d05071b9edef3cb752d0b017 + md5: 91d3aff938f0d0ecc768fec2b1bfdfc3 + sha256: 59496282c2e76ee467fd3002dd2e8d02482ea357b99ec7e35141a6ddcad3e524 category: main optional: false - name: parallel - version: '20240322' + version: '20240522' manager: conda platform: osx-arm64 dependencies: perl: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/parallel-20240322-hce30654_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/parallel-20240522-hce30654_0.conda hash: - md5: 9363ae9a6dd212575f8a9f9b16d19d5b - sha256: a02f0c8ba85b9ec0e9f292519614ee64b24348a8eec0127f917cc27865428eee + md5: f3f54087f73541d64f2565ddaad0f4bd + sha256: 64726a8ea0dcd5de7e3e5879abf1b066c43d85fd7c9e587ad888da9eeafdc7c0 category: main optional: false - name: parso @@ -10232,7 +10243,7 @@ package: libtiff: '>=4.6.0,<4.7.0a0' libwebp-base: '>=1.3.2,<2.0a0' libxcb: '>=1.15,<1.16.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openjpeg: '>=2.5.2,<3.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* @@ -10255,7 +10266,7 @@ package: libtiff: '>=4.6.0,<4.7.0a0' libwebp-base: '>=1.3.2,<2.0a0' libxcb: '>=1.15,<1.16.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openjpeg: '>=2.5.2,<3.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* @@ -10277,7 +10288,7 @@ package: libtiff: '>=4.6.0,<4.7.0a0' libwebp-base: '>=1.3.2,<2.0a0' libxcb: '>=1.15,<1.16.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openjpeg: '>=2.5.2,<3.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* @@ -10494,7 +10505,7 @@ package: libpng: '>=1.6.43,<1.7.0a0' libstdcxx-ng: '>=12' libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' nspr: '>=4.35,<5.0a0' nss: '>=3.98,<4.0a0' openjpeg: '>=2.5.2,<3.0a0' @@ -10523,7 +10534,7 @@ package: libpng: '>=1.6.43,<1.7.0a0' libstdcxx-ng: '>=12' libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' nspr: '>=4.35,<5.0a0' nss: '>=3.98,<4.0a0' openjpeg: '>=2.5.2,<3.0a0' @@ -10552,7 +10563,7 @@ package: libjpeg-turbo: '>=3.0.0,<4.0a0' libpng: '>=1.6.43,<1.7.0a0' libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' nspr: '>=4.35,<5.0a0' nss: '>=3.98,<4.0a0' openjpeg: '>=2.5.2,<3.0a0' @@ -10605,7 +10616,7 @@ package: libgcc-ng: '>=12' libpq: '16.3' libxml2: '>=2.12.6,<3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.3.0,<4.0a0' readline: '>=8.2,<9.0a0' tzcode: '' @@ -10625,7 +10636,7 @@ package: libgcc-ng: '>=12' libpq: '16.3' libxml2: '>=2.12.6,<3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.3.0,<4.0a0' readline: '>=8.2,<9.0a0' tzcode: '' @@ -10645,7 +10656,7 @@ package: krb5: '>=1.21.2,<1.22.0a0' libpq: '16.3' libxml2: '>=2.12.6,<3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.3.0,<4.0a0' readline: '>=8.2,<9.0a0' tzcode: '' @@ -11601,7 +11612,7 @@ package: libsqlite: '>=3.45.2,<4.0a0' libuuid: '>=2.38.1,<3.0a0' libxcrypt: '>=4.4.36' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' ncurses: '>=6.4.20240210,<7.0a0' openssl: '>=3.2.1,<4.0a0' readline: '>=8.2,<9.0a0' @@ -11628,7 +11639,7 @@ package: libsqlite: '>=3.45.2,<4.0a0' libuuid: '>=2.38.1,<3.0a0' libxcrypt: '>=4.4.36' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' ncurses: '>=6.4.20240210,<7.0a0' openssl: '>=3.2.1,<4.0a0' readline: '>=8.2,<9.0a0' @@ -11651,7 +11662,7 @@ package: libexpat: '>=2.6.2,<3.0a0' libffi: '>=3.4,<4.0a0' libsqlite: '>=3.45.2,<4.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' ncurses: '>=6.4.20240210,<7.0a0' openssl: '>=3.2.1,<4.0a0' readline: '>=8.2,<9.0a0' @@ -11671,10 +11682,10 @@ package: dependencies: python: '>=3.12,<3.13.0a0' six: '>=1.5' - url: https://repo.anaconda.com/pkgs/main/linux-64/python-dateutil-2.9.0post0-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/python-dateutil-2.9.0post0-py312h06a4308_2.conda hash: - md5: b5fa4f861d9af1401d91684e34519b33 - sha256: 1d6abbf5dd3d8aca0934ff2243ae38ba85e2abea77e87b222ec33030bee40991 + md5: 06c8706a892aaaae74325c0b46c86d01 + sha256: 7dcdba7369ce62f60853efd295fd1e4cbd6adb8b0b8501d6e64f511409a667c8 category: main optional: false - name: python-dateutil @@ -11684,10 +11695,10 @@ package: dependencies: python: '>=3.12,<3.13.0a0' six: '>=1.5' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/python-dateutil-2.9.0post0-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/python-dateutil-2.9.0post0-py312hd43f75c_2.conda hash: - md5: bd0ae87341a7ce53a04a641bb14130ea - sha256: 1c5acfd0315383e99668bcf96123bd04ed0ed8a06578b4a2728b1b4f26490980 + md5: 26432c59f7b4f25981ad627587b5fb74 + sha256: 97a743ddfde3745ee6eb3d588ef8b2f42b1e5e13ba498b64ac8cfa664b508576 category: main optional: false - name: python-dateutil @@ -11697,10 +11708,10 @@ package: dependencies: python: '>=3.12,<3.13.0a0' six: '>=1.5' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/python-dateutil-2.9.0post0-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/python-dateutil-2.9.0post0-py312hca03da5_2.conda hash: - md5: 21267fa13ab250b7309704e63cb15b7d - sha256: fdea042fbfbf66e6133ee0d4480d03e392ae75db1c925a0999d87218d5f19e57 + md5: 376e2d47392baa32ad2fff33701178e3 + sha256: 63ad4542511a80cf687c70f376ea89f4537e1cd450d8a3c5ed98d0fdcb78845b category: main optional: false - name: python-dotenv @@ -12129,10 +12140,10 @@ package: python_abi: 3.12.* setuptools: '>=0.9.8' snuggs: '>=1.4.1' - url: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.10-py312h061f55c_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.10-py312h2447d21_1.conda hash: - md5: afd2b09fc7b507cb7b8b8c38d404656b - sha256: 1f7ec9568a77fe49b82ab64a27da81bd04c719bee8ade8f81bfd89ac26597010 + md5: e3b23e993698c5afd6ee57e009cabf4c + sha256: 57949cd80a28489f35e56cee4ebd9a087e37241ae2f77ecca778d1ef52020ac3 category: main optional: false - name: rasterio @@ -12155,10 +12166,10 @@ package: python_abi: 3.12.* setuptools: '>=0.9.8' snuggs: '>=1.4.1' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/rasterio-1.3.10-py312h3700511_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/rasterio-1.3.10-py312h38e2d64_1.conda hash: - md5: d1973b76c92c9587043ce139c5f2fda4 - sha256: ce6e85b13b627726fc0a35bdd588fffae04325f18372d603aab6f00a61c6e4ef + md5: e2c87fb273aa470f08bb472e8f7140c8 + sha256: 387fcac82e6e2141c8747cef667fd0b9b901ee492081af7b1a4c9447c077b0f1 category: main optional: false - name: rasterio @@ -12166,6 +12177,7 @@ package: manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' affine: '' attrs: '' certifi: '' @@ -12180,10 +12192,10 @@ package: python_abi: 3.12.* setuptools: '>=0.9.8' snuggs: '>=1.4.1' - url: https://conda.anaconda.org/conda-forge/osx-arm64/rasterio-1.3.10-py312h5803006_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/rasterio-1.3.10-py312h7fdb319_1.conda hash: - md5: 88e9578b1b358e0ad8aa4ff736caaf08 - sha256: 13f7e32a02f983956ddb1766338ad55cd257f6552a8892beddf143793d6a36ae + md5: ef433a506198d601478974fd80f64a72 + sha256: ba406b00a0272f585bb5aeeb0ccaa39392b0be2601aa12603c0195e0d896a9fd category: main optional: false - name: re2 @@ -12303,7 +12315,7 @@ package: category: main optional: false - name: requests - version: 2.31.0 + version: 2.32.2 manager: conda platform: linux-64 dependencies: @@ -12312,14 +12324,14 @@ package: idna: '>=2.5,<4' python: '>=3.12,<3.13.0a0' urllib3: '>=1.21.1,<3' - url: https://repo.anaconda.com/pkgs/main/linux-64/requests-2.31.0-py312h06a4308_1.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/requests-2.32.2-py312h06a4308_0.conda hash: - md5: dda64a94c6d852a3ce315dcf0e3f1797 - sha256: 4d4dcc2f18124e856f966f81f59af050c507aba2a7661c59c16aedfc46062d19 + md5: 8149ef9ed40945df19d2aff5ffd5bae0 + sha256: b3c962e97b14a8f517560742d3f3e2b40b9431ed48d259387c8af3c8346295a0 category: main optional: false - name: requests - version: 2.31.0 + version: 2.32.2 manager: conda platform: linux-aarch64 dependencies: @@ -12328,14 +12340,14 @@ package: idna: '>=2.5,<4' python: '>=3.12,<3.13.0a0' urllib3: '>=1.21.1,<3' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/requests-2.31.0-py312hd43f75c_1.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/requests-2.32.2-py312hd43f75c_0.conda hash: - md5: d72e9183b30986c3d7821cc714571987 - sha256: cbae5876a02abc96015515ad5e5972d1bfc686f868300a29114f32ae33e9b408 + md5: 3d0419fbc7fb28b6ff0c6360d99f8087 + sha256: a6d46bc55e07487a6aace8ca843e2630844901adabbb5175a3eaa9596bb7b9d0 category: main optional: false - name: requests - version: 2.31.0 + version: 2.32.2 manager: conda platform: osx-arm64 dependencies: @@ -12344,10 +12356,10 @@ package: idna: '>=2.5,<4' python: '>=3.12,<3.13.0a0' urllib3: '>=1.21.1,<3' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/requests-2.31.0-py312hca03da5_1.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/requests-2.32.2-py312hca03da5_0.conda hash: - md5: 58c8f757a9aaae39e56b45ed23ee8c90 - sha256: 2303a2d1455e837b5a556362b84813cc0d09e5dcef78c2387532a6331234cf02 + md5: f7d4036797fff7d029b029375aca6e88 + sha256: ed30695fd8eea42d282930d59f434dd1652e07e58d3bd409680dcd1d6795aa17 category: main optional: false - name: requests-toolbelt @@ -12715,29 +12727,29 @@ package: category: main optional: false - name: s2n - version: 1.4.13 + version: 1.4.15 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.13-he19d79f_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.15-he19d79f_0.conda hash: - md5: 51db7e9c0cd527aea7691e7405df33bf - sha256: a51daaf7d6affe149452b08a5cbc0568a0984306c558728050c56c48f8f11615 + md5: 4c7cc3fa1d2c5a63f9e2b1e2980a1672 + sha256: e19fb5bfef25ebfcdb56c87f4c9f2b4e04933ae227f0803443e1539f7f59722a category: main optional: false - name: s2n - version: 1.4.13 + version: 1.4.15 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.4.13-h52a6840_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.4.15-h52a6840_0.conda hash: - md5: b1e9de2093e14202d628481725b5791c - sha256: 056bd14bb9d2ad1504b49e27a3bed9f480c4afd37eb2c898e1b28a3ba0a2b0e3 + md5: 3bf0e01d41c6f88d5555161d3d03d5ec + sha256: 70d0842e60840e8e037888d07a7eedf0d05aabc5f0efa9b162be9d74a99b7548 category: main optional: false - name: scikit-learn @@ -12855,6 +12867,54 @@ package: sha256: 84d0c0a021fa9de6148e71d89b9cb67f46d3e766fc446788e41c4d9dd93f661a category: main optional: false +- name: seaborn-base + version: 0.13.2 + manager: conda + platform: linux-64 + dependencies: + matplotlib-base: '>=3.4,!=3.6.1' + numpy: '>=1.20,!=1.24.0' + pandas: '>=1.2' + python: '>=3.8' + scipy: '>=1.7' + url: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda + hash: + md5: b713b116feaf98acdba93ad4d7f90ca1 + sha256: 5de8b9e88a0f2daf58b07e3f144da26f894e9a20071304fa37329664eb2a29a7 + category: main + optional: false +- name: seaborn-base + version: 0.13.2 + manager: conda + platform: linux-aarch64 + dependencies: + matplotlib-base: '>=3.4,!=3.6.1' + numpy: '>=1.20,!=1.24.0' + pandas: '>=1.2' + python: '>=3.8' + scipy: '>=1.7' + url: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda + hash: + md5: b713b116feaf98acdba93ad4d7f90ca1 + sha256: 5de8b9e88a0f2daf58b07e3f144da26f894e9a20071304fa37329664eb2a29a7 + category: main + optional: false +- name: seaborn-base + version: 0.13.2 + manager: conda + platform: osx-arm64 + dependencies: + matplotlib-base: '>=3.4,!=3.6.1' + numpy: '>=1.20,!=1.24.0' + pandas: '>=1.2' + python: '>=3.8' + scipy: '>=1.7' + url: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda + hash: + md5: b713b116feaf98acdba93ad4d7f90ca1 + sha256: 5de8b9e88a0f2daf58b07e3f144da26f894e9a20071304fa37329664eb2a29a7 + category: main + optional: false - name: secretstorage version: 3.3.1 manager: conda @@ -13307,48 +13367,48 @@ package: category: main optional: false - name: sphobjinv - version: 2.3.1 + version: 2.3.1.1 manager: conda platform: linux-64 dependencies: attrs: '>=19.2' certifi: '' jsonschema: '>=3.0' - python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/sphobjinv-2.3.1-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/sphobjinv-2.3.1.1-pyhd8ed1ab_0.conda hash: - md5: acdf6eee61eef569196651bf644d1b23 - sha256: 38dfa70c707e35b93cff2a79043c01c2fa0c0ed5cda37ae2abdad047d6721567 + md5: 3503896d50f4e463bb86c77bab85ce07 + sha256: 7a5e727b2ee384f5d78596c808ef9fc147a0f3ceedb39dc42b2531d52df2e0d4 category: dev optional: true - name: sphobjinv - version: 2.3.1 + version: 2.3.1.1 manager: conda platform: linux-aarch64 dependencies: attrs: '>=19.2' certifi: '' jsonschema: '>=3.0' - python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/sphobjinv-2.3.1-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/sphobjinv-2.3.1.1-pyhd8ed1ab_0.conda hash: - md5: acdf6eee61eef569196651bf644d1b23 - sha256: 38dfa70c707e35b93cff2a79043c01c2fa0c0ed5cda37ae2abdad047d6721567 + md5: 3503896d50f4e463bb86c77bab85ce07 + sha256: 7a5e727b2ee384f5d78596c808ef9fc147a0f3ceedb39dc42b2531d52df2e0d4 category: dev optional: true - name: sphobjinv - version: 2.3.1 + version: 2.3.1.1 manager: conda platform: osx-arm64 dependencies: attrs: '>=19.2' certifi: '' jsonschema: '>=3.0' - python: '>=3.6' - url: https://conda.anaconda.org/conda-forge/noarch/sphobjinv-2.3.1-pyhd8ed1ab_0.conda + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/sphobjinv-2.3.1.1-pyhd8ed1ab_0.conda hash: - md5: acdf6eee61eef569196651bf644d1b23 - sha256: 38dfa70c707e35b93cff2a79043c01c2fa0c0ed5cda37ae2abdad047d6721567 + md5: 3503896d50f4e463bb86c77bab85ce07 + sha256: 7a5e727b2ee384f5d78596c808ef9fc147a0f3ceedb39dc42b2531d52df2e0d4 category: dev optional: true - name: sqlite @@ -13595,8 +13655,8 @@ package: manager: conda platform: linux-64 dependencies: - aws-crt-cpp: '>=0.26.8,<0.26.9.0a0' - aws-sdk-cpp: '>=1.11.267,<1.11.268.0a0' + aws-crt-cpp: '>=0.26.9,<0.26.10.0a0' + aws-sdk-cpp: '>=1.11.329,<1.11.330.0a0' azure-core-cpp: '>=1.11.1,<1.11.2.0a0' azure-identity-cpp: '>=1.6.0,<1.6.1.0a0' azure-storage-blobs-cpp: '>=12.10.0,<12.10.1.0a0' @@ -13604,21 +13664,21 @@ package: bzip2: '>=1.0.8,<2.0a0' fmt: '>=10.2.1,<11.0a0' libabseil: '>=20240116.2,<20240117.0a0' - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' - libgoogle-cloud: '>=2.23.0,<2.24.0a0' - libgoogle-cloud-storage: '>=2.23.0,<2.24.0a0' + libgoogle-cloud: '>=2.24.0,<2.25.0a0' + libgoogle-cloud-storage: '>=2.24.0,<2.25.0a0' libstdcxx-ng: '>=12' libwebp-base: '>=1.4.0,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' lz4-c: '>=1.9.3,<1.10.0a0' openssl: '>=3.3.0,<4.0a0' spdlog: '>=1.13.0,<1.14.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.23.0-h27f064a_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.23.0-hfa691db_2.conda hash: - md5: 8a4a8fd1af3cfbdcb54ea7282965d91a - sha256: 6685f95a9a9f801cda5cc0848d5afa1fca4395a8cb4fb47ae6c3222c76d6cbfb + md5: f9cd15d6c7deeeb5b60d65fac59b18bc + sha256: ff6cf1bb8e28f2cb04eaeec07166d97f415e003eecd70c23e531b73403a956f8 category: main optional: false - name: tiledb @@ -13626,8 +13686,8 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-crt-cpp: '>=0.26.8,<0.26.9.0a0' - aws-sdk-cpp: '>=1.11.267,<1.11.268.0a0' + aws-crt-cpp: '>=0.26.9,<0.26.10.0a0' + aws-sdk-cpp: '>=1.11.329,<1.11.330.0a0' azure-core-cpp: '>=1.11.1,<1.11.2.0a0' azure-identity-cpp: '>=1.6.0,<1.6.1.0a0' azure-storage-blobs-cpp: '>=12.10.0,<12.10.1.0a0' @@ -13635,21 +13695,21 @@ package: bzip2: '>=1.0.8,<2.0a0' fmt: '>=10.2.1,<11.0a0' libabseil: '>=20240116.2,<20240117.0a0' - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' - libgoogle-cloud: '>=2.23.0,<2.24.0a0' - libgoogle-cloud-storage: '>=2.23.0,<2.24.0a0' + libgoogle-cloud: '>=2.24.0,<2.25.0a0' + libgoogle-cloud-storage: '>=2.24.0,<2.25.0a0' libstdcxx-ng: '>=12' libwebp-base: '>=1.4.0,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' lz4-c: '>=1.9.3,<1.10.0a0' openssl: '>=3.3.0,<4.0a0' spdlog: '>=1.13.0,<1.14.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/tiledb-2.23.0-hdb39961_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/tiledb-2.23.0-h58f92de_2.conda hash: - md5: e8f7396b9bf798b876da1ea45c06a2eb - sha256: a41c548b7bbd8bfe6eab76b047bed2dbd36e0b3232050e0f3dd3da5a67f22e38 + md5: 2849e9e572004516705478e0e32c7ddd + sha256: 1dd866d31f3938c1efce7c2bd30d894b8d1d2b36dafd8b0ff096d03df2fde015 category: main optional: false - name: tiledb @@ -13658,8 +13718,8 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-crt-cpp: '>=0.26.8,<0.26.9.0a0' - aws-sdk-cpp: '>=1.11.267,<1.11.268.0a0' + aws-crt-cpp: '>=0.26.9,<0.26.10.0a0' + aws-sdk-cpp: '>=1.11.329,<1.11.330.0a0' azure-core-cpp: '>=1.11.1,<1.11.2.0a0' azure-identity-cpp: '>=1.6.0,<1.6.1.0a0' azure-storage-blobs-cpp: '>=12.10.0,<12.10.1.0a0' @@ -13667,20 +13727,20 @@ package: bzip2: '>=1.0.8,<2.0a0' fmt: '>=10.2.1,<11.0a0' libabseil: '>=20240116.2,<20240117.0a0' - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libcxx: '>=16' - libgoogle-cloud: '>=2.23.0,<2.24.0a0' - libgoogle-cloud-storage: '>=2.23.0,<2.24.0a0' + libgoogle-cloud: '>=2.24.0,<2.25.0a0' + libgoogle-cloud-storage: '>=2.24.0,<2.25.0a0' libwebp-base: '>=1.4.0,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' lz4-c: '>=1.9.3,<1.10.0a0' openssl: '>=3.3.0,<4.0a0' spdlog: '>=1.13.0,<1.14.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/tiledb-2.23.0-ha902843_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/tiledb-2.23.0-h6a2131e_2.conda hash: - md5: ea782b5a5bffd6e1529c2a7982e6feec - sha256: 247de5121a6cf24082eb759e9d1f79c13ff5efd3fd1eb02c3fd6bc590ca765df + md5: a193de9a1a7b10ea36add60c67dcfce2 + sha256: 4f9a720487173ae29f26147df6f8f8030cc91e430e79be8dca7198b93a2460d2 category: main optional: false - name: tinycss2 @@ -13947,12 +14007,11 @@ package: manager: conda platform: linux-64 dependencies: - colorama: '' - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-64/tqdm-4.66.4-py312he106c6f_0.conda hash: - md5: e74cd796e70a4261f86699ee0a3a7a24 - sha256: 75342f40a69e434a1a23003c3e254a95dca695fb14955bc32f1819cd503964b2 + md5: 11d1cee87830bbb013896a43f47eafa9 + sha256: 068de63ad220413d320022cc5bce27c643d7c7e5a3a2086efc7251008bf2fbc3 category: main optional: false - name: tqdm @@ -13960,12 +14019,11 @@ package: manager: conda platform: linux-aarch64 dependencies: - colorama: '' - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/tqdm-4.66.4-py312h42ac6d5_0.conda hash: - md5: e74cd796e70a4261f86699ee0a3a7a24 - sha256: 75342f40a69e434a1a23003c3e254a95dca695fb14955bc32f1819cd503964b2 + md5: 0473bb81fdf24f8fca59e8ac4c444336 + sha256: fcec28bb105e985fd8977df1c132f535d2654572b6b9f315d6877e103529d461 category: main optional: false - name: tqdm @@ -13973,12 +14031,11 @@ package: manager: conda platform: osx-arm64 dependencies: - colorama: '' - python: '>=3.7' - url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/osx-arm64/tqdm-4.66.4-py312h989b03a_0.conda hash: - md5: e74cd796e70a4261f86699ee0a3a7a24 - sha256: 75342f40a69e434a1a23003c3e254a95dca695fb14955bc32f1819cd503964b2 + md5: 05c65c61a76907878d041b83f5f2bc70 + sha256: 876a20ba3b50ee2ec41fc62ff9eb7f812299e70680700835a73aa53a394501ac category: main optional: false - name: traitlets @@ -14585,45 +14642,46 @@ package: category: main optional: false - name: watchdog - version: 4.0.0 + version: 4.0.1 manager: conda platform: linux-64 dependencies: python: '>=3.12,<3.13.0a0' python_abi: 3.12.* pyyaml: '>=3.10' - url: https://conda.anaconda.org/conda-forge/linux-64/watchdog-4.0.0-py312h7900ff3_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/watchdog-4.0.1-py312h7900ff3_0.conda hash: - md5: 1b87b82dd803565550e6358c0790f3d2 - sha256: db3ef9753934826c008216b198f04a6637150e1d91d72733148c0822e4a042a2 + md5: 7cc94a3b5e9698eecc2c39dbf7a173db + sha256: c4786da0c938a65cea07e2bb3fe76dbeed6968c322994c66395176307cf78425 category: dev optional: true - name: watchdog - version: 4.0.0 + version: 4.0.1 manager: conda platform: linux-aarch64 dependencies: python: '>=3.12,<3.13.0a0' python_abi: 3.12.* pyyaml: '>=3.10' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/watchdog-4.0.0-py312h8025657_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/watchdog-4.0.1-py312h8025657_0.conda hash: - md5: f8f6a4d3ce5671474d13a9354cc8ce49 - sha256: d58e635548e4072b1a126e5d1d7548b33c4c2ff85bc8e9055f7c51202b66b4ac + md5: 106b4351ca616d0b0ad465dd2ae7fdab + sha256: 011a732e9abf46a9351edf2e0a57dc88ca51dd1e8caf32a96aa57ce13e964027 category: dev optional: true - name: watchdog - version: 4.0.0 + version: 4.0.1 manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* pyyaml: '>=3.10' - url: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-4.0.0-py312he37b823_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-4.0.1-py312h7e5086c_0.conda hash: - md5: c483c04540c229b50564201c5432667c - sha256: 3e7486e161e4478a1bb63cb124a446b21b0af113458522d215ba76eebb1a473a + md5: ce33cf6a4a69aa2beb93c8f7258bfe55 + sha256: f018376037c19c38e5b55602d09653106cc4fada7db3f02f871cee7be6befcd6 category: dev optional: true - name: wcwidth @@ -15273,10 +15331,10 @@ package: dependencies: libgcc-ng: '>=12' libzlib: 1.2.13 - url: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda + url: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda hash: - md5: 68c34ec6149623be41a1933ab996a209 - sha256: 9887a04d7e7cb14bd2b52fa01858f05a6d7f002c890f618d9fcd864adbfecb1b + md5: 559d338a4234c2ad6e676f460a093e67 + sha256: 534824ea44939f3e59ca8ebb95e3ece6f50f9d2a0e69999fbc692311252ed6ac category: main optional: false - name: zlib @@ -15286,10 +15344,10 @@ package: dependencies: libgcc-ng: '>=12' libzlib: 1.2.13 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.2.13-h31becfc_5.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.2.13-h68df207_6.conda hash: - md5: 96866c7301479abaf8308c50958c71a4 - sha256: aa3e9d46b13d1959faf634f03d929d7dec950dc1b84a8ff109f7f0e3f364b562 + md5: 11012f81be8e7dae8495df7ec17c0cc5 + sha256: 67d2e05bb76308ad2e6d8bd27d54e5f8d866d7900826a13f22b66ecacce02fed category: main optional: false - name: zlib @@ -15297,11 +15355,12 @@ package: manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' libzlib: 1.2.13 - url: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-h53f4e23_5.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-hfb2fe0b_6.conda hash: - md5: a08383f223b10b71492d27566fafbf6c - sha256: de0ee1e24aa6867058d3b852a15c8d7f49f262f5828772700c647186d4a96bbe + md5: 88cf27df3eff5813734b538461f4c8cf + sha256: c09c9cb6de86d87b9267a6331c74cc8fb05bae5ee7749070a5e8883c3eff5424 category: main optional: false - name: zstd @@ -15311,7 +15370,7 @@ package: dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda hash: md5: 4d056880988120e29d75bfff282e0f45 @@ -15325,7 +15384,7 @@ package: dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda hash: md5: be8d5f8cf21aed237b8b182ea86b3dd6 @@ -15338,7 +15397,7 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda hash: md5: d96942c06c3e84bfcc5efb038724a7fd diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index b0ececf6..680bc6a7 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -94,6 +94,32 @@ XARRAY_EXAMPLE_END_DATE_4_YEARS: Final[str] = "1984-11-30" +@dataclass +class CityCoords: + name: str + xmin: float + xmax: float + ymin: float + ymax: float + epsg: int = int(BRITISH_NATIONAL_GRID_EPSG[5:]) + + def as_tuple(self) -> tuple[float, float, float, float]: + """Return in `xmin`, `xmax`, `ymin`, `ymax` order.""" + return self.xmin, self.xmax, self.ymin, self.ymax + + +GlasgowCoords: Final[CityCoords] = CityCoords( + "Glasgow", 249799.999600002, 269234.9996, 657761.472000003, 672330.696800007 +) + +LondonCoords: Final[CityCoords] = CityCoords( + "London", 503568.1996, 561957.4961, 155850.7974, 200933.9025 +) +ManchesterCoords: Final[CityCoords] = CityCoords( + "Manchester", 380399.997, 393249.999, 389349.999, 405300.003 +) + + GLASGOW_GEOM_LOCAL_PATH: Final[Path] = Path( "shapefiles/three.cities/Glasgow/Glasgow.shp" ) @@ -408,6 +434,7 @@ def interpolate_coords( reference_coords: T_Dataset | PathLike = DEFAULT_RELATIVE_GRID_DATA_PATH, method: str = "linear", engine: XArrayEngineType = NETCDF4_XARRAY_ENGINE, + use_reference_grid: bool = True, **kwargs, ) -> T_Dataset: """Reproject `xr_time_series` to `x_resolution`/`y_resolution`. @@ -428,7 +455,8 @@ def interpolate_coords( except: ValueError(f"'xr_time_series' must be an 'xr.Dataset' instance.") - if x_grid is None or y_grid is None: + if use_reference_grid or (x_grid is None or y_grid is None): + use_reference_grid = True try: assert x_grid is None and y_grid is None except: @@ -475,7 +503,7 @@ def interpolate_coords( method=method, **kwargs ) # Ensure original `rio.crs` is kept in returned `Dataset` - if x_grid is None and y_grid is None: + if use_reference_grid: reprojected.rio.write_crs(reference_coords.rio.crs, inplace=True) else: reprojected.rio.write_crs(xr_time_series.rio.crs, inplace=True) @@ -490,8 +518,8 @@ def hads_resample_and_reproject( method: str = "linear", source_x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, source_y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, - final_x_coord_column_name: str = "lon", - final_y_coord_column_name: str = "lat", + final_x_coord_column_name: str = "x", + final_y_coord_column_name: str = "y", final_crs: str | None = BRITISH_NATIONAL_GRID_EPSG, vars_to_drop: Sequence[str] | None = HADS_DROP_VARS_AFTER_PROJECTION, ) -> T_Dataset: @@ -510,6 +538,7 @@ def hads_resample_and_reproject( ) if vars_to_drop: interpolated_hads = interpolated_hads.drop_vars(vars_to_drop) + interpolated_hads = interpolated_hads.rename( { source_x_coord_column_name: final_x_coord_column_name, diff --git a/python/pdm.lock b/python/pdm.lock index 8f878af9..a7480f80 100644 --- a/python/pdm.lock +++ b/python/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.4.1" -content_hash = "sha256:e16ddaa6a94f3b279112089e7a38addc0cfe7a1cc7f48fc23deb078c4e3b59cb" +content_hash = "sha256:bcc175d83c3ba888da4211def99cede8eecc624e36e5006b2ae99f3157361056" [[package]] name = "affine" @@ -2718,6 +2718,22 @@ files = [ {file = "scipy-1.13.0.tar.gz", hash = "sha256:58569af537ea29d3f78e5abd18398459f195546bb3be23d16677fb26616cc11e"}, ] +[[package]] +name = "seaborn" +version = "0.13.2" +requires_python = ">=3.8" +summary = "Statistical data visualization" +groups = ["default"] +dependencies = [ + "matplotlib!=3.6.1,>=3.4", + "numpy!=1.24.0,>=1.20", + "pandas>=1.2", +] +files = [ + {file = "seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987"}, + {file = "seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7"}, +] + [[package]] name = "secretstorage" version = "3.3.3" diff --git a/python/pyproject.toml b/python/pyproject.toml index a192186c..237eece9 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -36,6 +36,7 @@ dependencies = [ "netcdf4>=1.6.5", "pdm>=2.12.4", "typer>=0.12.3", + "seaborn>=0.13.2", ] [project.scripts] diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index a2310810..469af4fa 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -902,7 +902,7 @@ def test_hads_resample_and_reproject( variable_name: str = "tasmax" output_path: Path = Path("tests/runs/reample-hads") tasmax_hads_1980_raw = tasmax_hads_1980_raw_mount_or_local_cache - # The the first index is the first time point of a month, in this case January + # First index is for month, in this case January 1980 plot_xarray( tasmax_hads_1980_raw.tasmax[0], path=output_path / "tasmas-1980-JAN-1-raw.png", @@ -916,7 +916,7 @@ def test_hads_resample_and_reproject( tasmax_hads_1980_raw, variable_name=variable_name, ) - # The the first index is the first time point of a month, in this case January + plot_xarray(reprojected[0], path=output_path / "tasmas-1980.png", time_stamp=True) assert_allclose(reprojected[10][430][230:250], FINAL_HADS_JAN_10_430_X_230_250_Y) assert reprojected.rio.crs.to_epsg() == int(BRITISH_NATIONAL_GRID_EPSG[5:]) From ebdccf5cd395ccdbf5c07cfbb7e798b1b3ffc040 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Thu, 30 May 2024 09:20:57 +0100 Subject: [PATCH 08/92] fix: switch `FINAL_RESAMLE_LAT_COL` / `LON` and `HADsResampler` params --- python/clim_recal/resample.py | 8 ++++---- python/clim_recal/utils/xarray.py | 10 ++++++---- python/conftest.py | 2 -- python/tests/test_resample.py | 22 ++++++++++++++-------- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index 20394876..51902a28 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -391,8 +391,8 @@ def to_reprojection( variable_name=self.variable_name, x_grid=self.x, y_grid=self.y, - xr_time_series_x_column_name=self.input_file_x_column_name, - xr_time_series_y_column_name=self.input_file_y_column_name, + x_coord_column_name=self.input_file_x_column_name, + y_coord_column_name=self.input_file_y_column_name, new_path_name_func=reproject_2_2km_filename, return_results=return_results, ) @@ -487,8 +487,8 @@ def to_reprojection( variable_name=self.cpm_variable_name, # x_grid=self.x, # y_grid=self.y, - # xr_time_series_x_column_name=self.input_file_x_column_name, - # xr_time_series_y_column_name=self.input_file_y_column_name, + # x_coord_column_name=self.input_file_x_column_name, + # y_coord_column_name=self.input_file_y_column_name, return_results=return_results, ) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 680bc6a7..0f5d08d3 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -152,8 +152,10 @@ def as_tuple(self) -> tuple[float, float, float, float]: HADS_DROP_VARS_AFTER_PROJECTION: Final[tuple[str, ...]] = ("longitude", "latitude") # TODO: CHECK IF I GOT THESE BACKWARDS -FINAL_RESAMPLE_LAT_COL: Final[str] = "x" -FINAL_RESAMPLE_LON_COL: Final[str] = "y" +# FINAL_RESAMPLE_LAT_COL: Final[str] = "x" +# FINAL_RESAMPLE_LON_COL: Final[str] = "y" +FINAL_RESAMPLE_LON_COL: Final[str] = "x" +FINAL_RESAMPLE_LAT_COL: Final[str] = "y" def cpm_xarray_to_standard_calendar( @@ -518,8 +520,8 @@ def hads_resample_and_reproject( method: str = "linear", source_x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, source_y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, - final_x_coord_column_name: str = "x", - final_y_coord_column_name: str = "y", + final_x_coord_column_name: str = FINAL_RESAMPLE_LON_COL, + final_y_coord_column_name: str = FINAL_RESAMPLE_LAT_COL, final_crs: str | None = BRITISH_NATIONAL_GRID_EPSG, vars_to_drop: Sequence[str] | None = HADS_DROP_VARS_AFTER_PROJECTION, ) -> T_Dataset: diff --git a/python/conftest.py b/python/conftest.py index 77865478..fe8fe20e 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -229,7 +229,6 @@ def data_fixtures_path(tmp_path: Path) -> Iterator[Path]: rmtree(tmp_path / TEST_FILE_PATH.name) -@pytest.mark.mount @pytest.fixture def glasgow_shape_file_path(data_fixtures_path: Path) -> Path: return data_fixtures_path / Path(*GLASGOW_GEOM_LOCAL_PATH.parts[-2:]) @@ -287,7 +286,6 @@ def uk_rotated_grid_bounds() -> BoundsTupleType: # Note: it may be worth setting this to cache for session runs -@pytest.mark.mount @pytest.fixture def clim_runner(tmp_path) -> ClimRecalConfig: """Return default `ClimRecalConfig`.""" diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 469af4fa..34e34340 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -50,6 +50,8 @@ CPM_LOCAL_INTERMEDIATE_PATH, FINAL_RESAMPLE_LAT_COL, FINAL_RESAMPLE_LON_COL, + HADS_RAW_X_COLUMN_NAME, + HADS_RAW_Y_COLUMN_NAME, NETCDF4_XARRAY_ENGINE, BoundsTupleType, ConvertCalendarAlignOptions, @@ -870,8 +872,8 @@ def test_interpolate_coords( if data_type == "hads": reprojected_xr_time_series = interpolate_coords( tasmax_hads_1980_raw, - xr_time_series_x_column_name=HADS_XDIM, - xr_time_series_y_column_name=HADS_YDIM, + x_coord_column_name=HADS_XDIM, + y_coord_column_name=HADS_YDIM, **kwargs, ) assert reprojected_xr_time_series.dims["time"] == 31 @@ -882,8 +884,8 @@ def test_interpolate_coords( # We are now using gdal_warp_wrapper. See test_cpm_warp_steps reprojected_xr_time_series = interpolate_coords( tasmax_cpm_1980_raw, - xr_time_series_x_column_name=CPRUK_XDIM, - xr_time_series_y_column_name=CPRUK_YDIM, + x_coord_column_name=CPRUK_XDIM, + y_coord_column_name=CPRUK_YDIM, **kwargs, ) # Note: this test is to a raw file without 365 day projection @@ -910,8 +912,8 @@ def test_hads_resample_and_reproject( ) assert tasmax_hads_1980_raw.dims["time"] == 31 - assert tasmax_hads_1980_raw.dims["projection_x_coordinate"] == 900 - assert tasmax_hads_1980_raw.dims["projection_y_coordinate"] == 1450 + assert tasmax_hads_1980_raw.dims[HADS_RAW_X_COLUMN_NAME] == 900 + assert tasmax_hads_1980_raw.dims[HADS_RAW_Y_COLUMN_NAME] == 1450 reprojected: T_Dataset = hads_resample_and_reproject( tasmax_hads_1980_raw, variable_name=variable_name, @@ -926,8 +928,12 @@ def test_hads_resample_and_reproject( reprojected.to_netcdf(export_netcdf_path) read_from_export: T_Dataset = open_dataset(export_netcdf_path, decode_coords="all") assert read_from_export.dims["time"] == 31 - assert read_from_export.dims["lon"] == 528 # replaces projection_x_coordinate - assert read_from_export.dims["lat"] == 651 # replaces projection_y_coordinate + assert ( + read_from_export.dims[FINAL_RESAMPLE_LON_COL] == 528 + ) # replaces projection_x_coordinate + assert ( + read_from_export.dims[FINAL_RESAMPLE_LAT_COL] == 651 + ) # replaces projection_y_coordinate assert reprojected.rio.crs == read_from_export.rio.crs == BRITISH_NATIONAL_GRID_EPSG From 7578af19fd661e9f07301fdb585628ae640bcf9a Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sat, 1 Jun 2024 14:29:41 +0100 Subject: [PATCH 09/92] fix(test): fix `cftime_range_gen` regression, update tests, improve plot and `pickling` --- .conda-linux-64.lock | 7 +- conda-lock.yml | 118 +++++++++++++++++++----------- python/clim_recal/resample.py | 8 +- python/clim_recal/utils/xarray.py | 47 +++++++----- python/pdm.lock | 13 +++- python/pyproject.toml | 1 + python/tests/test_pipeline.py | 7 +- python/tests/test_resample.py | 71 ++++++++++++++---- 8 files changed, 186 insertions(+), 86 deletions(-) diff --git a/.conda-linux-64.lock b/.conda-linux-64.lock index 387f8b64..079fc5ec 100644 --- a/.conda-linux-64.lock +++ b/.conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: fc1a2dad7b75533eecc939adf85e8193120dab7b74e221e0e3adb78dc0263375 +# input_hash: 11beb7914787d1501787a8c8808a03235a67f9bd485168bbba543e06508fbba6 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://repo.anaconda.com/pkgs/main/linux-64/blas-1.0-openblas.conda#9ddfcaef10d79366c90128f5dc444be8 @@ -150,6 +150,7 @@ https://repo.anaconda.com/pkgs/main/noarch/cycler-0.11.0-pyhd3eb1b0_0.conda#f5e3 https://repo.anaconda.com/pkgs/main/linux-64/debugpy-1.6.7-py312h6a678d5_0.conda#e2d2e050b9401c68cfc979753f250616 https://repo.anaconda.com/pkgs/main/noarch/decorator-5.1.1-pyhd3eb1b0_0.conda#4d969aac32a0faf84af90c797bfc7fec https://repo.anaconda.com/pkgs/main/noarch/defusedxml-0.7.1-pyhd3eb1b0_0.conda#d912068b0729930972adcaac338882c0 +https://repo.anaconda.com/pkgs/main/linux-64/dill-0.3.8-py312h06a4308_0.conda#f55011f25e86927bea73438c228631af https://repo.anaconda.com/pkgs/main/linux-64/distlib-0.3.8-py312h06a4308_0.conda#3763a64961ca016ccf828044029cc5c0 https://repo.anaconda.com/pkgs/main/linux-64/et_xmlfile-1.1.0-py312h06a4308_1.conda#c9f51f719d877e8f6f8be7c9629d5791 https://repo.anaconda.com/pkgs/main/noarch/execnet-1.9.0-pyhd3eb1b0_0.conda#f895937671af67cebb8af617494b3513 @@ -288,7 +289,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/tinycss2-1.2.1-py312h06a4308_0.cond https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda#cf2c3a89f89644c53cadbfeb124914e9 https://repo.anaconda.com/pkgs/main/linux-64/typing-extensions-4.11.0-py312h06a4308_0.conda#181af932ad0824456dc3e6173c38b5c6 https://repo.anaconda.com/pkgs/main/linux-64/virtualenv-20.26.1-py312h06a4308_0.conda#9a27149f4f1db4ada607be0fb5494f1b -https://conda.anaconda.org/conda-forge/linux-64/watchdog-4.0.1-py312h7900ff3_0.conda#7cc94a3b5e9698eecc2c39dbf7a173db +https://repo.anaconda.com/pkgs/main/linux-64/watchdog-4.0.1-py312h06a4308_0.conda#7cd659167e2c8149985b2d6b14479b11 https://repo.anaconda.com/pkgs/main/linux-64/argon2-cffi-bindings-21.2.0-py312h5eee18b_0.conda#ed4180dcd3e7c19a9c06a86510ad1ae7 https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.9-he3a8b3b_0.conda#fbe6a256dd70a505730e7c461cd37a35 https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.10.0-h00ab1b0_1.conda#1e63d3866554a4d2e3d1cba5f21a2841 @@ -354,7 +355,7 @@ https://conda.anaconda.org/conda-forge/linux-64/gdal-3.8.5-py312h86af8fa_7.conda https://repo.anaconda.com/pkgs/main/linux-64/nbconvert-7.10.0-py312h06a4308_0.conda#e913ecbb1401f765ed8631ed511d6788 https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.10-py312h2447d21_1.conda#e3b23e993698c5afd6ee57e009cabf4c https://repo.anaconda.com/pkgs/main/linux-64/requests-toolbelt-1.0.0-py312h06a4308_0.conda#7aa77208d296f2bb73e3e71f5614e170 -https://conda.anaconda.org/conda-forge/noarch/unearth-0.15.2-pyhd8ed1ab_0.conda#dda35988bb25a59bc0545ec35fc25977 +https://conda.anaconda.org/conda-forge/noarch/unearth-0.15.3-pyhd8ed1ab_0.conda#f32041bd4210adb59aa3b11a4108f33d https://repo.anaconda.com/pkgs/main/linux-64/cachecontrol-with-filecache-0.14.0-py312h06a4308_1.conda#e3f673966a8bfbab947ceceb285f72d0 https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.6-py312h39f3bbb_2.conda#027c465cb004970543b3641b4a0fef74 https://repo.anaconda.com/pkgs/main/linux-64/jupyter_server-2.10.0-py312h06a4308_0.conda#49fdb30dd562f6417cc1a621e2f24047 diff --git a/conda-lock.yml b/conda-lock.yml index 691e7224..49198a37 100644 --- a/conda-lock.yml +++ b/conda-lock.yml @@ -15,9 +15,9 @@ version: 1 metadata: content_hash: - osx-arm64: 9d63316589f3dd984544e62a4e75390fcd4255abf4a16dd5f40259931f3c8c33 - linux-64: fc1a2dad7b75533eecc939adf85e8193120dab7b74e221e0e3adb78dc0263375 - linux-aarch64: ad83d114512697bc85313bf884872a426d7006d8f0de105ba5697733be34e9fb + osx-arm64: 16ab7f522094ab05883469fdd444acf93de252a72d6aec95ee98e67d2b30ff63 + linux-64: 11beb7914787d1501787a8c8808a03235a67f9bd485168bbba543e06508fbba6 + linux-aarch64: b8b106436844ebc9aa2ebafdfdbd3041b469ef0627d7145e49777f094172f66b channels: - url: r used_env_vars: [] @@ -3124,6 +3124,42 @@ package: sha256: 4a0eee0aa137cd11dec264d10afc97b584cf8828e267ec0629cb880728c3ac55 category: main optional: false +- name: dill + version: 0.3.8 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-64/dill-0.3.8-py312h06a4308_0.conda + hash: + md5: f55011f25e86927bea73438c228631af + sha256: 66ac2cdec90a58e8e136cb2cc868b5c42f70833e92c53d00824c7d0f219a2376 + category: main + optional: false +- name: dill + version: 0.3.8 + manager: conda + platform: linux-aarch64 + dependencies: + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/dill-0.3.8-py312hd43f75c_0.conda + hash: + md5: 6d484dc3b44aae9498d5453af3cdd29b + sha256: ca2443c2c2f84d2eb92e48f1edc06c5966c4b392c2b61c4986fa4928bb2d557d + category: main + optional: false +- name: dill + version: 0.3.8 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/osx-arm64/dill-0.3.8-py312hca03da5_0.conda + hash: + md5: 777a3a9815a699c67aefb761717fc8f9 + sha256: 3f6d073165c8d85fe4490077d52590a6741b1ed9fc762e22f61d105e311af432 + category: main + optional: false - name: distlib version: 0.3.8 manager: conda @@ -7498,7 +7534,7 @@ package: libstdcxx-ng: '>=12' libxml2: '>=2.12.2,<3.0.0a0' libzip: '>=1.10.1,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.2.0,<4.0a0' zlib: '' zstd: '>=1.5.5,<1.6.0a0' @@ -7523,7 +7559,7 @@ package: libstdcxx-ng: '>=12' libxml2: '>=2.12.2,<3.0.0a0' libzip: '>=1.10.1,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.2.0,<4.0a0' zlib: '' zstd: '>=1.5.5,<1.6.0a0' @@ -7548,7 +7584,7 @@ package: libcxx: '>=16.0.6' libxml2: '>=2.12.2,<3.0.0a0' libzip: '>=1.10.1,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.2.0,<4.0a0' zlib: '' zstd: '>=1.5.5,<1.6.0a0' @@ -7567,7 +7603,7 @@ package: libev: '>=4.33,<5.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.2.0,<4.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda hash: @@ -7584,7 +7620,7 @@ package: libev: '>=4.33,<5.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.2.0,<4.0a0' url: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.58.0-hb0e430d_1.conda hash: @@ -7601,7 +7637,7 @@ package: c-ares: '>=1.23.0,<2.0a0' libcxx: '>=16.0.6' libev: '>=4.33,<5.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.2.0,<4.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.58.0-ha4dd798_1.conda hash: @@ -7683,7 +7719,7 @@ package: platform: linux-64 dependencies: libgcc-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda hash: md5: 009981dd9cfcaa4dbfa25ffaed86bcae @@ -7696,7 +7732,7 @@ package: platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.43-h194ca79_0.conda hash: md5: 1123e504d9254dd9494267ab9aba95f0 @@ -7708,7 +7744,7 @@ package: manager: conda platform: osx-arm64 dependencies: - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.43-h091b4b1_0.conda hash: md5: 77e684ca58d82cae9deebafb95b1a2b8 @@ -9624,7 +9660,7 @@ package: libpng: '>=1.6.43,<1.7.0a0' libstdcxx-ng: '>=12' libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda hash: md5: 7f2e286780f072ed750df46dc2631138 @@ -9640,7 +9676,7 @@ package: libpng: '>=1.6.43,<1.7.0a0' libstdcxx-ng: '>=12' libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.2-h0d9d63b_0.conda hash: md5: fd2898519e839d5ceb778343f39a3176 @@ -9655,7 +9691,7 @@ package: libcxx: '>=16' libpng: '>=1.6.43,<1.7.0a0' libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda hash: md5: 5029846003f0bc14414b9128a1f7c84b @@ -10024,7 +10060,7 @@ package: dependencies: bzip2: '>=1.0.8,<2.0a0' libgcc-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda hash: md5: 8292dea9e022d9610a11fce5e0896ed8 @@ -10038,7 +10074,7 @@ package: dependencies: bzip2: '>=1.0.8,<2.0a0' libgcc-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.43-hd0f9c67_0.conda hash: md5: 1275fa549338ecdc8b7793589ac09150 @@ -10051,7 +10087,7 @@ package: platform: osx-arm64 dependencies: bzip2: '>=1.0.8,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.43-h26f9a81_0.conda hash: md5: 1ddc87f00014612830f3235b5ad6d821 @@ -14422,7 +14458,7 @@ package: category: dev optional: true - name: unearth - version: 0.15.2 + version: 0.15.3 manager: conda platform: linux-64 dependencies: @@ -14431,14 +14467,14 @@ package: packaging: '>=20' python: '>=3.7' requests: '>=2.25' - url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.15.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.15.3-pyhd8ed1ab_0.conda hash: - md5: dda35988bb25a59bc0545ec35fc25977 - sha256: 68bdb5b8a184a84c01d601b3d5c53a11d3808cc69b3837d18ad170039338d9ca + md5: f32041bd4210adb59aa3b11a4108f33d + sha256: f8d7065e9cd67e0eeb24b91001ccff369eef124a8ecfee59882c210846c01bb4 category: main optional: false - name: unearth - version: 0.15.2 + version: 0.15.3 manager: conda platform: linux-aarch64 dependencies: @@ -14447,14 +14483,14 @@ package: packaging: '>=20' python: '>=3.7' requests: '>=2.25' - url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.15.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.15.3-pyhd8ed1ab_0.conda hash: - md5: dda35988bb25a59bc0545ec35fc25977 - sha256: 68bdb5b8a184a84c01d601b3d5c53a11d3808cc69b3837d18ad170039338d9ca + md5: f32041bd4210adb59aa3b11a4108f33d + sha256: f8d7065e9cd67e0eeb24b91001ccff369eef124a8ecfee59882c210846c01bb4 category: main optional: false - name: unearth - version: 0.15.2 + version: 0.15.3 manager: conda platform: osx-arm64 dependencies: @@ -14463,10 +14499,10 @@ package: packaging: '>=20' python: '>=3.7' requests: '>=2.25' - url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.15.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.15.3-pyhd8ed1ab_0.conda hash: - md5: dda35988bb25a59bc0545ec35fc25977 - sha256: 68bdb5b8a184a84c01d601b3d5c53a11d3808cc69b3837d18ad170039338d9ca + md5: f32041bd4210adb59aa3b11a4108f33d + sha256: f8d7065e9cd67e0eeb24b91001ccff369eef124a8ecfee59882c210846c01bb4 category: main optional: false - name: unicodedata2 @@ -14647,12 +14683,11 @@ package: platform: linux-64 dependencies: python: '>=3.12,<3.13.0a0' - python_abi: 3.12.* pyyaml: '>=3.10' - url: https://conda.anaconda.org/conda-forge/linux-64/watchdog-4.0.1-py312h7900ff3_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/watchdog-4.0.1-py312h06a4308_0.conda hash: - md5: 7cc94a3b5e9698eecc2c39dbf7a173db - sha256: c4786da0c938a65cea07e2bb3fe76dbeed6968c322994c66395176307cf78425 + md5: 7cd659167e2c8149985b2d6b14479b11 + sha256: d4077feab03b7703c2d549dd14c0138f51d7bfd5b8aa7a04c66db6ad487fe2f3 category: dev optional: true - name: watchdog @@ -14661,12 +14696,11 @@ package: platform: linux-aarch64 dependencies: python: '>=3.12,<3.13.0a0' - python_abi: 3.12.* pyyaml: '>=3.10' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/watchdog-4.0.1-py312h8025657_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/watchdog-4.0.1-py312hd43f75c_0.conda hash: - md5: 106b4351ca616d0b0ad465dd2ae7fdab - sha256: 011a732e9abf46a9351edf2e0a57dc88ca51dd1e8caf32a96aa57ce13e964027 + md5: b1e1e1cbc579874ea8999826a744d174 + sha256: db974de26231218c13ee8e0bd8d68e779a57956599f2ad8ec741535db40e9cf9 category: dev optional: true - name: watchdog @@ -14674,14 +14708,12 @@ package: manager: conda platform: osx-arm64 dependencies: - __osx: '>=11.0' python: '>=3.12,<3.13.0a0' - python_abi: 3.12.* pyyaml: '>=3.10' - url: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-4.0.1-py312h7e5086c_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/watchdog-4.0.1-py312h80987f9_0.conda hash: - md5: ce33cf6a4a69aa2beb93c8f7258bfe55 - sha256: f018376037c19c38e5b55602d09653106cc4fada7db3f02f871cee7be6befcd6 + md5: 7efa01fbde268e0ee229e0a718ac7abc + sha256: 9d0db215c53a7188cdcc335f61b1ae7b10c0130ad42d0672a4836eeb37ce193a category: dev optional: true - name: wcwidth diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index 51902a28..2c722827 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -7,7 +7,6 @@ """ -import pickle from dataclasses import dataclass, field from datetime import date from glob import glob @@ -16,6 +15,7 @@ from pathlib import Path from typing import Any, Callable, Final, Iterable, Iterator, Literal, Sequence +import dill as pickle import numpy as np import rioxarray # nopycln: import from geopandas import GeoDataFrame @@ -365,6 +365,7 @@ class HADsResampler(ResamblerBase): resolution_relative_path: Path = HADS_2_2K_RESOLUTION_PATH input_file_x_column_name: str = HADS_XDIM input_file_y_column_name: str = HADS_YDIM + _use_reference_grid: bool = True def to_reprojection( self, @@ -391,8 +392,9 @@ def to_reprojection( variable_name=self.variable_name, x_grid=self.x, y_grid=self.y, - x_coord_column_name=self.input_file_x_column_name, - y_coord_column_name=self.input_file_y_column_name, + source_x_coord_column_name=self.input_file_x_column_name, + source_y_coord_column_name=self.input_file_y_column_name, + use_reference_grid=self._use_reference_grid, new_path_name_func=reproject_2_2km_filename, return_results=return_results, ) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 0f5d08d3..a2ff4801 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -7,6 +7,7 @@ import numpy as np import rioxarray # nopycln: import +import seaborn from cftime._cftime import Datetime360Day from geopandas import GeoDataFrame, read_file from matplotlib import pyplot as plt @@ -45,6 +46,8 @@ logger = getLogger(__name__) +seaborn.set() # Use seaborn style for all `matplotlib` plots + DropDayType = set[tuple[int, int]] ChangeDayType = set[tuple[int, int]] @@ -434,6 +437,8 @@ def interpolate_coords( x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, reference_coords: T_Dataset | PathLike = DEFAULT_RELATIVE_GRID_DATA_PATH, + reference_coord_x_column_name: str = HADS_RAW_X_COLUMN_NAME, + reference_coord_y_column_name: str = HADS_RAW_Y_COLUMN_NAME, method: str = "linear", engine: XArrayEngineType = NETCDF4_XARRAY_ENGINE, use_reference_grid: bool = True, @@ -458,11 +463,6 @@ def interpolate_coords( ValueError(f"'xr_time_series' must be an 'xr.Dataset' instance.") if use_reference_grid or (x_grid is None or y_grid is None): - use_reference_grid = True - try: - assert x_grid is None and y_grid is None - except: - raise ValueError(f"Both 'x_grid' and 'y_grid' must be set or none") if isinstance(reference_coords, PathLike | str): reference_coords = open_dataset( reference_coords, decode_coords="all", engine=engine @@ -471,26 +471,33 @@ def interpolate_coords( assert isinstance(reference_coords, Dataset) except: ValueError(f"'reference_coords' must be an 'xr.Dataset' instance.") - - x_grid = ( - reference_coords[x_coord_column_name].values if x_grid is None else x_grid - ) - y_grid = ( - reference_coords[y_coord_column_name].values if y_grid is None else y_grid - ) try: - assert x_coord_column_name in reference_coords.coords - assert y_coord_column_name in reference_coords.coords + assert reference_coord_x_column_name in reference_coords.coords + assert reference_coord_y_column_name in reference_coords.coords assert x_coord_column_name in xr_time_series.coords assert y_coord_column_name in xr_time_series.coords except AssertionError: raise ValueError( f"At least one of\n" + f"'reference_coord_x_column_name': '{reference_coord_x_column_name}'\n" + f"'reference_coord_y_column_name': '{reference_coord_y_column_name}'\n" f"'x_coord_column_name': '{x_coord_column_name}'\n" f"'y_coord_column_name': '{y_coord_column_name}'\n" f"not in 'reference_coords' and/or 'xr_time_series'." ) + x_grid = ( + reference_coords[reference_coord_x_column_name].values + if x_grid is None + else x_grid + ) + y_grid = ( + reference_coords[reference_coord_y_column_name].values + if y_grid is None + else y_grid + ) + use_reference_grid = True + try: assert isinstance(x_grid, ndarray) assert isinstance(y_grid, ndarray) @@ -501,14 +508,16 @@ def interpolate_coords( ) kwargs[x_coord_column_name] = x_grid kwargs[y_coord_column_name] = y_grid - reprojected: T_Dataset = xr_time_series[variable_name].interp( + reprojected_data_array: T_DataArray = xr_time_series[variable_name].interp( method=method, **kwargs ) + # Ensure original `rio.crs` is kept in returned `Dataset` if use_reference_grid: - reprojected.rio.write_crs(reference_coords.rio.crs, inplace=True) + reprojected_data_array.rio.write_crs(reference_coords.rio.crs, inplace=True) else: - reprojected.rio.write_crs(xr_time_series.rio.crs, inplace=True) + reprojected_data_array.rio.write_crs(xr_time_series.rio.crs, inplace=True) + reprojected: Dataset = Dataset({variable_name: reprojected_data_array}) return reprojected @@ -524,6 +533,7 @@ def hads_resample_and_reproject( final_y_coord_column_name: str = FINAL_RESAMPLE_LAT_COL, final_crs: str | None = BRITISH_NATIONAL_GRID_EPSG, vars_to_drop: Sequence[str] | None = HADS_DROP_VARS_AFTER_PROJECTION, + use_reference_grid: bool = False, ) -> T_Dataset: """Resample `HADs` `xarray` time series to 2.2km.""" if isinstance(hads_xr_time_series, PathLike): @@ -537,6 +547,7 @@ def hads_resample_and_reproject( x_coord_column_name=source_x_coord_column_name, y_coord_column_name=source_y_coord_column_name, method=method, + use_reference_grid=use_reference_grid, ) if vars_to_drop: interpolated_hads = interpolated_hads.drop_vars(vars_to_drop) @@ -1288,7 +1299,7 @@ def cftime_range_gen(time_data_array: T_DataArray, **kwargs) -> NDArray: assert hasattr(time_data_array, "time") time_bnds_fix_range_start: CFTimeIndex = cftime_range( time_data_array.time.dt.strftime(ISO_DATE_FORMAT_STR).values[0], - time_data_array.time.dt.strftime(ISO_DATE_FORMAT_STR).values[0], + time_data_array.time.dt.strftime(ISO_DATE_FORMAT_STR).values[-1], **kwargs, ) time_bnds_fix_range_end: CFTimeIndex = time_bnds_fix_range_start + timedelta(days=1) diff --git a/python/pdm.lock b/python/pdm.lock index a7480f80..b453cf68 100644 --- a/python/pdm.lock +++ b/python/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.4.1" -content_hash = "sha256:bcc175d83c3ba888da4211def99cede8eecc624e36e5006b2ae99f3157361056" +content_hash = "sha256:996b7c055224d6d78334907c4e0b4d1ca9e0237e6b00b7a81caa5b71213fe036" [[package]] name = "affine" @@ -691,6 +691,17 @@ files = [ {file = "dep_logic-0.2.0.tar.gz", hash = "sha256:cff502b515aff2d413d19d6afc70174fc67da19e821be4a9b68460ccee2514c9"}, ] +[[package]] +name = "dill" +version = "0.3.8" +requires_python = ">=3.8" +summary = "serialize all of Python" +groups = ["default"] +files = [ + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, +] + [[package]] name = "distlib" version = "0.3.8" diff --git a/python/pyproject.toml b/python/pyproject.toml index 237eece9..c79a8822 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -37,6 +37,7 @@ dependencies = [ "pdm>=2.12.4", "typer>=0.12.3", "seaborn>=0.13.2", + "dill>=0.3.8", ] [project.scripts] diff --git a/python/tests/test_pipeline.py b/python/tests/test_pipeline.py index 234b20ca..4cdecbe8 100644 --- a/python/tests/test_pipeline.py +++ b/python/tests/test_pipeline.py @@ -43,9 +43,10 @@ def test_main( capsys, ) -> None: """Test running pipeline configurations.""" - output_path: Path = ( - test_runs_output_path / f"{'-'.join(variables)}-multi-{multiprocess}" - ) + run_folder_name: str = f"{'-'.join(variables)}-multi-{multiprocess}" + if execute: + run_folder_name = "executed-" + run_folder_name + output_path: Path = test_runs_output_path / run_folder_name results = main( execute=execute, diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 34e34340..643443c2 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -152,6 +152,21 @@ ) ) +FINAL_CPM_DEC_10_5_X_0_10_Y: Final[NDArray] = np.array( + ( + np.nan, + np.nan, + np.nan, + np.nan, + np.nan, + np.nan, + 12.31753, + 12.31753, + 12.305811, + 12.290186, + ) +) + @pytest.mark.mount @pytest.fixture(scope="session") @@ -673,8 +688,9 @@ def test_cpm_warp_steps( variable_name: str = "tasmax", ) -> None: """Test all steps around calendar and warping CPM RAW data.""" - # file_name_prefix: str = "test-1980" - output_path: Path = test_runs_output_path / "test-cpm-warp" + output_path: Path = results_path( + "test-cpm-warp", path=test_runs_output_path, mkdir=True + ) test_intermediate_files = IntermediateCPMFilesManager( variable_name=variable_name, output_path=output_path, @@ -702,7 +718,6 @@ def test_cpm_warp_steps( test_intermediate_files.final_nc_path, decode_coords="all" ) assert (final_results.time == projected.time).all() - assert False @pytest.mark.xfail(reason="test not complete") @@ -809,7 +824,9 @@ def test_ukcp_manager(resample_test_cpm_output_path, config: str) -> None: assert export.dims["time"] == 365 assert export.dims[FINAL_RESAMPLE_LON_COL] == 492 assert export.dims[FINAL_RESAMPLE_LAT_COL] == 608 # previously 603 - assert not np.isnan(export.tasmax.head()[0].values).all() + # TODO: check final correct values + assert_allclose(export.tasmax[10][5][:10].values, FINAL_CPM_DEC_10_5_X_0_10_Y) + # assert not np.isnan(export.tasmax.head()[0].values).all() # Todo: reapply these checks to intermediary files # assert export.dims[CPRUK_XDIM] == 484 # assert export.dims[CPRUK_YDIM] == 606 @@ -851,11 +868,13 @@ def test_hads_manager(resample_test_hads_output_path, range: bool) -> None: @pytest.mark.mount @pytest.mark.slow @pytest.mark.parametrize("data_type", ("hads", "cpm")) +@pytest.mark.parametrize("use_reference_grid", (True, False)) def test_interpolate_coords( data_type: str, reference_final_coord_grid: T_Dataset, tasmax_cpm_1980_raw: T_Dataset, tasmax_hads_1980_raw: T_Dataset, + use_reference_grid: bool, ) -> None: """Test reprojecting raw spatial files. @@ -866,32 +885,50 @@ def test_interpolate_coords( reprojected_xr_time_series: T_Dataset kwargs: dict[str, Any] = dict( variable_name="tasmax", - x_grid=reference_final_coord_grid.projection_x_coordinate, - y_grid=reference_final_coord_grid.projection_y_coordinate, + x_grid=reference_final_coord_grid.projection_x_coordinate.values, + y_grid=reference_final_coord_grid.projection_y_coordinate.values, ) + x_col_name: str = HADS_XDIM + y_col_name: str = HADS_YDIM if data_type == "hads": reprojected_xr_time_series = interpolate_coords( tasmax_hads_1980_raw, - x_coord_column_name=HADS_XDIM, - y_coord_column_name=HADS_YDIM, + x_coord_column_name=x_col_name, + y_coord_column_name=y_col_name, + use_reference_grid=use_reference_grid, **kwargs, ) assert reprojected_xr_time_series.dims["time"] == 31 # assert reprojected_xr_time_series.dims[HADS_XDIM] == 528 # assert reprojected_xr_time_series.dims[HADS_YDIM] == 651 - assert reprojected_xr_time_series.rio.crs + assert_allclose( + reprojected_xr_time_series.tasmax[10][430][230:250], + FINAL_HADS_JAN_10_430_X_230_250_Y, + ) + if use_reference_grid: + assert reprojected_xr_time_series.rio.crs == BRITISH_NATIONAL_GRID_EPSG + else: + assert reprojected_xr_time_series.rio.crs == tasmax_hads_1980_raw.rio.crs else: + x_col_name = CPRUK_XDIM + y_col_name = CPRUK_YDIM # We are now using gdal_warp_wrapper. See test_cpm_warp_steps reprojected_xr_time_series = interpolate_coords( tasmax_cpm_1980_raw, - x_coord_column_name=CPRUK_XDIM, - y_coord_column_name=CPRUK_YDIM, + x_coord_column_name=x_col_name, + y_coord_column_name=y_col_name, + use_reference_grid=use_reference_grid, **kwargs, ) # Note: this test is to a raw file without 365 day projection assert reprojected_xr_time_series.dims["time"] == 360 - assert reprojected_xr_time_series.dims[HADS_XDIM] == 528 - assert reprojected_xr_time_series.dims[HADS_YDIM] == 651 + assert np.isnan(reprojected_xr_time_series.tasmax[0][10][5][:10].values).all() + if use_reference_grid: + assert reprojected_xr_time_series.rio.crs == BRITISH_NATIONAL_GRID_EPSG + else: + assert reprojected_xr_time_series.rio.crs == tasmax_cpm_1980_raw.rio.crs + assert reprojected_xr_time_series.dims[x_col_name] == 528 + assert reprojected_xr_time_series.dims[y_col_name] == 651 @pytest.mark.mount @@ -919,8 +956,12 @@ def test_hads_resample_and_reproject( variable_name=variable_name, ) - plot_xarray(reprojected[0], path=output_path / "tasmas-1980.png", time_stamp=True) - assert_allclose(reprojected[10][430][230:250], FINAL_HADS_JAN_10_430_X_230_250_Y) + plot_xarray( + reprojected.tasmax[0], path=output_path / "tasmas-1980.png", time_stamp=True + ) + assert_allclose( + reprojected.tasmax[10][430][230:250], FINAL_HADS_JAN_10_430_X_230_250_Y + ) assert reprojected.rio.crs.to_epsg() == int(BRITISH_NATIONAL_GRID_EPSG[5:]) export_netcdf_path: Path = results_path( "tasmax-1980-converted", path=output_path, extension="nc" From f9925aeee6c860d3fb3d08a4491c553029e02a6d Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 2 Jun 2024 17:18:55 +0100 Subject: [PATCH 10/92] feat(test): add `--mount-fixture-config` `pytest` cli run option and add `tests/utils.py` --- python/clim_recal/utils/xarray.py | 101 +----------- python/conftest.py | 143 ++++++----------- python/tests/test_resample.py | 90 ++++------- python/tests/utils.py | 259 ++++++++++++++++++++++++++++++ 4 files changed, 342 insertions(+), 251 deletions(-) create mode 100644 python/tests/utils.py diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index a2ff4801..3eaf8acd 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -3,7 +3,7 @@ from logging import getLogger from os import PathLike from pathlib import Path -from typing import Any, Callable, Final, Iterable, Literal, Sequence +from typing import Any, Callable, Final, Literal, Sequence import numpy as np import rioxarray # nopycln: import @@ -11,11 +11,11 @@ from cftime._cftime import Datetime360Day from geopandas import GeoDataFrame, read_file from matplotlib import pyplot as plt -from numpy import array, ndarray, random +from numpy import ndarray from numpy.typing import NDArray from osgeo.gdal import Dataset as GDALDataset from osgeo.gdal import GDALWarpAppOptions, Warp, WarpOptions -from pandas import DatetimeIndex, date_range, to_datetime +from pandas import DatetimeIndex, date_range from xarray import CFTimeIndex, DataArray, Dataset, cftime_range, open_dataset from xarray.backends.api import ENGINES from xarray.coding.calendar_ops import convert_calendar @@ -30,9 +30,7 @@ from .core import ( CLI_DATE_FORMAT_STR, ISO_DATE_FORMAT_STR, - DateType, climate_data_mount_path, - date_range_generator, date_range_to_str, results_path, time_str, @@ -91,11 +89,6 @@ } """City centre `(lon, lat)` `tuple` coords of `Glasgow`, `Manchester` and `London`.""" -XARRAY_EXAMPLE_RANDOM_SEED: Final[int] = 0 -# Default 4 year start and end date covering leap year -XARRAY_EXAMPLE_START_DATE_STR: Final[str] = "1980-11-30" -XARRAY_EXAMPLE_END_DATE_4_YEARS: Final[str] = "1984-11-30" - @dataclass class CityCoords: @@ -1079,94 +1072,6 @@ def apply_geo_func( return export_path -# Note: `rioxarray` is imported to ensure GIS methods are included. See: -# https://corteva.github.io/rioxarray/stable/getting_started/getting_started.html#rio-accessor -def xarray_example( - start_date: DateType = XARRAY_EXAMPLE_START_DATE_STR, - end_date: DateType = XARRAY_EXAMPLE_END_DATE_4_YEARS, - coordinates: dict[str, tuple[float, float]] = THREE_CITY_CENTRE_COORDS, - skip_dates: Iterable[date] | None = None, - random_seed_int: int | None = XARRAY_EXAMPLE_RANDOM_SEED, - name: str | None = None, - as_dataset: bool = False, - **kwargs, -) -> DataArray | Dataset: - """Generate spatial and temporal `xarray` objects. - - Parameters - ---------- - start_date - Start of time series. - end_date - End of time series (by default not inclusive). - coordinates - A `dict` of region name `str` to `tuple` of - `(lon, lat)` form. - skip_dates - A list of `date` objects to drop/skip between - `start_date` and `end_date`. - as_dataset - Convert output to `Dataset`. - name - Name of returned `DataArray` and `Dataset`. - kwargs - Additional parameters to pass to `date_range_generator`. - - Returns - ------- - : - A `DataArray` of `start_date` to `end_date` date - range a random variable for coordinates regions - (Glasgow, Manchester and London as default). - - Examples - -------- - >>> xarray_example('1980-11-30', '1980-12-5') - ... - array([[..., ..., ...], - [..., ..., ...], - [..., ..., ...], - [..., ..., ...], - [..., ..., ...]]) - Coordinates: - * time (time) datetime64[ns] ...1980-11-30 ... 1980-12-04 - * space (space) tuple[datetime, datetime]: diff --git a/python/conftest.py b/python/conftest.py index fe8fe20e..18d70251 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -1,29 +1,14 @@ from pathlib import Path from pprint import pprint from shutil import copytree, rmtree -from typing import Final, Iterator +from typing import Final, Iterator, Literal import pytest from coverage_badge.__main__ import main as gen_cov_badge from xarray import DataArray, Dataset from clim_recal.config import ClimRecalConfig -from clim_recal.debiasing.debias_wrapper import ( - CALIB_DATES_STR_DEFAULT, - CMETHODS_FILE_NAME, - CMETHODS_OUT_FOLDER_DEFAULT, - DATA_PATH_DEFAULT, - MOD_FOLDER_DEFAULT, - OBS_FOLDER_DEFAULT, - PREPROCESS_FILE_NAME, - PREPROCESS_OUT_FOLDER_DEFAULT, - PROCESSESORS_DEFAULT, - VALID_DATES_STR_DEFAULT, - CityOptions, - MethodOptions, - RunOptions, - VariableOptions, -) +from clim_recal.debiasing.debias_wrapper import CityOptions from clim_recal.resample import CPM_OUTPUT_LOCAL_PATH, HADS_OUTPUT_LOCAL_PATH from clim_recal.utils.core import ( ISO_DATE_FORMAT_STR, @@ -31,26 +16,27 @@ climate_data_mount_path, is_climate_data_mounted, is_platform_darwin, - iter_to_tuple_strs, results_path, ) from clim_recal.utils.server import CondaLockFileManager -from clim_recal.utils.xarray import ( - GLASGOW_GEOM_LOCAL_PATH, +from clim_recal.utils.xarray import GLASGOW_GEOM_LOCAL_PATH, BoundsTupleType +from tests.utils import ( + CLI_CMETHODS_DEFAULT_COMMAND_STR_CORRECT, + CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT, + CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_STR_CORRECT, + CLI_PREPROCESS_DEFAULT_COMMAND_STR_CORRECT, + CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT, + CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT, + TEST_AUTH_CSV_FILE_NAME, + XARRAY_END_DATE_4_DAYS, + XARRAY_END_DATE_8_DAYS, XARRAY_EXAMPLE_END_DATE_4_YEARS, - BoundsTupleType, + XARRAY_SKIP_2_FROM_8_DAYS, xarray_example, ) MOUNT_DOCTEST_SKIP_MESSAGE: Final[str] = "requires external data mounted" # Date Range covering leap year -XARRAY_END_DATE_4_DAYS: Final[str] = "1980-12-5" -XARRAY_END_DATE_8_DAYS: Final[str] = "1980-12-10" -XARRAY_SKIP_2_FROM_8_DAYS: Final[tuple[str, str]] = ( - "1980-12-7", - "1980-12-8", -) -TEST_AUTH_CSV_FILE_NAME: Final[Path] = Path("test_auth.csv") BADGE_PATH: Final[Path] = Path("docs") / "assets" / "coverage.svg" CLIMATE_DATA_MOUNT_PATH_LINUX: Final[Path] = Path("/mnt/vmfileshare/ClimateData") @@ -63,67 +49,7 @@ ) PYTHON_DIR_NAME: Final[Path] = Path("python") TEST_DATA_PATH: Final[Path] = TEST_FILE_PATH / "data" - -CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT: Final[tuple[str, ...]] = ( - "python", - PREPROCESS_FILE_NAME, - "--mod", - DATA_PATH_DEFAULT / MOD_FOLDER_DEFAULT / CityOptions.default(), - "--obs", - DATA_PATH_DEFAULT / OBS_FOLDER_DEFAULT / CityOptions.default(), - "-v", - VariableOptions.default(), - "-r", - RunOptions.default(), - "--out", - ( - DATA_PATH_DEFAULT - / PREPROCESS_OUT_FOLDER_DEFAULT - / CityOptions.default() - / RunOptions.default() - / VariableOptions.default() - ), - "--calib_dates", - CALIB_DATES_STR_DEFAULT, - "--valid_dates", - VALID_DATES_STR_DEFAULT, -) - -CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT: Final[ - tuple[str, ...] -] = iter_to_tuple_strs(CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT) - -CLI_PREPROCESS_DEFAULT_COMMAND_STR_CORRECT: Final[str] = " ".join( - CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT -) - -CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT: Final[tuple[str, ...]] = ( - "python", - CMETHODS_FILE_NAME, - "--input_data_folder", - CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT[11], - "--out", - ( - DATA_PATH_DEFAULT - / CMETHODS_OUT_FOLDER_DEFAULT - / CityOptions.default() - / RunOptions.default() - ).resolve(), - "--method", - MethodOptions.default(), - "-v", - VariableOptions.default(), - "-p", - PROCESSESORS_DEFAULT, -) - -CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_STR_CORRECT: Final[ - tuple[str, ...] -] = iter_to_tuple_strs(CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT) - -CLI_CMETHODS_DEFAULT_COMMAND_STR_CORRECT: Final[str] = " ".join( - CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_STR_CORRECT -) +LOCAL_FIXTURE_PATH_NAME: Final[Path] = Path("local-cache") MOD_FOLDER_FILES_COUNT_CORRECT: Final[int] = 1478 @@ -131,6 +57,10 @@ PREPROCESS_OUT_FOLDER_FILES_COUNT_CORRECT: Final[int] = 4 +MOUNT_FIXTURE_CONFIG_CHOICES: Final[tuple[str, str]] = ("mount", "local_cache") +MountFixtureConfigChoices = Literal[*MOUNT_FIXTURE_CONFIG_CHOICES] + + @pytest.fixture def mod_folder_files_count_correct() -> int: return MOD_FOLDER_FILES_COUNT_CORRECT @@ -160,6 +90,10 @@ def data_mount_path() -> Path: ------- The `Path` climate data would likely be mounted to. """ + # if 'localcache' in fixture_data_source_marks: + # assert False + # return LOCAL_CACHE_FIXTURE_PATH + # else: return climate_data_mount_path() @@ -242,9 +176,26 @@ def test_runs_output_path(path=TEST_RESULTS_PATH) -> Iterator[Path]: rmtree(path, ignore_errors=True) +def pytest_addoption(parser): + """Add test cli config options.""" + parser.addoption( + "--mount-fixture-config", + choices=MOUNT_FIXTURE_CONFIG_CHOICES, + # action="store", + default="mount", # 'mount' + type=str, + help="'mount' or 'local_cache' data fixture types", + ) + + +@pytest.fixture(scope="session") +def mount_fixture_config(request) -> MountFixtureConfigChoices: + return request.config.getoption("--mount-fixture-config") + + @pytest.fixture(scope="session") def local_cache_path() -> Path: - return TEST_DATA_PATH + return TEST_DATA_PATH / LOCAL_FIXTURE_PATH_NAME @pytest.fixture(scope="session") @@ -399,6 +350,18 @@ def doctest_auto_fixtures( doctest_namespace["clim_runner"] = clim_runner +# def pytest_generate_tests(metafunc): +# """Customise the standard process of generating tests.""" +# fixture_data_source_marks: list[str] = ['mount'] +# # use_local_cache: bool = False +# # if "use_local_cache" in metafunc.fixturenames: +# #use_local_fixture_cache: bool = metafunc.config.getoption("use_local_fixture_cache") +# if metafunc.config.getoption("use_local_fixture_cache"): +# fixture_data_source_marks.append('localcache') +# metafunc.parametrize("fixture_data_sources", fixture_data_source_marks, indirect=True) +# # metafunc.parametrize("use_local_cache", use_local_cache) + + def pytest_sessionfinish(session, exitstatus): """Generate badges for docs after tests finish. diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 643443c2..6b671088 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -30,9 +30,6 @@ ) from clim_recal.utils.core import ( CLI_DATE_FORMAT_STR, - CPM_YEAR_DAYS, - LEAP_YEAR_DAYS, - NORMAL_YEAR_DAYS, DateType, annual_data_path, annual_data_paths_generator, @@ -64,9 +61,10 @@ hads_resample_and_reproject, interpolate_coords, plot_xarray, - xarray_example, ) +from .utils import xarray_example, year_days_count + HADS_UK_TASMAX_DAY_SERVER_PATH: Final[Path] = Path("Raw/HadsUKgrid/tasmax/day") HADS_UK_RESAMPLED_DAY_SERVER_PATH: Final[Path] = Path( "Processed/HadsUKgrid/resampled_2.2km/tasmax/day" @@ -168,13 +166,33 @@ ) +# @pytest.mark.mount +# @pytest.fixture(scope="session") +# def tasmax_cpm_1980_raw() -> T_Dataset: +# # Backup path if furture rehydration issues +# # return open_dataset("/Volumes/vmfileshare/ClimateData/Raw/UKCP2.2/tasmin/05/latest/tasmin_rcp85_land-cpm_uk_2.2km_05_day_19801201-19811130.nc", decode_coords="all") +# # return open_dataset(local_cpm_cache_path / UKCP_RAW_TASMAX_1980_FILE, decode_coorda="all") +# return open_dataset(UKCP_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") @pytest.mark.mount +# @pytest.mark.localcache +# @pytest.fixture(scope="session", params=("mount", "localcache")) @pytest.fixture(scope="session") -def tasmax_cpm_1980_raw() -> T_Dataset: - # Backup path if furture rehydration issues - # return open_dataset("/Volumes/vmfileshare/ClimateData/Raw/UKCP2.2/tasmin/05/latest/tasmin_rcp85_land-cpm_uk_2.2km_05_day_19801201-19811130.nc", decode_coords="all") - # return open_dataset(local_cpm_cache_path / UKCP_RAW_TASMAX_1980_FILE, decode_coorda="all") - return open_dataset(UKCP_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") +def tasmax_cpm_1980_raw( + # request: pytest.FixtureRequest, local_cpm_cache_path: Path, + # localfixturecare: bool, + mount_fixture_config: str, + local_cpm_cache_path: Path, +) -> T_Dataset: + if mount_fixture_config == "mount": + # return open_dataset(HADS_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") + return open_dataset(UKCP_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") + # Using below to manage issues with server mount + elif mount_fixture_config == "local_cache": + return open_dataset( + local_cpm_cache_path / UKCP_RAW_TASMAX_1980_FILE, decode_coords="all" + ) + else: + raise ValueError(f"only 'mount' and 'localcache' params are supported") @pytest.mark.mount @@ -234,60 +252,6 @@ def ukcp_tasmax_local_test_path(data_fixtures_path: Path) -> Path: return data_fixtures_path / UKCP_TASMAX_LOCAL_TEST_PATH -class StandardWith360DayError(Exception): - ... - - -def year_days_count( - standard_years: int = 0, - leap_years: int = 0, - xarray_360_day_years: int = 0, - strict: bool = True, -) -> int: - """Return the number of days for the combination of learn lengths. - - Parameters - ---------- - standard_years - Count of 365 day years. - leap_years - Count of 366 day years. - xarray_360_day_years - Count of 360 day years following xarray's specification. - strict - Whether to prevent combining `standard_years` or `leap_years` - with `xarray_360_day_years`. - - Returns - ------- - Sum of all year type counts - - Examples - -------- - >>> year_days_count(standard_years=4) == NORMAL_YEAR_DAYS*4 == 365*4 - True - >>> year_days_count(xarray_360_day_years=4) == CPM_YEAR_DAYS*4 == 360*4 - True - >>> (year_days_count(standard_years=3, leap_years=1) - ... == NORMAL_YEAR_DAYS*3 + LEAP_YEAR_DAYS - ... == 365*3 + 366) - True - """ - if strict and (standard_years or leap_years) and xarray_360_day_years: - raise StandardWith360DayError( - f"With 'strict == True', " - f"{standard_years} standard (365 day) years and/or " - f"{leap_years} leap (366 day) years " - f"cannot be combined with " - f"xarray_360_day_years ({xarray_360_day_years})." - ) - return ( - standard_years * NORMAL_YEAR_DAYS - + leap_years * LEAP_YEAR_DAYS - + xarray_360_day_years * CPM_YEAR_DAYS - ) - - def test_leap_year_days() -> None: """Test covering a leap year of 366 days.""" start_date_str: str = "2024-03-01" diff --git a/python/tests/utils.py b/python/tests/utils.py new file mode 100644 index 00000000..e2893b8c --- /dev/null +++ b/python/tests/utils.py @@ -0,0 +1,259 @@ +from collections.abc import Hashable +from dataclasses import dataclass, field +from datetime import date +from os import PathLike +from pathlib import Path +from typing import Final, Iterable, Sequence + +from numpy import array, random +from pandas import date_range, to_datetime +from xarray import DataArray +from xarray.core.types import T_DataArray, T_DataArrayOrSet + +from clim_recal.debiasing.debias_wrapper import ( + CALIB_DATES_STR_DEFAULT, + CMETHODS_FILE_NAME, + CMETHODS_OUT_FOLDER_DEFAULT, + DATA_PATH_DEFAULT, + MOD_FOLDER_DEFAULT, + OBS_FOLDER_DEFAULT, + PREPROCESS_FILE_NAME, + PREPROCESS_OUT_FOLDER_DEFAULT, + PROCESSESORS_DEFAULT, + VALID_DATES_STR_DEFAULT, + CityOptions, + MethodOptions, + RunOptions, + VariableOptions, +) +from clim_recal.utils.core import ( + CPM_YEAR_DAYS, + ISO_DATE_FORMAT_STR, + LEAP_YEAR_DAYS, + NORMAL_YEAR_DAYS, + DateType, + date_range_generator, + iter_to_tuple_strs, +) +from clim_recal.utils.xarray import THREE_CITY_CENTRE_COORDS + +XARRAY_EXAMPLE_RANDOM_SEED: Final[int] = 0 +# Default 4 year start and end date covering leap year +XARRAY_EXAMPLE_START_DATE_STR: Final[str] = "1980-11-30" +XARRAY_EXAMPLE_END_DATE_4_YEARS: Final[str] = "1984-11-30" + +XARRAY_END_DATE_4_DAYS: Final[str] = "1980-12-5" +XARRAY_END_DATE_8_DAYS: Final[str] = "1980-12-10" +XARRAY_SKIP_2_FROM_8_DAYS: Final[tuple[str, str]] = ( + "1980-12-7", + "1980-12-8", +) +TEST_AUTH_CSV_FILE_NAME: Final[Path] = Path("test_auth.csv") + +CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT: Final[tuple[str | Path, ...]] = ( + "python", + PREPROCESS_FILE_NAME, + "--mod", + DATA_PATH_DEFAULT / MOD_FOLDER_DEFAULT / CityOptions.default(), + "--obs", + DATA_PATH_DEFAULT / OBS_FOLDER_DEFAULT / CityOptions.default(), + "-v", + VariableOptions.default(), + "-r", + RunOptions.default(), + "--out", + ( + DATA_PATH_DEFAULT + / PREPROCESS_OUT_FOLDER_DEFAULT + / CityOptions.default() + / RunOptions.default() + / VariableOptions.default() + ), + "--calib_dates", + CALIB_DATES_STR_DEFAULT, + "--valid_dates", + VALID_DATES_STR_DEFAULT, +) + +CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT: Final[ + tuple[str, ...] +] = iter_to_tuple_strs(CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT) + +CLI_PREPROCESS_DEFAULT_COMMAND_STR_CORRECT: Final[str] = " ".join( + CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT +) + +CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT: Final[tuple[str | Path, ...]] = ( + "python", + CMETHODS_FILE_NAME, + "--input_data_folder", + CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT[11], + "--out", + ( + DATA_PATH_DEFAULT + / CMETHODS_OUT_FOLDER_DEFAULT + / CityOptions.default() + / RunOptions.default() + ).resolve(), + "--method", + MethodOptions.default(), + "-v", + VariableOptions.default(), + "-p", + PROCESSESORS_DEFAULT, +) + +CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_STR_CORRECT: Final[ + tuple[str, ...] +] = iter_to_tuple_strs(CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT) + +CLI_CMETHODS_DEFAULT_COMMAND_STR_CORRECT: Final[str] = " ".join( + CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_STR_CORRECT +) + + +class StandardWith360DayError(Exception): + ... + + +def year_days_count( + standard_years: int = 0, + leap_years: int = 0, + xarray_360_day_years: int = 0, + strict: bool = True, +) -> int: + """Return the number of days for the combination of year lengths. + + Parameters + ---------- + standard_years + Count of 365 day years. + leap_years + Count of 366 day years. + xarray_360_day_years + Count of 360 day years following xarray's specification. + strict + Whether to prevent combining `standard_years` or `leap_years` + with `xarray_360_day_years`. + + Returns + ------- + Sum of all year type counts + + Examples + -------- + >>> year_days_count(standard_years=4) == NORMAL_YEAR_DAYS*4 == 365*4 + True + >>> year_days_count(xarray_360_day_years=4) == CPM_YEAR_DAYS*4 == 360*4 + True + >>> (year_days_count(standard_years=3, leap_years=1) + ... == NORMAL_YEAR_DAYS*3 + LEAP_YEAR_DAYS + ... == 365*3 + 366) + True + """ + if strict and (standard_years or leap_years) and xarray_360_day_years: + raise StandardWith360DayError( + f"With 'strict == True', " + f"{standard_years} standard (365 day) years and/or " + f"{leap_years} leap (366 day) years " + f"cannot be combined with " + f"xarray_360_day_years ({xarray_360_day_years})." + ) + return ( + standard_years * NORMAL_YEAR_DAYS + + leap_years * LEAP_YEAR_DAYS + + xarray_360_day_years * CPM_YEAR_DAYS + ) + + +# Note: `rioxarray` is imported to ensure GIS methods are included. See: +# https://corteva.github.io/rioxarray/stable/getting_started/getting_started.html#rio-accessor +def xarray_example( + start_date: DateType = XARRAY_EXAMPLE_START_DATE_STR, + end_date: DateType = XARRAY_EXAMPLE_END_DATE_4_YEARS, + coordinates: dict[str, tuple[float, float]] = THREE_CITY_CENTRE_COORDS, + skip_dates: Iterable[date] | None = None, + random_seed_int: int | None = XARRAY_EXAMPLE_RANDOM_SEED, + name: str | None = None, + as_dataset: bool = False, + **kwargs, +) -> T_DataArrayOrSet: + """Generate spatial and temporal `xarray` objects. + + Parameters + ---------- + start_date + Start of time series. + end_date + End of time series (by default not inclusive). + coordinates + A `dict` of region name `str` to `tuple` of + `(lon, lat)` form. + skip_dates + A list of `date` objects to drop/skip between + `start_date` and `end_date`. + as_dataset + Convert output to `Dataset`. + name + Name of returned `DataArray` and `Dataset`. + kwargs + Additional parameters to pass to `date_range_generator`. + + Returns + ------- + : + A `DataArray` of `start_date` to `end_date` date + range a random variable for coordinates regions + (Glasgow, Manchester and London as default). + + Examples + -------- + >>> xarray_example('1980-11-30', '1980-12-5') + ... + array([[..., ..., ...], + [..., ..., ...], + [..., ..., ...], + [..., ..., ...], + [..., ..., ...]]) + Coordinates: + * time (time) datetime64[ns] ...1980-11-30 ... 1980-12-04 + * space (space) Date: Sun, 2 Jun 2024 17:26:06 +0100 Subject: [PATCH 11/92] fix(test): add `tests/__init__.py` --- python/tests/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 python/tests/__init__.py diff --git a/python/tests/__init__.py b/python/tests/__init__.py new file mode 100644 index 00000000..e69de29b From f3296b2f27a8e3505c9a917558e2f6adf6862b51 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Mon, 3 Jun 2024 01:09:35 +0100 Subject: [PATCH 12/92] feat(test): add `rsync` called by `LocalCache` and `LocalCachesManager` --- .conda-linux-64.lock | 10 +- conda-lock.yml | 235 +++++++++++++++--- environment.yml | 1 + python/clim_recal/debiasing/debias_wrapper.py | 4 +- python/conftest.py | 69 +++-- python/pdm.lock | 27 +- python/pyproject.toml | 1 + python/tests/test_resample.py | 48 ++-- python/tests/utils.py | 229 ++++++++++++++++- 9 files changed, 509 insertions(+), 115 deletions(-) diff --git a/.conda-linux-64.lock b/.conda-linux-64.lock index 079fc5ec..69111042 100644 --- a/.conda-linux-64.lock +++ b/.conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 11beb7914787d1501787a8c8808a03235a67f9bd485168bbba543e06508fbba6 +# input_hash: e93d626994b24acc9824124ff7f680fce2a576875f8b1052dd7b9635db71c386 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://repo.anaconda.com/pkgs/main/linux-64/blas-1.0-openblas.conda#9ddfcaef10d79366c90128f5dc444be8 @@ -64,6 +64,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.con https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 https://repo.anaconda.com/pkgs/main/linux-64/xorg-xproto-7.0.31-h27cfd23_1007.conda#287ea0f32c5f1c209e5030ead360b613 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://repo.anaconda.com/pkgs/main/linux-64/xz-5.4.6-h5eee18b_1.conda#1562802f843297ee776a50b9329597ed https://repo.anaconda.com/pkgs/main/linux-64/yaml-0.2.5-h7b6447c_0.conda#39fdbf4db769e494ffb06d95680c83d8 https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.14-h88a6e22_1.conda#7ed63b0e816dd1635903506ef5d2c079 @@ -83,6 +84,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda#5d801a4906adc712d480afc362623b59 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 +https://conda.anaconda.org/conda-forge/linux-64/popt-1.16-h0b475e3_2002.tar.bz2#78388f97473c02e5ac8a3742eee4c959 https://repo.anaconda.com/pkgs/main/linux-64/readline-8.2-h5eee18b_0.conda#be42180685cce6e6b0329201d9f48efb https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.15-he19d79f_0.conda#4c7cc3fa1d2c5a63f9e2b1e2980a1672 https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.13.0-hd2e6256_0.conda#18f9348f064632785d54dbd1db9344bb @@ -107,6 +109,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#6 https://repo.anaconda.com/pkgs/main/linux-64/minizip-4.0.3-hf59b114_0.conda#e1efccc2d4cfe54c7119600ea6dcdbe7 https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda#949c4a82290ee58b3c970cef4bcfd4ad https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda +https://conda.anaconda.org/conda-forge/linux-64/rsync-3.3.0-he6cb5fe_0.conda#27da3fb7abe92e3ef592eda5321a0230 https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.45.3-h5eee18b_0.conda#acf93d6aceb74d6110e20b44cc45939e https://repo.anaconda.com/pkgs/main/linux-64/tk-8.6.14-h39e8969_0.conda#78dbc5e3c69143ebc037fc5d5b22e597 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec @@ -158,7 +161,7 @@ https://repo.anaconda.com/pkgs/main/noarch/executing-0.8.3-pyhd3eb1b0_0.conda#7b https://repo.anaconda.com/pkgs/main/linux-64/filelock-3.13.1-py312h06a4308_0.conda#6a0b440821945eda176c2bd78fd64a56 https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda#d427988dc3dbd0a4c136f52db356cc6a https://repo.anaconda.com/pkgs/main/linux-64/h11-0.14.0-py312h06a4308_0.conda#6e32d4e1d4c9409293e63ecf19755482 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_102.conda#d8cb3688b92e891e1e5f613517a50ca8 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_103.conda#ef50687276c086d59006696e1153fd60 https://repo.anaconda.com/pkgs/main/linux-64/idna-3.7-py312h06a4308_0.conda#03cc59cdabff44c47be0fadffcef003c https://repo.anaconda.com/pkgs/main/linux-64/importlib_resources-6.1.1-py312h06a4308_1.conda#13691687030e6f6b299bd04173696daf https://repo.anaconda.com/pkgs/main/noarch/iniconfig-1.1.1-pyhd3eb1b0_0.tar.bz2#e40edff2c5708f342cef43c7f280c507 @@ -284,6 +287,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/python-dateutil-2.9.0post0-py312h06 https://repo.anaconda.com/pkgs/main/linux-64/python-dotenv-0.21.0-py312h06a4308_0.conda#f983f4d6278453e00f637442967b29fa https://repo.anaconda.com/pkgs/main/linux-64/referencing-0.30.2-py312h06a4308_0.conda#3113fb44293d20eaae1e67a4876751c9 https://repo.anaconda.com/pkgs/main/linux-64/rfc3339-validator-0.1.4-py312h06a4308_0.conda#2b1db8c436c99c6856a78dad8f2278a1 +https://conda.anaconda.org/conda-forge/noarch/sysrsync-1.1.1-pyhd8ed1ab_0.conda#61b3102a992ef2c82a51c5e386f9aaef https://repo.anaconda.com/pkgs/main/linux-64/terminado-0.17.1-py312h06a4308_0.conda#4bc05c7f0c2e64b82882f774752a0263 https://repo.anaconda.com/pkgs/main/linux-64/tinycss2-1.2.1-py312h06a4308_0.conda#53422e62ac2d242aa12575ba12c2d430 https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda#cf2c3a89f89644c53cadbfeb124914e9 @@ -325,7 +329,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/jsonschema-4.19.2-py312h06a4308_0.c https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-base-3.8.4-py312h526ad5a_0.conda#82aa62c40bd375ed45589ba536312895 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py312h39d4375_101.conda#9033de6c10fd3396990890d8d8a6ac4e https://repo.anaconda.com/pkgs/main/linux-64/pandas-2.2.1-py312h526ad5a_0.conda#f292b675711a103bf8a3c577d052171a -https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.3.6-pyhd8ed1ab_0.conda#a805d5ef0fdc9fbee2c07ce24b118550 +https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.4.1-pyhd8ed1ab_0.conda#2fffd2371d53e1eefc597bae076eef41 https://repo.anaconda.com/pkgs/main/linux-64/pydantic-2.5.3-py312h06a4308_0.conda#b584f35c1c23cfe8bfa0ec111df2408e https://repo.anaconda.com/pkgs/main/linux-64/pyopenssl-24.0.0-py312h06a4308_0.conda#f93a6ad622b84e53aed3d899b5b36f6a https://repo.anaconda.com/pkgs/main/linux-64/scikit-learn-1.4.2-py312h526ad5a_1.conda#7f8e8d231b3df92ca1821f2062c76306 diff --git a/conda-lock.yml b/conda-lock.yml index 49198a37..2906e9c6 100644 --- a/conda-lock.yml +++ b/conda-lock.yml @@ -15,9 +15,9 @@ version: 1 metadata: content_hash: - osx-arm64: 16ab7f522094ab05883469fdd444acf93de252a72d6aec95ee98e67d2b30ff63 - linux-64: 11beb7914787d1501787a8c8808a03235a67f9bd485168bbba543e06508fbba6 - linux-aarch64: b8b106436844ebc9aa2ebafdfdbd3041b469ef0627d7145e49777f094172f66b + osx-arm64: e6085e96c1ef1b76328590db946e02019a43602a6bfb5964669ea986efa533c6 + linux-64: e93d626994b24acc9824124ff7f680fce2a576875f8b1052dd7b9635db71c386 + linux-aarch64: db00b5eb96e5e331116ea643b28eca6b8bb41be698198b6bc678518d5384e367 channels: - url: r used_env_vars: [] @@ -2025,7 +2025,7 @@ package: libpng: '>=1.6.39,<1.7.0a0' libstdcxx-ng: '>=12' libxcb: '>=1.15,<1.16.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' pixman: '>=0.42.2,<1.0a0' xorg-libice: '>=1.1.1,<2.0a0' xorg-libsm: '>=1.2.4,<2.0a0' @@ -2053,7 +2053,7 @@ package: libpng: '>=1.6.39,<1.7.0a0' libstdcxx-ng: '>=12' libxcb: '>=1.15,<1.16.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' pixman: '>=0.42.2,<1.0a0' xorg-libice: '>=1.1.1,<2.0a0' xorg-libsm: '>=1.2.4,<2.0a0' @@ -2080,7 +2080,7 @@ package: libcxx: '>=16.0.6' libglib: '>=2.78.0,<3.0a0' libpng: '>=1.6.39,<1.7.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' pixman: '>=0.42.2,<1.0a0' zlib: '' url: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.0-hd1e100b_0.conda @@ -4572,7 +4572,7 @@ package: libgcc-ng: '>=12' libjpeg-turbo: '>=3.0.0,<4.0a0' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda hash: md5: bd77f8da987968ec3927990495dc22e4 @@ -4587,7 +4587,7 @@ package: libgcc-ng: '>=12' libjpeg-turbo: '>=3.0.0,<4.0a0' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf4-4.2.15-hb6ba311_7.conda hash: md5: e1b6676b77b9690d07ea25de48aed97e @@ -4601,7 +4601,7 @@ package: dependencies: libcxx: '>=15.0.7' libjpeg-turbo: '>=3.0.0,<4.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda hash: md5: ff5d749fd711dc7759e127db38005924 @@ -4621,10 +4621,10 @@ package: libstdcxx-ng: '>=12' libzlib: '>=1.2.13,<2.0a0' openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_102.conda + url: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_103.conda hash: - md5: d8cb3688b92e891e1e5f613517a50ca8 - sha256: fcd864371b32e29557dddd7a9fdc60247586fbf321c06fa63dc287e3572ce99f + md5: ef50687276c086d59006696e1153fd60 + sha256: 2bfb909c1baf041f45ce64c7c76a954e8560b8e7ce5ed22ccb7265168288c771 category: main optional: false - name: hdf5 @@ -4640,10 +4640,10 @@ package: libstdcxx-ng: '>=12' libzlib: '>=1.2.13,<2.0a0' openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.3-nompi_hd1676c9_102.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.3-nompi_hd1676c9_103.conda hash: - md5: 66ff29661def48cd13a6cdd5691e8b77 - sha256: 3d9a6e36a42f915e5d4227bd86f872e0104a33f495a8e67340945caa0089faa8 + md5: c8a665df88f6d87a04d70a4143d744e8 + sha256: e1a68fa2b125d8f53cd78b5d24412f5185e26d350eb1ca007b077c118f9d14c3 category: main optional: false - name: hdf5 @@ -4659,10 +4659,10 @@ package: libgfortran5: '>=13.2.0' libzlib: '>=1.2.13,<2.0a0' openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.3-nompi_hec07895_102.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.3-nompi_hec07895_103.conda hash: - md5: 907a46a97e11629c15ff91c42d1db6d2 - sha256: 7c91f04ba94e8c20b8696d5de74c4b23bdb4a65637d1e9972b4f04212d45da13 + md5: 198270148a9c94ab7b3635e23b0926d4 + sha256: 942970f90942d4f8d71f8a1e17b018084b4f28e9eefa231ff008965b112e7091 category: main optional: false - name: html5lib @@ -8396,7 +8396,7 @@ package: dependencies: bzip2: '>=1.0.8,<2.0a0' libgcc-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.1.2,<4.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda hash: @@ -8411,7 +8411,7 @@ package: dependencies: bzip2: '>=1.0.8,<2.0a0' libgcc-ng: '>=12' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.1.2,<4.0a0' url: https://conda.anaconda.org/conda-forge/linux-aarch64/libzip-1.10.1-h4156a30_3.conda hash: @@ -8425,7 +8425,7 @@ package: platform: osx-arm64 dependencies: bzip2: '>=1.0.8,<2.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' openssl: '>=3.1.2,<4.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/libzip-1.10.1-ha0bc3c6_3.conda hash: @@ -10482,45 +10482,45 @@ package: category: dev optional: true - name: plum-dispatch - version: 2.3.6 + version: 2.4.1 manager: conda platform: linux-64 dependencies: beartype: '>=0.12' python: '>=3.8' rich: '>=10.0' - url: https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.3.6-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.4.1-pyhd8ed1ab_0.conda hash: - md5: a805d5ef0fdc9fbee2c07ce24b118550 - sha256: 653ee7aad4804a3907e83bf7ece62d99a7b8efeb9cbaba2e837d08c6631c3323 + md5: 2fffd2371d53e1eefc597bae076eef41 + sha256: 4179a0b71a0ff5f4def6a2e353cb3f00bf884a8ba384c07c995ffffc37a2a20c category: dev optional: true - name: plum-dispatch - version: 2.3.6 + version: 2.4.1 manager: conda platform: linux-aarch64 dependencies: beartype: '>=0.12' python: '>=3.8' rich: '>=10.0' - url: https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.3.6-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.4.1-pyhd8ed1ab_0.conda hash: - md5: a805d5ef0fdc9fbee2c07ce24b118550 - sha256: 653ee7aad4804a3907e83bf7ece62d99a7b8efeb9cbaba2e837d08c6631c3323 + md5: 2fffd2371d53e1eefc597bae076eef41 + sha256: 4179a0b71a0ff5f4def6a2e353cb3f00bf884a8ba384c07c995ffffc37a2a20c category: dev optional: true - name: plum-dispatch - version: 2.3.6 + version: 2.4.1 manager: conda platform: osx-arm64 dependencies: beartype: '>=0.12' python: '>=3.8' rich: '>=10.0' - url: https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.3.6-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.4.1-pyhd8ed1ab_0.conda hash: - md5: a805d5ef0fdc9fbee2c07ce24b118550 - sha256: 653ee7aad4804a3907e83bf7ece62d99a7b8efeb9cbaba2e837d08c6631c3323 + md5: 2fffd2371d53e1eefc597bae076eef41 + sha256: 4179a0b71a0ff5f4def6a2e353cb3f00bf884a8ba384c07c995ffffc37a2a20c category: dev optional: true - name: poppler @@ -10643,6 +10643,44 @@ package: sha256: f57dd3d1d41130c46ee975bf9ff239e0b27048b79a1906baad05fc2adb54784b category: main optional: false +- name: popt + version: '1.16' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.5.0' + libiconv: '' + url: https://conda.anaconda.org/conda-forge/linux-64/popt-1.16-h0b475e3_2002.tar.bz2 + hash: + md5: 78388f97473c02e5ac8a3742eee4c959 + sha256: 2868865a437515136840dbb7d901adea798128427f32f984cfa4cc56989f90ce + category: main + optional: false +- name: popt + version: '1.16' + manager: conda + platform: linux-aarch64 + dependencies: + libgcc-ng: '>=7.5.0' + libiconv: '' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/popt-1.16-h57fc80e_2002.tar.bz2 + hash: + md5: 12d1bf3f929ef6b789a0050c9dbf250b + sha256: 306b1bf6a337af6b0efa171e6fd86d33c3f6febdbb0ce097ee6e3bbb51fea06c + category: main + optional: false +- name: popt + version: '1.16' + manager: conda + platform: osx-arm64 + dependencies: + libiconv: '>=1.16,<2.0.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/popt-1.16-h61edf1b_2002.tar.bz2 + hash: + md5: 46a89e1cbd7f8dcca8bdd2b5a1bfb1f4 + sha256: b3ccf8160039214e684f19a81212126cdb5c8f19f3601a2491365f0ff0f83672 + category: main + optional: false - name: postgresql version: '16.3' manager: conda @@ -12685,6 +12723,63 @@ package: sha256: 7b8c26a8cdd61a2bfc4105928efc30cb4e91b8d9a7863f35b7dba8e183d63d6d category: main optional: false +- name: rsync + version: 3.3.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libiconv: '>=1.17,<2.0a0' + libzlib: '>=1.2.13,<2.0.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + openssl: '>=3.2.1,<4.0a0' + popt: '>=1.16,<2.0a0' + xxhash: '>=0.8.2,<0.8.3.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/rsync-3.3.0-he6cb5fe_0.conda + hash: + md5: 27da3fb7abe92e3ef592eda5321a0230 + sha256: fca85a7561d4f7a129bb7c18d38caf28111c63c49b899e74f9883571a62d81d4 + category: main + optional: false +- name: rsync + version: 3.3.0 + manager: conda + platform: linux-aarch64 + dependencies: + libgcc-ng: '>=12' + libiconv: '>=1.17,<2.0a0' + libzlib: '>=1.2.13,<2.0.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + openssl: '>=3.2.1,<4.0a0' + popt: '>=1.16,<2.0a0' + xxhash: '>=0.8.2,<0.8.3.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/rsync-3.3.0-hc43869a_0.conda + hash: + md5: 42a94edfc05b9f6435dd7f75a804113e + sha256: a7361b842bfa0fc7e8989a892e1e72677057ccb2dfe23d09df84c45f5e176443 + category: main + optional: false +- name: rsync + version: 3.3.0 + manager: conda + platform: osx-arm64 + dependencies: + libcxx: '>=16' + libiconv: '>=1.17,<2.0a0' + libzlib: '>=1.2.13,<2.0.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + openssl: '>=3.2.1,<4.0a0' + popt: '>=1.16,<2.0a0' + xxhash: '>=0.8.2,<0.8.3.0a0' + zstd: '>=1.5.5,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/rsync-3.3.0-h8fab359_0.conda + hash: + md5: 7d84988fa985d6265b0bb9de23578b69 + sha256: 809f3a2cb948be4e948b27689b1bc62c2e5364a2a8c312f0cd3c9efcba7a98d4 + category: main + optional: false - name: rtree version: 1.0.1 manager: conda @@ -13536,6 +13631,45 @@ package: sha256: 4e1527a4faf81f7d24c529f373c0dc432f2521480dcb528e55333ec8a0520f5a category: main optional: false +- name: sysrsync + version: 1.1.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6.0,<4.0.0' + toml: '>=0.10.0,<0.11.0' + url: https://conda.anaconda.org/conda-forge/noarch/sysrsync-1.1.1-pyhd8ed1ab_0.conda + hash: + md5: 61b3102a992ef2c82a51c5e386f9aaef + sha256: 9fa0f8d53b5de489a4ee152892efc71a480e2d0f56926e21dd308dc769fc6571 + category: dev + optional: true +- name: sysrsync + version: 1.1.1 + manager: conda + platform: linux-aarch64 + dependencies: + python: '>=3.6.0,<4.0.0' + toml: '>=0.10.0,<0.11.0' + url: https://conda.anaconda.org/conda-forge/noarch/sysrsync-1.1.1-pyhd8ed1ab_0.conda + hash: + md5: 61b3102a992ef2c82a51c5e386f9aaef + sha256: 9fa0f8d53b5de489a4ee152892efc71a480e2d0f56926e21dd308dc769fc6571 + category: dev + optional: true +- name: sysrsync + version: 1.1.1 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.6.0,<4.0.0' + toml: '>=0.10.0,<0.11.0' + url: https://conda.anaconda.org/conda-forge/noarch/sysrsync-1.1.1-pyhd8ed1ab_0.conda + hash: + md5: 61b3102a992ef2c82a51c5e386f9aaef + sha256: 9fa0f8d53b5de489a4ee152892efc71a480e2d0f56926e21dd308dc769fc6571 + category: dev + optional: true - name: tabulate version: 0.9.0 manager: conda @@ -15173,6 +15307,41 @@ package: sha256: f36ded62d270405be69f430649ee884d8ced80e3bd7c55e0abd9f718d2a1e59e category: main optional: false +- name: xxhash + version: 0.8.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda + hash: + md5: f08fb5c89edfc4aadee1c81d4cfb1fa1 + sha256: 6fe74a8fd84ab0dc25e4dc3e0c22388dd8accb212897a208b14fe5d4fbb8fc2f + category: main + optional: false +- name: xxhash + version: 0.8.2 + manager: conda + platform: linux-aarch64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.2-h31becfc_0.conda + hash: + md5: bb9faf6857108a9f62ebb4dab6ef05da + sha256: 4c526aed70b579d80e5c20d32130b6bc8bde59b3250d43c2b5269755f4da8a9b + category: main + optional: false +- name: xxhash + version: 0.8.2 + manager: conda + platform: osx-arm64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.2-hb547adb_0.conda + hash: + md5: 144cd3b88706507f332f5eb5fb83a33b + sha256: a70f59f7221ee72c45b39a6b36a33eb9c717ba01921cce1a3c361a4676979a2e + category: main + optional: false - name: xyzservices version: 2022.9.0 manager: conda diff --git a/environment.yml b/environment.yml index 704c5ed1..67dbbaeb 100644 --- a/environment.yml +++ b/environment.yml @@ -8,6 +8,7 @@ dependencies: - python=3.12 - gdal=3.8.5 - parallel + - rsync platforms: - osx-arm64 - linux-64 diff --git a/python/clim_recal/debiasing/debias_wrapper.py b/python/clim_recal/debiasing/debias_wrapper.py index f86884bf..3907adb9 100644 --- a/python/clim_recal/debiasing/debias_wrapper.py +++ b/python/clim_recal/debiasing/debias_wrapper.py @@ -22,7 +22,7 @@ PREPROCESS_FILE_NAME: Final[Path] = Path("preprocess_data.py") CMETHODS_FILE_NAME: Final[Path] = Path("run_cmethods.py") -PROCESSESORS_DEFAULT: Final[int] = 2 +PROCESSORS_DEFAULT: Final[int] = 2 RUN_PREFIX_DEFAULT: Final[str] = "python" MOD_FOLDER_DEFAULT: Final[Path] = Path("Cropped/three.cities/CPM") @@ -83,7 +83,7 @@ class BaseRunConfig: valid_date_start: DateType = VALID_DATE_START_DEFAULT valid_date_end: DateType = VALID_DATE_END_DEFAULT - processors: int = PROCESSESORS_DEFAULT + processors: int = PROCESSORS_DEFAULT date_format_str: str = CLI_DATE_FORMAT_STR date_split_str: str = DATE_FORMAT_SPLIT_STR diff --git a/python/conftest.py b/python/conftest.py index 18d70251..fdb8c9ef 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -1,7 +1,8 @@ +from argparse import BooleanOptionalAction from pathlib import Path from pprint import pprint from shutil import copytree, rmtree -from typing import Final, Iterator, Literal +from typing import Final, Iterator import pytest from coverage_badge.__main__ import main as gen_cov_badge @@ -27,16 +28,19 @@ CLI_PREPROCESS_DEFAULT_COMMAND_STR_CORRECT, CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT, CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT, + MOD_FOLDER_FILES_COUNT_CORRECT, + OBS_FOLDER_FILES_COUNT_CORRECT, + PREPROCESS_OUT_FOLDER_FILES_COUNT_CORRECT, TEST_AUTH_CSV_FILE_NAME, XARRAY_END_DATE_4_DAYS, XARRAY_END_DATE_8_DAYS, XARRAY_EXAMPLE_END_DATE_4_YEARS, XARRAY_SKIP_2_FROM_8_DAYS, + LocalCache, xarray_example, ) MOUNT_DOCTEST_SKIP_MESSAGE: Final[str] = "requires external data mounted" -# Date Range covering leap year BADGE_PATH: Final[Path] = Path("docs") / "assets" / "coverage.svg" CLIMATE_DATA_MOUNT_PATH_LINUX: Final[Path] = Path("/mnt/vmfileshare/ClimateData") @@ -52,15 +56,6 @@ LOCAL_FIXTURE_PATH_NAME: Final[Path] = Path("local-cache") -MOD_FOLDER_FILES_COUNT_CORRECT: Final[int] = 1478 -OBS_FOLDER_FILES_COUNT_CORRECT: Final[int] = MOD_FOLDER_FILES_COUNT_CORRECT -PREPROCESS_OUT_FOLDER_FILES_COUNT_CORRECT: Final[int] = 4 - - -MOUNT_FIXTURE_CONFIG_CHOICES: Final[tuple[str, str]] = ("mount", "local_cache") -MountFixtureConfigChoices = Literal[*MOUNT_FIXTURE_CONFIG_CHOICES] - - @pytest.fixture def mod_folder_files_count_correct() -> int: return MOD_FOLDER_FILES_COUNT_CORRECT @@ -90,10 +85,6 @@ def data_mount_path() -> Path: ------- The `Path` climate data would likely be mounted to. """ - # if 'localcache' in fixture_data_source_marks: - # assert False - # return LOCAL_CACHE_FIXTURE_PATH - # else: return climate_data_mount_path() @@ -159,7 +150,7 @@ def conda_lock_file_manager() -> CondaLockFileManager: @pytest.fixture def data_fixtures_path(tmp_path: Path) -> Iterator[Path]: - yield copytree(TEST_FILE_PATH, tmp_path / TEST_FILE_PATH.name) + yield copytree(TEST_DATA_PATH, tmp_path / TEST_FILE_PATH.name) rmtree(tmp_path / TEST_FILE_PATH.name) @@ -177,25 +168,28 @@ def test_runs_output_path(path=TEST_RESULTS_PATH) -> Iterator[Path]: def pytest_addoption(parser): - """Add test cli config options.""" + """Add cli config to use used cached test fixture files.""" parser.addoption( - "--mount-fixture-config", - choices=MOUNT_FIXTURE_CONFIG_CHOICES, - # action="store", - default="mount", # 'mount' - type=str, - help="'mount' or 'local_cache' data fixture types", + "--local-cache", + action=BooleanOptionalAction, + default=True, + help="use 'local_cache' data fixtures", ) @pytest.fixture(scope="session") -def mount_fixture_config(request) -> MountFixtureConfigChoices: - return request.config.getoption("--mount-fixture-config") +def local_cache(request) -> bool: + return request.config.getoption("--local-cache") + + +@pytest.fixture(scope="session") +def local_test_data_path() -> Path: + return TEST_DATA_PATH @pytest.fixture(scope="session") -def local_cache_path() -> Path: - return TEST_DATA_PATH / LOCAL_FIXTURE_PATH_NAME +def local_cache_path(local_test_data_path) -> Path: + return local_test_data_path / LOCAL_FIXTURE_PATH_NAME @pytest.fixture(scope="session") @@ -276,6 +270,15 @@ def glasgow_example_cropped_cpm_rainfall_path(data_fixtures_path: Path) -> Path: ) +@pytest.fixture +def glasgow_tif_cache(data_fixtures_path: Path, tmp_path: Path) -> LocalCache: + return LocalCache( + name="test-users", + source_path=data_fixtures_path / "test_user_accounts.xlsx", + local_cache_path=tmp_path / "test-local-cache", + ) + + @pytest.fixture(autouse=True) def doctest_auto_fixtures( doctest_namespace: dict, @@ -350,18 +353,6 @@ def doctest_auto_fixtures( doctest_namespace["clim_runner"] = clim_runner -# def pytest_generate_tests(metafunc): -# """Customise the standard process of generating tests.""" -# fixture_data_source_marks: list[str] = ['mount'] -# # use_local_cache: bool = False -# # if "use_local_cache" in metafunc.fixturenames: -# #use_local_fixture_cache: bool = metafunc.config.getoption("use_local_fixture_cache") -# if metafunc.config.getoption("use_local_fixture_cache"): -# fixture_data_source_marks.append('localcache') -# metafunc.parametrize("fixture_data_sources", fixture_data_source_marks, indirect=True) -# # metafunc.parametrize("use_local_cache", use_local_cache) - - def pytest_sessionfinish(session, exitstatus): """Generate badges for docs after tests finish. diff --git a/python/pdm.lock b/python/pdm.lock index b453cf68..526be200 100644 --- a/python/pdm.lock +++ b/python/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.4.1" -content_hash = "sha256:996b7c055224d6d78334907c4e0b4d1ca9e0237e6b00b7a81caa5b71213fe036" +content_hash = "sha256:edcd2288b6d61726de0d0f6c5a47e2e1317d77f386d29e1aa368a581246f43c0" [[package]] name = "affine" @@ -2914,6 +2914,20 @@ files = [ {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, ] +[[package]] +name = "sysrsync" +version = "1.1.1" +requires_python = ">=3.6,<4.0" +summary = "Simple and safe python wrapper for calling system rsync" +groups = ["dev"] +dependencies = [ + "toml<0.11.0,>=0.10.0", +] +files = [ + {file = "sysrsync-1.1.1-py3-none-any.whl", hash = "sha256:9c8877f162dce9c480804445fca56cd19bf41b998d2172651468ccebfdc60850"}, + {file = "sysrsync-1.1.1.tar.gz", hash = "sha256:435f9eb620e68ffb18ca5cbad32b113396a432361c7722038eab65c97dd83bd5"}, +] + [[package]] name = "tabulate" version = "0.9.0" @@ -2966,6 +2980,17 @@ files = [ {file = "tinycss2-1.3.0.tar.gz", hash = "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d"}, ] +[[package]] +name = "toml" +version = "0.10.2" +requires_python = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +summary = "Python Library for Tom's Obvious, Minimal Language" +groups = ["dev"] +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + [[package]] name = "tomlkit" version = "0.12.5" diff --git a/python/pyproject.toml b/python/pyproject.toml index c79a8822..63839a39 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -58,6 +58,7 @@ dev = [ "pre-commit<4.0.0,>=3.6.2", "coverage-badge<2.0.0,>=1.1.0", "pytest-xdist>=3.5.0", + "sysrsync>=1.1.1", ] [tool.pdm.build] diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 6b671088..3cb81813 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -166,43 +166,32 @@ ) -# @pytest.mark.mount -# @pytest.fixture(scope="session") -# def tasmax_cpm_1980_raw() -> T_Dataset: -# # Backup path if furture rehydration issues -# # return open_dataset("/Volumes/vmfileshare/ClimateData/Raw/UKCP2.2/tasmin/05/latest/tasmin_rcp85_land-cpm_uk_2.2km_05_day_19801201-19811130.nc", decode_coords="all") -# # return open_dataset(local_cpm_cache_path / UKCP_RAW_TASMAX_1980_FILE, decode_coorda="all") -# return open_dataset(UKCP_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") @pytest.mark.mount -# @pytest.mark.localcache -# @pytest.fixture(scope="session", params=("mount", "localcache")) @pytest.fixture(scope="session") def tasmax_cpm_1980_raw( - # request: pytest.FixtureRequest, local_cpm_cache_path: Path, - # localfixturecare: bool, - mount_fixture_config: str, + local_cache: bool, local_cpm_cache_path: Path, ) -> T_Dataset: - if mount_fixture_config == "mount": - # return open_dataset(HADS_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") - return open_dataset(UKCP_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") - # Using below to manage issues with server mount - elif mount_fixture_config == "local_cache": + if local_cache: return open_dataset( local_cpm_cache_path / UKCP_RAW_TASMAX_1980_FILE, decode_coords="all" ) else: - raise ValueError(f"only 'mount' and 'localcache' params are supported") + return open_dataset(UKCP_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") @pytest.mark.mount @pytest.fixture(scope="session") -def tasmax_hads_1980_raw() -> T_Dataset: - return open_dataset(HADS_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") - # Using below to manage issues with server mount - # return open_dataset( - # local_hads_cache_path / HADS_RAW_TASMAX_1980_FILE, decode_coords="all" - # ) +def tasmax_hads_1980_raw( + local_cache: bool, + local_hads_cache_path: Path, +) -> T_Dataset: + if local_cache: + return open_dataset( + local_hads_cache_path / HADS_RAW_TASMAX_1980_FILE, decode_coords="all" + ) + else: + return open_dataset(HADS_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") @pytest.mark.localcache @@ -896,15 +885,16 @@ def test_interpolate_coords( @pytest.mark.mount -@pytest.mark.parametrize( - "tasmax_hads_1980_raw_mount_or_local_cache", ("mount", "localcache"), indirect=True -) +# @pytest.mark.parametrize( +# "tasmax_hads_1980_raw_mount_or_local_cache", ("mount", "localcache"), indirect=True +# ) def test_hads_resample_and_reproject( - tasmax_hads_1980_raw_mount_or_local_cache: T_Dataset, + # tasmax_hads_1980_raw_mount_or_local_cache: T_Dataset, + tasmax_hads_1980_raw: T_Dataset, ) -> None: variable_name: str = "tasmax" output_path: Path = Path("tests/runs/reample-hads") - tasmax_hads_1980_raw = tasmax_hads_1980_raw_mount_or_local_cache + # tasmax_hads_1980_raw = tasmax_hads_1980_raw_mount_or_local_cache # First index is for month, in this case January 1980 plot_xarray( tasmax_hads_1980_raw.tasmax[0], diff --git a/python/tests/utils.py b/python/tests/utils.py index e2893b8c..f8f6845b 100644 --- a/python/tests/utils.py +++ b/python/tests/utils.py @@ -1,10 +1,13 @@ -from collections.abc import Hashable +import asyncio +from collections import UserDict from dataclasses import dataclass, field -from datetime import date +from datetime import date, datetime +from logging import getLogger from os import PathLike from pathlib import Path -from typing import Final, Iterable, Sequence +from typing import Awaitable, Final, Iterable, Sequence, TypedDict +import sysrsync from numpy import array, random from pandas import date_range, to_datetime from xarray import DataArray @@ -19,7 +22,7 @@ OBS_FOLDER_DEFAULT, PREPROCESS_FILE_NAME, PREPROCESS_OUT_FOLDER_DEFAULT, - PROCESSESORS_DEFAULT, + PROCESSORS_DEFAULT, VALID_DATES_STR_DEFAULT, CityOptions, MethodOptions, @@ -37,6 +40,8 @@ ) from clim_recal.utils.xarray import THREE_CITY_CENTRE_COORDS +logger = getLogger(__name__) + XARRAY_EXAMPLE_RANDOM_SEED: Final[int] = 0 # Default 4 year start and end date covering leap year XARRAY_EXAMPLE_START_DATE_STR: Final[str] = "1980-11-30" @@ -83,7 +88,7 @@ CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT ) -CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT: Final[tuple[str | Path, ...]] = ( +CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT: Final[tuple[str | Path | int, ...]] = ( "python", CMETHODS_FILE_NAME, "--input_data_folder", @@ -100,7 +105,7 @@ "-v", VariableOptions.default(), "-p", - PROCESSESORS_DEFAULT, + PROCESSORS_DEFAULT, ) CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_STR_CORRECT: Final[ @@ -111,6 +116,10 @@ CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_STR_CORRECT ) +MOD_FOLDER_FILES_COUNT_CORRECT: Final[int] = 1478 +OBS_FOLDER_FILES_COUNT_CORRECT: Final[int] = MOD_FOLDER_FILES_COUNT_CORRECT +PREPROCESS_OUT_FOLDER_FILES_COUNT_CORRECT: Final[int] = 4 + class StandardWith360DayError(Exception): ... @@ -254,6 +263,210 @@ def xarray_example( return da +CacheLogType = tuple[str, datetime | None, Path] +SyncedLog = TypedDict("SyncedLog", {"time": datetime | None, "path": Path}) + + @dataclass -class LocalCache(Hashable): - server_paths: Sequence[PathLike] = field(default_factory=tuple) +class LocalCache: + + """Manager for caching files locally. + + Attributes + ---------- + source_path + Path to file to cache + local_cache_folder + Optional path to save `cache_path` relative to. + local_cache_path + Path to copy `source_path` to within `local_cache_folder`. + reader + Optional function to call to read cached file with. + reader_kwargs + Any parameters to pass to `reader`. + + Examples + -------- + >>> tmp_path = getfixture('tmp_path') + >>> cacher: LocalCache = LocalCache( + ... name="example-user-config", + ... source_path=(data_fixtures_path / + ... 'test_user_accounts.xlsx'), + ... local_cache_path=tmp_path,) + >>> cacher + + >>> pprint(cacher.sync()) + ('example-user-config', + datetime.datetime(...), + ...Path('.../test_user_accounts.xlsx')) + >>> cacher.cache_path.is_file() + True + >>> cacher + + """ + + name: str + source_path: PathLike + local_cache_path: PathLike + created: datetime | None = None + synced: datetime | None = None + _make_local_cache_folders: bool = True + + # reader: Callable | None + # reader_kwargs: dict[str, Any] = field(default_factory=dict) + def __repr__(self) -> str: + """Summary of caching config.""" + return f"" + + def __post_init__(self) -> None: + """Account `self.cache_path` consistency.""" + self.source_path = Path(self.source_path) + self.local_cache_path = Path(self.local_cache_path) + try: + assert self.source_path.is_file() + except: + raise ValueError(f"Only files can be cached, not: '{self.source_path}'") + if self._make_local_cache_folders: + self.local_cache_path.mkdir(parents=True, exist_ok=True) + + @property + def is_cached(self) -> bool: + """Whether `self.source_path` has been cached.""" + return self.cache_path.is_file() + + @property + def cache_path(self) -> Path: + """Path to copy `source_path` file to.""" + assert isinstance(self.source_path, Path) + assert isinstance(self.local_cache_path, Path) + if not self.local_cache_path.is_file(): + logger.debug( + f"'local_cache_path' is a folder: " + f"'{self.local_cache_path}'. Inferring file name " + f"from 'source_path': '{self.source_path}'." + ) + return self.local_cache_path / self.source_path.name + else: + return self.local_cache_path + + @property + def source_path_exists(self) -> bool: + """Whether `self.source_path` is a file.""" + return Path(self.source_path).is_file() + + def _check_source_path(self, fail_if_no_source: bool = True) -> bool: + """Check access to `self.source_path`.""" + if not self.source_path_exists: + message: str = ( + f"No access, pehaps because server not mounted, to: " + f"'{self.source_path}'" + ) + if fail_if_no_source: + raise FileNotFoundError(message) + else: + logger.error(message) + return False + else: + return True + + def _update_synced(self) -> None: + """Update `self.synced` and `self.created`.""" + self.synced = datetime.now() + if not self.created: + self.created = self.synced + + async def async_sync( + self, fail_if_no_source: bool = True, **kwargs + ) -> CacheLogType: + """Asyncronously sync `self.source_path` to `self.cache_path`.""" + if self._check_source_path(fail_if_no_source=fail_if_no_source): + await asyncio.create_subprocess_exec( + "rsync", str(self.source_path), str(self.cache_path), **kwargs + ) + self._update_synced() + return self.name, self.synced, self.cache_path + + def sync(self, fail_if_no_source: bool = True, **kwargs) -> CacheLogType: + """Sync `self.source_path` to `self.cache_path`.""" + if self._check_source_path(fail_if_no_source=fail_if_no_source): + sysrsync.run( + source=str(self.source_path), destination=str(self.cache_path), **kwargs + ) + self._update_synced() + return self.name, self.synced, self.cache_path + + +@dataclass +class LocalCachesManager(UserDict): + + """Manager for a set of local caches. + + Attributes + ---------- + sources + A `dict` of `name`: `configs` to construct `LocalCache` instances + + Examples + -------- + >>> glasow_tif_cache = getfixture('glasgow_tif_cache') + >>> cache_configs = LocalCachesManager([glasow_tif_cache]) + >>> cache_configs + + >>> asyncio.run(cache_configs.async_sync_all()) + (...Path('.../test-local-cache/test_user_accounts.xlsx'),) + >>> 'test-users' in cache_configs._synced + True + >>> cache_configs.sync_all() + (...Path('.../test-local-cache/test_user_accounts.xlsx'),) + >>> cache_configs['test-users'].cache_path.is_file() + True + """ + + caches: Sequence[LocalCache] | None + _synced: dict[str, SyncedLog] = field(default_factory=dict) + + def __repr__(self) -> str: + """Summary of config.""" + return f"" + + def _sync_caches_attr(self) -> None: + """Sync `self.caches` and `self.data`.""" + if self.caches: + self.data = {cache.name: cache for cache in self.caches} + + def __post_init__(self) -> None: + """Populate the `data` attribute.""" + self._sync_caches_attr() + + @property + def cached_paths(self) -> tuple[Path, ...]: + """Return paths currently logged as cached.""" + return tuple(synced_path["path"] for synced_path in self._synced.values()) + + def sync_all(self, fail_if_no_source: bool = True, **kwargs) -> tuple[Path, ...]: + """Run `sync` on all `self.caches` instances.""" + sync_results: CacheLogType + for local_cacher in self.values(): + sync_results = local_cacher.sync( + fail_if_no_source=fail_if_no_source, **kwargs + ) + self._synced[local_cacher.name] = { + "time": sync_results[1], + "path": sync_results[2], + } + return self.cached_paths + + async def async_sync_all( + self, fail_if_no_source: bool = True, **kwargs + ) -> tuple[Path, ...]: + """Run `sync` on all `self.caches` instances.""" + async_save_calls: list[Awaitable] = [ + local_cacher.async_sync(fail_if_no_source=fail_if_no_source, **kwargs) + for local_cacher in self.values() + ] + async_results: list[CacheLogType] = await asyncio.gather(*async_save_calls) + self._synced = { + result[0]: {"time": result[1], "path": result[2]} + for result in async_results + } + return self.cached_paths From d8bb82b478118d728d94bf36f43272991612419e Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Mon, 3 Jun 2024 01:23:34 +0100 Subject: [PATCH 13/92] test: remove `tasmax_hads_1980_raw_mount_or_local_cache` fixture --- python/tests/test_resample.py | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 3cb81813..ce67f340 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -194,22 +194,6 @@ def tasmax_hads_1980_raw( return open_dataset(HADS_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") -@pytest.mark.localcache -@pytest.fixture(scope="session", params=("mount", "localcache")) -def tasmax_hads_1980_raw_mount_or_local_cache( - request: pytest.FixtureRequest, local_hads_cache_path -) -> T_Dataset: - if request.param == "mount": - return open_dataset(HADS_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") - # Using below to manage issues with server mount - elif request.param == "localcache": - return open_dataset( - local_hads_cache_path / HADS_RAW_TASMAX_1980_FILE, decode_coords="all" - ) - else: - raise ValueError(f"only 'mount' and 'localcache' params are supported") - - @pytest.fixture(scope="session") def reference_final_coord_grid() -> T_Dataset: return open_dataset(DEFAULT_RELATIVE_GRID_DATA_PATH, decode_coords="all") @@ -852,8 +836,6 @@ def test_interpolate_coords( **kwargs, ) assert reprojected_xr_time_series.dims["time"] == 31 - # assert reprojected_xr_time_series.dims[HADS_XDIM] == 528 - # assert reprojected_xr_time_series.dims[HADS_YDIM] == 651 assert_allclose( reprojected_xr_time_series.tasmax[10][430][230:250], FINAL_HADS_JAN_10_430_X_230_250_Y, @@ -885,16 +867,11 @@ def test_interpolate_coords( @pytest.mark.mount -# @pytest.mark.parametrize( -# "tasmax_hads_1980_raw_mount_or_local_cache", ("mount", "localcache"), indirect=True -# ) def test_hads_resample_and_reproject( - # tasmax_hads_1980_raw_mount_or_local_cache: T_Dataset, tasmax_hads_1980_raw: T_Dataset, ) -> None: variable_name: str = "tasmax" output_path: Path = Path("tests/runs/reample-hads") - # tasmax_hads_1980_raw = tasmax_hads_1980_raw_mount_or_local_cache # First index is for month, in this case January 1980 plot_xarray( tasmax_hads_1980_raw.tasmax[0], From 1b2b7ec138690aa4c68c49f48680d2dc4de7be77 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Mon, 3 Jun 2024 14:36:59 +0100 Subject: [PATCH 14/92] feat(test): add `read` method to `LocalCache` with `cli` `pytest` options. --- python/conftest.py | 22 ++++++++++ python/tests/test_resample.py | 54 +++++++++++++++++------- python/tests/utils.py | 79 ++++++++++++++++++++++++++++++----- 3 files changed, 130 insertions(+), 25 deletions(-) diff --git a/python/conftest.py b/python/conftest.py index fdb8c9ef..4f4f90b4 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -175,6 +175,18 @@ def pytest_addoption(parser): default=True, help="use 'local_cache' data fixtures", ) + parser.addoption( + "--sync-all", + action=BooleanOptionalAction, + default=False, + help="sync all local cached data fixtures", + ) + parser.addoption( + "--use-async", + action=BooleanOptionalAction, + default=False, + help="Use asyc if --sync-all is used", + ) @pytest.fixture(scope="session") @@ -182,6 +194,16 @@ def local_cache(request) -> bool: return request.config.getoption("--local-cache") +@pytest.fixture(scope="session") +def sync_all(request) -> bool: + return request.config.getoption("--sync-all") + + +@pytest.fixture(scope="session") +def use_async(request) -> bool: + return request.config.getoption("--use-async") + + @pytest.fixture(scope="session") def local_test_data_path() -> Path: return TEST_DATA_PATH diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index ce67f340..1211e6dc 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -1,3 +1,4 @@ +import asyncio from datetime import date, datetime from pathlib import Path from typing import Any, Final, Literal @@ -63,7 +64,7 @@ plot_xarray, ) -from .utils import xarray_example, year_days_count +from .utils import LocalCache, LocalCachesManager, xarray_example, year_days_count HADS_UK_TASMAX_DAY_SERVER_PATH: Final[Path] = Path("Raw/HadsUKgrid/tasmax/day") HADS_UK_RESAMPLED_DAY_SERVER_PATH: Final[Path] = Path( @@ -166,32 +167,55 @@ ) +@pytest.fixture(scope="session") +def local_cach_fixtures( + local_cpm_cache_path: Path, + local_hads_cache_path: Path, + sync_all: bool, + use_async: bool, +) -> LocalCachesManager: + cache_manager: LocalCachesManager = LocalCachesManager( + caches=( + LocalCache( + name="tasmax_cpm_1980_raw", + source_path=UKCP_RAW_TASMAX_EXAMPLE_PATH, + local_cache_path=local_cpm_cache_path / UKCP_RAW_TASMAX_1980_FILE, + reader=open_dataset, + reader_kwargs={"decode_coords": "all"}, + ), + LocalCache( + name="tasmax_hads_1980_raw", + source_path=HADS_RAW_TASMAX_EXAMPLE_PATH, + local_cache_path=local_hads_cache_path / HADS_RAW_TASMAX_1980_FILE, + reader=open_dataset, + reader_kwargs={"decode_coords": "all"}, + ), + ) + ) + if sync_all: + if use_async: + _ = asyncio.run(cache_manager.async_sync_all()) + else: + _ = cache_manager.sync_all() + return cache_manager + + @pytest.mark.mount @pytest.fixture(scope="session") def tasmax_cpm_1980_raw( local_cache: bool, - local_cpm_cache_path: Path, + local_cach_fixtures: LocalCachesManager, ) -> T_Dataset: - if local_cache: - return open_dataset( - local_cpm_cache_path / UKCP_RAW_TASMAX_1980_FILE, decode_coords="all" - ) - else: - return open_dataset(UKCP_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") + return local_cach_fixtures["tasmax_cpm_1980_raw"].read(cache_path=local_cache) @pytest.mark.mount @pytest.fixture(scope="session") def tasmax_hads_1980_raw( local_cache: bool, - local_hads_cache_path: Path, + local_cach_fixtures: LocalCachesManager, ) -> T_Dataset: - if local_cache: - return open_dataset( - local_hads_cache_path / HADS_RAW_TASMAX_1980_FILE, decode_coords="all" - ) - else: - return open_dataset(HADS_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all") + return local_cach_fixtures["tasmax_hads_1980_raw"].read(cache_path=local_cache) @pytest.fixture(scope="session") diff --git a/python/tests/utils.py b/python/tests/utils.py index f8f6845b..95eb9a1d 100644 --- a/python/tests/utils.py +++ b/python/tests/utils.py @@ -5,7 +5,7 @@ from logging import getLogger from os import PathLike from pathlib import Path -from typing import Awaitable, Final, Iterable, Sequence, TypedDict +from typing import Any, Awaitable, Callable, Final, Iterable, Sequence, TypedDict import sysrsync from numpy import array, random @@ -310,10 +310,12 @@ class LocalCache: local_cache_path: PathLike created: datetime | None = None synced: datetime | None = None - _make_local_cache_folders: bool = True - # reader: Callable | None - # reader_kwargs: dict[str, Any] = field(default_factory=dict) + reader: Callable | None = None + reader_kwargs: dict[str, Any] = field(default_factory=dict) + + _make_parent_folders: bool = True + def __repr__(self) -> str: """Summary of caching config.""" return f"" @@ -322,12 +324,11 @@ def __post_init__(self) -> None: """Account `self.cache_path` consistency.""" self.source_path = Path(self.source_path) self.local_cache_path = Path(self.local_cache_path) - try: - assert self.source_path.is_file() - except: - raise ValueError(f"Only files can be cached, not: '{self.source_path}'") - if self._make_local_cache_folders: - self.local_cache_path.mkdir(parents=True, exist_ok=True) + if self.source_path.exists(): + if not self.source_path.is_file(): + raise ValueError(f"Only files can be cached, not: '{self.source_path}'") + if self._make_parent_folders: + self.cache_path.parent.mkdir(parents=True, exist_ok=True) @property def is_cached(self) -> bool: @@ -395,6 +396,64 @@ def sync(self, fail_if_no_source: bool = True, **kwargs) -> CacheLogType: self._update_synced() return self.name, self.synced, self.cache_path + def read(self, cache_path: bool = True, run_sync: bool = False, **kwargs) -> Any: + """Read file using `self.reader` and `self.kwargs`. + + Parameters + ---------- + cache_path + Whether to read `self.cache_path` (`True`) or `self.source_path` (`False`). + run_sync + Whether to run `run_sync` if `self.cache_path` is not set. + + Returns + ------- + A processed version of either `self.cache_path` or `self.source_path`. + + Examples + -------- + >>> glasgow_tif_cache = getfixture('glasgow_tif_cache') + >>> glasgow_tif_cache.read() + Traceback (most recent call last): + ... + ValueError: `reader` attribute must be set for + + >>> from pandas import read_excel + >>> glasgow_tif_cache.reader = read_excel + >>> glasgow_tif_cache.read() + Traceback (most recent call last): + ... + ValueError: Can't use `local_path` prior to + cache run. Run with `run_sync` to override for + . + >>> glasgow_tif_cache.read(run_sync=True) + A Column User Name Password + 0 1 sally a pass + 1 2 george another pass + 2 34 jean passing + 3 4 felicity pastoral + 4 2 frank plough + >>> glasgow_tif_cache + + """ + if not self.reader: + raise ValueError(f"`reader` attribute must be set for {self}") + path: Path + if cache_path: + if self.is_cached: + path = self.cache_path + elif run_sync: + _, _, path = self.sync() + else: + raise ValueError( + f"Can't use `local_path` prior to cache run. " + f"Run with `run_sync` to override for {self}." + ) + else: + self._check_source_path() + path = Path(self.source_path) + return self.reader(path, **(kwargs | self.reader_kwargs)) + @dataclass class LocalCachesManager(UserDict): From e73fc497971037de80c72f117abcc1f6714ac3ba Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 4 Jun 2024 10:42:06 +0100 Subject: [PATCH 15/92] test: refactor `local_cache_fixtures` -> `conftest.py` --- python/conftest.py | 41 +++++++++++++- python/tests/test_resample.py | 103 +++++++++++++--------------------- python/tests/utils.py | 35 +++++++++++- 3 files changed, 113 insertions(+), 66 deletions(-) diff --git a/python/conftest.py b/python/conftest.py index 4f4f90b4..fdcb0235 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -1,3 +1,4 @@ +import asyncio from argparse import BooleanOptionalAction from pathlib import Path from pprint import pprint @@ -6,7 +7,7 @@ import pytest from coverage_badge.__main__ import main as gen_cov_badge -from xarray import DataArray, Dataset +from xarray import DataArray, Dataset, open_dataset from clim_recal.config import ClimRecalConfig from clim_recal.debiasing.debias_wrapper import CityOptions @@ -28,15 +29,20 @@ CLI_PREPROCESS_DEFAULT_COMMAND_STR_CORRECT, CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT, CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT, + HADS_RAW_TASMAX_1980_FILE, + HADS_RAW_TASMAX_EXAMPLE_PATH, MOD_FOLDER_FILES_COUNT_CORRECT, OBS_FOLDER_FILES_COUNT_CORRECT, PREPROCESS_OUT_FOLDER_FILES_COUNT_CORRECT, TEST_AUTH_CSV_FILE_NAME, + UKCP_RAW_TASMAX_1980_FILE, + UKCP_RAW_TASMAX_EXAMPLE_PATH, XARRAY_END_DATE_4_DAYS, XARRAY_END_DATE_8_DAYS, XARRAY_EXAMPLE_END_DATE_4_YEARS, XARRAY_SKIP_2_FROM_8_DAYS, LocalCache, + LocalCachesManager, xarray_example, ) @@ -99,6 +105,39 @@ def is_data_mounted(data_mount_path) -> bool: return is_climate_data_mounted(mount_path=data_mount_path) +@pytest.fixture(scope="session") +def local_cach_fixtures( + local_cpm_cache_path: Path, + local_hads_cache_path: Path, + sync_all: bool, + use_async: bool, +) -> LocalCachesManager: + cache_manager: LocalCachesManager = LocalCachesManager( + caches=( + LocalCache( + name="tasmax_cpm_1980_raw", + source_path=UKCP_RAW_TASMAX_EXAMPLE_PATH, + local_cache_path=local_cpm_cache_path / UKCP_RAW_TASMAX_1980_FILE, + reader=open_dataset, + reader_kwargs={"decode_coords": "all"}, + ), + LocalCache( + name="tasmax_hads_1980_raw", + source_path=HADS_RAW_TASMAX_EXAMPLE_PATH, + local_cache_path=local_hads_cache_path / HADS_RAW_TASMAX_1980_FILE, + reader=open_dataset, + reader_kwargs={"decode_coords": "all"}, + ), + ) + ) + if sync_all: + if use_async: + _ = asyncio.run(cache_manager.async_sync_all()) + else: + _ = cache_manager.sync_all() + return cache_manager + + # This may be removed in future # @pytest.fixture(autouse=True) def ensure_python_path() -> None: diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 1211e6dc..e719b3cd 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -1,4 +1,3 @@ -import asyncio from datetime import date, datetime from pathlib import Path from typing import Any, Final, Literal @@ -64,38 +63,47 @@ plot_xarray, ) -from .utils import LocalCache, LocalCachesManager, xarray_example, year_days_count - -HADS_UK_TASMAX_DAY_SERVER_PATH: Final[Path] = Path("Raw/HadsUKgrid/tasmax/day") -HADS_UK_RESAMPLED_DAY_SERVER_PATH: Final[Path] = Path( - "Processed/HadsUKgrid/resampled_2.2km/tasmax/day" -) - -UKCP_RAW_TASMAX_1980_FILE: Final[Path] = Path( - "tasmax_rcp85_land-cpm_uk_2.2km_01_day_19801201-19811130.nc" -) -HADS_RAW_TASMAX_1980_FILE: Final[Path] = Path( - "tasmax_hadukgrid_uk_1km_day_19800101-19800131.nc" -) - -HADS_UK_TASMAX_LOCAL_TEST_PATH: Final[Path] = ( - Path(HadUKGrid.slug) / HADS_RAW_TASMAX_1980_FILE -) - -UKCP_TASMAX_DAY_SERVER_PATH: Final[Path] = Path("Raw/UKCP2.2/tasmax/01/latest") -# Todo: Change "tasmax_rcp85_land-cpm_uk_2.2km_01_day_19801201-19811130.nc" -# to "tasmax_cpm_example.nc" -UKCP_TASMAX_LOCAL_TEST_PATH: Final[Path] = ( - Path(UKCPLocalProjections.slug) / UKCP_RAW_TASMAX_1980_FILE +from .utils import ( + HADS_UK_TASMAX_DAY_SERVER_PATH, + HADS_UK_TASMAX_LOCAL_TEST_PATH, + UKCP_RAW_TASMAX_EXAMPLE_PATH, + UKCP_TASMAX_DAY_SERVER_PATH, + UKCP_TASMAX_LOCAL_TEST_PATH, + LocalCachesManager, + xarray_example, + year_days_count, ) -UKCP_RAW_TASMAX_EXAMPLE_PATH: Final[Path] = ( - RAW_CPM_TASMAX_PATH / UKCP_RAW_TASMAX_1980_FILE -) - -HADS_RAW_TASMAX_EXAMPLE_PATH: Final[Path] = ( - RAW_HADS_TASMAX_PATH / HADS_RAW_TASMAX_1980_FILE -) +# HADS_UK_TASMAX_DAY_SERVER_PATH: Final[Path] = Path("Raw/HadsUKgrid/tasmax/day") +# HADS_UK_RESAMPLED_DAY_SERVER_PATH: Final[Path] = Path( +# "Processed/HadsUKgrid/resampled_2.2km/tasmax/day" +# ) +# +# UKCP_RAW_TASMAX_1980_FILE: Final[Path] = Path( +# "tasmax_rcp85_land-cpm_uk_2.2km_01_day_19801201-19811130.nc" +# ) +# HADS_RAW_TASMAX_1980_FILE: Final[Path] = Path( +# "tasmax_hadukgrid_uk_1km_day_19800101-19800131.nc" +# ) +# +# HADS_UK_TASMAX_LOCAL_TEST_PATH: Final[Path] = ( +# Path(HadUKGrid.slug) / HADS_RAW_TASMAX_1980_FILE +# ) +# +# UKCP_TASMAX_DAY_SERVER_PATH: Final[Path] = Path("Raw/UKCP2.2/tasmax/01/latest") +# # Todo: Change "tasmax_rcp85_land-cpm_uk_2.2km_01_day_19801201-19811130.nc" +# # to "tasmax_cpm_example.nc" +# UKCP_TASMAX_LOCAL_TEST_PATH: Final[Path] = ( +# Path(UKCPLocalProjections.slug) / UKCP_RAW_TASMAX_1980_FILE +# ) +# +# UKCP_RAW_TASMAX_EXAMPLE_PATH: Final[Path] = ( +# RAW_CPM_TASMAX_PATH / UKCP_RAW_TASMAX_1980_FILE +# ) +# +# HADS_RAW_TASMAX_EXAMPLE_PATH: Final[Path] = ( +# RAW_HADS_TASMAX_PATH / HADS_RAW_TASMAX_1980_FILE +# ) HADS_FIRST_DATES: np.array = np.array( ["19800101", "19800102", "19800103", "19800104", "19800105"] @@ -167,39 +175,6 @@ ) -@pytest.fixture(scope="session") -def local_cach_fixtures( - local_cpm_cache_path: Path, - local_hads_cache_path: Path, - sync_all: bool, - use_async: bool, -) -> LocalCachesManager: - cache_manager: LocalCachesManager = LocalCachesManager( - caches=( - LocalCache( - name="tasmax_cpm_1980_raw", - source_path=UKCP_RAW_TASMAX_EXAMPLE_PATH, - local_cache_path=local_cpm_cache_path / UKCP_RAW_TASMAX_1980_FILE, - reader=open_dataset, - reader_kwargs={"decode_coords": "all"}, - ), - LocalCache( - name="tasmax_hads_1980_raw", - source_path=HADS_RAW_TASMAX_EXAMPLE_PATH, - local_cache_path=local_hads_cache_path / HADS_RAW_TASMAX_1980_FILE, - reader=open_dataset, - reader_kwargs={"decode_coords": "all"}, - ), - ) - ) - if sync_all: - if use_async: - _ = asyncio.run(cache_manager.async_sync_all()) - else: - _ = cache_manager.sync_all() - return cache_manager - - @pytest.mark.mount @pytest.fixture(scope="session") def tasmax_cpm_1980_raw( diff --git a/python/tests/utils.py b/python/tests/utils.py index 95eb9a1d..4c145d74 100644 --- a/python/tests/utils.py +++ b/python/tests/utils.py @@ -29,6 +29,7 @@ RunOptions, VariableOptions, ) +from clim_recal.resample import RAW_CPM_TASMAX_PATH, RAW_HADS_TASMAX_PATH from clim_recal.utils.core import ( CPM_YEAR_DAYS, ISO_DATE_FORMAT_STR, @@ -38,10 +39,42 @@ date_range_generator, iter_to_tuple_strs, ) +from clim_recal.utils.data import HadUKGrid, UKCPLocalProjections from clim_recal.utils.xarray import THREE_CITY_CENTRE_COORDS logger = getLogger(__name__) +HADS_UK_TASMAX_DAY_SERVER_PATH: Final[Path] = Path("Raw/HadsUKgrid/tasmax/day") +HADS_UK_RESAMPLED_DAY_SERVER_PATH: Final[Path] = Path( + "Processed/HadsUKgrid/resampled_2.2km/tasmax/day" +) + +UKCP_RAW_TASMAX_1980_FILE: Final[Path] = Path( + "tasmax_rcp85_land-cpm_uk_2.2km_01_day_19801201-19811130.nc" +) +HADS_RAW_TASMAX_1980_FILE: Final[Path] = Path( + "tasmax_hadukgrid_uk_1km_day_19800101-19800131.nc" +) + +HADS_UK_TASMAX_LOCAL_TEST_PATH: Final[Path] = ( + Path(HadUKGrid.slug) / HADS_RAW_TASMAX_1980_FILE +) + +UKCP_TASMAX_DAY_SERVER_PATH: Final[Path] = Path("Raw/UKCP2.2/tasmax/01/latest") +# Todo: Change "tasmax_rcp85_land-cpm_uk_2.2km_01_day_19801201-19811130.nc" +# to "tasmax_cpm_example.nc" +UKCP_TASMAX_LOCAL_TEST_PATH: Final[Path] = ( + Path(UKCPLocalProjections.slug) / UKCP_RAW_TASMAX_1980_FILE +) + +UKCP_RAW_TASMAX_EXAMPLE_PATH: Final[Path] = ( + RAW_CPM_TASMAX_PATH / UKCP_RAW_TASMAX_1980_FILE +) + +HADS_RAW_TASMAX_EXAMPLE_PATH: Final[Path] = ( + RAW_HADS_TASMAX_PATH / HADS_RAW_TASMAX_1980_FILE +) + XARRAY_EXAMPLE_RANDOM_SEED: Final[int] = 0 # Default 4 year start and end date covering leap year XARRAY_EXAMPLE_START_DATE_STR: Final[str] = "1980-11-30" @@ -181,7 +214,7 @@ def xarray_example( start_date: DateType = XARRAY_EXAMPLE_START_DATE_STR, end_date: DateType = XARRAY_EXAMPLE_END_DATE_4_YEARS, coordinates: dict[str, tuple[float, float]] = THREE_CITY_CENTRE_COORDS, - skip_dates: Iterable[date] | None = None, + skip_dates: Iterable[date | str] | None = None, random_seed_int: int | None = XARRAY_EXAMPLE_RANDOM_SEED, name: str | None = None, as_dataset: bool = False, From 3dc7b0f34ae97bf4f9f86dc9a295bca8f297ee66 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 4 Jun 2024 11:52:07 +0100 Subject: [PATCH 16/92] fix: exclude `.conda-linux-64.lock` from `.dockerignore` --- .dockerignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.dockerignore b/.dockerignore index 2fe658b6..4c216545 100644 --- a/.dockerignore +++ b/.dockerignore @@ -13,3 +13,5 @@ python/tests/data/test-run-results* **/*.tic **/*.aux.xml .**/* +!.conda-linux-64.lock +!python/tests/data/local-cache From 07648fc1933853d2812d7db5e3a2618cdc0e15f9 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Thu, 6 Jun 2024 10:47:02 +0100 Subject: [PATCH 17/92] chore: remove commented sections of `test_resample.py` --- python/tests/test_resample.py | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index e719b3cd..5925ac31 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -74,37 +74,6 @@ year_days_count, ) -# HADS_UK_TASMAX_DAY_SERVER_PATH: Final[Path] = Path("Raw/HadsUKgrid/tasmax/day") -# HADS_UK_RESAMPLED_DAY_SERVER_PATH: Final[Path] = Path( -# "Processed/HadsUKgrid/resampled_2.2km/tasmax/day" -# ) -# -# UKCP_RAW_TASMAX_1980_FILE: Final[Path] = Path( -# "tasmax_rcp85_land-cpm_uk_2.2km_01_day_19801201-19811130.nc" -# ) -# HADS_RAW_TASMAX_1980_FILE: Final[Path] = Path( -# "tasmax_hadukgrid_uk_1km_day_19800101-19800131.nc" -# ) -# -# HADS_UK_TASMAX_LOCAL_TEST_PATH: Final[Path] = ( -# Path(HadUKGrid.slug) / HADS_RAW_TASMAX_1980_FILE -# ) -# -# UKCP_TASMAX_DAY_SERVER_PATH: Final[Path] = Path("Raw/UKCP2.2/tasmax/01/latest") -# # Todo: Change "tasmax_rcp85_land-cpm_uk_2.2km_01_day_19801201-19811130.nc" -# # to "tasmax_cpm_example.nc" -# UKCP_TASMAX_LOCAL_TEST_PATH: Final[Path] = ( -# Path(UKCPLocalProjections.slug) / UKCP_RAW_TASMAX_1980_FILE -# ) -# -# UKCP_RAW_TASMAX_EXAMPLE_PATH: Final[Path] = ( -# RAW_CPM_TASMAX_PATH / UKCP_RAW_TASMAX_1980_FILE -# ) -# -# HADS_RAW_TASMAX_EXAMPLE_PATH: Final[Path] = ( -# RAW_HADS_TASMAX_PATH / HADS_RAW_TASMAX_1980_FILE -# ) - HADS_FIRST_DATES: np.array = np.array( ["19800101", "19800102", "19800103", "19800104", "19800105"] ) From b7a2808165d5d7e571b12f072e477142fbbf6d3b Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Thu, 6 Jun 2024 11:36:53 +0100 Subject: [PATCH 18/92] chore: fix `docstring` typos raised by `quartodocs` --- python/clim_recal/utils/xarray.py | 51 ++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 3eaf8acd..9f8deb52 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -339,8 +339,8 @@ def cpm_reproject_with_standard_calendar( file_name_prefix: str = "", subfolder: PathLike = CPM_LOCAL_INTERMEDIATE_PATH, subfolder_time_stamp: bool = False, - source_x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, - source_y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, + # source_x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, + # source_y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, ) -> T_Dataset: """Convert raw `cpm_xr_time_series` to an 365/366 days and 27700 coords. @@ -353,10 +353,18 @@ def cpm_reproject_with_standard_calendar( cpm_xr_time_series `Dataset` (or path to load as `Dataset`) expected to be in raw UKCPM format, with 360 day years and a rotated coordinate system. - output_folder + variable_name + Name of variable used, usually a measure of climate change like + `tasmax` and `tasmin`. + output_path Path to store all intermediary and final projection. file_name_prefix `str` to prefix all written files with. + subfolder + Local `path` to place intermediate files from + `IntermediateCPMFilesManager` calls. + subfolder_time_stamp + Whether to add a timestamp in the intermediate file names. Returns ------- @@ -510,7 +518,7 @@ def interpolate_coords( reprojected_data_array.rio.write_crs(reference_coords.rio.crs, inplace=True) else: reprojected_data_array.rio.write_crs(xr_time_series.rio.crs, inplace=True) - reprojected: Dataset = Dataset({variable_name: reprojected_data_array}) + reprojected: T_Dataset = Dataset({variable_name: reprojected_data_array}) return reprojected @@ -724,7 +732,7 @@ def ensure_xr_dataset( def convert_xr_calendar( - xr_time_series: DataArray | Dataset | PathLike, + xr_time_series: T_DataArray | T_Dataset | PathLike, align_on: ConvertCalendarAlignOptions = DEFAULT_CALENDAR_ALIGN, calendar: CFCalendar = CFCalendarSTANDARD, use_cftime: bool = False, @@ -946,7 +954,7 @@ def gdal_warp_wrapper( output_y_resolution: int | None = None, copy_metadata: bool = True, return_path: bool = True, - format: GDALFormatsType | None = GDALGeoTiffFormatStr, + format: GDALFormatsType | str | None = GDALGeoTiffFormatStr, multithread: bool = True, **kwargs, ) -> Path | GDALDataset: @@ -987,9 +995,12 @@ def gdal_warp_wrapper( Whether to copy metadata when possible. return_path Return the resulting path if `True`, else the new `GDALDataset`. - resampling_method - Sampling method. `resampleAlg` in `WarpOption`. See other options - in: `https://gdal.org/programs/gdalwarp.html#cmdoption-gdalwarp-r`. + format + Format to write new file to. + multithread + Whether to use `multithread` to speed up calculations. + kwargs + Any additional parameters to pass to `WarpOption`. """ Path(output_path).parent.mkdir(parents=True, exist_ok=True) try: @@ -1016,7 +1027,7 @@ def gdal_warp_wrapper( def apply_geo_func( source_path: PathLike, - func: Callable[[Dataset], Dataset], + func: Callable[[T_Dataset], T_Dataset], export_folder: PathLike, new_path_name_func: Callable[[Path], Path] | None = None, to_netcdf: bool = True, @@ -1024,7 +1035,7 @@ def apply_geo_func( export_path_as_output_path_kwarg: bool = False, return_results: bool = False, **kwargs, -) -> Path | Dataset | GDALDataset: +) -> Path | T_Dataset | GDALDataset: """Apply a `Callable` to `netcdf_source` file and export via `to_netcdf`. Parameters @@ -1035,10 +1046,20 @@ def apply_geo_func( `Callable` to modify `netcdf`. export_folder Where to save results. - path_name_replace_tuple - Optional replacement `str` to apply to `source_path.name` when exporting + new_path_name_func + `Callabe` to generate new path to save to. to_netcdf - Whether to call `to_netcdf` method on `results` `Dataset`. + Whether to call `to_netcdf()` method on `results` `Dataset`. + to_raster + Whether to call `rio.to_raster()` on `results` `Dataset`. + export_path_as_output_path_kwarg + Whether to add `output_path = export_path` to `kwargs` passed to + `func`. Meant for cases calling `gdal_warp_wrapper`. + return_results + Whether to return results, which would be a `Dataset` or + `GDALDataset` (the latter if `gdal_warp_wrapper` is used). + **kwargs + Other parameters passed to `func` call. """ export_path: Path = Path(source_path) if new_path_name_func: @@ -1129,7 +1150,7 @@ def file_name_to_start_end_dates( return start_date, end_date -def generate_360_to_standard(array_to_expand: T_DataArray) -> DataArray: +def generate_360_to_standard(array_to_expand: T_DataArray) -> T_DataArray: """Return `array_to_expand` 360 days expanded to 365 or 366 days. This may be dropped if `cpm_reproject_with_standard_calendar` is successful. From ab88787a080a8aa2aac57c8b02472dc5ad4fa2a2 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 9 Jun 2024 15:26:35 +0100 Subject: [PATCH 19/92] fix: `cpm_reproject_with_standard_calendar` with `xr_reproject_crs` --- python/clim_recal/data_loader.py | 9 +- python/clim_recal/utils/xarray.py | 281 ++++++++++++++++++++++++------ python/conftest.py | 25 ++- python/tests/test_resample.py | 19 -- 4 files changed, 256 insertions(+), 78 deletions(-) diff --git a/python/clim_recal/data_loader.py b/python/clim_recal/data_loader.py index 079fdf20..18d8bb2b 100644 --- a/python/clim_recal/data_loader.py +++ b/python/clim_recal/data_loader.py @@ -1,16 +1,13 @@ import glob import os from datetime import datetime -from typing import Final from geopandas import read_file from rioxarray import open_rasterio from xarray import DataArray, cftime_range, concat, open_dataset from .utils.core import DateRange - -BritishNationalGridCoordsNum: Final[int] = 27700 -BritishNationalGridCoordinates: Final[str] = f'epsg:{BritishNationalGridCoordsNum}' +from .utils.xarray import BRITISH_NATIONAL_GRID_EPSG def load_data( @@ -169,7 +166,7 @@ def clip_dataset(xa: DataArray, variable: str, shapefile: str) -> DataArray: def reformat_file( file: str, variable: str, - spatial_config: str = BritishNationalGridCoordinates + spatial_config: str = BRITISH_NATIONAL_GRID_EPSG ) -> DataArray: """Load tif file and reformat xarray into expected format. @@ -230,7 +227,7 @@ def load_and_merge( date_range: DateRange, files: list[str], variable: str, - write_crs_format: str = BritishNationalGridCoordinates, + write_crs_format: str = BRITISH_NATIONAL_GRID_EPSG, ) -> DataArray: """ Load files into xarrays, select a time range and a variable and merge into a sigle xarray. diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 9f8deb52..5470b82b 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -52,7 +52,9 @@ # MONTH_DAY_DROP: DropDayType = {(1, 31), (4, 1), (6, 1), (8, 1), (10, 1), (12, 1)} # """A `set` of tuples of month and day numbers for `enforce_date_changes`.""" -BRITISH_NATIONAL_GRID_EPSG: Final[str] = "EPSG:27700" + +BRITISH_NATION_GRID_COORDS_NUMBER: Final[int] = 27700 +BRITISH_NATIONAL_GRID_EPSG: Final[str] = f"EPSG:{BRITISH_NATION_GRID_COORDS_NUMBER}" MONTH_DAY_XARRAY_LEAP_YEAR_DROP: DropDayType = { (1, 31), @@ -104,14 +106,14 @@ def as_tuple(self) -> tuple[float, float, float, float]: return self.xmin, self.xmax, self.ymin, self.ymax -GlasgowCoords: Final[CityCoords] = CityCoords( +GlasgowCoordsEPSG27700: Final[CityCoords] = CityCoords( "Glasgow", 249799.999600002, 269234.9996, 657761.472000003, 672330.696800007 ) -LondonCoords: Final[CityCoords] = CityCoords( +LondonCoordsEPSG27700: Final[CityCoords] = CityCoords( "London", 503568.1996, 561957.4961, 155850.7974, 200933.9025 ) -ManchesterCoords: Final[CityCoords] = CityCoords( +ManchesterCoordsEPSG27700: Final[CityCoords] = CityCoords( "Manchester", 380399.997, 393249.999, 389349.999, 405300.003 ) @@ -332,10 +334,39 @@ def final_nc_path(self) -> Path: ) +def check_xarray_path_and_var_name( + xr_time_series: T_Dataset | PathLike, variable_name: str | None +) -> tuple[Dataset, str]: + """Check and return a `T_Dataset` instances and included variable name.""" + if isinstance(xr_time_series, PathLike): + xr_time_series = open_dataset(xr_time_series, decode_coords="all") + try: + assert isinstance(xr_time_series, Dataset) + except AssertionError: + raise TypeError( + f"'xr_time_series' should be a 'Dataset' or 'NetCDF', recieved: '{type(xr_time_series)}'" + ) + + if not variable_name: + data_vars_count: int = len(xr_time_series.data_vars) + try: + assert data_vars_count == 1 + except: + ValueError( + f"'variable_name' must be specified or 'data_vars' count must be 1, not {data_vars_count}." + ) + variable_name = xr_time_series.data_vars[0] + if not isinstance(variable_name, str): + raise ValueError( + "'variable_name' must be a 'str' or inferred from 'xr_time_series.data_vars'. Got: '{variable_name}'" + ) + return xr_time_series, variable_name + + def cpm_reproject_with_standard_calendar( cpm_xr_time_series: T_Dataset | PathLike, - variable_name: str, - output_path: PathLike, + variable_name: str | None = None, + output_path: PathLike | None = None, file_name_prefix: str = "", subfolder: PathLike = CPM_LOCAL_INTERMEDIATE_PATH, subfolder_time_stamp: bool = False, @@ -369,65 +400,211 @@ def cpm_reproject_with_standard_calendar( Returns ------- Final `xarray` `Dataset` after spatial and temporal changes. + + Examples + -------- + >>> tasmax_cpm_1980_raw = getfixture('tasmax_cpm_1980_raw') + >>> if not tasmax_cpm_1980_raw: + ... pytest.skip(mount_or_cache_doctest_skip_message) + >>> tasmax_cpm_1980_365_day: T_Dataset = cpm_reproject_with_standard_calendar( + ... cpm_xr_time_series=tasmax_cpm_1980_raw, + ... variable_name="tasmax") + xarray.Dataset { + dimensions: + time = 365 ; + grid_latitude = 606 ; + grid_longitude = 484 ; + ... + >>> tasmax_cpm_1980_365_day + Size: 504MB + Dimensions: (x: 529, y: 653, time: 365) + Coordinates: + * x (x) float64 4kB -3.129e+05 -3.107e+05 ... 8.465e+05 8.487e+05 + * y (y) float64 5kB 1.197e+06 1.195e+06 ... -2.353e+05 -2.375e+05 + * time (time) datetime64[ns] 3kB 1980-12-01T12:00:00 ... 1981-11-30... + spatial_ref int64 8B 0 + Data variables: + tasmax (time, y, x) float32 504MB 3.403e+38 3.403e+38 ... 3.403e+38 """ - if isinstance(cpm_xr_time_series, PathLike): - cpm_xr_time_series = open_dataset(cpm_xr_time_series, decode_coords="all") - intermediate_file_configs: IntermediateCPMFilesManager = ( - IntermediateCPMFilesManager( - file_name_prefix=file_name_prefix, - variable_name=variable_name, - output_path=Path(output_path), - subfolder_path=Path(subfolder), - subfolder_time_stamp=subfolder_time_stamp, - time_series_start=cpm_xr_time_series.time.values[0], - time_series_end=cpm_xr_time_series.time.values[-1], - ) + # intermediate_file_configs: IntermediateCPMFilesManager = ( + # IntermediateCPMFilesManager( + # file_name_prefix=file_name_prefix, + # variable_name=variable_name, + # output_path=Path(output_path), + # subfolder_path=Path(subfolder), + # subfolder_time_stamp=subfolder_time_stamp, + # time_series_start=cpm_xr_time_series.time.values[0], + # time_series_end=cpm_xr_time_series.time.values[-1], + # ) + # ) + cpm_xr_time_series, variable_name = check_xarray_path_and_var_name( + cpm_xr_time_series, variable_name ) - expanded_calendar: T_Dataset = cpm_xarray_to_standard_calendar(cpm_xr_time_series) - # Index through the first ensemble - subset_within_ensemble: T_DataArray = expanded_calendar[variable_name][0] - - subset_within_ensemble.to_netcdf(intermediate_file_configs.intermediate_nc_path) - simplified_netcdf: T_Dataset = open_dataset( - intermediate_file_configs.intermediate_nc_path, decode_coords="all" - ) - simplified_netcdf["grid_longitude_bnds"] = expanded_calendar.grid_longitude_bnds - simplified_netcdf["grid_latitude_bnds"] = expanded_calendar.grid_latitude_bnds - simplified_netcdf[variable_name].to_netcdf( - intermediate_file_configs.simplified_nc_path + standar_calendar_ts: T_Dataset = cpm_xarray_to_standard_calendar(cpm_xr_time_series) + # Index through the first ensemble to skip the 'ensemble_member' index + subset_within_ensemble: T_Dataset = Dataset( + {variable_name: standar_calendar_ts[variable_name][0]} ) - warped_to_22700_path = gdal_warp_wrapper( - input_path=intermediate_file_configs.simplified_nc_path, - output_path=intermediate_file_configs.intermediate_warp_path, - copy_metadata=True, - format=None, + subset_in_epsg_27700: T_DataArray = xr_reproject_crs( + subset_within_ensemble, variable_name=variable_name ) - assert warped_to_22700_path == intermediate_file_configs.intermediate_warp_path - warped_to_22700 = open_dataset(intermediate_file_configs.intermediate_warp_path) - assert warped_to_22700.rio.crs == BRITISH_NATIONAL_GRID_EPSG - assert len(warped_to_22700.time) == len(expanded_calendar.time) - - # Commenting these out in prep for addressing - # https://github.com/alan-turing-institute/clim-recal/issues/151 - # warped_to_22700_y_axis_inverted: T_Dataset = warped_to_22700.reindex( - # y=warped_to_22700.y * -1 + # subset_within_ensemble.to_netcdf(intermediate_file_configs.intermediate_nc_path) + # simplified_netcdf: T_Dataset = open_dataset( + # intermediate_file_configs.intermediate_nc_path, decode_coords="all" + # ) + # simplified_netcdf["grid_longitude_bnds"] = expanded_calendar.grid_longitude_bnds + # simplified_netcdf["grid_latitude_bnds"] = expanded_calendar.grid_latitude_bnds + # simplified_netcdf[variable_name].to_netcdf( + # intermediate_file_configs.simplified_nc_path # ) # - # warped_to_22700_y_axis_inverted = warped_to_22700_y_axis_inverted.rename( - # {"x": source_x_coord_column_name, "y": source_y_coord_column_name} + # warped_to_22700_path = gdal_warp_wrapper( + # input_path=intermediate_file_configs.simplified_nc_path, + # output_path=intermediate_file_configs.intermediate_warp_path, + # copy_metadata=True, + # format=None, # ) + # + # assert warped_to_22700_path == intermediate_file_configs.intermediate_warp_path + # warped_to_22700 = open_dataset(intermediate_file_configs.intermediate_warp_path) + # assert warped_to_22700.rio.crs == BRITISH_NATIONAL_GRID_EPSG + # assert len(warped_to_22700.time) == len(expanded_calendar.time) + # + # # Commenting these out in prep for addressing + # # https://github.com/alan-turing-institute/clim-recal/issues/151 + # # warped_to_22700_y_axis_inverted: T_Dataset = warped_to_22700.reindex( + # # y=warped_to_22700.y * -1 + # # ) + # # + # # warped_to_22700_y_axis_inverted = warped_to_22700_y_axis_inverted.rename( + # # {"x": source_x_coord_column_name, "y": source_y_coord_column_name} + # # ) + # + # # warped_to_22700_y_axis_inverted.to_netcdf(intermediate_file_configs.final_nc_path) + # warped_to_22700.to_netcdf(intermediate_file_configs.final_nc_path) + # final_results = open_dataset( + # intermediate_file_configs.final_nc_path, decode_coords="all" + # ) + try: + assert (subset_in_epsg_27700.time == standar_calendar_ts.time).all() + except: + raise ValueError( + f"Time series of 'standar_calendar_ts' does not match projection to {BRITISH_NATIONAL_GRID_EPSG}." + ) + return subset_in_epsg_27700 - # warped_to_22700_y_axis_inverted.to_netcdf(intermediate_file_configs.final_nc_path) - warped_to_22700.to_netcdf(intermediate_file_configs.final_nc_path) - final_results = open_dataset( - intermediate_file_configs.final_nc_path, decode_coords="all" + +def xr_reproject_crs( + xr_time_series: T_Dataset | PathLike, + variable_name: str, + x_dim_name: str = "grid_longitude", + y_dim_name: str = "grid_latitude", + final_crs: str = BRITISH_NATIONAL_GRID_EPSG, + final_resolution: tuple[int, int] = (2200, 2200), + # target_xr: T_DataArray | PathLike = DEFAULT_RELATIVE_GRID_DATA_PATH, + time_dim_name: str = "time", + # target_x_dim_name: str = "x", + # target_y_dim_name: str = "y", + rename_final_dims_dict: dict[str, str] | None = None, + # target_time_dim_name: str = "time", +) -> T_Dataset: + """Reproject `source_xr` to `target_xr` coordinate structure. + + Examples + -------- + >>> tasmax_cpm_1980_raw = getfixture('tasmax_cpm_1980_raw') + >>> if not tasmax_cpm_1980_raw: + ... pytest.skip(mount_or_cache_doctest_skip_message) + >>> tasmax_cpm_1980_365_day: T_Dataset = cpm_xarray_to_standard_calendar( + ... tasmax_cpm_1980_raw) + >>> tasmax_sub_section = + >>> projected_cpm: Dataset = xr_reproject_crs( + ... tasmax_cpm_1980_365_day,) + >>> assert False + + """ + if isinstance(xr_time_series, PathLike | str): + xr_time_series = open_dataset(xr_time_series, decode_coords="all") + # if isinstance(xr_time_series, DataArray): + # if xr_time_series.name: + # if variable_name: + # try: + # assert variable_name == xr_time_series.name + # except AssertionError: + # raise ValueError(f"'variable_name': 'variable_name' != 'xr_time_series': '{xr_time_series.name}'.") + # else: + # variable_name = xr_time_series.name + # variable_name + # xr_time_series = Dataset({var}) + xr_time_series = xr_time_series.rio.set_spatial_dims( + x_dim=x_dim_name, y_dim=y_dim_name, inplace=True + ) + logger.info(xr_time_series.info()) + # if len(xr_time_series[variable_name].dims) > 3: + data_array: T_DataArray = xr_time_series[variable_name] + final_index_names: tuple[str, str, str] = (time_dim_name, x_dim_name, y_dim_name) + extra_dims: set[str] = set(data_array.indexes.dims) - set(final_index_names) + if extra_dims: + raise ValueError( + f"Can only reindex using dims: {final_index_names}, extra dim(s): {extra_dims}" + ) + data_array = data_array.drop_indexes(*extra_dims) + data_array = data_array.drop_vars(*extra_dims) + # if tuple(data_array.indexes.dims.keys()) != final_index_names: + # data_array = data_array.transpose(*final_index_names, ...) + coords: dict[str, DataArray] = { + time_dim_name: xr_time_series[time_dim_name], + y_dim_name: xr_time_series[y_dim_name], + x_dim_name: xr_time_series[x_dim_name], + } + without_attributes: T_DataArray = DataArray( + data=data_array.to_numpy(), coords=coords, name=variable_name + ) + without_attributes = without_attributes.rio.write_crs(xr_time_series.rio.crs) + without_attributes_reprojected: DataArray = without_attributes.rio.reproject( + final_crs, resolution=final_resolution ) - assert (final_results.time == expanded_calendar.time).all() - return final_results + return Dataset({variable_name: without_attributes_reprojected}) + # return without_attributes_reprojected + # coords: tuple[T_DataArray, T_DataArray, T_DataArray] = ( + # source_xr[source_time_dim_name].to_numpy(), + # source_xr[source_x_dim_name].to_numpy(), + # source_xr[source_y_dim_name].to_numpy(), + # ) + # dims: tuple[str, str, str] = (target_time_dim_name, target_x_dim_name, target_y_dim_name) + # dims: tuple[str, str, str] = (target_time_dim_name, target_x_dim_name, target_y_dim_name) + + # without_attributes: T_DataArray = DataArray( + # data=data_to_numpy, + # coords=coords, + # # dims=dims, + # name=variable_name + # ) + coords: dict[str, T_DataArray] = { + target_time_dim_name: source_xr[source_time_dim_name].to_numpy(), + source_y_dim_name: source_xr[source_y_dim_name].to_numpy(), + source_x_dim_name: source_xr[source_x_dim_name].to_numpy(), + } + data_to_numpy: NDArray = source_xr[variable_name].to_numpy() + without_attributes: T_DataArray = DataArray( + data=data_to_numpy[0], + coords=coords, + # dims=dims, + name=variable_name, + ) + renamed_attributes: T_DataArray = without_attributes.rename( + {source_x_dim_name: target_x_dim_name, source_y_dim_name: target_y_dim_name} + ) + renamed_attributes = renamed_attributes.rio.write_crs(source_xr.rio.crs) + renamed_attributes = renamed_attributes.rio.reproject_match(target_xr) + if rename_final_dims_dict: + renamed_attributes = renamed_attributes.rename(renamed_attributes) + + return Dataset({variable_name: renamed_attributes}) def interpolate_coords( diff --git a/python/conftest.py b/python/conftest.py index fdcb0235..262d5094 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -8,6 +8,7 @@ import pytest from coverage_badge.__main__ import main as gen_cov_badge from xarray import DataArray, Dataset, open_dataset +from xarray.core.types import T_Dataset from clim_recal.config import ClimRecalConfig from clim_recal.debiasing.debias_wrapper import CityOptions @@ -47,6 +48,9 @@ ) MOUNT_DOCTEST_SKIP_MESSAGE: Final[str] = "requires external data mounted" +MOUNT_OR_CACHE_DOCTEST_SKIP_MESSAGE: Final[ + str +] = "requires external data mounted or cached" BADGE_PATH: Final[Path] = Path("docs") / "assets" / "coverage.svg" CLIMATE_DATA_MOUNT_PATH_LINUX: Final[Path] = Path("/mnt/vmfileshare/ClimateData") @@ -106,7 +110,7 @@ def is_data_mounted(data_mount_path) -> bool: @pytest.fixture(scope="session") -def local_cach_fixtures( +def local_cache_fixtures( local_cpm_cache_path: Path, local_hads_cache_path: Path, sync_all: bool, @@ -138,6 +142,22 @@ def local_cach_fixtures( return cache_manager +@pytest.fixture(scope="session") +def tasmax_cpm_1980_raw( + local_cache: bool, + local_cache_fixtures: LocalCachesManager, +) -> T_Dataset: + return local_cache_fixtures["tasmax_cpm_1980_raw"].read(cache_path=local_cache) + + +@pytest.fixture(scope="session") +def tasmax_hads_1980_raw( + local_cache: bool, + local_cache_fixtures: LocalCachesManager, +) -> T_Dataset | None: + return local_cache_fixtures["tasmax_hads_1980_raw"].read(cache_path=local_cache) + + # This may be removed in future # @pytest.fixture(autouse=True) def ensure_python_path() -> None: @@ -408,6 +428,9 @@ def doctest_auto_fixtures( doctest_namespace["resample_test_hads_output_path"] = resample_test_hads_output_path doctest_namespace["resample_test_cpm_output_path"] = resample_test_cpm_output_path doctest_namespace["mount_doctest_skip_message"] = MOUNT_DOCTEST_SKIP_MESSAGE + doctest_namespace[ + "mount_or_cache_doctest_skip_message" + ] = MOUNT_OR_CACHE_DOCTEST_SKIP_MESSAGE doctest_namespace[ "glasgow_example_cropped_cpm_rainfall_path" ] = glasgow_example_cropped_cpm_rainfall_path diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 5925ac31..9c81a6e1 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -69,7 +69,6 @@ UKCP_RAW_TASMAX_EXAMPLE_PATH, UKCP_TASMAX_DAY_SERVER_PATH, UKCP_TASMAX_LOCAL_TEST_PATH, - LocalCachesManager, xarray_example, year_days_count, ) @@ -144,24 +143,6 @@ ) -@pytest.mark.mount -@pytest.fixture(scope="session") -def tasmax_cpm_1980_raw( - local_cache: bool, - local_cach_fixtures: LocalCachesManager, -) -> T_Dataset: - return local_cach_fixtures["tasmax_cpm_1980_raw"].read(cache_path=local_cache) - - -@pytest.mark.mount -@pytest.fixture(scope="session") -def tasmax_hads_1980_raw( - local_cache: bool, - local_cach_fixtures: LocalCachesManager, -) -> T_Dataset: - return local_cach_fixtures["tasmax_hads_1980_raw"].read(cache_path=local_cache) - - @pytest.fixture(scope="session") def reference_final_coord_grid() -> T_Dataset: return open_dataset(DEFAULT_RELATIVE_GRID_DATA_PATH, decode_coords="all") From 817c3771dee2550fcca0abe776206ce92b6e48e7 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 9 Jun 2024 15:45:04 +0100 Subject: [PATCH 20/92] chore: remove `IntermediateCPMFilesManager` --- python/clim_recal/utils/xarray.py | 252 +----------------------------- 1 file changed, 5 insertions(+), 247 deletions(-) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 5470b82b..e28be043 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -31,16 +31,9 @@ CLI_DATE_FORMAT_STR, ISO_DATE_FORMAT_STR, climate_data_mount_path, - date_range_to_str, results_path, - time_str, -) -from .gdal_formats import ( - NETCDF_EXTENSION_STR, - GDALFormatExtensions, - GDALFormatsType, - GDALGeoTiffFormatStr, ) +from .gdal_formats import NETCDF_EXTENSION_STR, GDALFormatsType, GDALGeoTiffFormatStr logger = getLogger(__name__) @@ -211,129 +204,6 @@ def cftime360_to_date(cf_360: Datetime360Day) -> date: return date(cf_360.year, cf_360.month, cf_360.day) -@dataclass -class IntermediateCPMFilesManager: - - """Manage intermediate files and paths for CPM calendar projection. - - Parameters - ---------- - variable_name - Name of variable (e.g. `tasmax`). Included in file names. - output_path - Folder to save results to. - subfolder_path - Path to place intermediate files relative to output_path. - time_series_start - Start of time series covered to include in file name. - time_series_end - End of time series covered to include in file name. - file_name_prefix - str to add at the start of the output file names (after integers). - subfolder_time_stamp - Whether to include a time stamp in the subfolder file name. - - Examples - -------- - >>> test_path = getfixture('tmp_path') - >>> intermedate_files_manager: IntermediateCPMFilesManager = IntermediateCPMFilesManager( - ... file_name_prefix="test-1980", - ... variable_name="tasmax", - ... output_path=test_path / 'intermediate_test_folder', - ... subfolder_path='test_subfolder', - ... time_series_start=date(1980, 12, 1), - ... time_series_end=date(1981, 11, 30), - ... ) - >>> str(intermedate_files_manager.output_path) - '.../intermediate_test_folder' - >>> str(intermedate_files_manager.intermediate_files_folder) - '.../test_subfolder' - >>> str(intermedate_files_manager.final_nc_path) - '.../test_subfolder/3-test-1980-tasmax-19801201-19811130-cpm-365-or-366-27700-final.nc' - """ - - variable_name: str - output_path: Path | None - time_series_start: datetime | date | Datetime360Day - time_series_end: datetime | date | Datetime360Day - subfolder_path: Path = CPM_LOCAL_INTERMEDIATE_PATH - file_name_prefix: str = "" - subfolder_time_stamp: bool = False - - def __post_init__(self) -> None: - """Ensure `output_path`, `time_series_start/end` are set correctly.""" - self.output_path = Path(self.output_path) if self.output_path else Path() - if self.output_path.suffix[1:] in GDALFormatExtensions.values(): - logger.info( - f"Output path is: '{str(self.output_path)}'\n" - "Putting intermediate files in parent directory." - ) - self._passed_output_path = self.output_path - self.output_path = self.output_path.parent - if isinstance(self.time_series_start, Datetime360Day): - self.time_series_start = cftime360_to_date(self.time_series_start) - if isinstance(self.time_series_end, Datetime360Day): - self.time_series_end = cftime360_to_date(self.time_series_end) - - def __repr__(self): - """Summary of config.""" - return ( - f"" - ) - - @property - def date_range_to_str(self) -> str: - return date_range_to_str(self.time_series_start, self.time_series_end) - - @property - def prefix_var_name_and_date(self) -> str: - prefix: str = f"{self.variable_name}-{self.date_range_to_str}-" - if self.file_name_prefix: - return f"{self.file_name_prefix}-{prefix}" - else: - return prefix - - @property - def subfolder(self) -> Path: - if self.subfolder_time_stamp: - return Path(Path(self.subfolder_path).name + f"-{time_str()}") - else: - return self.subfolder_path - - @property - def intermediate_files_folder(self) -> Path: - assert self.output_path - path: Path = self.output_path / self.subfolder - path.mkdir(exist_ok=True, parents=True) - assert path.is_dir() - return path - - @property - def intermediate_nc_path(self) -> Path: - return self.intermediate_files_folder / ( - "0-" + self.prefix_var_name_and_date + CPM_365_OR_366_INTERMEDIATE_NC - ) - - @property - def simplified_nc_path(self) -> Path: - return self.intermediate_files_folder / ( - "1-" + self.prefix_var_name_and_date + CPM_365_OR_366_SIMPLIFIED_NC - ) - - @property - def intermediate_warp_path(self) -> Path: - return self.intermediate_files_folder / ( - "2-" + self.prefix_var_name_and_date + CPM_365_OR_366_27700_TIF - ) - - @property - def final_nc_path(self) -> Path: - return self.intermediate_files_folder / ( - "3-" + self.prefix_var_name_and_date + CPM_365_OR_366_27700_FINAL - ) - - def check_xarray_path_and_var_name( xr_time_series: T_Dataset | PathLike, variable_name: str | None ) -> tuple[Dataset, str]: @@ -366,12 +236,6 @@ def check_xarray_path_and_var_name( def cpm_reproject_with_standard_calendar( cpm_xr_time_series: T_Dataset | PathLike, variable_name: str | None = None, - output_path: PathLike | None = None, - file_name_prefix: str = "", - subfolder: PathLike = CPM_LOCAL_INTERMEDIATE_PATH, - subfolder_time_stamp: bool = False, - # source_x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, - # source_y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, ) -> T_Dataset: """Convert raw `cpm_xr_time_series` to an 365/366 days and 27700 coords. @@ -426,24 +290,11 @@ def cpm_reproject_with_standard_calendar( Data variables: tasmax (time, y, x) float32 504MB 3.403e+38 3.403e+38 ... 3.403e+38 """ - - # intermediate_file_configs: IntermediateCPMFilesManager = ( - # IntermediateCPMFilesManager( - # file_name_prefix=file_name_prefix, - # variable_name=variable_name, - # output_path=Path(output_path), - # subfolder_path=Path(subfolder), - # subfolder_time_stamp=subfolder_time_stamp, - # time_series_start=cpm_xr_time_series.time.values[0], - # time_series_end=cpm_xr_time_series.time.values[-1], - # ) - # ) cpm_xr_time_series, variable_name = check_xarray_path_and_var_name( cpm_xr_time_series, variable_name ) standar_calendar_ts: T_Dataset = cpm_xarray_to_standard_calendar(cpm_xr_time_series) - # Index through the first ensemble to skip the 'ensemble_member' index subset_within_ensemble: T_Dataset = Dataset( {variable_name: standar_calendar_ts[variable_name][0]} ) @@ -451,44 +302,6 @@ def cpm_reproject_with_standard_calendar( subset_in_epsg_27700: T_DataArray = xr_reproject_crs( subset_within_ensemble, variable_name=variable_name ) - - # subset_within_ensemble.to_netcdf(intermediate_file_configs.intermediate_nc_path) - # simplified_netcdf: T_Dataset = open_dataset( - # intermediate_file_configs.intermediate_nc_path, decode_coords="all" - # ) - # simplified_netcdf["grid_longitude_bnds"] = expanded_calendar.grid_longitude_bnds - # simplified_netcdf["grid_latitude_bnds"] = expanded_calendar.grid_latitude_bnds - # simplified_netcdf[variable_name].to_netcdf( - # intermediate_file_configs.simplified_nc_path - # ) - # - # warped_to_22700_path = gdal_warp_wrapper( - # input_path=intermediate_file_configs.simplified_nc_path, - # output_path=intermediate_file_configs.intermediate_warp_path, - # copy_metadata=True, - # format=None, - # ) - # - # assert warped_to_22700_path == intermediate_file_configs.intermediate_warp_path - # warped_to_22700 = open_dataset(intermediate_file_configs.intermediate_warp_path) - # assert warped_to_22700.rio.crs == BRITISH_NATIONAL_GRID_EPSG - # assert len(warped_to_22700.time) == len(expanded_calendar.time) - # - # # Commenting these out in prep for addressing - # # https://github.com/alan-turing-institute/clim-recal/issues/151 - # # warped_to_22700_y_axis_inverted: T_Dataset = warped_to_22700.reindex( - # # y=warped_to_22700.y * -1 - # # ) - # # - # # warped_to_22700_y_axis_inverted = warped_to_22700_y_axis_inverted.rename( - # # {"x": source_x_coord_column_name, "y": source_y_coord_column_name} - # # ) - # - # # warped_to_22700_y_axis_inverted.to_netcdf(intermediate_file_configs.final_nc_path) - # warped_to_22700.to_netcdf(intermediate_file_configs.final_nc_path) - # final_results = open_dataset( - # intermediate_file_configs.final_nc_path, decode_coords="all" - # ) try: assert (subset_in_epsg_27700.time == standar_calendar_ts.time).all() except: @@ -500,17 +313,13 @@ def cpm_reproject_with_standard_calendar( def xr_reproject_crs( xr_time_series: T_Dataset | PathLike, - variable_name: str, + variable_name: str | None, x_dim_name: str = "grid_longitude", y_dim_name: str = "grid_latitude", final_crs: str = BRITISH_NATIONAL_GRID_EPSG, final_resolution: tuple[int, int] = (2200, 2200), - # target_xr: T_DataArray | PathLike = DEFAULT_RELATIVE_GRID_DATA_PATH, time_dim_name: str = "time", - # target_x_dim_name: str = "x", - # target_y_dim_name: str = "y", rename_final_dims_dict: dict[str, str] | None = None, - # target_time_dim_name: str = "time", ) -> T_Dataset: """Reproject `source_xr` to `target_xr` coordinate structure. @@ -527,24 +336,13 @@ def xr_reproject_crs( >>> assert False """ - if isinstance(xr_time_series, PathLike | str): - xr_time_series = open_dataset(xr_time_series, decode_coords="all") - # if isinstance(xr_time_series, DataArray): - # if xr_time_series.name: - # if variable_name: - # try: - # assert variable_name == xr_time_series.name - # except AssertionError: - # raise ValueError(f"'variable_name': 'variable_name' != 'xr_time_series': '{xr_time_series.name}'.") - # else: - # variable_name = xr_time_series.name - # variable_name - # xr_time_series = Dataset({var}) + xr_time_series, variable_name = check_xarray_path_and_var_name( + xr_time_series, variable_name + ) xr_time_series = xr_time_series.rio.set_spatial_dims( x_dim=x_dim_name, y_dim=y_dim_name, inplace=True ) logger.info(xr_time_series.info()) - # if len(xr_time_series[variable_name].dims) > 3: data_array: T_DataArray = xr_time_series[variable_name] final_index_names: tuple[str, str, str] = (time_dim_name, x_dim_name, y_dim_name) extra_dims: set[str] = set(data_array.indexes.dims) - set(final_index_names) @@ -552,10 +350,6 @@ def xr_reproject_crs( raise ValueError( f"Can only reindex using dims: {final_index_names}, extra dim(s): {extra_dims}" ) - data_array = data_array.drop_indexes(*extra_dims) - data_array = data_array.drop_vars(*extra_dims) - # if tuple(data_array.indexes.dims.keys()) != final_index_names: - # data_array = data_array.transpose(*final_index_names, ...) coords: dict[str, DataArray] = { time_dim_name: xr_time_series[time_dim_name], y_dim_name: xr_time_series[y_dim_name], @@ -569,42 +363,6 @@ def xr_reproject_crs( final_crs, resolution=final_resolution ) return Dataset({variable_name: without_attributes_reprojected}) - # return without_attributes_reprojected - # coords: tuple[T_DataArray, T_DataArray, T_DataArray] = ( - # source_xr[source_time_dim_name].to_numpy(), - # source_xr[source_x_dim_name].to_numpy(), - # source_xr[source_y_dim_name].to_numpy(), - # ) - # dims: tuple[str, str, str] = (target_time_dim_name, target_x_dim_name, target_y_dim_name) - # dims: tuple[str, str, str] = (target_time_dim_name, target_x_dim_name, target_y_dim_name) - - # without_attributes: T_DataArray = DataArray( - # data=data_to_numpy, - # coords=coords, - # # dims=dims, - # name=variable_name - # ) - coords: dict[str, T_DataArray] = { - target_time_dim_name: source_xr[source_time_dim_name].to_numpy(), - source_y_dim_name: source_xr[source_y_dim_name].to_numpy(), - source_x_dim_name: source_xr[source_x_dim_name].to_numpy(), - } - data_to_numpy: NDArray = source_xr[variable_name].to_numpy() - without_attributes: T_DataArray = DataArray( - data=data_to_numpy[0], - coords=coords, - # dims=dims, - name=variable_name, - ) - renamed_attributes: T_DataArray = without_attributes.rename( - {source_x_dim_name: target_x_dim_name, source_y_dim_name: target_y_dim_name} - ) - renamed_attributes = renamed_attributes.rio.write_crs(source_xr.rio.crs) - renamed_attributes = renamed_attributes.rio.reproject_match(target_xr) - if rename_final_dims_dict: - renamed_attributes = renamed_attributes.rename(renamed_attributes) - - return Dataset({variable_name: renamed_attributes}) def interpolate_coords( From c80c6656728b11e6e23e35ae40e416b8700ac45b Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Mon, 10 Jun 2024 09:10:46 +0100 Subject: [PATCH 21/92] fix: fix `xr_reproject_crs` `log` add `doctests` and remove `tests/check_calendar_log.txt` --- python/clim_recal/utils/xarray.py | 82 +- python/tests/check_calendar_log.txt | 1943 --------------------------- python/tests/test_resample.py | 69 +- 3 files changed, 81 insertions(+), 2013 deletions(-) delete mode 100644 python/tests/check_calendar_log.txt diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index e28be043..83437f33 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -131,13 +131,6 @@ def as_tuple(self) -> tuple[float, float, float, float]: Path().absolute() / "../data/rcp85_land-cpm_uk_2.2km_grid.nc" ) - -CPM_365_OR_366_INTERMEDIATE_NC: Final[str] = "cpm-365-or-366.nc" -CPM_365_OR_366_SIMPLIFIED_NC: Final[str] = "cpm-365-or-366-simplified.nc" -CPM_365_OR_366_27700_TIF: Final[str] = "cpm-365-or-366-27700.tif" -CPM_365_OR_366_27700_FINAL: Final[str] = "cpm-365-or-366-27700-final.nc" -CPM_LOCAL_INTERMEDIATE_PATH: Final[Path] = Path("cpm-intermediate-files") - HADS_RAW_X_COLUMN_NAME: Final[str] = "projection_x_coordinate" HADS_RAW_Y_COLUMN_NAME: Final[str] = "projection_y_coordinate" HADS_DROP_VARS_AFTER_PROJECTION: Final[tuple[str, ...]] = ("longitude", "latitude") @@ -225,7 +218,7 @@ def check_xarray_path_and_var_name( ValueError( f"'variable_name' must be specified or 'data_vars' count must be 1, not {data_vars_count}." ) - variable_name = xr_time_series.data_vars[0] + variable_name = tuple(xr_time_series.data_vars)[0] if not isinstance(variable_name, str): raise ValueError( "'variable_name' must be a 'str' or inferred from 'xr_time_series.data_vars'. Got: '{variable_name}'" @@ -251,15 +244,6 @@ def cpm_reproject_with_standard_calendar( variable_name Name of variable used, usually a measure of climate change like `tasmax` and `tasmin`. - output_path - Path to store all intermediary and final projection. - file_name_prefix - `str` to prefix all written files with. - subfolder - Local `path` to place intermediate files from - `IntermediateCPMFilesManager` calls. - subfolder_time_stamp - Whether to add a timestamp in the intermediate file names. Returns ------- @@ -273,12 +257,6 @@ def cpm_reproject_with_standard_calendar( >>> tasmax_cpm_1980_365_day: T_Dataset = cpm_reproject_with_standard_calendar( ... cpm_xr_time_series=tasmax_cpm_1980_raw, ... variable_name="tasmax") - xarray.Dataset { - dimensions: - time = 365 ; - grid_latitude = 606 ; - grid_longitude = 484 ; - ... >>> tasmax_cpm_1980_365_day Size: 504MB Dimensions: (x: 529, y: 653, time: 365) @@ -289,6 +267,14 @@ def cpm_reproject_with_standard_calendar( spatial_ref int64 8B 0 Data variables: tasmax (time, y, x) float32 504MB 3.403e+38 3.403e+38 ... 3.403e+38 + >>> tasmax_cpm_1980_raw.dims + FrozenMappingWarningOnValuesAccess({'ensemble_member': 1, + 'time': 360, + 'grid_latitude': 606, + 'grid_longitude': 484, + 'bnds': 2}) + >>> tasmax_cpm_1980_365_day.dims + FrozenMappingWarningOnValuesAccess({'x': 529, 'y': 653, 'time': 365}) """ cpm_xr_time_series, variable_name = check_xarray_path_and_var_name( cpm_xr_time_series, variable_name @@ -313,28 +299,49 @@ def cpm_reproject_with_standard_calendar( def xr_reproject_crs( xr_time_series: T_Dataset | PathLike, - variable_name: str | None, x_dim_name: str = "grid_longitude", y_dim_name: str = "grid_latitude", - final_crs: str = BRITISH_NATIONAL_GRID_EPSG, - final_resolution: tuple[int, int] = (2200, 2200), time_dim_name: str = "time", - rename_final_dims_dict: dict[str, str] | None = None, + variable_name: str | None = None, + final_crs: str = BRITISH_NATIONAL_GRID_EPSG, + final_resolution: tuple[int, int] | None = (2200, 2200), ) -> T_Dataset: """Reproject `source_xr` to `target_xr` coordinate structure. + Parameters + ---------- + xr_time_series + `Dataset` or `PathLike` to load and reproject. + x_dim_name + `str` name of `x` spatial dimension in `xr_time_series`. + y_dim_name + `str` name of `y` spatial dimension in `xr_time_series`. + y_dim_name + `str` name of `time` dimension in `xr_time_series`. + variable_name + Name of datset to apply projection to within `xr_time_series`. + Inferred if `None` assuming only one `data_var` attribute. + final_crs + Coordinate system `str` to project `xr_time_series` to. + final_resolution + Resolution to project `xr_time_series` raster data to. + Examples -------- - >>> tasmax_cpm_1980_raw = getfixture('tasmax_cpm_1980_raw') - >>> if not tasmax_cpm_1980_raw: + >>> tasmax_hads_1980_raw = getfixture('tasmax_hads_1980_raw') + >>> if not tasmax_hads_1980_raw: ... pytest.skip(mount_or_cache_doctest_skip_message) - >>> tasmax_cpm_1980_365_day: T_Dataset = cpm_xarray_to_standard_calendar( - ... tasmax_cpm_1980_raw) - >>> tasmax_sub_section = - >>> projected_cpm: Dataset = xr_reproject_crs( - ... tasmax_cpm_1980_365_day,) - >>> assert False - + >>> tasmax_hads_1980_raw.dims + FrozenMappingWarningOnValuesAccess({'time': 31, + 'projection_y_coordinate': 1450, + 'projection_x_coordinate': 900, + 'bnds': 2}) + >>> tasmax_hads_2_2km: T_Dataset = xr_reproject_crs( + ... tasmax_hads_1980_raw, + ... x_dim_name=HADS_RAW_X_COLUMN_NAME, + ... y_dim_name=HADS_RAW_Y_COLUMN_NAME,) + >>> tasmax_hads_2_2km.dims + FrozenMappingWarningOnValuesAccess({'x': 410, 'y': 660, 'time': 31}) """ xr_time_series, variable_name = check_xarray_path_and_var_name( xr_time_series, variable_name @@ -342,7 +349,8 @@ def xr_reproject_crs( xr_time_series = xr_time_series.rio.set_spatial_dims( x_dim=x_dim_name, y_dim=y_dim_name, inplace=True ) - logger.info(xr_time_series.info()) + # info requires a bf parameter, not straightforward for logging + # logger.info(xr_time_series.info()) data_array: T_DataArray = xr_time_series[variable_name] final_index_names: tuple[str, str, str] = (time_dim_name, x_dim_name, y_dim_name) extra_dims: set[str] = set(data_array.indexes.dims) - set(final_index_names) diff --git a/python/tests/check_calendar_log.txt b/python/tests/check_calendar_log.txt deleted file mode 100644 index 48553625..00000000 --- a/python/tests/check_calendar_log.txt +++ /dev/null @@ -1,1943 +0,0 @@ -******************** Comparing raw data: /Volumes/vmfileshare/ClimateData/Raw/HadsUKgrid/tasmax/day ******************** -******************** to resampled data: /Volumes/vmfileshare/ClimateData/Processed/HadsUKgrid/resampled_2.2km/tasmax/day ******************** -File: tasmax_hadukgrid_uk_1km_day_19800101-19800131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1980-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19800301-19800331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1980-03-31'} -Dates in resampled not in raw: {'1980-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19800401-19800430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1980-04-30'} -Dates in resampled not in raw: {'1980-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19800501-19800531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1980-05-31'} -Dates in resampled not in raw: {'1980-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19800601-19800630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1980-06-30'} -Dates in resampled not in raw: {'1980-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19800701-19800731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1980-07-31'} -Dates in resampled not in raw: {'1980-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19800801-19800831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1980-08-31'} -Dates in resampled not in raw: {'1980-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19801001-19801031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1980-10-31'} -Dates in resampled not in raw: {'1980-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19801201-19801231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1980-12-31'} -Dates in resampled not in raw: {'1980-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19810101-19810131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1981-01-31'} -Dates in resampled not in raw: {'1981-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19810201-19810228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1981-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19810301-19810331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1981-03-31', '1981-03-30'} -Dates in resampled not in raw: {'1981-02-29', '1981-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19810401-19810430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1981-04-29', '1981-04-30'} -Dates in resampled not in raw: {'1981-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19810501-19810531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1981-05-30', '1981-05-31'} -Dates in resampled not in raw: {'1981-04-29', '1981-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19810601-19810630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1981-06-30'} -Dates in resampled not in raw: {'1981-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19810701-19810731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1981-07-30', '1981-07-31'} -Dates in resampled not in raw: {'1981-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19810801-19810831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1981-08-31'} -Dates in resampled not in raw: {'1981-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19810901-19810930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1981-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19811001-19811031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1981-10-31'} -Dates in resampled not in raw: {'1981-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19811101-19811130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1981-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19811201-19811231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1981-12-31'} -Dates in resampled not in raw: {'1981-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19820101-19820131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1982-01-31'} -Dates in resampled not in raw: {'1982-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19820201-19820228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1982-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19820301-19820331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1982-03-30', '1982-03-31'} -Dates in resampled not in raw: {'1982-02-29', '1982-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19820401-19820430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1982-04-29', '1982-04-30'} -Dates in resampled not in raw: {'1982-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19820501-19820531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1982-05-30', '1982-05-31'} -Dates in resampled not in raw: {'1982-04-29', '1982-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19820601-19820630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1982-06-30'} -Dates in resampled not in raw: {'1982-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19820701-19820731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1982-07-31', '1982-07-30'} -Dates in resampled not in raw: {'1982-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19820801-19820831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1982-08-31'} -Dates in resampled not in raw: {'1982-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19820901-19820930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1982-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19821001-19821031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1982-10-31'} -Dates in resampled not in raw: {'1982-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19821101-19821130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1982-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19821201-19821231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1982-12-31'} -Dates in resampled not in raw: {'1982-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19830101-19830131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1983-01-31'} -Dates in resampled not in raw: {'1983-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19830201-19830228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1983-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19830301-19830331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1983-03-30', '1983-03-31'} -Dates in resampled not in raw: {'1983-02-30', '1983-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19830401-19830430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1983-04-30', '1983-04-29'} -Dates in resampled not in raw: {'1983-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19830501-19830531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1983-05-31', '1983-05-30'} -Dates in resampled not in raw: {'1983-04-30', '1983-04-29'} -File: tasmax_hadukgrid_uk_1km_day_19830601-19830630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1983-06-30'} -Dates in resampled not in raw: {'1983-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19830701-19830731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1983-07-31', '1983-07-30'} -Dates in resampled not in raw: {'1983-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19830801-19830831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1983-08-31'} -Dates in resampled not in raw: {'1983-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19830901-19830930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1983-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19831001-19831031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1983-10-31'} -Dates in resampled not in raw: {'1983-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19831101-19831130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1983-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19831201-19831231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1983-12-31'} -Dates in resampled not in raw: {'1983-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19840101-19840131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1984-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19840301-19840331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1984-03-31'} -Dates in resampled not in raw: {'1984-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19840401-19840430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1984-04-30'} -Dates in resampled not in raw: {'1984-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19840501-19840531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1984-05-31'} -Dates in resampled not in raw: {'1984-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19840601-19840630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1984-06-30'} -Dates in resampled not in raw: {'1984-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19840701-19840731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1984-07-31'} -Dates in resampled not in raw: {'1984-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19840801-19840831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1984-08-31'} -Dates in resampled not in raw: {'1984-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19841001-19841031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1984-10-31'} -Dates in resampled not in raw: {'1984-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19841201-19841231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1984-12-31'} -Dates in resampled not in raw: {'1984-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19850101-19850131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1985-01-31'} -Dates in resampled not in raw: {'1985-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19850201-19850228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1985-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19850301-19850331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1985-03-31', '1985-03-30'} -Dates in resampled not in raw: {'1985-02-30', '1985-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19850401-19850430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1985-04-29', '1985-04-30'} -Dates in resampled not in raw: {'1985-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19850501-19850531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1985-05-31', '1985-05-30'} -Dates in resampled not in raw: {'1985-04-29', '1985-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19850601-19850630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1985-06-30'} -Dates in resampled not in raw: {'1985-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19850701-19850731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1985-07-31', '1985-07-30'} -Dates in resampled not in raw: {'1985-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19850801-19850831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1985-08-31'} -Dates in resampled not in raw: {'1985-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19850901-19850930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1985-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19851001-19851031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1985-10-31'} -Dates in resampled not in raw: {'1985-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19851101-19851130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1985-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19851201-19851231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1985-12-31'} -Dates in resampled not in raw: {'1985-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19860101-19860131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1986-01-31'} -Dates in resampled not in raw: {'1986-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19860201-19860228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1986-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19860301-19860331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1986-03-31', '1986-03-30'} -Dates in resampled not in raw: {'1986-02-29', '1986-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19860401-19860430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1986-04-30', '1986-04-29'} -Dates in resampled not in raw: {'1986-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19860501-19860531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1986-05-31', '1986-05-30'} -Dates in resampled not in raw: {'1986-04-30', '1986-04-29'} -File: tasmax_hadukgrid_uk_1km_day_19860601-19860630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1986-06-30'} -Dates in resampled not in raw: {'1986-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19860701-19860731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1986-07-31', '1986-07-30'} -Dates in resampled not in raw: {'1986-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19860801-19860831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1986-08-31'} -Dates in resampled not in raw: {'1986-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19860901-19860930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1986-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19861001-19861031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1986-10-31'} -Dates in resampled not in raw: {'1986-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19861101-19861130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1986-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19861201-19861231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1986-12-31'} -Dates in resampled not in raw: {'1986-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19870101-19870131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1987-01-31'} -Dates in resampled not in raw: {'1987-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19870201-19870228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1987-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19870301-19870331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1987-03-30', '1987-03-31'} -Dates in resampled not in raw: {'1987-02-30', '1987-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19870401-19870430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1987-04-29', '1987-04-30'} -Dates in resampled not in raw: {'1987-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19870501-19870531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1987-05-30', '1987-05-31'} -Dates in resampled not in raw: {'1987-04-29', '1987-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19870601-19870630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1987-06-30'} -Dates in resampled not in raw: {'1987-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19870701-19870731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1987-07-31', '1987-07-30'} -Dates in resampled not in raw: {'1987-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19870801-19870831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1987-08-31'} -Dates in resampled not in raw: {'1987-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19870901-19870930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1987-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19871001-19871031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1987-10-31'} -Dates in resampled not in raw: {'1987-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19871101-19871130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1987-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19871201-19871231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1987-12-31'} -Dates in resampled not in raw: {'1987-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19880101-19880131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1988-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19880301-19880331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1988-03-31'} -Dates in resampled not in raw: {'1988-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19880401-19880430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1988-04-30'} -Dates in resampled not in raw: {'1988-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19880501-19880531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1988-05-31'} -Dates in resampled not in raw: {'1988-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19880601-19880630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1988-06-30'} -Dates in resampled not in raw: {'1988-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19880701-19880731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1988-07-31'} -Dates in resampled not in raw: {'1988-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19880801-19880831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1988-08-31'} -Dates in resampled not in raw: {'1988-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19881001-19881031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1988-10-31'} -Dates in resampled not in raw: {'1988-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19881201-19881231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1988-12-31'} -Dates in resampled not in raw: {'1988-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19890101-19890131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1989-01-31'} -Dates in resampled not in raw: {'1989-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19890201-19890228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1989-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19890301-19890331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1989-03-30', '1989-03-31'} -Dates in resampled not in raw: {'1989-02-29', '1989-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19890401-19890430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1989-04-30', '1989-04-29'} -Dates in resampled not in raw: {'1989-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19890501-19890531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1989-05-30', '1989-05-31'} -Dates in resampled not in raw: {'1989-04-30', '1989-04-29'} -File: tasmax_hadukgrid_uk_1km_day_19890601-19890630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1989-06-30'} -Dates in resampled not in raw: {'1989-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19890701-19890731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1989-07-30', '1989-07-31'} -Dates in resampled not in raw: {'1989-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19890801-19890831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1989-08-31'} -Dates in resampled not in raw: {'1989-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19890901-19890930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1989-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19891001-19891031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1989-10-31'} -Dates in resampled not in raw: {'1989-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19891101-19891130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1989-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19891201-19891231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1989-12-31'} -Dates in resampled not in raw: {'1989-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19900101-19900131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1990-01-31'} -Dates in resampled not in raw: {'1990-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19900201-19900228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1990-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19900301-19900331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1990-03-30', '1990-03-31'} -Dates in resampled not in raw: {'1990-02-30', '1990-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19900401-19900430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1990-04-29', '1990-04-30'} -Dates in resampled not in raw: {'1990-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19900501-19900531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1990-05-31', '1990-05-30'} -Dates in resampled not in raw: {'1990-04-29', '1990-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19900601-19900630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1990-06-30'} -Dates in resampled not in raw: {'1990-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19900701-19900731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1990-07-30', '1990-07-31'} -Dates in resampled not in raw: {'1990-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19900801-19900831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1990-08-31'} -Dates in resampled not in raw: {'1990-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19900901-19900930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1990-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19901001-19901031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1990-10-31'} -Dates in resampled not in raw: {'1990-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19901101-19901130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1990-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19901201-19901231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1990-12-31'} -Dates in resampled not in raw: {'1990-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19910101-19910131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1991-01-31'} -Dates in resampled not in raw: {'1991-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19910201-19910228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1991-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19910301-19910331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1991-03-31', '1991-03-30'} -Dates in resampled not in raw: {'1991-02-29', '1991-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19910401-19910430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1991-04-29', '1991-04-30'} -Dates in resampled not in raw: {'1991-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19910501-19910531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1991-05-31', '1991-05-30'} -Dates in resampled not in raw: {'1991-04-29', '1991-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19910601-19910630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1991-06-30'} -Dates in resampled not in raw: {'1991-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19910701-19910731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1991-07-30', '1991-07-31'} -Dates in resampled not in raw: {'1991-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19910801-19910831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1991-08-31'} -Dates in resampled not in raw: {'1991-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19910901-19910930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1991-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19911001-19911031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1991-10-31'} -Dates in resampled not in raw: {'1991-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19911101-19911130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1991-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19911201-19911231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1991-12-31'} -Dates in resampled not in raw: {'1991-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19920101-19920131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1992-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19920301-19920331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1992-03-31'} -Dates in resampled not in raw: {'1992-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19920401-19920430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1992-04-30'} -Dates in resampled not in raw: {'1992-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19920501-19920531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1992-05-31'} -Dates in resampled not in raw: {'1992-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19920601-19920630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1992-06-30'} -Dates in resampled not in raw: {'1992-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19920701-19920731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1992-07-31'} -Dates in resampled not in raw: {'1992-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19920801-19920831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1992-08-31'} -Dates in resampled not in raw: {'1992-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19921001-19921031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1992-10-31'} -Dates in resampled not in raw: {'1992-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19921201-19921231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1992-12-31'} -Dates in resampled not in raw: {'1992-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19930101-19930131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1993-01-31'} -Dates in resampled not in raw: {'1993-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19930201-19930228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1993-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19930301-19930331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1993-03-30', '1993-03-31'} -Dates in resampled not in raw: {'1993-02-29', '1993-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19930401-19930430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1993-04-29', '1993-04-30'} -Dates in resampled not in raw: {'1993-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19930501-19930531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1993-05-31', '1993-05-30'} -Dates in resampled not in raw: {'1993-04-29', '1993-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19930601-19930630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1993-06-30'} -Dates in resampled not in raw: {'1993-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19930701-19930731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1993-07-31', '1993-07-30'} -Dates in resampled not in raw: {'1993-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19930801-19930831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1993-08-31'} -Dates in resampled not in raw: {'1993-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19930901-19930930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1993-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19931001-19931031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1993-10-31'} -Dates in resampled not in raw: {'1993-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19931101-19931130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1993-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19931201-19931231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1993-12-31'} -Dates in resampled not in raw: {'1993-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19940101-19940131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1994-01-31'} -Dates in resampled not in raw: {'1994-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19940201-19940228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1994-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19940301-19940331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1994-03-30', '1994-03-31'} -Dates in resampled not in raw: {'1994-02-29', '1994-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19940401-19940430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1994-04-30', '1994-04-29'} -Dates in resampled not in raw: {'1994-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19940501-19940531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1994-05-31', '1994-05-30'} -Dates in resampled not in raw: {'1994-04-30', '1994-04-29'} -File: tasmax_hadukgrid_uk_1km_day_19940601-19940630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1994-06-30'} -Dates in resampled not in raw: {'1994-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19940701-19940731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1994-07-31', '1994-07-30'} -Dates in resampled not in raw: {'1994-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19940801-19940831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1994-08-31'} -Dates in resampled not in raw: {'1994-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19940901-19940930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1994-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19941001-19941031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1994-10-31'} -Dates in resampled not in raw: {'1994-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19941101-19941130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1994-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19941201-19941231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1994-12-31'} -Dates in resampled not in raw: {'1994-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19950101-19950131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1995-01-31'} -Dates in resampled not in raw: {'1995-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19950201-19950228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1995-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19950301-19950331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1995-03-31', '1995-03-30'} -Dates in resampled not in raw: {'1995-02-30', '1995-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19950401-19950430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1995-04-29', '1995-04-30'} -Dates in resampled not in raw: {'1995-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19950501-19950531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1995-05-30', '1995-05-31'} -Dates in resampled not in raw: {'1995-04-29', '1995-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19950601-19950630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1995-06-30'} -Dates in resampled not in raw: {'1995-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19950701-19950731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1995-07-30', '1995-07-31'} -Dates in resampled not in raw: {'1995-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19950801-19950831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1995-08-31'} -Dates in resampled not in raw: {'1995-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19950901-19950930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1995-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19951001-19951031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1995-10-31'} -Dates in resampled not in raw: {'1995-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19951101-19951130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1995-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19951201-19951231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1995-12-31'} -Dates in resampled not in raw: {'1995-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19960101-19960131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1996-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19960301-19960331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1996-03-31'} -Dates in resampled not in raw: {'1996-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19960401-19960430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1996-04-30'} -Dates in resampled not in raw: {'1996-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19960501-19960531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1996-05-31'} -Dates in resampled not in raw: {'1996-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19960601-19960630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1996-06-30'} -Dates in resampled not in raw: {'1996-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19960701-19960731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1996-07-31'} -Dates in resampled not in raw: {'1996-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19960801-19960831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1996-08-31'} -Dates in resampled not in raw: {'1996-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19961001-19961031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1996-10-31'} -Dates in resampled not in raw: {'1996-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19961201-19961231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1996-12-31'} -Dates in resampled not in raw: {'1996-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19970101-19970131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1997-01-31'} -Dates in resampled not in raw: {'1997-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19970201-19970228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1997-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19970301-19970331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1997-03-30', '1997-03-31'} -Dates in resampled not in raw: {'1997-02-29', '1997-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19970401-19970430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1997-04-30', '1997-04-29'} -Dates in resampled not in raw: {'1997-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19970501-19970531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1997-05-30', '1997-05-31'} -Dates in resampled not in raw: {'1997-04-30', '1997-04-29'} -File: tasmax_hadukgrid_uk_1km_day_19970601-19970630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1997-06-30'} -Dates in resampled not in raw: {'1997-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19970701-19970731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1997-07-30', '1997-07-31'} -Dates in resampled not in raw: {'1997-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19970801-19970831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1997-08-31'} -Dates in resampled not in raw: {'1997-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19970901-19970930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1997-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19971001-19971031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1997-10-31'} -Dates in resampled not in raw: {'1997-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19971101-19971130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1997-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19971201-19971231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1997-12-31'} -Dates in resampled not in raw: {'1997-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19980101-19980131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1998-01-31'} -Dates in resampled not in raw: {'1998-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19980201-19980228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1998-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19980301-19980331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1998-03-31', '1998-03-30'} -Dates in resampled not in raw: {'1998-02-30', '1998-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19980401-19980430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1998-04-29', '1998-04-30'} -Dates in resampled not in raw: {'1998-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19980501-19980531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1998-05-30', '1998-05-31'} -Dates in resampled not in raw: {'1998-04-29', '1998-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19980601-19980630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1998-06-30'} -Dates in resampled not in raw: {'1998-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19980701-19980731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1998-07-31', '1998-07-30'} -Dates in resampled not in raw: {'1998-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19980801-19980831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1998-08-31'} -Dates in resampled not in raw: {'1998-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19980901-19980930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1998-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19981001-19981031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1998-10-31'} -Dates in resampled not in raw: {'1998-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19981101-19981130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1998-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19981201-19981231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1998-12-31'} -Dates in resampled not in raw: {'1998-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19990101-19990131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1999-01-31'} -Dates in resampled not in raw: {'1999-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19990201-19990228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1999-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19990301-19990331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1999-03-31', '1999-03-30'} -Dates in resampled not in raw: {'1999-02-29', '1999-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19990401-19990430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1999-04-29', '1999-04-30'} -Dates in resampled not in raw: {'1999-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19990501-19990531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1999-05-30', '1999-05-31'} -Dates in resampled not in raw: {'1999-04-29', '1999-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19990601-19990630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1999-06-30'} -Dates in resampled not in raw: {'1999-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19990701-19990731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1999-07-31', '1999-07-30'} -Dates in resampled not in raw: {'1999-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19990801-19990831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1999-08-31'} -Dates in resampled not in raw: {'1999-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19990901-19990930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1999-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19991001-19991031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1999-10-31'} -Dates in resampled not in raw: {'1999-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19991101-19991130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1999-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19991201-19991231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1999-12-31'} -Dates in resampled not in raw: {'1999-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20000101-20000131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2000-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20000301-20000331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2000-03-31'} -Dates in resampled not in raw: {'2000-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20000401-20000430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2000-04-30'} -Dates in resampled not in raw: {'2000-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20000501-20000531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2000-05-31'} -Dates in resampled not in raw: {'2000-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20000601-20000630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2000-06-30'} -Dates in resampled not in raw: {'2000-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20000701-20000731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2000-07-31'} -Dates in resampled not in raw: {'2000-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20000801-20000831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2000-08-31'} -Dates in resampled not in raw: {'2000-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20001001-20001031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2000-10-31'} -Dates in resampled not in raw: {'2000-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20001201-20001231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2000-12-31'} -Dates in resampled not in raw: {'2000-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20010101-20010131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2001-01-31'} -Dates in resampled not in raw: {'2001-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20010201-20010228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2001-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20010301-20010331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2001-03-31', '2001-03-30'} -Dates in resampled not in raw: {'2001-02-30', '2001-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20010401-20010430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2001-04-29', '2001-04-30'} -Dates in resampled not in raw: {'2001-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20010501-20010531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2001-05-31', '2001-05-30'} -Dates in resampled not in raw: {'2001-04-29', '2001-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20010601-20010630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2001-06-30'} -Dates in resampled not in raw: {'2001-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20010701-20010731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2001-07-30', '2001-07-31'} -Dates in resampled not in raw: {'2001-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20010801-20010831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2001-08-31'} -Dates in resampled not in raw: {'2001-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20010901-20010930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2001-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20011001-20011031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2001-10-31'} -Dates in resampled not in raw: {'2001-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20011101-20011130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2001-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20011201-20011231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2001-12-31'} -Dates in resampled not in raw: {'2001-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20020101-20020131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2002-01-31'} -Dates in resampled not in raw: {'2002-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20020201-20020228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2002-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20020301-20020331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2002-03-30', '2002-03-31'} -Dates in resampled not in raw: {'2002-02-29', '2002-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20020401-20020430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2002-04-29', '2002-04-30'} -Dates in resampled not in raw: {'2002-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20020501-20020531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2002-05-31', '2002-05-30'} -Dates in resampled not in raw: {'2002-04-29', '2002-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20020601-20020630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2002-06-30'} -Dates in resampled not in raw: {'2002-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20020701-20020731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2002-07-31', '2002-07-30'} -Dates in resampled not in raw: {'2002-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20020801-20020831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2002-08-31'} -Dates in resampled not in raw: {'2002-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20020901-20020930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2002-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20021001-20021031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2002-10-31'} -Dates in resampled not in raw: {'2002-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20021101-20021130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2002-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20021201-20021231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2002-12-31'} -Dates in resampled not in raw: {'2002-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20030101-20030131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2003-01-31'} -Dates in resampled not in raw: {'2003-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20030201-20030228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2003-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20030301-20030331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2003-03-31', '2003-03-30'} -Dates in resampled not in raw: {'2003-02-29', '2003-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20030401-20030430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2003-04-30', '2003-04-29'} -Dates in resampled not in raw: {'2003-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20030501-20030531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2003-05-31', '2003-05-30'} -Dates in resampled not in raw: {'2003-04-30', '2003-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20030601-20030630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2003-06-30'} -Dates in resampled not in raw: {'2003-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20030701-20030731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2003-07-31', '2003-07-30'} -Dates in resampled not in raw: {'2003-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20030801-20030831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2003-08-31'} -Dates in resampled not in raw: {'2003-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20030901-20030930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2003-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20031001-20031031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2003-10-31'} -Dates in resampled not in raw: {'2003-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20031101-20031130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2003-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20031201-20031231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2003-12-31'} -Dates in resampled not in raw: {'2003-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20040101-20040131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2004-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20040301-20040331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2004-03-31'} -Dates in resampled not in raw: {'2004-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20040401-20040430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2004-04-30'} -Dates in resampled not in raw: {'2004-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20040501-20040531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2004-05-31'} -Dates in resampled not in raw: {'2004-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20040601-20040630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2004-06-30'} -Dates in resampled not in raw: {'2004-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20040701-20040731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2004-07-31'} -Dates in resampled not in raw: {'2004-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20040801-20040831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2004-08-31'} -Dates in resampled not in raw: {'2004-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20041001-20041031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2004-10-31'} -Dates in resampled not in raw: {'2004-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20041201-20041231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2004-12-31'} -Dates in resampled not in raw: {'2004-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20050101-20050131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2005-01-31'} -Dates in resampled not in raw: {'2005-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20050201-20050228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2005-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20050301-20050331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2005-03-30', '2005-03-31'} -Dates in resampled not in raw: {'2005-02-30', '2005-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20050401-20050430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2005-04-30', '2005-04-29'} -Dates in resampled not in raw: {'2005-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20050501-20050531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2005-05-31', '2005-05-30'} -Dates in resampled not in raw: {'2005-04-30', '2005-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20050601-20050630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2005-06-30'} -Dates in resampled not in raw: {'2005-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20050701-20050731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2005-07-31', '2005-07-30'} -Dates in resampled not in raw: {'2005-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20050801-20050831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2005-08-31'} -Dates in resampled not in raw: {'2005-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20050901-20050930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2005-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20051001-20051031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2005-10-31'} -Dates in resampled not in raw: {'2005-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20051101-20051130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2005-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20051201-20051231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2005-12-31'} -Dates in resampled not in raw: {'2005-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20060101-20060131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2006-01-31'} -Dates in resampled not in raw: {'2006-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20060201-20060228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2006-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20060301-20060331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2006-03-31', '2006-03-30'} -Dates in resampled not in raw: {'2006-02-30', '2006-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20060401-20060430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2006-04-30', '2006-04-29'} -Dates in resampled not in raw: {'2006-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20060501-20060531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2006-05-30', '2006-05-31'} -Dates in resampled not in raw: {'2006-04-30', '2006-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20060601-20060630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2006-06-30'} -Dates in resampled not in raw: {'2006-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20060701-20060731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2006-07-30', '2006-07-31'} -Dates in resampled not in raw: {'2006-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20060801-20060831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2006-08-31'} -Dates in resampled not in raw: {'2006-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20060901-20060930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2006-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20061001-20061031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2006-10-31'} -Dates in resampled not in raw: {'2006-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20061101-20061130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2006-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20061201-20061231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2006-12-31'} -Dates in resampled not in raw: {'2006-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20070101-20070131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2007-01-31'} -Dates in resampled not in raw: {'2007-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20070201-20070228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2007-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20070301-20070331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2007-03-30', '2007-03-31'} -Dates in resampled not in raw: {'2007-02-30', '2007-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20070401-20070430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2007-04-29', '2007-04-30'} -Dates in resampled not in raw: {'2007-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20070501-20070531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2007-05-30', '2007-05-31'} -Dates in resampled not in raw: {'2007-04-29', '2007-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20070601-20070630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2007-06-30'} -Dates in resampled not in raw: {'2007-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20070701-20070731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2007-07-30', '2007-07-31'} -Dates in resampled not in raw: {'2007-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20070801-20070831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2007-08-31'} -Dates in resampled not in raw: {'2007-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20070901-20070930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2007-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20071001-20071031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2007-10-31'} -Dates in resampled not in raw: {'2007-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20071101-20071130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2007-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20071201-20071231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2007-12-31'} -Dates in resampled not in raw: {'2007-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20080101-20080131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2008-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20080301-20080331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2008-03-31'} -Dates in resampled not in raw: {'2008-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20080401-20080430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2008-04-30'} -Dates in resampled not in raw: {'2008-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20080501-20080531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2008-05-31'} -Dates in resampled not in raw: {'2008-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20080601-20080630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2008-06-30'} -Dates in resampled not in raw: {'2008-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20080701-20080731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2008-07-31'} -Dates in resampled not in raw: {'2008-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20080801-20080831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2008-08-31'} -Dates in resampled not in raw: {'2008-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20081001-20081031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2008-10-31'} -Dates in resampled not in raw: {'2008-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20081201-20081231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2008-12-31'} -Dates in resampled not in raw: {'2008-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20090101-20090131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2009-01-31'} -Dates in resampled not in raw: {'2009-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20090201-20090228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2009-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20090301-20090331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2009-03-31', '2009-03-30'} -Dates in resampled not in raw: {'2009-02-30', '2009-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20090401-20090430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2009-04-30', '2009-04-29'} -Dates in resampled not in raw: {'2009-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20090501-20090531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2009-05-30', '2009-05-31'} -Dates in resampled not in raw: {'2009-04-30', '2009-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20090601-20090630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2009-06-30'} -Dates in resampled not in raw: {'2009-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20090701-20090731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2009-07-30', '2009-07-31'} -Dates in resampled not in raw: {'2009-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20090801-20090831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2009-08-31'} -Dates in resampled not in raw: {'2009-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20090901-20090930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2009-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20091001-20091031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2009-10-31'} -Dates in resampled not in raw: {'2009-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20091101-20091130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2009-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20091201-20091231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2009-12-31'} -Dates in resampled not in raw: {'2009-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20100101-20100131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2010-01-31'} -Dates in resampled not in raw: {'2010-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20100201-20100228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2010-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20100301-20100331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2010-03-30', '2010-03-31'} -Dates in resampled not in raw: {'2010-02-30', '2010-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20100401-20100430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2010-04-30', '2010-04-29'} -Dates in resampled not in raw: {'2010-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20100501-20100531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2010-05-31', '2010-05-30'} -Dates in resampled not in raw: {'2010-04-30', '2010-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20100601-20100630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2010-06-30'} -Dates in resampled not in raw: {'2010-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20100701-20100731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2010-07-30', '2010-07-31'} -Dates in resampled not in raw: {'2010-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20100801-20100831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2010-08-31'} -Dates in resampled not in raw: {'2010-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20100901-20100930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2010-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20101001-20101031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2010-10-31'} -Dates in resampled not in raw: {'2010-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20101101-20101130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2010-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20101201-20101231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2010-12-31'} -Dates in resampled not in raw: {'2010-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20110101-20110131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2011-01-31'} -Dates in resampled not in raw: {'2011-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20110201-20110228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2011-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20110301-20110331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2011-03-31', '2011-03-30'} -Dates in resampled not in raw: {'2011-02-30', '2011-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20110401-20110430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2011-04-29', '2011-04-30'} -Dates in resampled not in raw: {'2011-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20110501-20110531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2011-05-30', '2011-05-31'} -Dates in resampled not in raw: {'2011-04-29', '2011-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20110601-20110630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2011-06-30'} -Dates in resampled not in raw: {'2011-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20110701-20110731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2011-07-31', '2011-07-30'} -Dates in resampled not in raw: {'2011-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20110801-20110831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2011-08-31'} -Dates in resampled not in raw: {'2011-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20110901-20110930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2011-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20111001-20111031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2011-10-31'} -Dates in resampled not in raw: {'2011-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20111101-20111130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2011-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20111201-20111231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2011-12-31'} -Dates in resampled not in raw: {'2011-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20120101-20120131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2012-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20120301-20120331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2012-03-31'} -Dates in resampled not in raw: {'2012-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20120401-20120430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2012-04-30'} -Dates in resampled not in raw: {'2012-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20120501-20120531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2012-05-31'} -Dates in resampled not in raw: {'2012-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20120601-20120630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2012-06-30'} -Dates in resampled not in raw: {'2012-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20120701-20120731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2012-07-31'} -Dates in resampled not in raw: {'2012-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20120801-20120831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2012-08-31'} -Dates in resampled not in raw: {'2012-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20121001-20121031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2012-10-31'} -Dates in resampled not in raw: {'2012-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20121201-20121231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2012-12-31'} -Dates in resampled not in raw: {'2012-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20130101-20130131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2013-01-31'} -Dates in resampled not in raw: {'2013-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20130201-20130228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2013-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20130301-20130331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2013-03-31', '2013-03-30'} -Dates in resampled not in raw: {'2013-02-29', '2013-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20130401-20130430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2013-04-30', '2013-04-29'} -Dates in resampled not in raw: {'2013-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20130501-20130531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2013-05-31', '2013-05-30'} -Dates in resampled not in raw: {'2013-04-30', '2013-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20130601-20130630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2013-06-30'} -Dates in resampled not in raw: {'2013-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20130701-20130731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2013-07-30', '2013-07-31'} -Dates in resampled not in raw: {'2013-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20130801-20130831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2013-08-31'} -Dates in resampled not in raw: {'2013-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20130901-20130930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2013-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20131001-20131031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2013-10-31'} -Dates in resampled not in raw: {'2013-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20131101-20131130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2013-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20131201-20131231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2013-12-31'} -Dates in resampled not in raw: {'2013-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20140101-20140131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2014-01-31'} -Dates in resampled not in raw: {'2014-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20140201-20140228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2014-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20140301-20140331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2014-03-31', '2014-03-30'} -Dates in resampled not in raw: {'2014-02-29', '2014-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20140401-20140430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2014-04-30', '2014-04-29'} -Dates in resampled not in raw: {'2014-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20140501-20140531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2014-05-31', '2014-05-30'} -Dates in resampled not in raw: {'2014-04-30', '2014-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20140601-20140630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2014-06-30'} -Dates in resampled not in raw: {'2014-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20140701-20140731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2014-07-30', '2014-07-31'} -Dates in resampled not in raw: {'2014-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20140801-20140831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2014-08-31'} -Dates in resampled not in raw: {'2014-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20140901-20140930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2014-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20141001-20141031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2014-10-31'} -Dates in resampled not in raw: {'2014-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20141101-20141130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2014-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20141201-20141231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2014-12-31'} -Dates in resampled not in raw: {'2014-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20150101-20150131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2015-01-31'} -Dates in resampled not in raw: {'2015-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20150201-20150228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2015-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20150301-20150331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2015-03-31', '2015-03-30'} -Dates in resampled not in raw: {'2015-02-29', '2015-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20150401-20150430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2015-04-29', '2015-04-30'} -Dates in resampled not in raw: {'2015-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20150501-20150531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2015-05-30', '2015-05-31'} -Dates in resampled not in raw: {'2015-04-29', '2015-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20150601-20150630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2015-06-30'} -Dates in resampled not in raw: {'2015-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20150701-20150731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2015-07-31', '2015-07-30'} -Dates in resampled not in raw: {'2015-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20150801-20150831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2015-08-31'} -Dates in resampled not in raw: {'2015-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20150901-20150930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2015-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20151001-20151031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2015-10-31'} -Dates in resampled not in raw: {'2015-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20151101-20151130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2015-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20151201-20151231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2015-12-31'} -Dates in resampled not in raw: {'2015-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20160101-20160131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2016-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20160301-20160331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2016-03-31'} -Dates in resampled not in raw: {'2016-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20160401-20160430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2016-04-30'} -Dates in resampled not in raw: {'2016-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20160501-20160531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2016-05-31'} -Dates in resampled not in raw: {'2016-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20160601-20160630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2016-06-30'} -Dates in resampled not in raw: {'2016-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20160701-20160731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2016-07-31'} -Dates in resampled not in raw: {'2016-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20160801-20160831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2016-08-31'} -Dates in resampled not in raw: {'2016-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20161001-20161031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2016-10-31'} -Dates in resampled not in raw: {'2016-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20161201-20161231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2016-12-31'} -Dates in resampled not in raw: {'2016-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20170101-20170131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2017-01-31'} -Dates in resampled not in raw: {'2017-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20170201-20170228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2017-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20170301-20170331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2017-03-30', '2017-03-31'} -Dates in resampled not in raw: {'2017-02-30', '2017-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20170401-20170430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2017-04-30', '2017-04-29'} -Dates in resampled not in raw: {'2017-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20170501-20170531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2017-05-31', '2017-05-30'} -Dates in resampled not in raw: {'2017-04-30', '2017-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20170601-20170630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2017-06-30'} -Dates in resampled not in raw: {'2017-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20170701-20170731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2017-07-30', '2017-07-31'} -Dates in resampled not in raw: {'2017-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20170801-20170831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2017-08-31'} -Dates in resampled not in raw: {'2017-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20170901-20170930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2017-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20171001-20171031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2017-10-31'} -Dates in resampled not in raw: {'2017-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20171101-20171130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2017-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20171201-20171231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2017-12-31'} -Dates in resampled not in raw: {'2017-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20180101-20180131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2018-01-31'} -Dates in resampled not in raw: {'2018-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20180201-20180228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2018-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20180301-20180331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2018-03-30', '2018-03-31'} -Dates in resampled not in raw: {'2018-02-29', '2018-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20180401-20180430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2018-04-29', '2018-04-30'} -Dates in resampled not in raw: {'2018-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20180501-20180531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2018-05-30', '2018-05-31'} -Dates in resampled not in raw: {'2018-04-29', '2018-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20180601-20180630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2018-06-30'} -Dates in resampled not in raw: {'2018-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20180701-20180731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2018-07-30', '2018-07-31'} -Dates in resampled not in raw: {'2018-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20180801-20180831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2018-08-31'} -Dates in resampled not in raw: {'2018-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20180901-20180930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2018-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20181001-20181031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2018-10-31'} -Dates in resampled not in raw: {'2018-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20181101-20181130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2018-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20181201-20181231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2018-12-31'} -Dates in resampled not in raw: {'2018-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20190101-20190131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2019-01-31'} -Dates in resampled not in raw: {'2019-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20190201-20190228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2019-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20190301-20190331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2019-03-31', '2019-03-30'} -Dates in resampled not in raw: {'2019-02-30', '2019-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20190401-20190430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2019-04-30', '2019-04-29'} -Dates in resampled not in raw: {'2019-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20190501-20190531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2019-05-31', '2019-05-30'} -Dates in resampled not in raw: {'2019-04-30', '2019-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20190601-20190630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2019-06-30'} -Dates in resampled not in raw: {'2019-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20190701-20190731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2019-07-31', '2019-07-30'} -Dates in resampled not in raw: {'2019-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20190801-20190831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2019-08-31'} -Dates in resampled not in raw: {'2019-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20190901-20190930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2019-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20191001-20191031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2019-10-31'} -Dates in resampled not in raw: {'2019-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20191101-20191130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2019-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20191201-20191231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2019-12-31'} -Dates in resampled not in raw: {'2019-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20200101-20200131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2020-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20200301-20200331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2020-03-31'} -Dates in resampled not in raw: {'2020-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20200401-20200430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2020-04-30'} -Dates in resampled not in raw: {'2020-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20200501-20200531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2020-05-31'} -Dates in resampled not in raw: {'2020-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20200601-20200630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2020-06-30'} -Dates in resampled not in raw: {'2020-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20200701-20200731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2020-07-31'} -Dates in resampled not in raw: {'2020-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20200801-20200831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2020-08-31'} -Dates in resampled not in raw: {'2020-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20201001-20201031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2020-10-31'} -Dates in resampled not in raw: {'2020-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20201201-20201231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2020-12-31'} -Dates in resampled not in raw: {'2020-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20210101-20210131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2021-01-31'} -Dates in resampled not in raw: {'2021-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20210201-20210228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2021-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20210301-20210331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2021-03-31', '2021-03-30'} -Dates in resampled not in raw: {'2021-02-29', '2021-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20210401-20210430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2021-04-29', '2021-04-30'} -Dates in resampled not in raw: {'2021-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20210501-20210531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2021-05-31', '2021-05-30'} -Dates in resampled not in raw: {'2021-04-29', '2021-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20210601-20210630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2021-06-30'} -Dates in resampled not in raw: {'2021-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20210701-20210731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2021-07-30', '2021-07-31'} -Dates in resampled not in raw: {'2021-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20210801-20210831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2021-08-31'} -Dates in resampled not in raw: {'2021-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20210901-20210930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2021-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20211001-20211031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2021-10-31'} -Dates in resampled not in raw: {'2021-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20211101-20211130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2021-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20211201-20211231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2021-12-31'} -Dates in resampled not in raw: {'2021-11-30'} -______________________________ -missing dates: 0 -date '1980-03-30' appears 2 times. -date '1980-05-30' appears 2 times. -date '1980-07-30' appears 2 times. -date '1980-09-30' appears 2 times. -date '1980-11-30' appears 2 times. -date '1984-03-30' appears 2 times. -date '1984-05-30' appears 2 times. -date '1984-07-30' appears 2 times. -date '1984-09-30' appears 2 times. -date '1984-11-30' appears 2 times. -date '1988-03-30' appears 2 times. -date '1988-05-30' appears 2 times. -date '1988-07-30' appears 2 times. -date '1988-09-30' appears 2 times. -date '1988-11-30' appears 2 times. -date '1992-03-30' appears 2 times. -date '1992-05-30' appears 2 times. -date '1992-07-30' appears 2 times. -date '1992-09-30' appears 2 times. -date '1992-11-30' appears 2 times. -date '1996-03-30' appears 2 times. -date '1996-05-30' appears 2 times. -date '1996-07-30' appears 2 times. -date '1996-09-30' appears 2 times. -date '1996-11-30' appears 2 times. -date '2000-03-30' appears 2 times. -date '2000-05-30' appears 2 times. -date '2000-07-30' appears 2 times. -date '2000-09-30' appears 2 times. -date '2000-11-30' appears 2 times. -date '2004-03-30' appears 2 times. -date '2004-05-30' appears 2 times. -date '2004-07-30' appears 2 times. -date '2004-09-30' appears 2 times. -date '2004-11-30' appears 2 times. -date '2008-03-30' appears 2 times. -date '2008-05-30' appears 2 times. -date '2008-07-30' appears 2 times. -date '2008-09-30' appears 2 times. -date '2008-11-30' appears 2 times. -date '2012-03-30' appears 2 times. -date '2012-05-30' appears 2 times. -date '2012-07-30' appears 2 times. -date '2012-09-30' appears 2 times. -date '2012-11-30' appears 2 times. -date '2016-03-30' appears 2 times. -date '2016-05-30' appears 2 times. -date '2016-07-30' appears 2 times. -date '2016-09-30' appears 2 times. -date '2016-11-30' appears 2 times. -date '2020-03-30' appears 2 times. -date '2020-05-30' appears 2 times. -date '2020-07-30' appears 2 times. -date '2020-09-30' appears 2 times. -date '2020-11-30' appears 2 times. diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 9c81a6e1..91c4aec8 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -44,7 +44,6 @@ GDALNetCDFFormatStr, ) from clim_recal.utils.xarray import ( - CPM_LOCAL_INTERMEDIATE_PATH, FINAL_RESAMPLE_LAT_COL, FINAL_RESAMPLE_LON_COL, HADS_RAW_X_COLUMN_NAME, @@ -52,7 +51,6 @@ NETCDF4_XARRAY_ENGINE, BoundsTupleType, ConvertCalendarAlignOptions, - IntermediateCPMFilesManager, convert_xr_calendar, cpm_xarray_to_standard_calendar, crop_nc, @@ -127,6 +125,22 @@ ) ) +# Previous CPM test results, likely flipped +# FINAL_CPM_DEC_10_5_X_0_10_Y: Final[NDArray] = np.array( +# ( +# np.nan, +# np.nan, +# np.nan, +# np.nan, +# np.nan, +# np.nan, +# 12.31753, +# 12.31753, +# 12.305811, +# 12.290186, +# ) +# ) + FINAL_CPM_DEC_10_5_X_0_10_Y: Final[NDArray] = np.array( ( np.nan, @@ -135,10 +149,10 @@ np.nan, np.nan, np.nan, - 12.31753, - 12.31753, - 12.305811, - 12.290186, + 5.131494, + 5.091943, + 5.091943, + 5.057275, ) ) @@ -567,43 +581,32 @@ def test_cpm_xarray_to_standard_calendar( @pytest.mark.mount @pytest.mark.slow -def test_cpm_warp_steps( +def test_cpm_reproject_with_standard_calendar( tasmax_cpm_1980_raw: T_Dataset, test_runs_output_path: Path, - caplog: pytest.LogCaptureFixture, variable_name: str = "tasmax", ) -> None: """Test all steps around calendar and warping CPM RAW data.""" output_path: Path = results_path( - "test-cpm-warp", path=test_runs_output_path, mkdir=True - ) - test_intermediate_files = IntermediateCPMFilesManager( - variable_name=variable_name, - output_path=output_path, - time_series_start=tasmax_cpm_1980_raw.time.values[0], - time_series_end=tasmax_cpm_1980_raw.time.values[-1], + "test-cpm-warp", path=test_runs_output_path, mkdir=True, extension="nc" ) - projected = cpm_reproject_with_standard_calendar( + plot_path: Path = output_path.parent / (output_path.stem + ".png") + projected: T_Dataset = cpm_reproject_with_standard_calendar( tasmax_cpm_1980_raw, - variable_name=variable_name, - output_path=output_path, - # file_name_prefix=file_name_prefix, ) assert projected.rio.crs == BRITISH_NATIONAL_GRID_EPSG - # Previous checks, worth re-wroking/expanding - # test_projected = open_dataset(intermediate_warp_path) - # assert test_projected.rio.crs == BRITISH_NATIONAL_GRID_EPSG - # assert len(test_projected.time) == len(expanded_calendar.time) - # assert len(test_projected.x) == len(tasmax_cpm_1980_raw.grid_longitude) - # assert len(test_projected.y) == len(tasmax_cpm_1980_raw.grid_latitude) - # test_projected.to_netcdf(final_nc_path) - assert test_intermediate_files.intermediate_files_folder.name.startswith( - CPM_LOCAL_INTERMEDIATE_PATH.name - ) - final_results: T_Dataset = open_dataset( - test_intermediate_files.final_nc_path, decode_coords="all" - ) - assert (final_results.time == projected.time).all() + projected.to_netcdf(output_path) + results: T_Dataset = open_dataset(output_path, decode_coords="all") + assert (results.time == projected.time).all() + assert results.dims == { + FINAL_RESAMPLE_LON_COL: 529, + FINAL_RESAMPLE_LAT_COL: 653, + "time": 365, + } + assert results.rio.crs == BRITISH_NATIONAL_GRID_EPSG + assert len(results.data_vars) == 1 + assert_allclose(results[variable_name][10][5][:10], FINAL_CPM_DEC_10_5_X_0_10_Y) + plot_xarray(results.tasmax[0], plot_path) @pytest.mark.xfail(reason="test not complete") From 92f4590a8e8b82e4722c7e6cda664f094cd5ff34 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Fri, 14 Jun 2024 13:27:26 +0100 Subject: [PATCH 22/92] fix: remove `export_path_as_output_path_kwarg=True` from `CPMResampler` --- python/clim_recal/resample.py | 8 +++---- python/tests/test_resample.py | 45 ++++------------------------------- 2 files changed, 9 insertions(+), 44 deletions(-) diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index 2c722827..049e08f7 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -195,6 +195,10 @@ def __repr__(self) -> str: def set_grid(self, new_grid_data_path: PathLike | None = None) -> None: """Set check and set (if necessary) `grid` attribute of `self`. + Notes + ----- + To be depricated. + Parameters ---------- new_grid_data_path @@ -481,11 +485,7 @@ def to_reprojection( func=cpm_reproject_with_standard_calendar, new_path_name_func=reproject_standard_calendar_filename, export_folder=path, - # export_folder=gdal_warp_wrapper, - # Leaving in case we return to using warp - export_path_as_output_path_kwarg=True, to_netcdf=True, - # to_netcdf=True, variable_name=self.cpm_variable_name, # x_grid=self.x, # y_grid=self.y, diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 91c4aec8..97c4a6c0 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -74,8 +74,8 @@ HADS_FIRST_DATES: np.array = np.array( ["19800101", "19800102", "19800103", "19800104", "19800105"] ) -FINAL_CONVERTED_CPM_WIDTH: Final[int] = 484 -FINAL_CONVERTED_CPM_HEIGHT: Final[int] = 606 +FINAL_CONVERTED_CPM_WIDTH: Final[int] = 529 +FINAL_CONVERTED_CPM_HEIGHT: Final[int] = 653 RAW_CPM_TASMAX_1980_FIRST_5: np.array = np.array( [12.654932, 12.63711, 12.616358, 12.594385, 12.565821], dtype="float32" @@ -91,14 +91,6 @@ [10.645899, 10.508448, 10.546778, 10.547998, 10.553614], dtype="float32" ) -# Initial HADS projection test results matched this, leaving to -# double check before merge to main -# FINAL_HADS_JAN_10_430_X_370_390_Y: Final[NDArray] = np.array( -# ( np.nan, np.nan, np.nan, np.nan, np.nan, -# np.nan, np.nan, np.nan, np.nan, 4.99268164, -# 4.82281839, 4.55366184, 4.45834185, 4.27357187, 4.1575218, -# 4.07316193, 3.97350405, 3.84286826, 3.81615739, 3.84426594), -# ) FINAL_HADS_JAN_10_430_X_230_250_Y: Final[NDArray] = np.array( ( @@ -125,21 +117,6 @@ ) ) -# Previous CPM test results, likely flipped -# FINAL_CPM_DEC_10_5_X_0_10_Y: Final[NDArray] = np.array( -# ( -# np.nan, -# np.nan, -# np.nan, -# np.nan, -# np.nan, -# np.nan, -# 12.31753, -# 12.31753, -# 12.305811, -# 12.290186, -# ) -# ) FINAL_CPM_DEC_10_5_X_0_10_Y: Final[NDArray] = np.array( ( @@ -599,8 +576,8 @@ def test_cpm_reproject_with_standard_calendar( results: T_Dataset = open_dataset(output_path, decode_coords="all") assert (results.time == projected.time).all() assert results.dims == { - FINAL_RESAMPLE_LON_COL: 529, - FINAL_RESAMPLE_LAT_COL: 653, + FINAL_RESAMPLE_LON_COL: FINAL_CONVERTED_CPM_HEIGHT, + FINAL_RESAMPLE_LAT_COL: FINAL_CONVERTED_CPM_WIDTH, "time": 365, } assert results.rio.crs == BRITISH_NATIONAL_GRID_EPSG @@ -711,23 +688,11 @@ def test_ukcp_manager(resample_test_cpm_output_path, config: str) -> None: ) export: T_Dataset = open_dataset(paths[0]) assert export.dims["time"] == 365 - assert export.dims[FINAL_RESAMPLE_LON_COL] == 492 - assert export.dims[FINAL_RESAMPLE_LAT_COL] == 608 # previously 603 - # TODO: check final correct values + assert export.dims[FINAL_RESAMPLE_LON_COL] == FINAL_CONVERTED_CPM_WIDTH assert_allclose(export.tasmax[10][5][:10].values, FINAL_CPM_DEC_10_5_X_0_10_Y) - # assert not np.isnan(export.tasmax.head()[0].values).all() - # Todo: reapply these checks to intermediary files - # assert export.dims[CPRUK_XDIM] == 484 - # assert export.dims[CPRUK_YDIM] == 606 - # assert not np.isnan(export.tasmax.head()[0][0][0].values).all() assert ( CPM_FIRST_DATES == export.time.dt.strftime(CLI_DATE_FORMAT_STR).head().values ).all() - # assert ( - # CPM_FIRST_DATES - # == export.time_bnds.dt.strftime(CLI_DATE_FORMAT_STR).head().values - # ).all() - # assert (CPM_FIRST_DATES == export.yyyymmdd.head().values).all() # @pytest.mark.xfail(reason="checking `export.tasmax` values currently yields `nan`") From 12d69b4e76e19029edfe932a47be7b2f14e948e4 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 16 Jun 2024 10:06:37 +0100 Subject: [PATCH 23/92] fix: refactor `hads_reseample_and_reproject` to use `xr_reproject_crs` --- python/clim_recal/resample.py | 21 +++-- python/clim_recal/utils/xarray.py | 123 ++++++++++++++++++------------ python/conftest.py | 36 ++++++++- python/tests/test_resample.py | 94 ++++++++++++++++------- python/tests/utils.py | 14 ++++ 5 files changed, 202 insertions(+), 86 deletions(-) diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index 049e08f7..01181315 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -37,6 +37,7 @@ HADS_RAW_X_COLUMN_NAME, HADS_RAW_Y_COLUMN_NAME, NETCDF_EXTENSION_STR, + ReprojectFuncType, apply_geo_func, cpm_reproject_with_standard_calendar, hads_resample_and_reproject, @@ -369,6 +370,7 @@ class HADsResampler(ResamblerBase): resolution_relative_path: Path = HADS_2_2K_RESOLUTION_PATH input_file_x_column_name: str = HADS_XDIM input_file_y_column_name: str = HADS_YDIM + _resample_func: ReprojectFuncType = hads_resample_and_reproject _use_reference_grid: bool = True def to_reprojection( @@ -387,18 +389,20 @@ def to_reprojection( return apply_geo_func( source_path=source_path, # func=interpolate_coords, - func=hads_resample_and_reproject, + func=self._resample_func, export_folder=path, # Leaving in case we return to using warp # export_path_as_output_path_kwarg=True, # to_netcdf=False, to_netcdf=True, variable_name=self.variable_name, - x_grid=self.x, - y_grid=self.y, - source_x_coord_column_name=self.input_file_x_column_name, - source_y_coord_column_name=self.input_file_y_column_name, - use_reference_grid=self._use_reference_grid, + x_dim_name=self.input_file_x_column_name, + y_dim_name=self.input_file_y_column_name, + # x_grid=self.x, + # y_grid=self.y, + # source_x_coord_column_name=self.input_file_x_column_name, + # source_y_coord_column_name=self.input_file_y_column_name, + # use_reference_grid=self._use_reference_grid, new_path_name_func=reproject_2_2km_filename, return_results=return_results, ) @@ -462,6 +466,7 @@ class CPMResampler(ResamblerBase): input_file_x_column_name: str = CPRUK_XDIM input_file_y_column_name: str = CPRUK_YDIM resolution_relative_path: Path = CPM_SPATIAL_COORDS_PATH + _resample_func: ReprojectFuncType = cpm_reproject_with_standard_calendar @property def cpm_variable_name(self) -> str: @@ -482,11 +487,13 @@ def to_reprojection( ) return apply_geo_func( source_path=source_path, - func=cpm_reproject_with_standard_calendar, + func=self._resample_func, new_path_name_func=reproject_standard_calendar_filename, export_folder=path, to_netcdf=True, variable_name=self.cpm_variable_name, + x_dim_name=self.input_file_x_column_name, + y_dim_name=self.input_file_y_column_name, # x_grid=self.x, # y_grid=self.y, # x_coord_column_name=self.input_file_x_column_name, diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 83437f33..7a95f45c 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -3,7 +3,7 @@ from logging import getLogger from os import PathLike from pathlib import Path -from typing import Any, Callable, Final, Literal, Sequence +from typing import Any, Callable, Final, Literal import numpy as np import rioxarray # nopycln: import @@ -41,6 +41,7 @@ DropDayType = set[tuple[int, int]] ChangeDayType = set[tuple[int, int]] +ReprojectFuncType = Callable[[T_Dataset], T_Dataset] # MONTH_DAY_DROP: DropDayType = {(1, 31), (4, 1), (6, 1), (8, 1), (10, 1), (12, 1)} # """A `set` of tuples of month and day numbers for `enforce_date_changes`.""" @@ -86,7 +87,7 @@ @dataclass -class CityCoords: +class BondingBoxCoords: name: str xmin: float xmax: float @@ -99,14 +100,14 @@ def as_tuple(self) -> tuple[float, float, float, float]: return self.xmin, self.xmax, self.ymin, self.ymax -GlasgowCoordsEPSG27700: Final[CityCoords] = CityCoords( +GlasgowCoordsEPSG27700: Final[BondingBoxCoords] = BondingBoxCoords( "Glasgow", 249799.999600002, 269234.9996, 657761.472000003, 672330.696800007 ) -LondonCoordsEPSG27700: Final[CityCoords] = CityCoords( +LondonCoordsEPSG27700: Final[BondingBoxCoords] = BondingBoxCoords( "London", 503568.1996, 561957.4961, 155850.7974, 200933.9025 ) -ManchesterCoordsEPSG27700: Final[CityCoords] = CityCoords( +ManchesterCoordsEPSG27700: Final[BondingBoxCoords] = BondingBoxCoords( "Manchester", 380399.997, 393249.999, 389349.999, 405300.003 ) @@ -130,14 +131,16 @@ def as_tuple(self) -> tuple[float, float, float, float]: DEFAULT_RELATIVE_GRID_DATA_PATH: Final[Path] = ( Path().absolute() / "../data/rcp85_land-cpm_uk_2.2km_grid.nc" ) +TIME_COLUMN_NAME: Final[str] = "time" HADS_RAW_X_COLUMN_NAME: Final[str] = "projection_x_coordinate" HADS_RAW_Y_COLUMN_NAME: Final[str] = "projection_y_coordinate" HADS_DROP_VARS_AFTER_PROJECTION: Final[tuple[str, ...]] = ("longitude", "latitude") -# TODO: CHECK IF I GOT THESE BACKWARDS -# FINAL_RESAMPLE_LAT_COL: Final[str] = "x" -# FINAL_RESAMPLE_LON_COL: Final[str] = "y" +CPM_RAW_X_COLUMN_NAME: Final[str] = "grid_longitude" +CPM_RAW_Y_COLUMN_NAME: Final[str] = "grid_latitude" + +# TODO: CHECK IF THESE ARE BACKWARDS FINAL_RESAMPLE_LON_COL: Final[str] = "x" FINAL_RESAMPLE_LAT_COL: Final[str] = "y" @@ -229,6 +232,8 @@ def check_xarray_path_and_var_name( def cpm_reproject_with_standard_calendar( cpm_xr_time_series: T_Dataset | PathLike, variable_name: str | None = None, + x_dim_name: str = CPM_RAW_X_COLUMN_NAME, + y_dim_name: str = CPM_RAW_Y_COLUMN_NAME, ) -> T_Dataset: """Convert raw `cpm_xr_time_series` to an 365/366 days and 27700 coords. @@ -286,22 +291,25 @@ def cpm_reproject_with_standard_calendar( ) subset_in_epsg_27700: T_DataArray = xr_reproject_crs( - subset_within_ensemble, variable_name=variable_name + subset_within_ensemble, + variable_name=variable_name, + x_dim_name=x_dim_name, + y_dim_name=y_dim_name, ) try: assert (subset_in_epsg_27700.time == standar_calendar_ts.time).all() except: raise ValueError( - f"Time series of 'standar_calendar_ts' does not match projection to {BRITISH_NATIONAL_GRID_EPSG}." + f"Time series of 'standar_calendar_ts' does not match time series of projection to {BRITISH_NATIONAL_GRID_EPSG}." ) return subset_in_epsg_27700 def xr_reproject_crs( xr_time_series: T_Dataset | PathLike, - x_dim_name: str = "grid_longitude", - y_dim_name: str = "grid_latitude", - time_dim_name: str = "time", + x_dim_name: str = CPM_RAW_X_COLUMN_NAME, + y_dim_name: str = CPM_RAW_Y_COLUMN_NAME, + time_dim_name: str = TIME_COLUMN_NAME, variable_name: str | None = None, final_crs: str = BRITISH_NATIONAL_GRID_EPSG, final_resolution: tuple[int, int] | None = (2200, 2200), @@ -313,10 +321,10 @@ def xr_reproject_crs( xr_time_series `Dataset` or `PathLike` to load and reproject. x_dim_name - `str` name of `x` spatial dimension in `xr_time_series`. - y_dim_name - `str` name of `y` spatial dimension in `xr_time_series`. + `str` name of `x` spatial dimension in `xr_time_series`. Default matches CPM UK projections. y_dim_name + `str` name of `y` spatial dimension in `xr_time_series`. Default matches CPM UK projections. + time_dim_name `str` name of `time` dimension in `xr_time_series`. variable_name Name of datset to apply projection to within `xr_time_series`. @@ -468,43 +476,55 @@ def interpolate_coords( def hads_resample_and_reproject( hads_xr_time_series: T_Dataset | PathLike, variable_name: str, - x_grid: NDArray | None = None, - y_grid: NDArray | None = None, - method: str = "linear", - source_x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, - source_y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, - final_x_coord_column_name: str = FINAL_RESAMPLE_LON_COL, - final_y_coord_column_name: str = FINAL_RESAMPLE_LAT_COL, - final_crs: str | None = BRITISH_NATIONAL_GRID_EPSG, - vars_to_drop: Sequence[str] | None = HADS_DROP_VARS_AFTER_PROJECTION, - use_reference_grid: bool = False, + x_dim_name: str = HADS_RAW_X_COLUMN_NAME, + y_dim_name: str = HADS_RAW_Y_COLUMN_NAME, + # x_grid: NDArray | None = None, + # y_grid: NDArray | None = None, + # method: str = "linear", + # source_x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, + # source_y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, + # final_x_coord_column_name: str = FINAL_RESAMPLE_LON_COL, + # final_y_coord_column_name: str = FINAL_RESAMPLE_LAT_COL, + # final_crs: str | None = BRITISH_NATIONAL_GRID_EPSG, + # vars_to_drop: Sequence[str] | None = HADS_DROP_VARS_AFTER_PROJECTION, + # use_reference_grid: bool = False, ) -> T_Dataset: """Resample `HADs` `xarray` time series to 2.2km.""" - if isinstance(hads_xr_time_series, PathLike): - hads_xr_time_series = open_dataset(hads_xr_time_series, decode_coords="all") - - interpolated_hads: T_Dataset = interpolate_coords( + hads_xr_time_series, variable_name = check_xarray_path_and_var_name( + hads_xr_time_series, variable_name + ) + # if isinstance(hads_xr_time_series, PathLike): + # hads_xr_time_series = open_dataset(hads_xr_time_series, decode_coords="all") + epsg_277000_2_2km: T_Dataset = xr_reproject_crs( hads_xr_time_series, variable_name=variable_name, - x_grid=x_grid, - y_grid=y_grid, - x_coord_column_name=source_x_coord_column_name, - y_coord_column_name=source_y_coord_column_name, - method=method, - use_reference_grid=use_reference_grid, - ) - if vars_to_drop: - interpolated_hads = interpolated_hads.drop_vars(vars_to_drop) - - interpolated_hads = interpolated_hads.rename( - { - source_x_coord_column_name: final_x_coord_column_name, - source_y_coord_column_name: final_y_coord_column_name, - } + x_dim_name=x_dim_name, + y_dim_name=y_dim_name, ) - if final_crs: - interpolated_hads.rio.write_crs(final_crs, inplace=True) - return interpolated_hads + + # interpolated_hads: T_Dataset = interpolate_coords( + # hads_xr_time_series, + # variable_name=variable_name, + # x_grid=x_grid, + # y_grid=y_grid, + # x_coord_column_name=source_x_coord_column_name, + # y_coord_column_name=source_y_coord_column_name, + # method=method, + # use_reference_grid=use_reference_grid, + # ) + # if vars_to_drop: + # interpolated_hads = interpolated_hads.drop_vars(vars_to_drop) + # + # interpolated_hads = interpolated_hads.rename( + # { + # source_x_coord_column_name: final_x_coord_column_name, + # source_y_coord_column_name: final_y_coord_column_name, + # } + # ) + # if final_crs: + # interpolated_hads.rio.write_crs(final_crs, inplace=True) + # return interpolated_hads + return epsg_277000_2_2km def plot_xarray( @@ -970,7 +990,7 @@ def gdal_warp_wrapper( def apply_geo_func( source_path: PathLike, - func: Callable[[T_Dataset], T_Dataset], + func: ReprojectFuncType, export_folder: PathLike, new_path_name_func: Callable[[Path], Path] | None = None, to_netcdf: bool = True, @@ -1004,6 +1024,11 @@ def apply_geo_func( **kwargs Other parameters passed to `func` call. """ + if not source_path: + raise ValueError( + f"Source path must be a folder, currently '{source_path}'. " + f"May need to mount drive." + ) export_path: Path = Path(source_path) if new_path_name_func: export_path = new_path_name_func(export_path) diff --git a/python/conftest.py b/python/conftest.py index 262d5094..30b1e7b9 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -111,12 +111,14 @@ def is_data_mounted(data_mount_path) -> bool: @pytest.fixture(scope="session") def local_cache_fixtures( + local_cache_path: Path, local_cpm_cache_path: Path, local_hads_cache_path: Path, sync_all: bool, use_async: bool, ) -> LocalCachesManager: cache_manager: LocalCachesManager = LocalCachesManager( + default_local_cache_path=local_cache_path, caches=( LocalCache( name="tasmax_cpm_1980_raw", @@ -132,7 +134,7 @@ def local_cache_fixtures( reader=open_dataset, reader_kwargs={"decode_coords": "all"}, ), - ) + ), ) if sync_all: if use_async: @@ -150,6 +152,17 @@ def tasmax_cpm_1980_raw( return local_cache_fixtures["tasmax_cpm_1980_raw"].read(cache_path=local_cache) +@pytest.fixture(scope="session") +def tasmax_cpm_1980_raw_path( + local_cache: bool, + local_cache_fixtures: LocalCachesManager, +) -> T_Dataset: + if local_cache: + return local_cache_fixtures["tasmax_cpm_1980_raw"].local_cache_path + else: + return local_cache_fixtures["tasmax_cpm_1980_raw"].source_path + + @pytest.fixture(scope="session") def tasmax_hads_1980_raw( local_cache: bool, @@ -158,6 +171,17 @@ def tasmax_hads_1980_raw( return local_cache_fixtures["tasmax_hads_1980_raw"].read(cache_path=local_cache) +@pytest.fixture(scope="session") +def tasmax_hads_1980_raw_path( + local_cache: bool, + local_cache_fixtures: LocalCachesManager, +) -> T_Dataset: + if local_cache: + return local_cache_fixtures["tasmax_hads_1980_raw"].local_cache_path + else: + return local_cache_fixtures["tasmax_hads_1980_raw"].source_path + + # This may be removed in future # @pytest.fixture(autouse=True) def ensure_python_path() -> None: @@ -313,8 +337,14 @@ def uk_rotated_grid_bounds() -> BoundsTupleType: # Note: it may be worth setting this to cache for session runs @pytest.fixture -def clim_runner(tmp_path) -> ClimRecalConfig: +def clim_runner( + tmp_path: Path, + local_cache: bool, + local_cache_fixtures: LocalCachesManager, +) -> ClimRecalConfig: """Return default `ClimRecalConfig`.""" + assert local_cache_fixtures.default_local_cache_path + assert local_cache_fixtures.check_default_cache_path() try: return ClimRecalConfig( preprocess_out_folder=tmp_path, @@ -324,6 +354,8 @@ def clim_runner(tmp_path) -> ClimRecalConfig: return ClimRecalConfig( preprocess_out_folder=tmp_path, cities=(CityOptions.GLASGOW, CityOptions.MANCHESTER), + hads_folder=local_cache_fixtures.default_local_cache_path, + cpm_folder=local_cache_fixtures.default_local_cache_path, cpm_kwargs=dict(_allow_check_fail=True), hads_kwargs=dict(_allow_check_fail=True), ) diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 97c4a6c0..d65f344f 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -19,14 +19,10 @@ DEFAULT_RELATIVE_GRID_DATA_PATH, HADS_XDIM, HADS_YDIM, - RAW_CPM_TASMAX_PATH, - RAW_HADS_PATH, - RAW_HADS_TASMAX_PATH, CPMResampler, CPMResamplerManager, HADsResampler, HADsResamplerManager, - cpm_reproject_with_standard_calendar, ) from clim_recal.utils.core import ( CLI_DATE_FORMAT_STR, @@ -52,6 +48,7 @@ BoundsTupleType, ConvertCalendarAlignOptions, convert_xr_calendar, + cpm_reproject_with_standard_calendar, cpm_xarray_to_standard_calendar, crop_nc, file_name_to_start_end_dates, @@ -60,6 +57,7 @@ interpolate_coords, plot_xarray, ) +from conftest import resample_test_cpm_output_path from .utils import ( HADS_UK_TASMAX_DAY_SERVER_PATH, @@ -74,9 +72,18 @@ HADS_FIRST_DATES: np.array = np.array( ["19800101", "19800102", "19800103", "19800104", "19800105"] ) + +CALENDAR_CONVERTED_CPM_WIDTH: Final[int] = 484 +CALENDAR_CONVERTED_CPM_HEIGHT: Final[int] = 606 + +# FINAL_CONVERTED_CPM_WIDTH: Final[int] = 410 +# FINAL_CONVERTED_CPM_HEIGHT: Final[int] = 660 FINAL_CONVERTED_CPM_WIDTH: Final[int] = 529 FINAL_CONVERTED_CPM_HEIGHT: Final[int] = 653 +FINAL_CONVERTED_HADS_WIDTH: Final[int] = 410 +FINAL_CONVERTED_HADS_HEIGHT: Final[int] = 660 + RAW_CPM_TASMAX_1980_FIRST_5: np.array = np.array( [12.654932, 12.63711, 12.616358, 12.594385, 12.565821], dtype="float32" ) @@ -503,6 +510,7 @@ def test_geo_warp_format_type_crop( assert read_exported.rio.bounds() == glasgow_epsg_27700_bounds +@pytest.mark.localcache @pytest.mark.mount @pytest.mark.slow @pytest.mark.parametrize("include_bnds_index", (True, False)) @@ -523,8 +531,8 @@ def test_cpm_xarray_to_standard_calendar( test_converted = cpm_xarray_to_standard_calendar( tasmax_cpm_1980_raw, include_bnds_index=include_bnds_index ) - assert test_converted.rio.width == FINAL_CONVERTED_CPM_WIDTH - assert test_converted.rio.height == FINAL_CONVERTED_CPM_HEIGHT + assert test_converted.rio.width == CALENDAR_CONVERTED_CPM_WIDTH + assert test_converted.rio.height == CALENDAR_CONVERTED_CPM_HEIGHT assert test_converted.rio.crs.to_proj4() == CORRECT_PROJ4 assert test_converted.tasmax.rio.crs.to_proj4() == CORRECT_PROJ4 assert len(test_converted.time) == 365 @@ -556,6 +564,7 @@ def test_cpm_xarray_to_standard_calendar( ).all() +@pytest.mark.localcache @pytest.mark.mount @pytest.mark.slow def test_cpm_reproject_with_standard_calendar( @@ -576,14 +585,14 @@ def test_cpm_reproject_with_standard_calendar( results: T_Dataset = open_dataset(output_path, decode_coords="all") assert (results.time == projected.time).all() assert results.dims == { - FINAL_RESAMPLE_LON_COL: FINAL_CONVERTED_CPM_HEIGHT, - FINAL_RESAMPLE_LAT_COL: FINAL_CONVERTED_CPM_WIDTH, + FINAL_RESAMPLE_LON_COL: FINAL_CONVERTED_CPM_WIDTH, + FINAL_RESAMPLE_LAT_COL: FINAL_CONVERTED_CPM_HEIGHT, "time": 365, } assert results.rio.crs == BRITISH_NATIONAL_GRID_EPSG assert len(results.data_vars) == 1 assert_allclose(results[variable_name][10][5][:10], FINAL_CPM_DEC_10_5_X_0_10_Y) - plot_xarray(results.tasmax[0], plot_path) + plot_xarray(results.tasmax[0], plot_path, time_stamp=True) @pytest.mark.xfail(reason="test not complete") @@ -657,19 +666,22 @@ def test_crop_nc( assert False +@pytest.mark.localcache @pytest.mark.slow @pytest.mark.mount @pytest.mark.parametrize( "config", ("direct", "range", "direct_provided", "range_provided") ) -def test_ukcp_manager(resample_test_cpm_output_path, config: str) -> None: +def test_ukcp_manager( + resample_test_cpm_output_path, config: str, tasmax_cpm_1980_raw_path: Path +) -> None: """Test running default CPM calendar fix.""" CPM_FIRST_DATES: np.array = np.array( ["19801201", "19801202", "19801203", "19801204", "19801205"] ) output_path: Path = resample_test_cpm_output_path / config test_config = CPMResampler( - input_path=RAW_CPM_TASMAX_PATH, + input_path=tasmax_cpm_1980_raw_path.parent, output_path=output_path, ) paths: list[Path] @@ -693,16 +705,24 @@ def test_ukcp_manager(resample_test_cpm_output_path, config: str) -> None: assert ( CPM_FIRST_DATES == export.time.dt.strftime(CLI_DATE_FORMAT_STR).head().values ).all() + plot_xarray( + export.tasmax[0], + path=resample_test_cpm_output_path / f"config-{config}.png", + time_stamp=True, + ) # @pytest.mark.xfail(reason="checking `export.tasmax` values currently yields `nan`") +@pytest.mark.localcache @pytest.mark.slow @pytest.mark.mount @pytest.mark.parametrize("range", (False, True)) -def test_hads_manager(resample_test_hads_output_path, range: bool) -> None: +def test_hads_manager( + resample_test_hads_output_path, range: bool, tasmax_hads_1980_raw_path: Path +) -> None: """Test running default HADs spatial projection.""" test_config = HADsResampler( - input_path=RAW_HADS_TASMAX_PATH, + input_path=tasmax_hads_1980_raw_path.parent, output_path=resample_test_hads_output_path / f"range-{range}", ) paths: list[Path] @@ -717,8 +737,14 @@ def test_hads_manager(resample_test_hads_output_path, range: bool) -> None: HADS_FIRST_DATES.astype(object) == export.time.dt.strftime(CLI_DATE_FORMAT_STR).head().values ).all() + plot_xarray( + export.tasmax[0], + path=resample_test_hads_output_path / f"range-{range}.png", + time_stamp=True, + ) +@pytest.mark.localcache @pytest.mark.mount @pytest.mark.slow @pytest.mark.parametrize("data_type", ("hads", "cpm")) @@ -783,13 +809,16 @@ def test_interpolate_coords( assert reprojected_xr_time_series.dims[y_col_name] == 651 +@pytest.mark.localcache @pytest.mark.mount def test_hads_resample_and_reproject( tasmax_hads_1980_raw: T_Dataset, + tasmax_cpm_1980_raw: T_Dataset, ) -> None: variable_name: str = "tasmax" output_path: Path = Path("tests/runs/reample-hads") # First index is for month, in this case January 1980 + cpm_to_match: T_Dataset = cpm_reproject_with_standard_calendar(tasmax_cpm_1980_raw) plot_xarray( tasmax_hads_1980_raw.tasmax[0], path=output_path / "tasmas-1980-JAN-1-raw.png", @@ -804,12 +833,12 @@ def test_hads_resample_and_reproject( variable_name=variable_name, ) - plot_xarray( - reprojected.tasmax[0], path=output_path / "tasmas-1980.png", time_stamp=True - ) - assert_allclose( - reprojected.tasmax[10][430][230:250], FINAL_HADS_JAN_10_430_X_230_250_Y - ) + # plot_xarray( + # reprojected.tasmax[0], path=output_path / "tasmas-1980.png", time_stamp=True + # ) + # assert_allclose( + # reprojected.tasmax[10][430][230:250], FINAL_HADS_JAN_10_430_X_230_250_Y + # ) assert reprojected.rio.crs.to_epsg() == int(BRITISH_NATIONAL_GRID_EPSG[5:]) export_netcdf_path: Path = results_path( "tasmax-1980-converted", path=output_path, extension="nc" @@ -818,42 +847,51 @@ def test_hads_resample_and_reproject( read_from_export: T_Dataset = open_dataset(export_netcdf_path, decode_coords="all") assert read_from_export.dims["time"] == 31 assert ( - read_from_export.dims[FINAL_RESAMPLE_LON_COL] == 528 + read_from_export.dims[FINAL_RESAMPLE_LON_COL] == FINAL_CONVERTED_HADS_WIDTH ) # replaces projection_x_coordinate assert ( - read_from_export.dims[FINAL_RESAMPLE_LAT_COL] == 651 + read_from_export.dims[FINAL_RESAMPLE_LAT_COL] == FINAL_CONVERTED_HADS_HEIGHT ) # replaces projection_y_coordinate assert reprojected.rio.crs == read_from_export.rio.crs == BRITISH_NATIONAL_GRID_EPSG + # Check projection coordinates match for CPM and HADs + assert all(cpm_to_match.x == read_from_export.x) + assert all(cpm_to_match.y == read_from_export.y) +@pytest.mark.localcache @pytest.mark.mount @pytest.mark.parametrize("strict_fail_bool", (True, False)) @pytest.mark.parametrize("manager", (HADsResamplerManager, CPMResamplerManager)) def test_variable_in_base_import_path_error( - strict_fail_bool: bool, manager: HADsResamplerManager | CPMResamplerManager + strict_fail_bool: bool, + manager: HADsResamplerManager | CPMResamplerManager, + tasmax_hads_1980_raw_path: Path, ) -> None: """Test checking import path validity for a given variable.""" with pytest.raises(manager.VarirableInBaseImportPathError): - HADsResamplerManager( - input_paths=RAW_HADS_TASMAX_PATH, + manager( + input_paths=tasmax_hads_1980_raw_path, stop_index=1, ) if strict_fail_bool: with pytest.raises(FileExistsError): - HADsResamplerManager( - input_paths=RAW_HADS_TASMAX_PATH, + manager( + input_paths=tasmax_hads_1980_raw_path, stop_index=1, _strict_fail_if_var_in_input_path=False, ) +@pytest.mark.localcache @pytest.mark.slow @pytest.mark.mount @pytest.mark.parametrize("multiprocess", (False, True)) -def test_execute_resample_configs(multiprocess: bool, tmp_path) -> None: +def test_execute_resample_configs( + multiprocess: bool, tmp_path, tasmax_hads_1980_raw_path: Path +) -> None: """Test running default HADs spatial projection.""" test_config = HADsResamplerManager( - input_paths=RAW_HADS_PATH, + input_paths=tasmax_hads_1980_raw_path.parent, output_paths=tmp_path, stop_index=1, ) diff --git a/python/tests/utils.py b/python/tests/utils.py index 4c145d74..86d25664 100644 --- a/python/tests/utils.py +++ b/python/tests/utils.py @@ -515,6 +515,8 @@ class LocalCachesManager(UserDict): """ caches: Sequence[LocalCache] | None + fail_if_no_source: bool = False + default_local_cache_path: PathLike | None = None _synced: dict[str, SyncedLog] = field(default_factory=dict) def __repr__(self) -> str: @@ -526,9 +528,21 @@ def _sync_caches_attr(self) -> None: if self.caches: self.data = {cache.name: cache for cache in self.caches} + def check_default_cache_path(self) -> bool: + """Check `self.cached_paths` in `self.default_local_cache_path`.""" + if len(self): + return all( + self.default_local_cache_path in cache_config.local_cache_path.parents + for cache_config in self.values() + ) + else: + return False + def __post_init__(self) -> None: """Populate the `data` attribute.""" self._sync_caches_attr() + if not self._synced: + self.sync_all(fail_if_no_source=self.fail_if_no_source) @property def cached_paths(self) -> tuple[Path, ...]: From 3dd297d79e0e0237ab4ea0cafb3985c8b7525288 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 16 Jun 2024 15:15:13 +0100 Subject: [PATCH 24/92] feat: add `crop_xarray` to `utils/xarray.py` --- python/clim_recal/utils/xarray.py | 57 ++++++++++++++++++++----------- python/tests/test_resample.py | 10 +++--- 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 7a95f45c..8c4a9c16 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -9,7 +9,6 @@ import rioxarray # nopycln: import import seaborn from cftime._cftime import Datetime360Day -from geopandas import GeoDataFrame, read_file from matplotlib import pyplot as plt from numpy import ndarray from numpy.typing import NDArray @@ -87,7 +86,7 @@ @dataclass -class BondingBoxCoords: +class BoundingBoxCoords: name: str xmin: float xmax: float @@ -99,15 +98,20 @@ def as_tuple(self) -> tuple[float, float, float, float]: """Return in `xmin`, `xmax`, `ymin`, `ymax` order.""" return self.xmin, self.xmax, self.ymin, self.ymax + @property + def rioxarry_epsg(self) -> str: + """Return `self.epsg` in `rioxarray` `str` format.""" + return f"EPSG:{self.epsg}" -GlasgowCoordsEPSG27700: Final[BondingBoxCoords] = BondingBoxCoords( + +GlasgowCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( "Glasgow", 249799.999600002, 269234.9996, 657761.472000003, 672330.696800007 ) -LondonCoordsEPSG27700: Final[BondingBoxCoords] = BondingBoxCoords( +LondonCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( "London", 503568.1996, 561957.4961, 155850.7974, 200933.9025 ) -ManchesterCoordsEPSG27700: Final[BondingBoxCoords] = BondingBoxCoords( +ManchesterCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( "Manchester", 380399.997, 393249.999, 389349.999, 405300.003 ) @@ -577,9 +581,9 @@ def plot_xarray( return Path(path) -def crop_nc( +def crop_xarray( xr_time_series: T_Dataset | PathLike, - crop_geom: PathLike | GeoDataFrame, + crop_box: BoundingBoxCoords, invert=False, final_crs: str = BRITISH_NATIONAL_GRID_EPSG, initial_clip_box: bool = False, @@ -595,7 +599,7 @@ def crop_nc( xr_time_series `Dataset` or path to `netcdf` file to load and crop. crop_geom - `GeoDataFrame` or `Path` of file to crop with. + Box coordinates to crop to. invert Whether to invert the `crop_geom` coordinates. final_crs @@ -620,16 +624,33 @@ def crop_nc( Examples -------- - >>> pytest.skip('Refactor needed, may be removed.') - >>> if not is_data_mounted: - ... pytest.skip(mount_doctest_skip_message) - >>> cropped = crop_nc( - ... RAW_CPM_TASMAX_PATH / - ... 'tasmax_rcp85_land-cpm_uk_2.2km_01_day_19821201-19831130.nc', - ... crop_geom=glasgow_shape_file_path, invert=True) - >>> cropped.rio.bounds() == glasgow_epsg_27700_bounds - True + >>> from numpy.testing import assert_allclose + >>> tasmax_cpm_1980_raw = getfixture('tasmax_cpm_1980_raw') + >>> if not tasmax_cpm_1980_raw: + ... pytest.skip(mount_or_cache_doctest_skip_message) + >>> tasmax_cpm_1980_365_day: T_Dataset = cpm_reproject_with_standard_calendar( + ... cpm_xr_time_series=tasmax_cpm_1980_raw, + ... variable_name="tasmax") + >>> cropped = crop_xarray( + ... tasmax_cpm_1980_365_day, + ... crop_box=GlasgowCoordsEPSG27700) + >>> assert_allclose(cropped.rio.bounds(), + ... GlasgowCoordsEPSG27700.as_tuple(), + ... rtol=.01) + >>> tasmax_cpm_1980_365_day.sizes + Frozen({'x': 529, 'y': 653, 'time': 365}) + >>> cropped.sizes + Frozen({'x': 186, 'y': 185, 'time': 365}) """ + xr_time_series, _ = check_xarray_path_and_var_name(xr_time_series, None) + try: + assert str(xr_time_series.rio.crs) == crop_box.rioxarry_epsg + except AssertionError: + raise ValueError( + f"'xr_time_series.rio.crs': '{xr_time_series.rio.epsg}' must equal 'crop_box.crs': '{crop_box.crs}'" + ) + return xr_time_series.rio.clip_box(*crop_box.as_tuple()) + # xr_time_series = reproject_xarray_by_crs( # xr_time_series, # crs=final_crs, @@ -638,8 +659,6 @@ def crop_nc( # xr_spatial_ydim=xr_spatial_ydim, # ) - if isinstance(crop_geom, PathLike): - crop_geom = read_file(crop_geom) # assert isinstance(crop_geom, GeoDataFrame) # crop_geom.set_crs(crs=final_crs, inplace=True) # if initial_clip_box: diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index d65f344f..c1708487 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -50,7 +50,7 @@ convert_xr_calendar, cpm_reproject_with_standard_calendar, cpm_xarray_to_standard_calendar, - crop_nc, + crop_xarray, file_name_to_start_end_dates, gdal_warp_wrapper, hads_resample_and_reproject, @@ -609,7 +609,7 @@ def test_cpm_tif_to_standard_calendar( @pytest.mark.xfail(reason="not finished writing, will need refactor") -def test_crop_nc( +def test_crop_xarray( # align_on: ConvertCalendarAlignOptions, # ukcp_tasmax_raw_path glasgow_shape_file_path, @@ -650,7 +650,7 @@ def test_crop_nc( assert str(xarray_pre_crop.rio.crs) != BRITISH_NATIONAL_GRID_EPSG assert xarray_pre_crop.rio.bounds() == uk_rotated_grid_bounds - cropped: T_Dataset = crop_nc( + cropped: T_Dataset = crop_xarray( xr_time_series=max_temp_1981_path, crop_geom=glasgow_shape_file_path, enforce_xarray_spatial_dims=True, @@ -926,7 +926,7 @@ def test_execute_resample_configs( # 8.073382596733156 # ) # -# cropped = crop_nc( +# cropped = crop_xarray( # 'tests/data/tasmax_rcp85_land-cpm_uk_2.2km_01_day_19821201-19831130.nc', # crop_geom=glasgow_shape_file_path, invert=True) # assert cropped.rio.bounds == result_bounds @@ -936,4 +936,4 @@ def test_execute_resample_configs( # ts_to_crop[path] = open_dataset(path, decode_coords="all") # # assert False -# test_crop = crop_nc() +# test_crop = crop_xarray() From d2fabc951513273457421b9b3ff1fa09f24140bb Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 16 Jun 2024 15:49:59 +0100 Subject: [PATCH 25/92] refactor: replace `City` variable names with `Region` --- python/clim_recal/cli.py | 12 +-- python/clim_recal/config.py | 44 +++++---- python/clim_recal/debiasing/debias_wrapper.py | 90 +++++++++---------- python/clim_recal/pipeline.py | 22 ++--- python/clim_recal/utils/data.py | 2 +- python/conftest.py | 6 +- python/tests/test_debiasing.py | 36 ++++---- python/tests/utils.py | 21 +++-- 8 files changed, 118 insertions(+), 115 deletions(-) diff --git a/python/clim_recal/cli.py b/python/clim_recal/cli.py index 3a92bb1d..2089e0bc 100644 --- a/python/clim_recal/cli.py +++ b/python/clim_recal/cli.py @@ -7,9 +7,9 @@ from .config import ( DEFAULT_CPUS, DEFAULT_OUTPUT_PATH, - CityOptions, ClimRecalRunResultsType, MethodOptions, + RegionOptions, RunOptions, VariableOptions, ) @@ -32,8 +32,8 @@ def pipeline( variable: Annotated[list[VariableOptions], typer.Option("--variable", "-v")] = [ VariableOptions.default() ], - city: Annotated[list[CityOptions], typer.Option("--city", "-c")] = [ - CityOptions.default() + region: Annotated[list[RegionOptions], typer.Option("--region", "-c")] = [ + RegionOptions.default() ], run: Annotated[list[RunOptions], typer.Option("--run", "-r")] = [ RunOptions.default() @@ -42,7 +42,7 @@ def pipeline( MethodOptions.default() ], all_variables: Annotated[bool, typer.Option("--all-variables")] = False, - all_cities: Annotated[bool, typer.Option("--all-cities")] = False, + all_regions: Annotated[bool, typer.Option("--all-regions")] = False, all_runs: Annotated[bool, typer.Option("--all-runs")] = False, default_runs: Annotated[bool, typer.Option("--default-runs")] = False, all_methods: Annotated[bool, typer.Option("--all-methods")] = False, @@ -62,7 +62,7 @@ def pipeline( results: ClimRecalRunResultsType = main( variables=variable, runs=run, - cities=city, + regions=region, methods=method, output_path=output_path, cpus=cpus, @@ -73,7 +73,7 @@ def pipeline( total=total, multiprocess=multiprocess, all_variables=all_variables, - all_cities=all_cities, + all_regions=all_regions, all_runs=all_runs, default_runs=default_runs, all_methods=all_methods, diff --git a/python/clim_recal/config.py b/python/clim_recal/config.py index cc067840..ee95bffc 100644 --- a/python/clim_recal/config.py +++ b/python/clim_recal/config.py @@ -9,8 +9,6 @@ from .debiasing.debias_wrapper import ( BaseRunConfig, - CityOptions, - MethodOptions, RunConfig, RunConfigType, climate_data_mount_path, @@ -22,7 +20,7 @@ HADsResamplerManager, ) from .utils.core import product_dict, results_path -from .utils.data import RunOptions, VariableOptions +from .utils.data import MethodOptions, RegionOptions, RunOptions, VariableOptions warnings.filterwarnings("ignore", category=TqdmExperimentalWarning) @@ -38,7 +36,7 @@ class ClimRecalRunsConfigType(TypedDict): """Lists of parameters to generate `RunConfigType` instances.""" - cities: Sequence[CityOptions] | None + regions: Sequence[RegionOptions] | None variables: Sequence[VariableOptions] runs: Sequence[RunOptions] methods: Sequence[MethodOptions] @@ -58,8 +56,8 @@ class ClimRecalConfig(BaseRunConfig): Variables to include in the model, eg. `tasmax`, `tasmin`. runs Which model runs to include, eg. "01", "08", "11". - cities - Which cities to crop data to. Future plans facilitate skipping to run for entire UK. + regions + Which regions to crop data to. Future plans facilitate skipping to run for entire UK. methods Which debiasing methods to apply. multiprocess @@ -84,11 +82,11 @@ class ClimRecalConfig(BaseRunConfig): >>> if not is_data_mounted: ... pytest.skip(mount_doctest_skip_message) >>> run_config: ClimRecalConfig = ClimRecalConfig( - ... cities=('Manchester', 'Glasgow'), + ... regions=('Manchester', 'Glasgow'), ... output_path=test_runs_output_path, ... cpus=1) >>> run_config - @@ -96,7 +94,7 @@ class ClimRecalConfig(BaseRunConfig): variables: Sequence[VariableOptions] = (VariableOptions.default(),) runs: Sequence[RunOptions] = (RunOptions.default(),) - cities: Sequence[CityOptions] | None = (CityOptions.default(),) + regions: Sequence[RegionOptions] | None = (RegionOptions.default(),) methods: Sequence[MethodOptions] = (MethodOptions.default(),) multiprocess: bool = False cpus: int | None = DEFAULT_CPUS @@ -197,7 +195,7 @@ def __repr__(self) -> str: f"<{self.__class__.__name__}(" f"variables_count={len(self.variables)}, " f"runs_count={len(self.runs)}, " - f"cities_count={len(self.cities) if self.cities else None}, " + f"regions_count={len(self.regions) if self.regions else None}, " f"methods_count={len(self.methods)}, " f"cpm_folders_count={len(self.cpm_manager)}, " f"hads_folders_count={len(self.hads_manager)}, " @@ -213,13 +211,13 @@ def model_vars(self) -> ClimRecalRunsConfigType: Examples -------- >>> pprint(clim_runner.model_vars) - {'cities': ('Glasgow', 'Manchester'), - 'methods': ('quantile_delta_mapping',), + {'methods': ('quantile_delta_mapping',), + 'regions': ('Glasgow', 'Manchester'), 'runs': ('05',), 'variables': ('tasmax',)} """ return ClimRecalRunsConfigType( - cities=self.cities, + regions=self.regions, variables=self.variables, runs=self.runs, methods=self.methods, @@ -232,19 +230,19 @@ def model_configs(self) -> tuple[RunConfigType, ...]: Examples -------- >>> pprint(clim_runner.model_configs) - ({'city': 'Glasgow', - 'method': 'quantile_delta_mapping', + ({'method': 'quantile_delta_mapping', + 'region': 'Glasgow', 'run': '05', 'variable': 'tasmax'}, - {'city': 'Manchester', - 'method': 'quantile_delta_mapping', + {'method': 'quantile_delta_mapping', + 'region': 'Manchester', 'run': '05', 'variable': 'tasmax'}) """ return tuple( RunConfigType(**params) for params in product_dict( - city=self.cities, + region=self.regions, variable=self.variables, run=self.runs, method=self.methods, @@ -279,9 +277,9 @@ def _first_conf_method(self) -> MethodOptions: return self.methods[0] @property - def _first_conf_city(self) -> VariableOptions | None: + def _first_conf_region(self) -> VariableOptions | None: """Return the first `self.variables` value.""" - return self._get_first_or_none(attr_name="cities") + return self._get_first_or_none(attr_name="regions") @property def _base_run_config(self) -> RunConfig: @@ -290,7 +288,7 @@ def _base_run_config(self) -> RunConfig: command_dir=self.command_dir, variable=self._first_conf_variable, run=self._first_conf_run, - city=self._first_conf_city, + region=self._first_conf_region, method=self._first_conf_method, run_prefix=self.run_prefix, preprocess_data_file=self.preprocess_data_file, @@ -328,14 +326,14 @@ def run_models(self) -> ClimRecalRunResultsType: self._base_run_config.to_cli_preprocess_tuple_strs( variable=model_config["variable"], run=model_config["run"], - city=model_config["city"], + region=model_config["region"], ), capture_output=True, text=True, ) cmethods_run: subprocess.CompletedProcess = subprocess.run( self._base_run_config.to_cli_run_cmethods_tuple_strs( - city=model_config["city"], + region=model_config["region"], run=model_config["run"], variable=model_config["variable"], method=model_config["method"], diff --git a/python/clim_recal/debiasing/debias_wrapper.py b/python/clim_recal/debiasing/debias_wrapper.py index 3907adb9..4f455ca4 100644 --- a/python/clim_recal/debiasing/debias_wrapper.py +++ b/python/clim_recal/debiasing/debias_wrapper.py @@ -14,7 +14,7 @@ iter_to_tuple_strs, path_iterdir, ) -from ..utils.data import CityOptions, MethodOptions, RunOptions, VariableOptions +from ..utils.data import MethodOptions, RegionOptions, RunOptions, VariableOptions DATA_PATH_DEFAULT: Final[Path] = climate_data_mount_path() @@ -55,7 +55,7 @@ class RunConfigType(TypedDict): """Parameters needed for a model run.""" - city: CityOptions | None + region: RegionOptions | None variable: VariableOptions run: RunOptions method: MethodOptions @@ -96,7 +96,7 @@ class RunConfig(BaseRunConfig): variable: VariableOptions | str = VariableOptions.default() run: RunOptions | str = RunOptions.default() - city: CityOptions | str | None = CityOptions.default() + region: RegionOptions | str | None = RegionOptions.default() method: MethodOptions | str = MethodOptions.default() def calib_dates_to_str( @@ -182,8 +182,8 @@ def _date_range_to_str( split_str=split_str, ) - def mod_path(self, city: str | None = None) -> Path: - """Return city estimates path. + def mod_path(self, region: str | None = None) -> Path: + """Return region estimates path. Examples -------- @@ -195,11 +195,11 @@ def mod_path(self, city: str | None = None) -> Path: >>> config.mod_path('Glasgow') PosixPath('/.../ClimateData/Cropped/three.cities/CPM/Glasgow') """ - city = city if city else self.city - return self.data_path / self.mod_folder / city + region = region if region else self.region + return self.data_path / self.mod_folder / region - def obs_path(self, city: str | None = None) -> Path: - """Return city observations path. + def obs_path(self, region: str | None = None) -> Path: + """Return region observations path. Examples -------- @@ -211,12 +211,12 @@ def obs_path(self, city: str | None = None) -> Path: >>> config.obs_path('Glasgow') PosixPath('/.../ClimateData/Cropped/three.cities/Hads.updated360/Glasgow') """ - city = city if city else self.city - return self.data_path / self.obs_folder / city + region = region if region else self.region + return self.data_path / self.obs_folder / region def preprocess_out_path( self, - city: str | None = None, + region: str | None = None, run: str | None = None, variable: str | None = None, ) -> Path: @@ -229,19 +229,19 @@ def preprocess_out_path( >>> config: RunConfig = RunConfig() >>> config.preprocess_out_path() PosixPath('.../ClimateData/Cropped/three.cities/Preprocessed/Manchester/05/tasmax') - >>> config.preprocess_out_path(city='Glasgow', run='07') + >>> config.preprocess_out_path(region='Glasgow', run='07') PosixPath('.../ClimateData/Cropped/three.cities/Preprocessed/Glasgow/07/tasmax') """ - city = city if city else self.city + region = region if region else self.region run = run if run else self.run variable = variable if variable else self.variable return ( - self.data_path / self.preprocess_out_folder / city / run / variable + self.data_path / self.preprocess_out_folder / region / run / variable ).resolve() def cmethods_out_path( self, - city: str | None = None, + region: str | None = None, run: str | None = None, ) -> Path: """Return path to save cmethods results. @@ -251,12 +251,12 @@ def cmethods_out_path( >>> config: RunConfig = RunConfig() >>> config.cmethods_out_path() PosixPath('/.../ClimateData/Debiased/three.cities.cropped/Manchester/05') - >>> config.cmethods_out_path(city='Glasgow', run='07') + >>> config.cmethods_out_path(region='Glasgow', run='07') PosixPath('/.../ClimateData/Debiased/three.cities.cropped/Glasgow/07') """ - city = city if city else self.city + region = region if region else self.region run = run if run else self.run - return (self.data_path / self.cmethods_out_folder / city / run).resolve() + return (self.data_path / self.cmethods_out_folder / region / run).resolve() @property def run_prefix_tuple(self) -> tuple[str, ...]: @@ -274,7 +274,7 @@ def to_cli_preprocess_tuple( self, variable: str | None = None, run: str | None = None, - city: str | None = None, + region: str | None = None, calib_start: Optional[DateType] = None, calib_end: Optional[DateType] = None, valid_start: Optional[DateType] = None, @@ -291,14 +291,14 @@ def to_cli_preprocess_tuple( >>> command_str_tuple: tuple[str, ...] = config.to_cli_preprocess_tuple() >>> assert command_str_tuple == CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT """ - city = city if city else self.city + region = region if region else self.region variable = variable if variable else self.variable run = run if run else self.run - mod_path: Path = self.mod_path(city=city) - obs_path: Path = self.obs_path(city=city) + mod_path: Path = self.mod_path(region=region) + obs_path: Path = self.obs_path(region=region) preprocess_out_path: Path = self.preprocess_out_path( - city=city, run=run, variable=variable + region=region, run=run, variable=variable ) calib_dates_str: str = self.calib_dates_to_str( start_date=calib_start, end_date=calib_end @@ -330,7 +330,7 @@ def to_cli_preprocess_tuple_strs( self, variable: str | None = None, run: str | None = None, - city: str | None = None, + region: str | None = None, calib_start: Optional[DateType] = None, calib_end: Optional[DateType] = None, valid_start: Optional[DateType] = None, @@ -348,7 +348,7 @@ def to_cli_preprocess_tuple_strs( self.to_cli_preprocess_tuple( variable=variable, run=run, - city=city, + region=region, calib_start=calib_start, calib_end=calib_end, valid_start=valid_start, @@ -360,7 +360,7 @@ def to_cli_preprocess_str( self, variable: str | None = None, run: str | None = None, - city: str | None = None, + region: str | None = None, calib_start: Optional[DateType] = None, calib_end: Optional[DateType] = None, valid_start: Optional[DateType] = None, @@ -380,7 +380,7 @@ def to_cli_preprocess_str( self.to_cli_preprocess_tuple_strs( variable=variable, run=run, - city=city, + region=region, calib_start=calib_start, calib_end=calib_end, valid_start=valid_start, @@ -388,7 +388,7 @@ def to_cli_preprocess_str( ) ) - def yield_mod_folder(self, city: str | None = None) -> Iterator[Path]: + def yield_mod_folder(self, region: str | None = None) -> Iterator[Path]: """`Iterable` of all `Path`s in `self.mod_folder`. Examples @@ -399,10 +399,10 @@ def yield_mod_folder(self, city: str | None = None) -> Iterator[Path]: >>> len(tuple(config.yield_mod_folder())) == MOD_FOLDER_FILES_COUNT_CORRECT True """ - city = city if city else self.city - return path_iterdir(self.obs_path(city=city)) + region = region if region else self.region + return path_iterdir(self.obs_path(region=region)) - def yield_obs_folder(self, city: str | None = None) -> Iterator[Path]: + def yield_obs_folder(self, region: str | None = None) -> Iterator[Path]: """`Iterable` of all `Path`s in `self.obs_folder`. Examples @@ -413,12 +413,12 @@ def yield_obs_folder(self, city: str | None = None) -> Iterator[Path]: >>> len(tuple(config.yield_obs_folder())) == OBS_FOLDER_FILES_COUNT_CORRECT True """ - city = city if city else self.city - return path_iterdir(self.obs_path(city=city)) + region = region if region else self.region + return path_iterdir(self.obs_path(region=region)) def yield_preprocess_out_folder( self, - city: str | None = None, + region: str | None = None, run: str | None = None, variable: str | None = None, ) -> Iterator[Path]: @@ -433,11 +433,11 @@ def yield_preprocess_out_folder( ... PREPROCESS_OUT_FOLDER_FILES_COUNT_CORRECT) True """ - city = city if city else self.city + region = region if region else self.region run = run if run else self.run variable = variable if variable else self.variable return path_iterdir( - self.preprocess_out_path(city=city, run=run, variable=variable) + self.preprocess_out_path(region=region, run=run, variable=variable) ) @property @@ -447,7 +447,7 @@ def command_path(self) -> Path: def to_cli_run_cmethods_tuple( self, - city: str | None = None, + region: str | None = None, run: str | None = None, variable: str | None = None, method: str | None = None, @@ -466,7 +466,7 @@ def to_cli_run_cmethods_tuple( >>> command_str_tuple: tuple[str, ...] = config.to_cli_run_cmethods_tuple() >>> assert command_str_tuple == CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT """ - city = city if city else self.city + region = region if region else self.region variable = variable if variable else self.variable run = run if run else self.run method = method if method else self.method @@ -475,13 +475,13 @@ def to_cli_run_cmethods_tuple( input_data_path = ( input_data_path if input_data_path - else self.preprocess_out_path(city=city, run=run, variable=variable) + else self.preprocess_out_path(region=region, run=run, variable=variable) ) cmethods_out_path = ( cmethods_out_path if cmethods_out_path - else self.cmethods_out_path(city=city, run=run) + else self.cmethods_out_path(region=region, run=run) ) return ( @@ -501,7 +501,7 @@ def to_cli_run_cmethods_tuple( def to_cli_run_cmethods_tuple_strs( self, - city: str | None = None, + region: str | None = None, run: str | None = None, variable: str | None = None, method: str | None = None, @@ -519,7 +519,7 @@ def to_cli_run_cmethods_tuple_strs( """ return iter_to_tuple_strs( self.to_cli_run_cmethods_tuple( - city=city, + region=region, run=run, variable=variable, method=method, @@ -531,7 +531,7 @@ def to_cli_run_cmethods_tuple_strs( def to_cli_run_cmethods_str( self, - city: str | None = None, + region: str | None = None, run: str | None = None, variable: str | None = None, method: str | None = None, @@ -551,7 +551,7 @@ def to_cli_run_cmethods_str( """ return " ".join( self.to_cli_run_cmethods_tuple_strs( - city=city, + region=region, run=run, variable=variable, method=method, diff --git a/python/clim_recal/pipeline.py b/python/clim_recal/pipeline.py index 79c4c7ba..034a8507 100644 --- a/python/clim_recal/pipeline.py +++ b/python/clim_recal/pipeline.py @@ -61,7 +61,7 @@ ```console $ clim-recal --all-variables --default-runs --output-path /where/results/should/be/written clim-recal pipeline configurations: - @@ -92,7 +92,7 @@ ```console $ clim-recal --all-variables --default-runs --output-path /where/results/should/be/written --execute clim-recal pipeline configurations: - @@ -139,10 +139,10 @@ from .config import ( DEFAULT_OUTPUT_PATH, - CityOptions, ClimRecalConfig, ClimRecalRunResultsType, MethodOptions, + RegionOptions, RunOptions, VariableOptions, ) @@ -156,11 +156,11 @@ def main( execute: bool = False, output_path: PathLike = DEFAULT_OUTPUT_PATH, variables: Sequence[VariableOptions | str] = (VariableOptions.default(),), - cities: Sequence[CityOptions | str] | None = (CityOptions.default(),), + regions: Sequence[RegionOptions | str] | None = (RegionOptions.default(),), runs: Sequence[RunOptions | str] = (RunOptions.default(),), methods: Sequence[MethodOptions | str] = (MethodOptions.default(),), all_variables: bool = False, - all_cities: bool = False, + all_regions: bool = False, default_runs: bool = False, all_runs: bool = False, all_methods: bool = False, @@ -182,8 +182,8 @@ def main( Variables to include in the model, eg. `tasmax`, `tasmin`. runs Which model runs to include, eg. "01", "08", "11". - cities - Which cities to crop data to. Future plans facilitate + regions + Which regions to crop data to. Future plans facilitate skipping to run for entire UK. methods Which debiasing methods to apply. @@ -220,7 +220,7 @@ def main( ... ) clim-recal pipeline configurations: @@ -239,8 +239,8 @@ def main( f"'stop_index': {stop_index} set from 'total': {total} and 'start_index': {start_index}." ) variables = VariableOptions.all() if all_variables else tuple(variables) - assert cities # In future there will be support for skipping city cropping - cities = CityOptions.all() if all_cities else tuple(cities) + assert regions # In future there will be support for skipping city cropping + regions = RegionOptions.all() if all_regions else tuple(regions) methods = MethodOptions.all() if all_methods else tuple(methods) if all_runs: runs = RunOptions.all() @@ -252,7 +252,7 @@ def main( config: ClimRecalConfig = ClimRecalConfig( output_path=output_path, variables=variables, - cities=cities, + regions=regions, methods=methods, runs=runs, cpus=cpus, diff --git a/python/clim_recal/utils/data.py b/python/clim_recal/utils/data.py index dc5a9ea5..bbabfffc 100644 --- a/python/clim_recal/utils/data.py +++ b/python/clim_recal/utils/data.py @@ -132,7 +132,7 @@ def all(cls) -> tuple[str, ...]: return tuple(map(lambda c: c.value, cls)) -class CityOptions(StrEnumReprName): +class RegionOptions(StrEnumReprName): """Supported options for variables.""" GLASGOW = "Glasgow" diff --git a/python/conftest.py b/python/conftest.py index 30b1e7b9..22196a7b 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -11,7 +11,7 @@ from xarray.core.types import T_Dataset from clim_recal.config import ClimRecalConfig -from clim_recal.debiasing.debias_wrapper import CityOptions +from clim_recal.debiasing.debias_wrapper import RegionOptions from clim_recal.resample import CPM_OUTPUT_LOCAL_PATH, HADS_OUTPUT_LOCAL_PATH from clim_recal.utils.core import ( ISO_DATE_FORMAT_STR, @@ -348,12 +348,12 @@ def clim_runner( try: return ClimRecalConfig( preprocess_out_folder=tmp_path, - cities=(CityOptions.GLASGOW, CityOptions.MANCHESTER), + regions=(RegionOptions.GLASGOW, RegionOptions.MANCHESTER), ) except FileExistsError: return ClimRecalConfig( preprocess_out_folder=tmp_path, - cities=(CityOptions.GLASGOW, CityOptions.MANCHESTER), + regions=(RegionOptions.GLASGOW, RegionOptions.MANCHESTER), hads_folder=local_cache_fixtures.default_local_cache_path, cpm_folder=local_cache_fixtures.default_local_cache_path, cpm_kwargs=dict(_allow_check_fail=True), diff --git a/python/tests/test_debiasing.py b/python/tests/test_debiasing.py index 13f0ed3d..6ca75642 100644 --- a/python/tests/test_debiasing.py +++ b/python/tests/test_debiasing.py @@ -10,8 +10,8 @@ from clim_recal.debiasing.debias_wrapper import ( PREPROCESS_FILE_NAME, - CityOptions, MethodOptions, + RegionOptions, RunConfig, RunOptions, VariableOptions, @@ -36,29 +36,29 @@ def test_command_line_default(cli_preprocess_default_command_str_correct) -> Non @pytest.mark.server @pytest.mark.slow @pytest.mark.parametrize( - "city, variable, run, method", + "region, variable, run, method", ( ( - CityOptions.default(), # 'Manchester' + RegionOptions.default(), # 'Manchester' VariableOptions.default(), # 'tasmax` RunOptions.default(), # '05' MethodOptions.default(), # 'quantile_delta_mapping' ), ( - CityOptions.GLASGOW, + RegionOptions.GLASGOW, VariableOptions.default(), RunOptions.default(), MethodOptions.default(), ), pytest.param( - CityOptions.LONDON, + RegionOptions.LONDON, VariableOptions.default(), RunOptions.default(), MethodOptions.default(), marks=pytest.mark.slow, ), pytest.param( - CityOptions.LONDON, + RegionOptions.LONDON, VariableOptions.RAINFALL, RunOptions.SIX, MethodOptions.DELTA_METHOD, @@ -68,7 +68,7 @@ def test_command_line_default(cli_preprocess_default_command_str_correct) -> Non ) def test_run( run_config, - city, + region, variable, run, method, @@ -82,33 +82,35 @@ def test_run( assert PREPROCESS_FILE_NAME in tuple(Path().iterdir()) # run_config.method = method preprocess_run: subprocess.CompletedProcess = subprocess.run( - run_config.to_cli_preprocess_tuple_strs(city=city, variable=variable, run=run), + run_config.to_cli_preprocess_tuple_strs( + region=region, variable=variable, run=run + ), capture_output=True, text=True, ) assert preprocess_run.returncode == 0 assert ( - len(tuple(run_config.yield_mod_folder(city=city))) + len(tuple(run_config.yield_mod_folder(region=region))) == mod_folder_files_count_correct ) assert ( - len(tuple(run_config.yield_obs_folder(city=city))) + len(tuple(run_config.yield_obs_folder(region=region))) == obs_folder_files_count_correct ) if method == MethodOptions.default(): assert ( - len(tuple(run_config.yield_preprocess_out_folder(city=city))) + len(tuple(run_config.yield_preprocess_out_folder(region=region))) == preprocess_out_folder_files_count_correct ) for log_txt in ( "Saved observed (HADs) data for validation, period ('2010-01-01', '2010-12-30')", - f"{city}/{run}/{variable}/modv_var-{variable}_run-{run}_20100101_20101230.nc", + f"{region}/{run}/{variable}/modv_var-{variable}_run-{run}_20100101_20101230.nc", ): assert log_txt in preprocess_run.stdout cmethods_run: subprocess.CompletedProcess = subprocess.run( run_config.to_cli_run_cmethods_tuple_strs( - city=city, run=run, variable=variable, method=method + region=region, run=run, variable=variable, method=method ), capture_output=True, text=True, @@ -118,21 +120,21 @@ def test_run( "Loading modelled calibration data (CPM)", # Todo: uncomment in future to check new paths # ( - # f"Debiased/three.cities.cropped/{city}/{run}/{variable}/" + # f"Debiased/three.cities.cropped/{region}/{run}/{variable}/" # f"debiased_{method}_result_var" # f"-{variable}_quantiles-1000_kind-+_group-None_20100101_20101229.nc" # ), ( - f"Debiased/three.cities.cropped/{city}/{run}/{variable}/" + f"Debiased/three.cities.cropped/{region}/{run}/{variable}/" f"debiased_{method}_result_var" ), "Saving to", # Todo: uncomment in future to check new paths # ( - # f"Saving to {DATA_PATH_DEFAULT}/{city}/{run}/{variable}/" + # f"Saving to {DATA_PATH_DEFAULT}/{region}/{run}/{variable}/" # f"debiased_{method}_result_var-{variable}_kind-+None_20100101_20101229.nc" # ), - (f"{city}/{run}/{variable}/debiased_{method}_result_var-"), + (f"{region}/{run}/{variable}/debiased_{method}_result_var-"), ): assert log_txt in cmethods_run.stdout diff --git a/python/tests/utils.py b/python/tests/utils.py index 86d25664..68f5defe 100644 --- a/python/tests/utils.py +++ b/python/tests/utils.py @@ -24,10 +24,6 @@ PREPROCESS_OUT_FOLDER_DEFAULT, PROCESSORS_DEFAULT, VALID_DATES_STR_DEFAULT, - CityOptions, - MethodOptions, - RunOptions, - VariableOptions, ) from clim_recal.resample import RAW_CPM_TASMAX_PATH, RAW_HADS_TASMAX_PATH from clim_recal.utils.core import ( @@ -39,7 +35,14 @@ date_range_generator, iter_to_tuple_strs, ) -from clim_recal.utils.data import HadUKGrid, UKCPLocalProjections +from clim_recal.utils.data import ( + HadUKGrid, + MethodOptions, + RegionOptions, + RunOptions, + UKCPLocalProjections, + VariableOptions, +) from clim_recal.utils.xarray import THREE_CITY_CENTRE_COORDS logger = getLogger(__name__) @@ -92,9 +95,9 @@ "python", PREPROCESS_FILE_NAME, "--mod", - DATA_PATH_DEFAULT / MOD_FOLDER_DEFAULT / CityOptions.default(), + DATA_PATH_DEFAULT / MOD_FOLDER_DEFAULT / RegionOptions.default(), "--obs", - DATA_PATH_DEFAULT / OBS_FOLDER_DEFAULT / CityOptions.default(), + DATA_PATH_DEFAULT / OBS_FOLDER_DEFAULT / RegionOptions.default(), "-v", VariableOptions.default(), "-r", @@ -103,7 +106,7 @@ ( DATA_PATH_DEFAULT / PREPROCESS_OUT_FOLDER_DEFAULT - / CityOptions.default() + / RegionOptions.default() / RunOptions.default() / VariableOptions.default() ), @@ -130,7 +133,7 @@ ( DATA_PATH_DEFAULT / CMETHODS_OUT_FOLDER_DEFAULT - / CityOptions.default() + / RegionOptions.default() / RunOptions.default() ).resolve(), "--method", From 0403aab0b424fb82232beb8423dd0a8140f85cd9 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Mon, 17 Jun 2024 11:28:53 +0100 Subject: [PATCH 26/92] feat: add `crop_projection` method to `ResampleBase` --- python/clim_recal/pipeline.py | 29 +++++- python/clim_recal/resample.py | 120 ++++++++++++++++++++-- python/clim_recal/utils/data.py | 117 +++++++++++++++++++++ python/clim_recal/utils/xarray.py | 158 ++++++---------------------- python/conftest.py | 3 +- python/tests/test_resample.py | 164 ++++++++++++++++++++---------- python/tests/utils.py | 2 +- 7 files changed, 401 insertions(+), 192 deletions(-) diff --git a/python/clim_recal/pipeline.py b/python/clim_recal/pipeline.py index 034a8507..75f9ae8c 100644 --- a/python/clim_recal/pipeline.py +++ b/python/clim_recal/pipeline.py @@ -166,6 +166,8 @@ def main( all_methods: bool = False, skip_cpm_standard_calendar_projection: bool = False, skip_hads_spatial_2k_projection: bool = False, + crop_cpm: bool = False, + crop_hads: bool = False, cpus: int | None = None, multiprocess: bool = False, start_index: int = 0, @@ -239,7 +241,7 @@ def main( f"'stop_index': {stop_index} set from 'total': {total} and 'start_index': {start_index}." ) variables = VariableOptions.all() if all_variables else tuple(variables) - assert regions # In future there will be support for skipping city cropping + assert regions # In future there will be support for skipping region cropping regions = RegionOptions.all() if all_regions else tuple(regions) methods = MethodOptions.all() if all_methods else tuple(methods) if all_runs: @@ -286,6 +288,31 @@ def main( multiprocess=multiprocess, cpus=cpus ) print(hads_resamplers[:print_range_length]) + if skip_cropping: + print("Skipping cropping.") + else: + if skip_cpm_standard_calendar_projection and not crop_cpm: + print("Skipping cropping CPM Standard Calendar projections.") + else: + print(f"Cropping CPMs to regions {config.regions}: ...") + cropped_cpm_resamplers: tuple[ + CPMResampler, ... + ] = config.cpm_manager.execute_crop_resamples( + multiprocess=multiprocess, cpus=cpus + ) + print(cropped_cpm_resamplers[:print_range_length]) + if skip_cpm_standard_calendar_projection and not crop_hads: + print("Skipping cropping HADS 2.2km projections.") + else: + print( + f"Cropping HADS 2.2km projections to regions {config.regions}: ..." + ) + cropped_hads_resamplers: tuple[ + CPMResampler, ... + ] = config.hands_manager.execute_crop_resamples( + multiprocess=multiprocess, cpus=cpus + ) + print(cropped_hads_resamplers[:print_range_length]) else: print("No steps run. Add '--execute' to run steps.") diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index 01181315..ac603e49 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -18,7 +18,6 @@ import dill as pickle import numpy as np import rioxarray # nopycln: import -from geopandas import GeoDataFrame from numpy.typing import NDArray from osgeo.gdal import GRA_NearestNeighbour from rich import print @@ -29,7 +28,7 @@ from clim_recal.debiasing.debias_wrapper import VariableOptions from .utils.core import climate_data_mount_path, multiprocess_execute -from .utils.data import RunOptions, VariableOptions +from .utils.data import RegionOptions, RunOptions, VariableOptions from .utils.gdal_formats import TIF_EXTENSION_STR from .utils.xarray import ( BRITISH_NATIONAL_GRID_EPSG, @@ -37,9 +36,11 @@ HADS_RAW_X_COLUMN_NAME, HADS_RAW_Y_COLUMN_NAME, NETCDF_EXTENSION_STR, + BoundingBoxCoords, ReprojectFuncType, apply_geo_func, cpm_reproject_with_standard_calendar, + crop_xarray, hads_resample_and_reproject, ) @@ -87,6 +88,8 @@ CPM_OUTPUT_LOCAL_PATH: Final[Path] = Path("cpm") HADS_OUTPUT_LOCAL_PATH: Final[Path] = Path("hads") +CPM_CROP_OUTPUT_LOCAL_PATH: Final[Path] = Path("cpm-crop") +HADS_CROP_OUTPUT_LOCAL_PATH: Final[Path] = Path("hads-crop") NETCDF_OR_TIF = Literal[TIF_EXTENSION_STR, NETCDF_EXTENSION_STR] @@ -109,11 +112,12 @@ class ResamblerBase: input_path: PathLike | None = RAW_HADS_TASMAX_PATH output_path: PathLike = RESAMPLING_OUTPUT_PATH / HADS_OUTPUT_LOCAL_PATH - variable_name: VariableOptions = VariableOptions.default() + variable_name: VariableOptions | str = VariableOptions.default() grid: PathLike | T_Dataset = DEFAULT_RELATIVE_GRID_DATA_PATH input_files: Iterable[PathLike] | None = None cpus: int | None = None - crop: PathLike | GeoDataFrame | None = None + crop_regions: tuple[RegionOptions | str, ...] | None = RegionOptions.all() + crop_path: PathLike = RESAMPLING_OUTPUT_PATH / HADS_CROP_OUTPUT_LOCAL_PATH final_crs: str = BRITISH_NATIONAL_GRID_EPSG grid_x_column_name: str = HADS_XDIM grid_y_column_name: str = HADS_YDIM @@ -136,6 +140,8 @@ def __post_init__(self) -> None: self.set_grid_x_y() self.set_input_files() Path(self.output_path).mkdir(parents=True, exist_ok=True) + if self.crop_regions: + Path(self.crop_path).mkdir(parents=True, exist_ok=True) self.total_cpus: int | None = cpu_count() if not self.cpus: self.cpus = 1 if not self.total_cpus else self.total_cpus @@ -301,6 +307,70 @@ def execute(self, skip_spatial: bool = False, **kwargs) -> list[Path] | None: """Run all steps for processing""" return self.range_to_reprojection(**kwargs) if not skip_spatial else None + def exported_range_to_crop( + self, + start: int | None = None, + stop: int | None = None, + step: int = 1, + override_export_path: Path | None = None, + source_to_index: Sequence | None = None, + ) -> list[Path]: + start = start or self.start_index + stop = stop or self.stop_index + return self._range_call( + method=crop_xarray, + start=start, + stop=stop, + step=step, + override_export_path=override_export_path, + source_to_index=source_to_index, + ) + + def crop_projection( + self, + region: str, + index: int = 0, + everride_export_path: Path | None = None, + return_results: bool = False, + source_to_index: Sequence | None = None, + ) -> Path | T_Dataset: + """Crop a projection to `region` geometry.""" + # source_path: Path = self._get_source_path( + # index=index, source_to_index=source_to_index + # ) + + assert False + # source_path: Path = + path: PathLike = self._output_path( + self.resolution_relative_path, override_export_path + ) + return apply_geo_func( + source_path=source_path, + # func=interpolate_coords, + func=self._resample_func, + export_folder=path, + # Leaving in case we return to using warp + # export_path_as_output_path_kwarg=True, + # to_netcdf=False, + to_netcdf=True, + variable_name=self.variable_name, + x_dim_name=self.input_file_x_column_name, + y_dim_name=self.input_file_y_column_name, + # x_grid=self.x, + # y_grid=self.y, + # source_x_coord_column_name=self.input_file_x_column_name, + # source_y_coord_column_name=self.input_file_y_column_name, + # use_reference_grid=self._use_reference_grid, + new_path_name_func=reproject_2_2km_filename, + return_results=return_results, + ) + + # def execute_crop(self, **kwargs) -> list[Path] | None: + # """Run crop for related reprojections.""" + # if not self.output_path or not Path(self.output_path).exists(): + # raise ValueError(f"Output path {self.output_path} required to crop.") + # else: + @dataclass(kw_only=True, repr=False) class HADsResampler(ResamblerBase): @@ -361,7 +431,7 @@ class HADsResampler(ResamblerBase): grid: PathLike | T_Dataset = DEFAULT_RELATIVE_GRID_DATA_PATH input_files: Iterable[PathLike] | None = None cpus: int | None = None - crop: PathLike | GeoDataFrame | None = None + crop_coords: tuple[BoundingBoxCoords] | None = None final_crs: str = BRITISH_NATIONAL_GRID_EPSG grid_x_column_name: str = HADS_XDIM grid_y_column_name: str = HADS_YDIM @@ -407,6 +477,40 @@ def to_reprojection( return_results=return_results, ) + # def to_crop( + # self, + # index: int = 0, + # override_export_path: Path | None = None, + # return_results: bool = False, + # source_to_index: Sequence | None = None, + # ) -> Path | T_Dataset: + # source_path: Path = self._output_path( + # index=index, source_to_index=source_to_index + # ) + # path: PathLike = self._output_path( + # self.resolution_relative_path, override_export_path + # ) + # return apply_geo_func( + # source_path=source_path, + # # func=interpolate_coords, + # func=self._resample_func, + # export_folder=path, + # # Leaving in case we return to using warp + # # export_path_as_output_path_kwarg=True, + # # to_netcdf=False, + # to_netcdf=True, + # variable_name=self.variable_name, + # x_dim_name=self.input_file_x_column_name, + # y_dim_name=self.input_file_y_column_name, + # # x_grid=self.x, + # # y_grid=self.y, + # # source_x_coord_column_name=self.input_file_x_column_name, + # # source_y_coord_column_name=self.input_file_y_column_name, + # # use_reference_grid=self._use_reference_grid, + # new_path_name_func=reproject_2_2km_filename, + # return_results=return_results, + # ) + @dataclass(kw_only=True, repr=False) class CPMResampler(ResamblerBase): @@ -462,10 +566,10 @@ class CPMResampler(ResamblerBase): input_path: PathLike | None = RAW_CPM_TASMAX_PATH output_path: PathLike = RESAMPLING_OUTPUT_PATH / CPM_OUTPUT_LOCAL_PATH - standard_calendar_relative_path: Path = CPM_STANDARD_CALENDAR_PATH + # standard_calendar_relative_path: Path = CPM_STANDARD_CALENDAR_PATH input_file_x_column_name: str = CPRUK_XDIM input_file_y_column_name: str = CPRUK_YDIM - resolution_relative_path: Path = CPM_SPATIAL_COORDS_PATH + # resolution_relative_path: Path = CPM_SPATIAL_COORDS_PATH _resample_func: ReprojectFuncType = cpm_reproject_with_standard_calendar @property @@ -492,8 +596,6 @@ def to_reprojection( export_folder=path, to_netcdf=True, variable_name=self.cpm_variable_name, - x_dim_name=self.input_file_x_column_name, - y_dim_name=self.input_file_y_column_name, # x_grid=self.x, # y_grid=self.y, # x_coord_column_name=self.input_file_x_column_name, diff --git a/python/clim_recal/utils/data.py b/python/clim_recal/utils/data.py index bbabfffc..9965f4cb 100644 --- a/python/clim_recal/utils/data.py +++ b/python/clim_recal/utils/data.py @@ -3,13 +3,124 @@ from os import PathLike from datetime import date from enum import auto +from pathlib import Path + +from xarray.backends.api import ENGINES from .core import StrEnumReprName + +BRITISH_NATION_GRID_COORDS_NUMBER: Final[int] = 27700 +BRITISH_NATIONAL_GRID_EPSG: Final[str] = f"EPSG:{BRITISH_NATION_GRID_COORDS_NUMBER}" + AuthorshipType = Union[ str | tuple[str, ...], dict[str, str] | dict[str, dict[str, str]] | dict[str, Collection[str]] ] +DropDayType = set[tuple[int, int]] +ChangeDayType = set[tuple[int, int]] + +BoundsTupleType = tuple[float, float, float, float] +"""`GeoPandas` bounds: (`minx`, `miny`, `maxx`, `maxy`).""" + + +@dataclass +class BoundingBoxCoords: + + """A region name and its bounding box coordinates.""" + + name: str + xmin: float + xmax: float + ymin: float + ymax: float + epsg: int = BRITISH_NATION_GRID_COORDS_NUMBER + + def as_tuple(self) -> tuple[float, float, float, float]: + """Return in `xmin`, `xmax`, `ymin`, `ymax` order.""" + return self.xmin, self.xmax, self.ymin, self.ymax + + @property + def rioxarry_epsg(self) -> str: + """Return `self.epsg` in `rioxarray` `str` format.""" + return f"EPSG:{self.epsg}" + + +GlasgowCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( + "Glasgow", 249799.999600002, 269234.9996, 657761.472000003, 672330.696800007 +) +"""Rough approximation of Glasgow box coordinates.""" + +LondonCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( + "London", 503568.1996, 561957.4961, 155850.7974, 200933.9025 +) +"""Rough approximation of London box coordinates.""" + +ManchesterCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( + "Manchester", 380399.997, 393249.999, 389349.999, 405300.003 +) +"""Rough approximation of Manchester box coordinates.""" + +ScotlandCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( + "Scotland", 51029, 547530, 419319, 1222324 +) +"""Rough approximation of Scotland box coordinates.""" + +DEFAULT_CROP_COORDS_EPSG2770: Final[dict[str, BoundingBoxCoords]] = { + record.name: record for record in + (GlasgowCoordsEPSG27700, ManchesterCoordsEPSG27700, + LondonCoordsEPSG27700, ScotlandCoordsEPSG27700) +} + +GLASGOW_CENTRE_COORDS: Final[tuple[float, float]] = (55.86279, -4.25424) +MANCHESTER_CENTRE_COORDS: Final[tuple[float, float]] = (53.48095, -2.23743) +LONDON_CENTRE_COORDS: Final[tuple[float, float]] = (51.509865, -0.118092) +THREE_CITY_CENTRE_COORDS: Final[dict[str, tuple[float, float]]] = { + "Glasgow": GLASGOW_CENTRE_COORDS, + "Manchester": MANCHESTER_CENTRE_COORDS, + "London": LONDON_CENTRE_COORDS, +} +"""City centre `(lon, lat)` `tuple` coords of `Glasgow`, `Manchester` and `London`.""" + +MONTH_DAY_XARRAY_LEAP_YEAR_DROP: DropDayType = { + (1, 31), + (4, 1), + (6, 1), + (8, 1), + (9, 31), + (12, 1), +} +"""A `set` of month and day tuples dropped for `xarray.day_360` leap years.""" + +MONTH_DAY_XARRAY_NO_LEAP_YEAR_DROP: DropDayType = { + (2, 6), + (4, 20), + (7, 2), + (9, 13), + (11, 25), +} +"""A `set` of month and day tuples dropped for `xarray.day_360` non leap years.""" + +DEFAULT_INTERPOLATION_METHOD: str = "linear" +"""Default method to infer missing estimates in a time series.""" + +CFCalendarSTANDARD: Final[str] = "standard" +ConvertCalendarAlignOptions = Literal["date", "year", None] + +XArrayEngineType = Literal[*tuple(ENGINES)] +"""Engine types supported by `xarray` as `str`.""" + +DEFAULT_CALENDAR_ALIGN: Final[ConvertCalendarAlignOptions] = "year" +NETCDF4_XARRAY_ENGINE: Final[str] = "netcdf4" + +DEFAULT_RELATIVE_GRID_DATA_PATH: Final[Path] = ( + Path().absolute() / "../data/rcp85_land-cpm_uk_2.2km_grid.nc" +) +TIME_COLUMN_NAME: Final[str] = "time" + +GLASGOW_GEOM_LOCAL_PATH: Final[Path] = Path( + "shapefiles/three.cities/Glasgow/Glasgow.shp" +) class VariableOptions(StrEnumReprName): """Supported options for variables""" @@ -138,6 +249,7 @@ class RegionOptions(StrEnumReprName): GLASGOW = "Glasgow" MANCHESTER = "Manchester" LONDON = "London" + SCOTLAND = "Scotland" @classmethod def default(cls) -> str: @@ -149,6 +261,11 @@ def all(cls) -> tuple[str, ...]: """Return a `tuple` of all options""" return tuple(map(lambda c: c.value, cls)) + @classmethod + def boundaries_dict(cls) -> dict[str, BoundingBoxCoords]: + """`dict` for accessing bounding boxes of included `Regions`.""" + return DEFAULT_CROP_COORDS_EPSG2770 + @dataclass class DataLicense: diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 8c4a9c16..48310e31 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -1,9 +1,8 @@ -from dataclasses import dataclass from datetime import date, datetime, timedelta from logging import getLogger from os import PathLike from pathlib import Path -from typing import Any, Callable, Final, Literal +from typing import Any, Callable, Final import numpy as np import rioxarray # nopycln: import @@ -16,7 +15,6 @@ from osgeo.gdal import GDALWarpAppOptions, Warp, WarpOptions from pandas import DatetimeIndex, date_range from xarray import CFTimeIndex, DataArray, Dataset, cftime_range, open_dataset -from xarray.backends.api import ENGINES from xarray.coding.calendar_ops import convert_calendar from xarray.core.types import ( CFCalendar, @@ -32,110 +30,34 @@ climate_data_mount_path, results_path, ) +from .data import ( + BRITISH_NATIONAL_GRID_EPSG, + DEFAULT_CALENDAR_ALIGN, + DEFAULT_INTERPOLATION_METHOD, + DEFAULT_RELATIVE_GRID_DATA_PATH, + GLASGOW_GEOM_LOCAL_PATH, + NETCDF4_XARRAY_ENGINE, + TIME_COLUMN_NAME, + BoundingBoxCoords, + CFCalendarSTANDARD, + ConvertCalendarAlignOptions, + XArrayEngineType, +) from .gdal_formats import NETCDF_EXTENSION_STR, GDALFormatsType, GDALGeoTiffFormatStr logger = getLogger(__name__) seaborn.set() # Use seaborn style for all `matplotlib` plots -DropDayType = set[tuple[int, int]] -ChangeDayType = set[tuple[int, int]] ReprojectFuncType = Callable[[T_Dataset], T_Dataset] -# MONTH_DAY_DROP: DropDayType = {(1, 31), (4, 1), (6, 1), (8, 1), (10, 1), (12, 1)} -# """A `set` of tuples of month and day numbers for `enforce_date_changes`.""" - - -BRITISH_NATION_GRID_COORDS_NUMBER: Final[int] = 27700 -BRITISH_NATIONAL_GRID_EPSG: Final[str] = f"EPSG:{BRITISH_NATION_GRID_COORDS_NUMBER}" - -MONTH_DAY_XARRAY_LEAP_YEAR_DROP: DropDayType = { - (1, 31), - (4, 1), - (6, 1), - (8, 1), - (9, 31), - (12, 1), -} -"""A `set` of month and day tuples dropped for `xarray.day_360` leap years.""" - -MONTH_DAY_XARRAY_NO_LEAP_YEAR_DROP: DropDayType = { - (2, 6), - (4, 20), - (7, 2), - (9, 13), - (11, 25), -} -"""A `set` of month and day tuples dropped for `xarray.day_360` non leap years.""" - -DEFAULT_INTERPOLATION_METHOD: str = "linear" -"""Default method to infer missing estimates in a time series.""" - -CFCalendarSTANDARD: Final[str] = "standard" -ConvertCalendarAlignOptions = Literal["date", "year", None] - -GLASGOW_CENTRE_COORDS: Final[tuple[float, float]] = (55.86279, -4.25424) -MANCHESTER_CENTRE_COORDS: Final[tuple[float, float]] = (53.48095, -2.23743) -LONDON_CENTRE_COORDS: Final[tuple[float, float]] = (51.509865, -0.118092) -THREE_CITY_CENTRE_COORDS: Final[dict[str, tuple[float, float]]] = { - "Glasgow": GLASGOW_CENTRE_COORDS, - "Manchester": MANCHESTER_CENTRE_COORDS, - "London": LONDON_CENTRE_COORDS, -} -"""City centre `(lon, lat)` `tuple` coords of `Glasgow`, `Manchester` and `London`.""" - - -@dataclass -class BoundingBoxCoords: - name: str - xmin: float - xmax: float - ymin: float - ymax: float - epsg: int = int(BRITISH_NATIONAL_GRID_EPSG[5:]) - - def as_tuple(self) -> tuple[float, float, float, float]: - """Return in `xmin`, `xmax`, `ymin`, `ymax` order.""" - return self.xmin, self.xmax, self.ymin, self.ymax - - @property - def rioxarry_epsg(self) -> str: - """Return `self.epsg` in `rioxarray` `str` format.""" - return f"EPSG:{self.epsg}" - - -GlasgowCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( - "Glasgow", 249799.999600002, 269234.9996, 657761.472000003, 672330.696800007 -) - -LondonCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( - "London", 503568.1996, 561957.4961, 155850.7974, 200933.9025 -) -ManchesterCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( - "Manchester", 380399.997, 393249.999, 389349.999, 405300.003 -) - - -GLASGOW_GEOM_LOCAL_PATH: Final[Path] = Path( - "shapefiles/three.cities/Glasgow/Glasgow.shp" -) GLASGOW_GEOM_ABSOLUTE_PATH: Final[Path] = ( climate_data_mount_path() / GLASGOW_GEOM_LOCAL_PATH ) -BoundsTupleType = tuple[float, float, float, float] -"""`GeoPandas` bounds: (`minx`, `miny`, `maxx`, `maxy`).""" - -XArrayEngineType = Literal[*tuple(ENGINES)] -"""Engine types supported by `xarray` as `str`.""" - -DEFAULT_CALENDAR_ALIGN: Final[ConvertCalendarAlignOptions] = "year" -NETCDF4_XARRAY_ENGINE: Final[str] = "netcdf4" +# MONTH_DAY_DROP: DropDayType = {(1, 31), (4, 1), (6, 1), (8, 1), (10, 1), (12, 1)} +# """A `set` of tuples of month and day numbers for `enforce_date_changes`.""" -DEFAULT_RELATIVE_GRID_DATA_PATH: Final[Path] = ( - Path().absolute() / "../data/rcp85_land-cpm_uk_2.2km_grid.nc" -) -TIME_COLUMN_NAME: Final[str] = "time" HADS_RAW_X_COLUMN_NAME: Final[str] = "projection_x_coordinate" HADS_RAW_Y_COLUMN_NAME: Final[str] = "projection_y_coordinate" @@ -165,8 +87,7 @@ def cpm_xarray_to_standard_calendar( ------- `Dataset` calendar converted to standard (Gregorian). """ - if isinstance(cpm_xr_time_series, PathLike): - cpm_xr_time_series = open_dataset(cpm_xr_time_series, decode_coords="all") + cpm_xr_time_series, _ = check_xarray_path_and_var_name(cpm_xr_time_series, None) cpm_to_std_calendar: T_Dataset = convert_xr_calendar( cpm_xr_time_series, interpolate_na=True, check_cftime_cols=("time_bnds",) ) @@ -584,12 +505,6 @@ def plot_xarray( def crop_xarray( xr_time_series: T_Dataset | PathLike, crop_box: BoundingBoxCoords, - invert=False, - final_crs: str = BRITISH_NATIONAL_GRID_EPSG, - initial_clip_box: bool = False, - enforce_xarray_spatial_dims: bool = True, - xr_spatial_xdim: str = "grid_longitude", - xr_spatial_ydim: str = "grid_latitude", **kwargs, ) -> T_Dataset: """Crop `xr_time_series` with `crop_path` `shapefile`. @@ -624,6 +539,7 @@ def crop_xarray( Examples -------- + >>> from clim_recal.utils.data import GlasgowCoordsEPSG27700 >>> from numpy.testing import assert_allclose >>> tasmax_cpm_1980_raw = getfixture('tasmax_cpm_1980_raw') >>> if not tasmax_cpm_1980_raw: @@ -649,33 +565,7 @@ def crop_xarray( raise ValueError( f"'xr_time_series.rio.crs': '{xr_time_series.rio.epsg}' must equal 'crop_box.crs': '{crop_box.crs}'" ) - return xr_time_series.rio.clip_box(*crop_box.as_tuple()) - - # xr_time_series = reproject_xarray_by_crs( - # xr_time_series, - # crs=final_crs, - # enforce_xarray_spatial_dims=enforce_xarray_spatial_dims, - # xr_spatial_xdim=xr_spatial_xdim, - # xr_spatial_ydim=xr_spatial_ydim, - # ) - - # assert isinstance(crop_geom, GeoDataFrame) - # crop_geom.set_crs(crs=final_crs, inplace=True) - # if initial_clip_box: - # return xr_time_series.rio.clip_box( - # minx=crop_geom.bounds.minx, - # miny=crop_geom.bounds.miny, - # maxx=crop_geom.bounds.maxx, - # maxy=crop_geom.bounds.maxy, - # ) - # return xr_time_series.rio.clip( - # crop_geom.geometry.values, drop=True, invert=invert, **kwargs - # ) - assert False - gdal_warp_wrapper( - input_path=xr_time_series, - output_path=output_path, - ) + return xr_time_series.rio.clip_box(*crop_box.as_tuple(), **kwargs) def ensure_xr_dataset( @@ -1217,3 +1107,13 @@ def cftime_range_gen(time_data_array: T_DataArray, **kwargs) -> NDArray: ) time_bnds_fix_range_end: CFTimeIndex = time_bnds_fix_range_start + timedelta(days=1) return np.array((time_bnds_fix_range_start, time_bnds_fix_range_end)).T + + +# def tansform_lat_lng_bounding_box(bbox: tuple[float, float] | BoundsTupleType): +# # clip_box = box(*bbox) +# wgs84 = pyproj.CRS('EPSG:4326') +# brit_grid = pyproj.CRS('EPSG:27700') +# project = pyproj.Transformer.from_crs(wgs84, brit_grid, always_xy=True).transform +# clip_box = transform(project, clip_box) +# clipped = grid.rio.clip([clip_box]) +# return clipped diff --git a/python/conftest.py b/python/conftest.py index 22196a7b..0a465439 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -21,8 +21,9 @@ is_platform_darwin, results_path, ) +from clim_recal.utils.data import BoundsTupleType from clim_recal.utils.server import CondaLockFileManager -from clim_recal.utils.xarray import GLASGOW_GEOM_LOCAL_PATH, BoundsTupleType +from clim_recal.utils.xarray import GLASGOW_GEOM_LOCAL_PATH from tests.utils import ( CLI_CMETHODS_DEFAULT_COMMAND_STR_CORRECT, CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT, diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index c1708487..8270701a 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -32,7 +32,12 @@ date_range_generator, results_path, ) -from clim_recal.utils.data import CEDADataSources, HadUKGrid, UKCPLocalProjections +from clim_recal.utils.data import ( + BoundsTupleType, + CEDADataSources, + HadUKGrid, + UKCPLocalProjections, +) from clim_recal.utils.gdal_formats import ( GDALFormatExtensions, GDALFormatsType, @@ -45,12 +50,10 @@ HADS_RAW_X_COLUMN_NAME, HADS_RAW_Y_COLUMN_NAME, NETCDF4_XARRAY_ENGINE, - BoundsTupleType, ConvertCalendarAlignOptions, convert_xr_calendar, cpm_reproject_with_standard_calendar, cpm_xarray_to_standard_calendar, - crop_xarray, file_name_to_start_end_dates, gdal_warp_wrapper, hads_resample_and_reproject, @@ -608,62 +611,121 @@ def test_cpm_tif_to_standard_calendar( assert False -@pytest.mark.xfail(reason="not finished writing, will need refactor") +# @pytest.mark.xfail(reason="not finished writing, will need refactor") +@pytest.mark.localcache +@pytest.mark.slow +@pytest.mark.mount +@pytest.mark.parametrize("data_type", (UKCPLocalProjections, HadUKGrid)) +@pytest.mark.parametrize( + "config", ("direct", "range", "direct_provided", "range_provided") +) def test_crop_xarray( # align_on: ConvertCalendarAlignOptions, # ukcp_tasmax_raw_path - glasgow_shape_file_path, - data_fixtures_path, - glasgow_epsg_27700_bounds, - uk_rotated_grid_bounds, + # glasgow_shape_file_path, + # data_fixtures_path, + # glasgow_epsg_27700_bounds, + tasmax_cpm_1980_raw_path, + tasmax_hads_1980_raw_path, + # uk_rotated_grid_bounds, + resample_test_cpm_output_path, + config: str, + data_type: str, ): """Test `cropping` `DataArray` to `standard` calendar.""" - # cropped.rio.set_spatial_dims(x_dim="grid_longitude", y_dim="grid_latitude") - datetime_now_str: str = str(datetime.now()).replace(" ", "-") - - # plot_path: Path = data_fixtures_path / 'output' - plot_path: Path = Path("tests") / "runs" - plot_path.mkdir(parents=True, exist_ok=True) - - glasgow_fig_file_name: Path = Path(f"glasgow_{datetime_now_str}.png") - pre_crop_fig_file_name: Path = Path(f"pre_crop_{datetime_now_str}.png") - crop_fig_file_name: Path = Path(f"test_crop_{datetime_now_str}.png") - - glasgow_test_fig_path: Path = plot_path / glasgow_fig_file_name - pre_crop_test_fig_path: Path = plot_path / pre_crop_fig_file_name - crop_test_fig_path: Path = plot_path / crop_fig_file_name - - glasgow_geo_df: GeoDataFrame = read_file(glasgow_shape_file_path) - glasgow_geo_df.plot() - plt.savefig(glasgow_test_fig_path) - assert glasgow_geo_df.crs == BRITISH_NATIONAL_GRID_EPSG - assert tuple(glasgow_geo_df.bounds.values.tolist()[0]) == glasgow_epsg_27700_bounds - - max_temp_1981_path: Path = annual_data_path( - end_year=1981, - parent_path=data_fixtures_path, + CPM_FIRST_DATES: np.array = np.array( + ["19801201", "19801202", "19801203", "19801204", "19801205"] ) - xarray_pre_crop: T_Dataset = open_dataset(max_temp_1981_path, decode_coords="all") - xarray_pre_crop.isel(time=0).tasmax.plot() - plt.savefig(pre_crop_test_fig_path) - - assert str(xarray_pre_crop.rio.crs) != BRITISH_NATIONAL_GRID_EPSG - assert xarray_pre_crop.rio.bounds() == uk_rotated_grid_bounds - - cropped: T_Dataset = crop_xarray( - xr_time_series=max_temp_1981_path, - crop_geom=glasgow_shape_file_path, - enforce_xarray_spatial_dims=True, - invert=True, - initial_clip_box=False, + crop_path: Path = resample_test_cpm_output_path / config + output_path: Path = resample_test_cpm_output_path / config + test_config: CPMResampler | HADsResampler + if data_type == HadUKGrid: + test_config = HADsResampler( + input_path=tasmax_hads_1980_raw_path.parent, + output_path=output_path, + crop_path=crop_path, + ) + else: + assert data_type == UKCPLocalProjections + test_config = CPMResampler( + input_path=tasmax_cpm_1980_raw_path.parent, + output_path=output_path, + crop_path=crop_path, + ) + paths: list[Path] + reproject_result: GDALDataset = test_config.to_reprojection() + match config: + case "direct": + paths = [test_config.crop_projection(region="Scotland")] + case "range": + paths = test_config.range_to_reprojection(stop=1) + case "direct_provided": + paths = [ + test_config.to_reprojection(index=0, source_to_index=tuple(test_config)) + ] + case "range_provided": + paths = test_config.range_to_reprojection( + stop=1, source_to_index=tuple(test_config) + ) + crop: T_Dataset = open_dataset(paths[0]) + assert crop.dims["time"] == 365 + # assert crop.dims[FINAL_RESAMPLE_LON_COL] == FINAL_CONVERTED_CPM_WIDTH + # assert_allclose(export.tasmax[10][5][:10].values, FINAL_CPM_DEC_10_5_X_0_10_Y) + assert ( + CPM_FIRST_DATES == crop.time.dt.strftime(CLI_DATE_FORMAT_STR).head().values + ).all() + plot_xarray( + crop.tasmax[0], + path=resample_test_cpm_output_path / f"config-{config}.png", + time_stamp=True, ) - - cropped.isel(time=0).tasmax.plot() - plt.savefig(crop_test_fig_path) - - assert str(cropped.rio.crs) == BRITISH_NATIONAL_GRID_EPSG - assert cropped.rio.bounds() == glasgow_epsg_27700_bounds assert False + # cropped.rio.set_spatial_dims(x_dim="grid_longitude", y_dim="grid_latitude") + # datetime_now_str: str = str(datetime.now()).replace(" ", "-") + # + # # plot_path: Path = data_fixtures_path / 'output' + # plot_path: Path = Path("tests") / "runs" + # plot_path.mkdir(parents=True, exist_ok=True) + # + # glasgow_fig_file_name: Path = Path(f"glasgow_{datetime_now_str}.png") + # pre_crop_fig_file_name: Path = Path(f"pre_crop_{datetime_now_str}.png") + # crop_fig_file_name: Path = Path(f"test_crop_{datetime_now_str}.png") + # + # glasgow_test_fig_path: Path = plot_path / glasgow_fig_file_name + # pre_crop_test_fig_path: Path = plot_path / pre_crop_fig_file_name + # crop_test_fig_path: Path = plot_path / crop_fig_file_name + # + # glasgow_geo_df: GeoDataFrame = read_file(glasgow_shape_file_path) + # glasgow_geo_df.plot() + # plt.savefig(glasgow_test_fig_path) + # assert glasgow_geo_df.crs == BRITISH_NATIONAL_GRID_EPSG + # assert tuple(glasgow_geo_df.bounds.values.tolist()[0]) == glasgow_epsg_27700_bounds + # + # max_temp_1981_path: Path = annual_data_path( + # end_year=1981, + # parent_path=data_fixtures_path, + # ) + # xarray_pre_crop: T_Dataset = open_dataset(max_temp_1981_path, decode_coords="all") + # xarray_pre_crop.isel(time=0).tasmax.plot() + # plt.savefig(pre_crop_test_fig_path) + # + # assert str(xarray_pre_crop.rio.crs) != BRITISH_NATIONAL_GRID_EPSG + # assert xarray_pre_crop.rio.bounds() == uk_rotated_grid_bounds + # + # cropped: T_Dataset = crop_xarray( + # xr_time_series=max_temp_1981_path, + # crop_geom=glasgow_shape_file_path, + # enforce_xarray_spatial_dims=True, + # invert=True, + # initial_clip_box=False, + # ) + # + # cropped.isel(time=0).tasmax.plot() + # plt.savefig(crop_test_fig_path) + # + # assert str(cropped.rio.crs) == BRITISH_NATIONAL_GRID_EPSG + # assert cropped.rio.bounds() == glasgow_epsg_27700_bounds + # assert False @pytest.mark.localcache diff --git a/python/tests/utils.py b/python/tests/utils.py index 68f5defe..443d12a0 100644 --- a/python/tests/utils.py +++ b/python/tests/utils.py @@ -36,6 +36,7 @@ iter_to_tuple_strs, ) from clim_recal.utils.data import ( + THREE_CITY_CENTRE_COORDS, HadUKGrid, MethodOptions, RegionOptions, @@ -43,7 +44,6 @@ UKCPLocalProjections, VariableOptions, ) -from clim_recal.utils.xarray import THREE_CITY_CENTRE_COORDS logger = getLogger(__name__) From 81b1b798fb3125ac669f5b520841e9f15836a838 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Mon, 17 Jun 2024 11:32:55 +0100 Subject: [PATCH 27/92] fix(ci): set `github` `workflow` to skip `localcahce` marked tests --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a80a8fe8..3dea0ebc 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -70,7 +70,7 @@ jobs: - name: Run Python Tests run: | - mamba run -n ${{ env.CONDA_ENV_NAME }} --cwd python pytest -m "not darwin and not mount" + mamba run -n ${{ env.CONDA_ENV_NAME }} --cwd python pytest -m "not darwin and not mount and not localcache" - name: Copy test coverage results run: | From e248967c8a5d6a08359322b62bcbbfb22af5cfc5 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 18 Jun 2024 10:21:03 +0100 Subject: [PATCH 28/92] refactor: add `range_crop_projection` method to `ResampleBase` --- python/clim_recal/resample.py | 146 +++++++----- python/clim_recal/utils/core.py | 3 + python/clim_recal/utils/data.py | 18 +- python/clim_recal/utils/xarray.py | 18 +- python/conftest.py | 19 +- python/tests/test_resample.py | 355 +++++++++++++----------------- 6 files changed, 277 insertions(+), 282 deletions(-) diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index ac603e49..c8845712 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -27,7 +27,7 @@ from clim_recal.debiasing.debias_wrapper import VariableOptions -from .utils.core import climate_data_mount_path, multiprocess_execute +from .utils.core import climate_data_mount_path, console, multiprocess_execute from .utils.data import RegionOptions, RunOptions, VariableOptions from .utils.gdal_formats import TIF_EXTENSION_STR from .utils.xarray import ( @@ -36,7 +36,6 @@ HADS_RAW_X_COLUMN_NAME, HADS_RAW_Y_COLUMN_NAME, NETCDF_EXTENSION_STR, - BoundingBoxCoords, ReprojectFuncType, apply_geo_func, cpm_reproject_with_standard_calendar, @@ -307,63 +306,96 @@ def execute(self, skip_spatial: bool = False, **kwargs) -> list[Path] | None: """Run all steps for processing""" return self.range_to_reprojection(**kwargs) if not skip_spatial else None - def exported_range_to_crop( + def _sync_reprojected_paths( + self, overwrite_output_path: PathLike | None = None + ) -> None: + """Sync `self._reprojected_paths` with files in `self.export_path`.""" + if not hasattr(self, "_reprojected_paths"): + if overwrite_output_path: + self.output_path = overwrite_output_path + path: PathLike = self.output_path + self._reprojected_paths: list[Path] = [ + local_path + for local_path in Path(path).iterdir() + if local_path.is_file() and local_path.suffix == f".{NETCDF_EXTENSION_STR}" + ] + + def range_crop_projection( self, + regions: Iterable[str] | None = None, start: int | None = None, stop: int | None = None, step: int = 1, override_export_path: Path | None = None, - source_to_index: Sequence | None = None, + return_results: bool = False, + **kwargs, ) -> list[Path]: + regions = regions or self.crop_regions start = start or self.start_index stop = stop or self.stop_index - return self._range_call( - method=crop_xarray, - start=start, - stop=stop, - step=step, - override_export_path=override_export_path, - source_to_index=source_to_index, - ) + export_paths: list[Path | T_Dataset] = [] + if stop is None: + stop = len(self) + assert regions + for region in regions: + console.print(f"Cropping to '{region}' from {self}...") + for index in trange(start, stop, step): + export_paths.append( + self.crop_projection( + region=region, + index=index, + override_export_path=override_export_path, + return_results=return_results, + **kwargs, + ) + ) + return export_paths def crop_projection( self, region: str, index: int = 0, - everride_export_path: Path | None = None, + override_export_path: Path | None = None, return_results: bool = False, - source_to_index: Sequence | None = None, + sync_reprojection_paths: bool = True, + **kwargs, ) -> Path | T_Dataset: """Crop a projection to `region` geometry.""" - # source_path: Path = self._get_source_path( - # index=index, source_to_index=source_to_index - # ) - - assert False - # source_path: Path = - path: PathLike = self._output_path( - self.resolution_relative_path, override_export_path - ) - return apply_geo_func( - source_path=source_path, - # func=interpolate_coords, - func=self._resample_func, - export_folder=path, - # Leaving in case we return to using warp - # export_path_as_output_path_kwarg=True, - # to_netcdf=False, - to_netcdf=True, - variable_name=self.variable_name, - x_dim_name=self.input_file_x_column_name, - y_dim_name=self.input_file_y_column_name, - # x_grid=self.x, - # y_grid=self.y, - # source_x_coord_column_name=self.input_file_x_column_name, - # source_y_coord_column_name=self.input_file_y_column_name, - # use_reference_grid=self._use_reference_grid, - new_path_name_func=reproject_2_2km_filename, - return_results=return_results, + try: + assert hasattr(self, "_reprojected_paths") + except AssertionError: + if sync_reprojection_paths: + self._sync_reprojected_paths() + else: + raise AttributeError( + f"'_reprojected_paths' must be set. " + "Run after 'self.to_reprojection()' or set as a " + "list directly." + ) + try: + assert region and region in self.crop_regions + except AttributeError: + raise IndexError(f"'{region}' not in 'crop_regions': '{self.crop_regions}'") + path: PathLike = override_export_path or Path(self.crop_path) / (region) + path.mkdir(exist_ok=True, parents=True) + resampled_xr: Dataset = self._reprojected_paths[index] + cropped: Dataset = crop_xarray( + xr_time_series=resampled_xr, + crop_box=RegionOptions.bounding_box(region), + **kwargs, ) + cropped_file_name: str = "crop_" + region + "-" + resampled_xr.name + export_path: Path = path / cropped_file_name + cropped.to_netcdf(export_path) + if not hasattr(self, "_cropped_paths"): + self._cropped_paths: dict[str, list[PathLike]] = {} + if region not in self._cropped_paths: + self._cropped_paths[region] = [] + self._cropped_paths[region].append(export_path) + if return_results: + return cropped + else: + return export_path # def execute_crop(self, **kwargs) -> list[Path] | None: # """Run crop for related reprojections.""" @@ -431,13 +463,13 @@ class HADsResampler(ResamblerBase): grid: PathLike | T_Dataset = DEFAULT_RELATIVE_GRID_DATA_PATH input_files: Iterable[PathLike] | None = None cpus: int | None = None - crop_coords: tuple[BoundingBoxCoords] | None = None + crop_path: PathLike = RESAMPLING_OUTPUT_PATH / HADS_CROP_OUTPUT_LOCAL_PATH final_crs: str = BRITISH_NATIONAL_GRID_EPSG grid_x_column_name: str = HADS_XDIM grid_y_column_name: str = HADS_YDIM input_file_extension: NETCDF_OR_TIF = NETCDF_EXTENSION_STR export_file_extension: NETCDF_OR_TIF = NETCDF_EXTENSION_STR - resolution_relative_path: Path = HADS_2_2K_RESOLUTION_PATH + # resolution_relative_path: Path = HADS_2_2K_RESOLUTION_PATH input_file_x_column_name: str = HADS_XDIM input_file_y_column_name: str = HADS_YDIM _resample_func: ReprojectFuncType = hads_resample_and_reproject @@ -453,9 +485,10 @@ def to_reprojection( source_path: Path = self._get_source_path( index=index, source_to_index=source_to_index ) - path: PathLike = self._output_path( - self.resolution_relative_path, override_export_path - ) + path: PathLike = self.output_path + # path: PathLike = self._output_path( + # self.resolution_relative_path, override_export_path + # ) return apply_geo_func( source_path=source_path, # func=interpolate_coords, @@ -566,6 +599,7 @@ class CPMResampler(ResamblerBase): input_path: PathLike | None = RAW_CPM_TASMAX_PATH output_path: PathLike = RESAMPLING_OUTPUT_PATH / CPM_OUTPUT_LOCAL_PATH + crop_path: PathLike = RESAMPLING_OUTPUT_PATH / CPM_CROP_OUTPUT_LOCAL_PATH # standard_calendar_relative_path: Path = CPM_STANDARD_CALENDAR_PATH input_file_x_column_name: str = CPRUK_XDIM input_file_y_column_name: str = CPRUK_YDIM @@ -586,22 +620,24 @@ def to_reprojection( source_path: Path = self._get_source_path( index=index, source_to_index=source_to_index ) - path: PathLike = self._output_path( - self.resolution_relative_path, override_export_path - ) - return apply_geo_func( + path: PathLike = self.output_path + # path: PathLike = self._output_path( + # self.resolution_relative_path, override_export_path + # ) + result: Path | T_Dataset | GDALDataset = apply_geo_func( source_path=source_path, func=self._resample_func, new_path_name_func=reproject_standard_calendar_filename, export_folder=path, to_netcdf=True, variable_name=self.cpm_variable_name, - # x_grid=self.x, - # y_grid=self.y, - # x_coord_column_name=self.input_file_x_column_name, - # y_coord_column_name=self.input_file_y_column_name, return_results=return_results, ) + if isinstance(result, PathLike): + if not hasattr(self, "_reprojected_paths"): + self._reprojected_paths: list[Path] = [] + self._reprojected_paths.append(Path(result)) + return result def __getstate__(self): """Meanse of testing what aspects of instance have issues multiprocessing. diff --git a/python/clim_recal/utils/core.py b/python/clim_recal/utils/core.py index d1f5cc85..c2eddc1d 100644 --- a/python/clim_recal/utils/core.py +++ b/python/clim_recal/utils/core.py @@ -24,10 +24,13 @@ Union, ) +from rich.console import Console from tqdm import TqdmExperimentalWarning, tqdm logger = getLogger(__name__) +console = Console() + warnings.filterwarnings("ignore", category=TqdmExperimentalWarning) DateType = Union[date, str] diff --git a/python/clim_recal/utils/data.py b/python/clim_recal/utils/data.py index 9965f4cb..602ed51e 100644 --- a/python/clim_recal/utils/data.py +++ b/python/clim_recal/utils/data.py @@ -40,6 +40,10 @@ def as_tuple(self) -> tuple[float, float, float, float]: """Return in `xmin`, `xmax`, `ymin`, `ymax` order.""" return self.xmin, self.xmax, self.ymin, self.ymax + def as_dict(self) -> dict[str, float]: + """Return coords as `dict`""" + return {'xmin': self.xmin, 'xmax': self.xmax, 'ymin': self.ymin, 'ymax': self.ymax} + @property def rioxarry_epsg(self) -> str: """Return `self.epsg` in `rioxarray` `str` format.""" @@ -47,22 +51,22 @@ def rioxarry_epsg(self) -> str: GlasgowCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( - "Glasgow", 249799.999600002, 269234.9996, 657761.472000003, 672330.696800007 + name="Glasgow", xmin=249799.999600002, xmax=269234.9996, ymin=657761.472000003, ymax=672330.696800007 ) """Rough approximation of Glasgow box coordinates.""" LondonCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( - "London", 503568.1996, 561957.4961, 155850.7974, 200933.9025 + name="London", xmin=503568.1996, xmax=561957.4961, ymin=155850.7974, ymax=200933.9025 ) """Rough approximation of London box coordinates.""" ManchesterCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( - "Manchester", 380399.997, 393249.999, 389349.999, 405300.003 + name="Manchester", xmin=380399.997, xmax=393249.999, ymin=389349.999, ymax=405300.003 ) """Rough approximation of Manchester box coordinates.""" ScotlandCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( - "Scotland", 51029, 547530, 419319, 1222324 + name="Scotland", xmin=51029, xmax=547530, ymin=4480515, ymax=1243058 ) """Rough approximation of Scotland box coordinates.""" @@ -261,10 +265,10 @@ def all(cls) -> tuple[str, ...]: """Return a `tuple` of all options""" return tuple(map(lambda c: c.value, cls)) - @classmethod - def boundaries_dict(cls) -> dict[str, BoundingBoxCoords]: + @staticmethod + def bounding_box(region_name: str) -> BoundingBoxCoords: """`dict` for accessing bounding boxes of included `Regions`.""" - return DEFAULT_CROP_COORDS_EPSG2770 + return DEFAULT_CROP_COORDS_EPSG2770[region_name.title()] @dataclass diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 48310e31..8a69b396 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -513,22 +513,8 @@ def crop_xarray( ---------- xr_time_series `Dataset` or path to `netcdf` file to load and crop. - crop_geom - Box coordinates to crop to. - invert - Whether to invert the `crop_geom` coordinates. - final_crs - Final coordinate system to return cropped `xr_time_series` in. - initial_clip_box - Whether to initially clip `xr_time_series` via `crop_geom` - boundaries. For more details on chained clip approaches see - https://corteva.github.io/rioxarray/html/examples/clip_geom.html#Clipping-larger-rasters - enforce_xarray_spatial_dims - Whether to use `set_spatial_dims` on `xr_time_series` prior to `clip`. - xr_spatial_xdim - Column parameter to pass as `xdim` to `set_spatial_dims` if used. - xr_spatial_ydim - Column parameter to pass as `ydim` to `set_spatial_dims` if used. + crop_box + Instance of `BoundingBoxCoords` with coords. kwargs Any additional parameters to pass to `clip` diff --git a/python/conftest.py b/python/conftest.py index 0a465439..daed1a8d 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -244,11 +244,13 @@ def glasgow_shape_file_path(data_fixtures_path: Path) -> Path: @pytest.fixture(scope="session") -def test_runs_output_path(path=TEST_RESULTS_PATH) -> Iterator[Path]: +def test_runs_output_path( + keep_test_results: bool, path=TEST_RESULTS_PATH +) -> Iterator[Path]: path.mkdir(exist_ok=True, parents=True) yield path - # Comment out rmtree line below to leave test files for checking after runs - rmtree(path, ignore_errors=True) + if not keep_test_results: + rmtree(path, ignore_errors=True) def pytest_addoption(parser): @@ -271,6 +273,12 @@ def pytest_addoption(parser): default=False, help="Use asyc if --sync-all is used", ) + parser.addoption( + "--keep-results", + action=BooleanOptionalAction, + default=False, + help="Keep test result files (else deleted after each test)", + ) @pytest.fixture(scope="session") @@ -288,6 +296,11 @@ def use_async(request) -> bool: return request.config.getoption("--use-async") +@pytest.fixture(scope="session") +def keep_test_results(request) -> bool: + return request.config.getoption("--keep-results") + + @pytest.fixture(scope="session") def local_test_data_path() -> Path: return TEST_DATA_PATH diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 8270701a..e5efa144 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -1,11 +1,11 @@ -from datetime import date, datetime +from datetime import date from pathlib import Path -from typing import Any, Final, Literal +from typing import Any, Final import numpy as np import pytest -from geopandas import GeoDataFrame, read_file -from matplotlib import pyplot as plt + +# from matplotlib import pyplot as plt from numpy.testing import assert_allclose from numpy.typing import NDArray from osgeo.gdal import Dataset as GDALDataset @@ -14,9 +14,11 @@ from clim_recal.resample import ( BRITISH_NATIONAL_GRID_EPSG, + CPM_CROP_OUTPUT_LOCAL_PATH, CPRUK_XDIM, CPRUK_YDIM, DEFAULT_RELATIVE_GRID_DATA_PATH, + HADS_CROP_OUTPUT_LOCAL_PATH, HADS_XDIM, HADS_YDIM, CPMResampler, @@ -27,23 +29,11 @@ from clim_recal.utils.core import ( CLI_DATE_FORMAT_STR, DateType, - annual_data_path, annual_data_paths_generator, date_range_generator, results_path, ) -from clim_recal.utils.data import ( - BoundsTupleType, - CEDADataSources, - HadUKGrid, - UKCPLocalProjections, -) -from clim_recal.utils.gdal_formats import ( - GDALFormatExtensions, - GDALFormatsType, - GDALGeoTiffFormatStr, - GDALNetCDFFormatStr, -) +from clim_recal.utils.data import HadUKGrid, UKCPLocalProjections from clim_recal.utils.xarray import ( FINAL_RESAMPLE_LAT_COL, FINAL_RESAMPLE_LON_COL, @@ -55,7 +45,6 @@ cpm_reproject_with_standard_calendar, cpm_xarray_to_standard_calendar, file_name_to_start_end_dates, - gdal_warp_wrapper, hads_resample_and_reproject, interpolate_coords, plot_xarray, @@ -400,117 +389,117 @@ def test_convert_cpm_calendar(interpolate_na: bool) -> None: ) -@pytest.mark.slow -@pytest.mark.xfail -@pytest.mark.parametrize("data_type", (UKCPLocalProjections, HadUKGrid)) -@pytest.mark.parametrize("data_source", ("mounted", "local")) -@pytest.mark.parametrize("output_format", (GDALNetCDFFormatStr, GDALGeoTiffFormatStr)) -@pytest.mark.parametrize("glasgow_crop", (True, False)) -def test_geo_warp_format_type_crop( - data_type: CEDADataSources, - data_source: Literal["mounted", "local"], - output_format: GDALFormatsType, - glasgow_crop: bool, - test_runs_output_path: Path, - glasgow_shape_file_path: Path, - glasgow_epsg_27700_bounds: BoundsTupleType, - uk_rotated_grid_bounds, - ukcp_tasmax_raw_mount_path: Path, - hads_tasmax_raw_mount_path: Path, - hads_tasmax_local_test_path: Path, - ukcp_tasmax_local_test_path: Path, - is_data_mounted: bool, -) -> None: - """Test using `geo_warp` with mounted raw data.""" - server_data_path: Path = ( - ukcp_tasmax_raw_mount_path - if data_type == UKCPLocalProjections - else hads_tasmax_raw_mount_path - ) - local_data_path: Path = ( - ukcp_tasmax_local_test_path - if data_type == UKCPLocalProjections - else hads_tasmax_local_test_path - ) - data_path: Path = server_data_path if data_source == "mounted" else local_data_path - if data_source == "mounted" and not is_data_mounted: - pytest.skip("requires external data mounted") - assert data_path.exists() - - # cropped.rio.set_spatial_dims(x_dim="grid_longitude", y_dim="grid_latitude") - datetime_now = datetime.now() - warp_path: Path = test_runs_output_path / "geo_warp" - if glasgow_crop: - glasgow_test_fig_path = results_path( - name="glasgow", - path=warp_path, - time=datetime_now, - extension="png", - mkdir=True, - ) - pre_warp_test_fig_path = results_path( - name="pre_warp", path=warp_path, time=datetime_now, extension="png", mkdir=True - ) - warp_test_file_path = results_path( - name="test_warp_file", - path=warp_path, - time=datetime_now, - extension=GDALFormatExtensions[output_format], - mkdir=False, - ) - warp_test_fig_path = results_path( - name="test_warp", path=warp_path, time=datetime_now, extension="png", mkdir=True - ) - - if glasgow_crop: - glasgow_geo_df: GeoDataFrame = read_file(glasgow_shape_file_path) - glasgow_geo_df.plot() - plt.savefig(glasgow_test_fig_path) - assert glasgow_geo_df.crs == BRITISH_NATIONAL_GRID_EPSG - assert ( - tuple(glasgow_geo_df.bounds.values.tolist()[0]) == glasgow_epsg_27700_bounds - ) - - max_temp_data_path: Path = ( - data_path - if data_source == "local" - else annual_data_path( - end_year=1981, - parent_path=data_path, - ) - ) - xarray_pre_warp: T_Dataset = open_dataset( - max_temp_data_path, decode_coords="all", engine=NETCDF4_XARRAY_ENGINE - ) - xarray_pre_warp.isel(time=0).tasmax.plot() - plt.savefig(pre_warp_test_fig_path) - - assert str(xarray_pre_warp.rio.crs) != BRITISH_NATIONAL_GRID_EPSG - assert xarray_pre_warp.rio.bounds() == uk_rotated_grid_bounds - # output_path: Path = warp_path / (max_temp_data_path.stem + ".tif" if output_format == GDALGeoTiffFormatStr else ".nc") - xarray_warped: GDALDataset - if glasgow_crop: - xarray_warped = gdal_warp_wrapper( - input_path=max_temp_data_path, - output_path=warp_test_file_path, - format=output_format, - ) - else: - xarray_warped = gdal_warp_wrapper( - input_path=max_temp_data_path, - output_path=warp_test_file_path, - format=output_format, - output_bounds=uk_rotated_grid_bounds, - ) - assert xarray_warped is not None - read_exported: T_Dataset = open_dataset(warp_test_file_path, decode_coords="all") - - read_exported.Band1.plot() - plt.savefig(warp_test_fig_path) - - assert str(read_exported.rio.crs) == BRITISH_NATIONAL_GRID_EPSG - if glasgow_crop: - assert read_exported.rio.bounds() == glasgow_epsg_27700_bounds +# @pytest.mark.slow +# @pytest.mark.xfail +# @pytest.mark.parametrize("data_type", (UKCPLocalProjections, HadUKGrid)) +# @pytest.mark.parametrize("data_source", ("mounted", "local")) +# @pytest.mark.parametrize("output_format", (GDALNetCDFFormatStr, GDALGeoTiffFormatStr)) +# @pytest.mark.parametrize("glasgow_crop", (True, False)) +# def test_geo_warp_format_type_crop( +# data_type: CEDADataSources, +# data_source: Literal["mounted", "local"], +# output_format: GDALFormatsType, +# glasgow_crop: bool, +# test_runs_output_path: Path, +# glasgow_shape_file_path: Path, +# glasgow_epsg_27700_bounds: BoundsTupleType, +# uk_rotated_grid_bounds, +# ukcp_tasmax_raw_mount_path: Path, +# hads_tasmax_raw_mount_path: Path, +# hads_tasmax_local_test_path: Path, +# ukcp_tasmax_local_test_path: Path, +# is_data_mounted: bool, +# ) -> None: +# """Test using `geo_warp` with mounted raw data.""" +# server_data_path: Path = ( +# ukcp_tasmax_raw_mount_path +# if data_type == UKCPLocalProjections +# else hads_tasmax_raw_mount_path +# ) +# local_data_path: Path = ( +# ukcp_tasmax_local_test_path +# if data_type == UKCPLocalProjections +# else hads_tasmax_local_test_path +# ) +# data_path: Path = server_data_path if data_source == "mounted" else local_data_path +# if data_source == "mounted" and not is_data_mounted: +# pytest.skip("requires external data mounted") +# assert data_path.exists() +# +# # cropped.rio.set_spatial_dims(x_dim="grid_longitude", y_dim="grid_latitude") +# datetime_now = datetime.now() +# warp_path: Path = test_runs_output_path / "geo_warp" +# if glasgow_crop: +# glasgow_test_fig_path = results_path( +# name="glasgow", +# path=warp_path, +# time=datetime_now, +# extension="png", +# mkdir=True, +# ) +# pre_warp_test_fig_path = results_path( +# name="pre_warp", path=warp_path, time=datetime_now, extension="png", mkdir=True +# ) +# warp_test_file_path = results_path( +# name="test_warp_file", +# path=warp_path, +# time=datetime_now, +# extension=GDALFormatExtensions[output_format], +# mkdir=False, +# ) +# warp_test_fig_path = results_path( +# name="test_warp", path=warp_path, time=datetime_now, extension="png", mkdir=True +# ) +# +# if glasgow_crop: +# glasgow_geo_df: GeoDataFrame = read_file(glasgow_shape_file_path) +# glasgow_geo_df.plot() +# plt.savefig(glasgow_test_fig_path) +# assert glasgow_geo_df.crs == BRITISH_NATIONAL_GRID_EPSG +# assert ( +# tuple(glasgow_geo_df.bounds.values.tolist()[0]) == glasgow_epsg_27700_bounds +# ) +# +# max_temp_data_path: Path = ( +# data_path +# if data_source == "local" +# else annual_data_path( +# end_year=1981, +# parent_path=data_path, +# ) +# ) +# xarray_pre_warp: T_Dataset = open_dataset( +# max_temp_data_path, decode_coords="all", engine=NETCDF4_XARRAY_ENGINE +# ) +# xarray_pre_warp.isel(time=0).tasmax.plot() +# plt.savefig(pre_warp_test_fig_path) +# +# assert str(xarray_pre_warp.rio.crs) != BRITISH_NATIONAL_GRID_EPSG +# assert xarray_pre_warp.rio.bounds() == uk_rotated_grid_bounds +# # output_path: Path = warp_path / (max_temp_data_path.stem + ".tif" if output_format == GDALGeoTiffFormatStr else ".nc") +# xarray_warped: GDALDataset +# if glasgow_crop: +# xarray_warped = gdal_warp_wrapper( +# input_path=max_temp_data_path, +# output_path=warp_test_file_path, +# format=output_format, +# ) +# else: +# xarray_warped = gdal_warp_wrapper( +# input_path=max_temp_data_path, +# output_path=warp_test_file_path, +# format=output_format, +# output_bounds=uk_rotated_grid_bounds, +# ) +# assert xarray_warped is not None +# read_exported: T_Dataset = open_dataset(warp_test_file_path, decode_coords="all") +# +# read_exported.Band1.plot() +# plt.savefig(warp_test_fig_path) +# +# assert str(read_exported.rio.crs) == BRITISH_NATIONAL_GRID_EPSG +# if glasgow_crop: +# assert read_exported.rio.bounds() == glasgow_epsg_27700_bounds @pytest.mark.localcache @@ -615,31 +604,33 @@ def test_cpm_tif_to_standard_calendar( @pytest.mark.localcache @pytest.mark.slow @pytest.mark.mount +@pytest.mark.parametrize("region", ("Glasgow", "Manchester", "London", "Scotland")) @pytest.mark.parametrize("data_type", (UKCPLocalProjections, HadUKGrid)) @pytest.mark.parametrize( - "config", ("direct", "range", "direct_provided", "range_provided") + # "config", ("direct", "range", "direct_provided", "range_provided") + "config", + ("direct", "range"), ) def test_crop_xarray( - # align_on: ConvertCalendarAlignOptions, - # ukcp_tasmax_raw_path - # glasgow_shape_file_path, - # data_fixtures_path, - # glasgow_epsg_27700_bounds, tasmax_cpm_1980_raw_path, tasmax_hads_1980_raw_path, - # uk_rotated_grid_bounds, resample_test_cpm_output_path, + resample_test_hads_output_path, config: str, data_type: str, + region: str, ): """Test `cropping` `DataArray` to `standard` calendar.""" CPM_FIRST_DATES: np.array = np.array( ["19801201", "19801202", "19801203", "19801204", "19801205"] ) - crop_path: Path = resample_test_cpm_output_path / config - output_path: Path = resample_test_cpm_output_path / config test_config: CPMResampler | HADsResampler if data_type == HadUKGrid: + output_path: Path = resample_test_hads_output_path / config + crop_path: Path = ( + resample_test_hads_output_path / config / HADS_CROP_OUTPUT_LOCAL_PATH + ) + test_config = HADsResampler( input_path=tasmax_hads_1980_raw_path.parent, output_path=output_path, @@ -647,85 +638,47 @@ def test_crop_xarray( ) else: assert data_type == UKCPLocalProjections + output_path: Path = resample_test_cpm_output_path / config + crop_path: Path = ( + resample_test_cpm_output_path / config / CPM_CROP_OUTPUT_LOCAL_PATH + ) test_config = CPMResampler( input_path=tasmax_cpm_1980_raw_path.parent, output_path=output_path, crop_path=crop_path, ) paths: list[Path] - reproject_result: GDALDataset = test_config.to_reprojection() + try: + reproject_result: GDALDataset = test_config.to_reprojection() + except FileExistsError: + test_config._sync_reprojected_paths(overwrite_output_path=output_path) + match config: case "direct": - paths = [test_config.crop_projection(region="Scotland")] + paths = [test_config.crop_projection(region=region)] case "range": - paths = test_config.range_to_reprojection(stop=1) - case "direct_provided": - paths = [ - test_config.to_reprojection(index=0, source_to_index=tuple(test_config)) - ] - case "range_provided": - paths = test_config.range_to_reprojection( - stop=1, source_to_index=tuple(test_config) - ) + paths = test_config.range_crop_projection(stop=1) + # case "direct_provided": + # paths = [ + # test_config.to_reprojection(index=0, source_to_index=tuple(test_config)) + # ] + # case "range_provided": + # paths = test_config.range_to_reprojection( + # stop=1, source_to_index=tuple(test_config) + # ) crop: T_Dataset = open_dataset(paths[0]) - assert crop.dims["time"] == 365 # assert crop.dims[FINAL_RESAMPLE_LON_COL] == FINAL_CONVERTED_CPM_WIDTH # assert_allclose(export.tasmax[10][5][:10].values, FINAL_CPM_DEC_10_5_X_0_10_Y) - assert ( - CPM_FIRST_DATES == crop.time.dt.strftime(CLI_DATE_FORMAT_STR).head().values - ).all() + if data_type == UKCPLocalProjections: + assert crop.dims["time"] == 365 + assert ( + CPM_FIRST_DATES == crop.time.dt.strftime(CLI_DATE_FORMAT_STR).head().values + ).all() plot_xarray( crop.tasmax[0], - path=resample_test_cpm_output_path / f"config-{config}.png", + path=crop_path / region / f"config-{config}.png", time_stamp=True, ) - assert False - # cropped.rio.set_spatial_dims(x_dim="grid_longitude", y_dim="grid_latitude") - # datetime_now_str: str = str(datetime.now()).replace(" ", "-") - # - # # plot_path: Path = data_fixtures_path / 'output' - # plot_path: Path = Path("tests") / "runs" - # plot_path.mkdir(parents=True, exist_ok=True) - # - # glasgow_fig_file_name: Path = Path(f"glasgow_{datetime_now_str}.png") - # pre_crop_fig_file_name: Path = Path(f"pre_crop_{datetime_now_str}.png") - # crop_fig_file_name: Path = Path(f"test_crop_{datetime_now_str}.png") - # - # glasgow_test_fig_path: Path = plot_path / glasgow_fig_file_name - # pre_crop_test_fig_path: Path = plot_path / pre_crop_fig_file_name - # crop_test_fig_path: Path = plot_path / crop_fig_file_name - # - # glasgow_geo_df: GeoDataFrame = read_file(glasgow_shape_file_path) - # glasgow_geo_df.plot() - # plt.savefig(glasgow_test_fig_path) - # assert glasgow_geo_df.crs == BRITISH_NATIONAL_GRID_EPSG - # assert tuple(glasgow_geo_df.bounds.values.tolist()[0]) == glasgow_epsg_27700_bounds - # - # max_temp_1981_path: Path = annual_data_path( - # end_year=1981, - # parent_path=data_fixtures_path, - # ) - # xarray_pre_crop: T_Dataset = open_dataset(max_temp_1981_path, decode_coords="all") - # xarray_pre_crop.isel(time=0).tasmax.plot() - # plt.savefig(pre_crop_test_fig_path) - # - # assert str(xarray_pre_crop.rio.crs) != BRITISH_NATIONAL_GRID_EPSG - # assert xarray_pre_crop.rio.bounds() == uk_rotated_grid_bounds - # - # cropped: T_Dataset = crop_xarray( - # xr_time_series=max_temp_1981_path, - # crop_geom=glasgow_shape_file_path, - # enforce_xarray_spatial_dims=True, - # invert=True, - # initial_clip_box=False, - # ) - # - # cropped.isel(time=0).tasmax.plot() - # plt.savefig(crop_test_fig_path) - # - # assert str(cropped.rio.crs) == BRITISH_NATIONAL_GRID_EPSG - # assert cropped.rio.bounds() == glasgow_epsg_27700_bounds - # assert False @pytest.mark.localcache From a856656351b5796f4c3428f741b74232ffa0c341 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 18 Jun 2024 11:08:21 +0100 Subject: [PATCH 29/92] fix(crop): ensure `BoundingBoxCoords` `kwargs` for `rioxarray` `crop_box` --- python/clim_recal/utils/data.py | 7 +++---- python/clim_recal/utils/xarray.py | 6 ++++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/python/clim_recal/utils/data.py b/python/clim_recal/utils/data.py index 602ed51e..a2f56805 100644 --- a/python/clim_recal/utils/data.py +++ b/python/clim_recal/utils/data.py @@ -40,9 +40,9 @@ def as_tuple(self) -> tuple[float, float, float, float]: """Return in `xmin`, `xmax`, `ymin`, `ymax` order.""" return self.xmin, self.xmax, self.ymin, self.ymax - def as_dict(self) -> dict[str, float]: + def as_rioxarray_dict(self) -> dict[str, float]: """Return coords as `dict`""" - return {'xmin': self.xmin, 'xmax': self.xmax, 'ymin': self.ymin, 'ymax': self.ymax} + return {'minx': self.xmin, 'maxx': self.xmax, 'miny': self.ymin, 'maxy': self.ymax} @property def rioxarry_epsg(self) -> str: @@ -66,7 +66,7 @@ def rioxarry_epsg(self) -> str: """Rough approximation of Manchester box coordinates.""" ScotlandCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( - name="Scotland", xmin=51029, xmax=547530, ymin=4480515, ymax=1243058 + name="Scotland", xmin=51029, xmax=547530, ymin=1243058, ymax=4480515, ) """Rough approximation of Scotland box coordinates.""" @@ -227,7 +227,6 @@ def all(cls) -> tuple[str, ...]: return tuple(map(lambda c: c.value, cls)) - class MethodOptions(StrEnumReprName): """Supported options for methods.""" diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 8a69b396..37f754c7 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -538,7 +538,7 @@ def crop_xarray( ... crop_box=GlasgowCoordsEPSG27700) >>> assert_allclose(cropped.rio.bounds(), ... GlasgowCoordsEPSG27700.as_tuple(), - ... rtol=.01) + ... rtol=.001) >>> tasmax_cpm_1980_365_day.sizes Frozen({'x': 529, 'y': 653, 'time': 365}) >>> cropped.sizes @@ -551,7 +551,9 @@ def crop_xarray( raise ValueError( f"'xr_time_series.rio.crs': '{xr_time_series.rio.epsg}' must equal 'crop_box.crs': '{crop_box.crs}'" ) - return xr_time_series.rio.clip_box(*crop_box.as_tuple(), **kwargs) + return xr_time_series.rio.clip_box( + **crop_box.as_rioxarray_dict(), crs=crop_box.rioxarry_epsg, **kwargs + ) def ensure_xr_dataset( From 6888821d4c23f31e9b447c02683084d97e68c3b0 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 18 Jun 2024 11:53:55 +0100 Subject: [PATCH 30/92] fix: `ScotlandCoordsEPSG27700` to include all of the Shetland islands --- python/clim_recal/utils/data.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/python/clim_recal/utils/data.py b/python/clim_recal/utils/data.py index a2f56805..417cfbee 100644 --- a/python/clim_recal/utils/data.py +++ b/python/clim_recal/utils/data.py @@ -53,22 +53,22 @@ def rioxarry_epsg(self) -> str: GlasgowCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( name="Glasgow", xmin=249799.999600002, xmax=269234.9996, ymin=657761.472000003, ymax=672330.696800007 ) -"""Rough approximation of Glasgow box coordinates.""" +"""Glasgow box coordinates in 27700 grid.""" LondonCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( name="London", xmin=503568.1996, xmax=561957.4961, ymin=155850.7974, ymax=200933.9025 ) -"""Rough approximation of London box coordinates.""" +"""London box coordinates in 27700 grid.""" ManchesterCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( name="Manchester", xmin=380399.997, xmax=393249.999, ymin=389349.999, ymax=405300.003 ) -"""Rough approximation of Manchester box coordinates.""" +"""Manchester box coordinates in 27700 grid.""" ScotlandCoordsEPSG27700: Final[BoundingBoxCoords] = BoundingBoxCoords( - name="Scotland", xmin=51029, xmax=547530, ymin=1243058, ymax=4480515, + name="Scotland", xmin=5513.00030000042, xmax=470323.0001, ymin=530252.800000001, ymax=1220301.5 ) -"""Rough approximation of Scotland box coordinates.""" +"""Scotland box coordinates in 27700 grid.""" DEFAULT_CROP_COORDS_EPSG2770: Final[dict[str, BoundingBoxCoords]] = { record.name: record for record in From cc5d0da4c100b845976998901330d88153516091 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 18 Jun 2024 23:37:59 +0100 Subject: [PATCH 31/92] fix: `BoundingBoxCoords.as_tuple()` -> `as_xarray_tuple()` --- python/clim_recal/resample.py | 5 +- python/clim_recal/utils/data.py | 4 +- python/clim_recal/utils/xarray.py | 6 +- python/conftest.py | 22 ++++- python/tests/test_resample.py | 157 ++---------------------------- python/tests/utils.py | 34 +++++-- 6 files changed, 60 insertions(+), 168 deletions(-) diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index c8845712..90fe524b 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -336,7 +336,10 @@ def range_crop_projection( export_paths: list[Path | T_Dataset] = [] if stop is None: stop = len(self) - assert regions + try: + assert regions + except: + raise ValueError(f"Iterable 'regions' must be set.") for region in regions: console.print(f"Cropping to '{region}' from {self}...") for index in trange(start, stop, step): diff --git a/python/clim_recal/utils/data.py b/python/clim_recal/utils/data.py index 417cfbee..78081b01 100644 --- a/python/clim_recal/utils/data.py +++ b/python/clim_recal/utils/data.py @@ -36,9 +36,9 @@ class BoundingBoxCoords: ymax: float epsg: int = BRITISH_NATION_GRID_COORDS_NUMBER - def as_tuple(self) -> tuple[float, float, float, float]: + def as_rioxarray_tuple(self) -> tuple[float, float, float, float]: """Return in `xmin`, `xmax`, `ymin`, `ymax` order.""" - return self.xmin, self.xmax, self.ymin, self.ymax + return self.xmin, self.ymin, self.xmax, self.ymax def as_rioxarray_dict(self) -> dict[str, float]: """Return coords as `dict`""" diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 37f754c7..22ae50b3 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -537,12 +537,12 @@ def crop_xarray( ... tasmax_cpm_1980_365_day, ... crop_box=GlasgowCoordsEPSG27700) >>> assert_allclose(cropped.rio.bounds(), - ... GlasgowCoordsEPSG27700.as_tuple(), - ... rtol=.001) + ... GlasgowCoordsEPSG27700.as_rioxarray_tuple(), + ... rtol=.01) >>> tasmax_cpm_1980_365_day.sizes Frozen({'x': 529, 'y': 653, 'time': 365}) >>> cropped.sizes - Frozen({'x': 186, 'y': 185, 'time': 365}) + Frozen({'x': 10, 'y': 8, 'time': 365}) """ xr_time_series, _ = check_xarray_path_and_var_name(xr_time_series, None) try: diff --git a/python/conftest.py b/python/conftest.py index daed1a8d..00c10c7d 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -31,14 +31,14 @@ CLI_PREPROCESS_DEFAULT_COMMAND_STR_CORRECT, CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT, CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT, + CPM_RAW_TASMAX_1980_FILE, + CPM_RAW_TASMAX_EXAMPLE_PATH, HADS_RAW_TASMAX_1980_FILE, HADS_RAW_TASMAX_EXAMPLE_PATH, MOD_FOLDER_FILES_COUNT_CORRECT, OBS_FOLDER_FILES_COUNT_CORRECT, PREPROCESS_OUT_FOLDER_FILES_COUNT_CORRECT, TEST_AUTH_CSV_FILE_NAME, - UKCP_RAW_TASMAX_1980_FILE, - UKCP_RAW_TASMAX_EXAMPLE_PATH, XARRAY_END_DATE_4_DAYS, XARRAY_END_DATE_8_DAYS, XARRAY_EXAMPLE_END_DATE_4_YEARS, @@ -123,8 +123,8 @@ def local_cache_fixtures( caches=( LocalCache( name="tasmax_cpm_1980_raw", - source_path=UKCP_RAW_TASMAX_EXAMPLE_PATH, - local_cache_path=local_cpm_cache_path / UKCP_RAW_TASMAX_1980_FILE, + source_path=CPM_RAW_TASMAX_EXAMPLE_PATH, + local_cache_path=local_cpm_cache_path / CPM_RAW_TASMAX_1980_FILE, reader=open_dataset, reader_kwargs={"decode_coords": "all"}, ), @@ -135,6 +135,20 @@ def local_cache_fixtures( reader=open_dataset, reader_kwargs={"decode_coords": "all"}, ), + # LocalCache( + # name="railfall_hads_1980_raw", + # source_path=HADS_RAW_RAINFALL_EXAMPLE_PATH, + # local_cache_path=local_hads_cache_path / HADS_RAW_RAINFALL_1980_FILE, + # reader=open_dataset, + # reader_kwargs={"decode_coords": "all"}, + # ), + # LocalCache( + # name="railfall_cpm_1980_raw", + # source_path=CPM_RAW_RAINFALL_EXAMPLE_PATH, + # local_cache_path=local_hads_cache_path / CPM_RAW_RAINFALL_1980_FILE, + # reader=open_dataset, + # reader_kwargs={"decode_coords": "all"}, + # ), ), ) if sync_all: diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index e5efa144..076086f4 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -52,11 +52,11 @@ from conftest import resample_test_cpm_output_path from .utils import ( + CPM_RAW_TASMAX_EXAMPLE_PATH, + CPM_TASMAX_DAY_SERVER_PATH, + CPM_TASMAX_LOCAL_TEST_PATH, HADS_UK_TASMAX_DAY_SERVER_PATH, HADS_UK_TASMAX_LOCAL_TEST_PATH, - UKCP_RAW_TASMAX_EXAMPLE_PATH, - UKCP_TASMAX_DAY_SERVER_PATH, - UKCP_TASMAX_LOCAL_TEST_PATH, xarray_example, year_days_count, ) @@ -140,7 +140,7 @@ def reference_final_coord_grid() -> T_Dataset: @pytest.fixture def ukcp_tasmax_raw_mount_path(data_mount_path: Path) -> Path: - return data_mount_path / UKCP_TASMAX_DAY_SERVER_PATH + return data_mount_path / CPM_TASMAX_DAY_SERVER_PATH @pytest.fixture @@ -161,7 +161,7 @@ def hads_tasmax_local_test_path(data_fixtures_path: Path) -> Path: @pytest.fixture def ukcp_tasmax_local_test_path(data_fixtures_path: Path) -> Path: - return data_fixtures_path / UKCP_TASMAX_LOCAL_TEST_PATH + return data_fixtures_path / CPM_TASMAX_LOCAL_TEST_PATH def test_leap_year_days() -> None: @@ -376,7 +376,7 @@ def test_convert_cpm_calendar(interpolate_na: bool) -> None: """ any_na_values_in_tasmax: bool = not interpolate_na raw_nc: T_Dataset = open_dataset( - UKCP_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all", engine=NETCDF4_XARRAY_ENGINE + CPM_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all", engine=NETCDF4_XARRAY_ENGINE ) assert len(raw_nc.time) == 360 assert len(raw_nc.time_bnds) == 360 @@ -389,119 +389,6 @@ def test_convert_cpm_calendar(interpolate_na: bool) -> None: ) -# @pytest.mark.slow -# @pytest.mark.xfail -# @pytest.mark.parametrize("data_type", (UKCPLocalProjections, HadUKGrid)) -# @pytest.mark.parametrize("data_source", ("mounted", "local")) -# @pytest.mark.parametrize("output_format", (GDALNetCDFFormatStr, GDALGeoTiffFormatStr)) -# @pytest.mark.parametrize("glasgow_crop", (True, False)) -# def test_geo_warp_format_type_crop( -# data_type: CEDADataSources, -# data_source: Literal["mounted", "local"], -# output_format: GDALFormatsType, -# glasgow_crop: bool, -# test_runs_output_path: Path, -# glasgow_shape_file_path: Path, -# glasgow_epsg_27700_bounds: BoundsTupleType, -# uk_rotated_grid_bounds, -# ukcp_tasmax_raw_mount_path: Path, -# hads_tasmax_raw_mount_path: Path, -# hads_tasmax_local_test_path: Path, -# ukcp_tasmax_local_test_path: Path, -# is_data_mounted: bool, -# ) -> None: -# """Test using `geo_warp` with mounted raw data.""" -# server_data_path: Path = ( -# ukcp_tasmax_raw_mount_path -# if data_type == UKCPLocalProjections -# else hads_tasmax_raw_mount_path -# ) -# local_data_path: Path = ( -# ukcp_tasmax_local_test_path -# if data_type == UKCPLocalProjections -# else hads_tasmax_local_test_path -# ) -# data_path: Path = server_data_path if data_source == "mounted" else local_data_path -# if data_source == "mounted" and not is_data_mounted: -# pytest.skip("requires external data mounted") -# assert data_path.exists() -# -# # cropped.rio.set_spatial_dims(x_dim="grid_longitude", y_dim="grid_latitude") -# datetime_now = datetime.now() -# warp_path: Path = test_runs_output_path / "geo_warp" -# if glasgow_crop: -# glasgow_test_fig_path = results_path( -# name="glasgow", -# path=warp_path, -# time=datetime_now, -# extension="png", -# mkdir=True, -# ) -# pre_warp_test_fig_path = results_path( -# name="pre_warp", path=warp_path, time=datetime_now, extension="png", mkdir=True -# ) -# warp_test_file_path = results_path( -# name="test_warp_file", -# path=warp_path, -# time=datetime_now, -# extension=GDALFormatExtensions[output_format], -# mkdir=False, -# ) -# warp_test_fig_path = results_path( -# name="test_warp", path=warp_path, time=datetime_now, extension="png", mkdir=True -# ) -# -# if glasgow_crop: -# glasgow_geo_df: GeoDataFrame = read_file(glasgow_shape_file_path) -# glasgow_geo_df.plot() -# plt.savefig(glasgow_test_fig_path) -# assert glasgow_geo_df.crs == BRITISH_NATIONAL_GRID_EPSG -# assert ( -# tuple(glasgow_geo_df.bounds.values.tolist()[0]) == glasgow_epsg_27700_bounds -# ) -# -# max_temp_data_path: Path = ( -# data_path -# if data_source == "local" -# else annual_data_path( -# end_year=1981, -# parent_path=data_path, -# ) -# ) -# xarray_pre_warp: T_Dataset = open_dataset( -# max_temp_data_path, decode_coords="all", engine=NETCDF4_XARRAY_ENGINE -# ) -# xarray_pre_warp.isel(time=0).tasmax.plot() -# plt.savefig(pre_warp_test_fig_path) -# -# assert str(xarray_pre_warp.rio.crs) != BRITISH_NATIONAL_GRID_EPSG -# assert xarray_pre_warp.rio.bounds() == uk_rotated_grid_bounds -# # output_path: Path = warp_path / (max_temp_data_path.stem + ".tif" if output_format == GDALGeoTiffFormatStr else ".nc") -# xarray_warped: GDALDataset -# if glasgow_crop: -# xarray_warped = gdal_warp_wrapper( -# input_path=max_temp_data_path, -# output_path=warp_test_file_path, -# format=output_format, -# ) -# else: -# xarray_warped = gdal_warp_wrapper( -# input_path=max_temp_data_path, -# output_path=warp_test_file_path, -# format=output_format, -# output_bounds=uk_rotated_grid_bounds, -# ) -# assert xarray_warped is not None -# read_exported: T_Dataset = open_dataset(warp_test_file_path, decode_coords="all") -# -# read_exported.Band1.plot() -# plt.savefig(warp_test_fig_path) -# -# assert str(read_exported.rio.crs) == BRITISH_NATIONAL_GRID_EPSG -# if glasgow_crop: -# assert read_exported.rio.bounds() == glasgow_epsg_27700_bounds - - @pytest.mark.localcache @pytest.mark.mount @pytest.mark.slow @@ -920,35 +807,3 @@ def test_execute_resample_configs( HADS_FIRST_DATES.astype(object) == export.time.dt.strftime(CLI_DATE_FORMAT_STR).head().values ).all() - - -# Todo: rearrange test below for crop testing or delete -# @pytest.mark.xfail(reason="test still in development") -# @pytest.mark.slow -# @pytest.mark.mount -# def test_crop_merged_nc( -# # align_on: ConvertCalendarAlignOptions, -# # ukcp_tasmax_raw_path -# glasgow_shape_file_path, -# data_mount_path, -# ): -# """Test `cropping` `DataArray` to `standard` calendar.""" -# # Create a base -# result_bounds: BoundsTupleType = ( -# 353.92520902961434, -# -4.693282346489016, -# 364.3162765660888, -# 8.073382596733156 -# ) -# -# cropped = crop_xarray( -# 'tests/data/tasmax_rcp85_land-cpm_uk_2.2km_01_day_19821201-19831130.nc', -# crop_geom=glasgow_shape_file_path, invert=True) -# assert cropped.rio.bounds == result_bounds -# ts_to_crop: dict[Path, T_Dataset] = {} -# for path in ukcp_tasmax_raw_5_years_paths: -# assert path.exists() -# ts_to_crop[path] = open_dataset(path, decode_coords="all") -# -# assert False -# test_crop = crop_xarray() diff --git a/python/tests/utils.py b/python/tests/utils.py index 443d12a0..9f5eab50 100644 --- a/python/tests/utils.py +++ b/python/tests/utils.py @@ -25,7 +25,7 @@ PROCESSORS_DEFAULT, VALID_DATES_STR_DEFAULT, ) -from clim_recal.resample import RAW_CPM_TASMAX_PATH, RAW_HADS_TASMAX_PATH +from clim_recal.resample import RAW_CPM_PATH, RAW_CPM_TASMAX_PATH, RAW_HADS_TASMAX_PATH from clim_recal.utils.core import ( CPM_YEAR_DAYS, ISO_DATE_FORMAT_STR, @@ -52,7 +52,7 @@ "Processed/HadsUKgrid/resampled_2.2km/tasmax/day" ) -UKCP_RAW_TASMAX_1980_FILE: Final[Path] = Path( +CPM_RAW_TASMAX_1980_FILE: Final[Path] = Path( "tasmax_rcp85_land-cpm_uk_2.2km_01_day_19801201-19811130.nc" ) HADS_RAW_TASMAX_1980_FILE: Final[Path] = Path( @@ -63,21 +63,41 @@ Path(HadUKGrid.slug) / HADS_RAW_TASMAX_1980_FILE ) -UKCP_TASMAX_DAY_SERVER_PATH: Final[Path] = Path("Raw/UKCP2.2/tasmax/01/latest") +CPM_TASMAX_DAY_SERVER_PATH: Final[Path] = Path("Raw/UKCP2.2/tasmax/01/latest") # Todo: Change "tasmax_rcp85_land-cpm_uk_2.2km_01_day_19801201-19811130.nc" # to "tasmax_cpm_example.nc" -UKCP_TASMAX_LOCAL_TEST_PATH: Final[Path] = ( - Path(UKCPLocalProjections.slug) / UKCP_RAW_TASMAX_1980_FILE +CPM_TASMAX_LOCAL_TEST_PATH: Final[Path] = ( + Path(UKCPLocalProjections.slug) / CPM_RAW_TASMAX_1980_FILE ) -UKCP_RAW_TASMAX_EXAMPLE_PATH: Final[Path] = ( - RAW_CPM_TASMAX_PATH / UKCP_RAW_TASMAX_1980_FILE +HADS_UK_RAINFALL_DAY_SERVER_PATH: Final[Path] = Path("Raw/HadsUKgrid/rainfall/day") +HADS_RAW_RAINFALL_1980_FILE: Final[Path] = Path( + "rainfall_hadukgrid_uk_1km_day_19800101-19800131.nc" +) + + +RAW_CPM_RAINFALL_PATH: Final[Path] = Path(RAW_CPM_PATH) / "Raw/UKCP2.2/pr/01/latest/" +RAW_HADS_RAINFALL_PATH: Final[Path] = Path(RAW_CPM_PATH) / "rainfall/day" +CPM_RAW_RAINFALL_1980_FILE: Final[Path] = Path( + "pr_rcp85_land-cpm_uk_2.2km_01_day_20331201-20341130.nc" +) + +CPM_RAW_TASMAX_EXAMPLE_PATH: Final[Path] = ( + RAW_CPM_TASMAX_PATH / CPM_RAW_TASMAX_1980_FILE +) +CPM_RAW_RAINFALL_EXAMPLE_PATH: Final[Path] = ( + RAW_CPM_RAINFALL_PATH / CPM_RAW_RAINFALL_1980_FILE ) HADS_RAW_TASMAX_EXAMPLE_PATH: Final[Path] = ( RAW_HADS_TASMAX_PATH / HADS_RAW_TASMAX_1980_FILE ) +HADS_RAW_RAINFALL_EXAMPLE_PATH: Final[Path] = ( + RAW_HADS_RAINFALL_PATH / HADS_RAW_RAINFALL_1980_FILE +) + + XARRAY_EXAMPLE_RANDOM_SEED: Final[int] = 0 # Default 4 year start and end date covering leap year XARRAY_EXAMPLE_START_DATE_STR: Final[str] = "1980-11-30" From 7817615640b0364d7b26acf2226f193252baf0a4 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Thu, 20 Jun 2024 11:20:31 +0100 Subject: [PATCH 32/92] fix: add `match_xr_time_series` params to `xr_reproject_crs` --- python/clim_recal/resample.py | 126 +++++------------------------- python/clim_recal/utils/xarray.py | 117 ++++++++++++++------------- python/tests/test_resample.py | 47 +++++------ 3 files changed, 109 insertions(+), 181 deletions(-) diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index 90fe524b..b0efeda6 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -1,10 +1,7 @@ """Resample UKHADS data and UKCP18 data. -- UKHADS is resampled spatially from 1km to 2.2km. -- UKCP18 is resampled temporally from a 360 day calendar to a standard (365/366 day) calendar and projected to British National Grid (BNG) (from rotated polar grid). - -## Notes - +- UKCP18 is resampled temporally from a 360 day calendar to a standard (365/366 day) calendar and projected to British National Grid (BNG) EPSG:27700 from its original rotated polar grid. +- UKHADS is resampled spatially from 1km to 2.2km in BNG aligned with the projected UKCP18 """ from dataclasses import dataclass, field @@ -61,11 +58,10 @@ RAW_CPM_PATH: Final[PathLike] = CLIMATE_DATA_MOUNT_PATH / "Raw/UKCP2.2" RAW_HADS_TASMAX_PATH: Final[PathLike] = RAW_HADS_PATH / "tasmax/day" RAW_CPM_TASMAX_PATH: Final[PathLike] = RAW_CPM_PATH / "tasmax/01/latest" -REPROJECTED_CPM_TASMAX_05_LATEST_INPUT_PATH: Final[PathLike] = ( +REPROJECTED_CPM_TASMAX_05_LATEST_INPUT_PATH: Final[PathLike] = Path( CLIMATE_DATA_MOUNT_PATH / "Reprojected_infill/UKCP2.2/tasmax/05/latest" ) -CPRUK_RESOLUTION: Final[int] = 2200 CPRUK_RESAMPLING_METHOD: Final[str] = GRA_NearestNeighbour ResamplingArgs = tuple[PathLike, np.ndarray, np.ndarray, PathLike] ResamplingCallable = Callable[[list | tuple], int] @@ -440,7 +436,7 @@ class HADsResampler(ResamblerBase): ----- - [x] Try time projection first - [x] Combine with space (this worked) - - [ ] Add crop step + - [x] Add crop step Examples -------- @@ -475,9 +471,25 @@ class HADsResampler(ResamblerBase): # resolution_relative_path: Path = HADS_2_2K_RESOLUTION_PATH input_file_x_column_name: str = HADS_XDIM input_file_y_column_name: str = HADS_YDIM + cpm_for_coord_alignment: T_Dataset | PathLike = RAW_CPM_TASMAX_PATH _resample_func: ReprojectFuncType = hads_resample_and_reproject _use_reference_grid: bool = True + def __post_init__(self) -> None: + """Ensure `self.cpm_for_coord_alignment` is set.""" + super().__post_init__() + if Path(self.cpm_for_coord_alignment).is_dir(): + self.cpm_for_coord_alignment = next( + Path(self.cpm_for_coord_alignment).glob("t*.nc") + ) + self.cpm_for_coord_alignment = cpm_reproject_with_standard_calendar( + self.cpm_for_coord_alignment + ) + logger.info( + f"Set 'self.cpm_for_coord_alignment' to: '{self.cpm_for_coord_alignment}'" + ) + # cpm_match_variable_name: str = self.cpm_for_coord_alignment + def to_reprojection( self, index: int = 0, @@ -504,6 +516,7 @@ def to_reprojection( variable_name=self.variable_name, x_dim_name=self.input_file_x_column_name, y_dim_name=self.input_file_y_column_name, + cpm_to_match=self.cpm_for_coord_alignment, # x_grid=self.x, # y_grid=self.y, # source_x_coord_column_name=self.input_file_x_column_name, @@ -513,40 +526,6 @@ def to_reprojection( return_results=return_results, ) - # def to_crop( - # self, - # index: int = 0, - # override_export_path: Path | None = None, - # return_results: bool = False, - # source_to_index: Sequence | None = None, - # ) -> Path | T_Dataset: - # source_path: Path = self._output_path( - # index=index, source_to_index=source_to_index - # ) - # path: PathLike = self._output_path( - # self.resolution_relative_path, override_export_path - # ) - # return apply_geo_func( - # source_path=source_path, - # # func=interpolate_coords, - # func=self._resample_func, - # export_folder=path, - # # Leaving in case we return to using warp - # # export_path_as_output_path_kwarg=True, - # # to_netcdf=False, - # to_netcdf=True, - # variable_name=self.variable_name, - # x_dim_name=self.input_file_x_column_name, - # y_dim_name=self.input_file_y_column_name, - # # x_grid=self.x, - # # y_grid=self.y, - # # source_x_coord_column_name=self.input_file_x_column_name, - # # source_y_coord_column_name=self.input_file_y_column_name, - # # use_reference_grid=self._use_reference_grid, - # new_path_name_func=reproject_2_2km_filename, - # return_results=return_results, - # ) - @dataclass(kw_only=True, repr=False) class CPMResampler(ResamblerBase): @@ -961,66 +940,3 @@ def _gen_folder_paths( if append_var_path_dict: self._var_path_dict[var_path] = var yield var_path - - -# Kept from previous structure for reference -# if __name__ == "__main__": -# """ -# Script to resample UKHADs data from the command line -# """ -# # Initialize parser -# parser = argparse.ArgumentParser() -# -# # Adding arguments -# parser.add_argument( -# "--input-path", -# help="Path where the .nc files to resample is located", -# required=True, -# type=str, -# ) -# parser.add_argument( -# "--grid-data-path", -# help="Path where the .nc file with the grid to resample is located", -# required=False, -# type=str, -# default="../../data/rcp85_land-cpm_uk_2.2km_grid.nc", -# ) -# parser.add_argument( -# "--output-path", -# help="Path to save the resampled data data", -# required=False, -# default=".", -# type=str, -# ) -# parser_args = parser.parse_args() -# hads_run_manager = HADsResampler( -# input_path=parser_args.input_path, -# grid_data_path=parser_args.grid_data_path, -# output_path=parser_args.output, -# ) -# res = hads_run_manager.resample_multiprocessing() -# -# parser_args = parser.parse_args() -# -# # reading baseline grid to resample files to -# grid = xr.open_dataset(parser_args.grid_data) -# -# try: -# # must have dimensions named projection_x_coordinate and projection_y_coordinate -# x = grid["projection_x_coordinate"][:].values -# y = grid["projection_y_coordinate"][:].values -# except Exception as e: -# print(f"Grid file: {parser_args.grid_data} produced errors: {e}") -# -# # If output file do not exist create it -# if not os.path.exists(parser_args.output): -# os.makedirs(parser_args.output) -# -# # find all nc files in input directory -# files = glob.glob(f"{parser_args.input}/*.nc", recursive=True) -# N = len(files) -# -# args = [[f, x, y, parser_args.output] for f in files] -# -# with multiprocessing.Pool(processes=os.cpu_count() - 1) as pool: -# res = list(tqdm(pool.imap_unordered(resample_hadukgrid, args), total=N)) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 22ae50b3..2efe9164 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -63,6 +63,7 @@ HADS_RAW_Y_COLUMN_NAME: Final[str] = "projection_y_coordinate" HADS_DROP_VARS_AFTER_PROJECTION: Final[tuple[str, ...]] = ("longitude", "latitude") +CPM_RESOLUTION_METERS: Final[int] = 2200 CPM_RAW_X_COLUMN_NAME: Final[str] = "grid_longitude" CPM_RAW_Y_COLUMN_NAME: Final[str] = "grid_latitude" @@ -210,9 +211,11 @@ def cpm_reproject_with_standard_calendar( cpm_xr_time_series, variable_name ) - standar_calendar_ts: T_Dataset = cpm_xarray_to_standard_calendar(cpm_xr_time_series) + standard_calendar_ts: T_Dataset = cpm_xarray_to_standard_calendar( + cpm_xr_time_series + ) subset_within_ensemble: T_Dataset = Dataset( - {variable_name: standar_calendar_ts[variable_name][0]} + {variable_name: standard_calendar_ts[variable_name][0]} ) subset_in_epsg_27700: T_DataArray = xr_reproject_crs( @@ -220,12 +223,13 @@ def cpm_reproject_with_standard_calendar( variable_name=variable_name, x_dim_name=x_dim_name, y_dim_name=y_dim_name, + resolution=(CPM_RESOLUTION_METERS, CPM_RESOLUTION_METERS), ) try: - assert (subset_in_epsg_27700.time == standar_calendar_ts.time).all() + assert (subset_in_epsg_27700.time == standard_calendar_ts.time).all() except: raise ValueError( - f"Time series of 'standar_calendar_ts' does not match time series of projection to {BRITISH_NATIONAL_GRID_EPSG}." + f"Time series of 'standard_calendar_ts' does not match time series of projection to {BRITISH_NATIONAL_GRID_EPSG}." ) return subset_in_epsg_27700 @@ -237,7 +241,10 @@ def xr_reproject_crs( time_dim_name: str = TIME_COLUMN_NAME, variable_name: str | None = None, final_crs: str = BRITISH_NATIONAL_GRID_EPSG, - final_resolution: tuple[int, int] | None = (2200, 2200), + match_xr_time_series: T_Dataset | PathLike | None = None, + match_xr_time_series_load_func: Callable | None = None, + match_xr_time_series_load_kwargs: dict[str, Any] | None = None, + **kwargs, ) -> T_Dataset: """Reproject `source_xr` to `target_xr` coordinate structure. @@ -256,8 +263,6 @@ def xr_reproject_crs( Inferred if `None` assuming only one `data_var` attribute. final_crs Coordinate system `str` to project `xr_time_series` to. - final_resolution - Resolution to project `xr_time_series` raster data to. Examples -------- @@ -271,10 +276,15 @@ def xr_reproject_crs( 'bnds': 2}) >>> tasmax_hads_2_2km: T_Dataset = xr_reproject_crs( ... tasmax_hads_1980_raw, + ... variable_name="tasmax", ... x_dim_name=HADS_RAW_X_COLUMN_NAME, - ... y_dim_name=HADS_RAW_Y_COLUMN_NAME,) + ... y_dim_name=HADS_RAW_Y_COLUMN_NAME, + ... resolution=(CPM_RESOLUTION_METERS, + ... CPM_RESOLUTION_METERS),) >>> tasmax_hads_2_2km.dims - FrozenMappingWarningOnValuesAccess({'x': 410, 'y': 660, 'time': 31}) + FrozenMappingWarningOnValuesAccess({'x': 410, + 'y': 660, + 'time': 31}) """ xr_time_series, variable_name = check_xarray_path_and_var_name( xr_time_series, variable_name @@ -282,14 +292,14 @@ def xr_reproject_crs( xr_time_series = xr_time_series.rio.set_spatial_dims( x_dim=x_dim_name, y_dim=y_dim_name, inplace=True ) - # info requires a bf parameter, not straightforward for logging + # info requires a df parameter, not straightforward for logging # logger.info(xr_time_series.info()) data_array: T_DataArray = xr_time_series[variable_name] - final_index_names: tuple[str, str, str] = (time_dim_name, x_dim_name, y_dim_name) - extra_dims: set[str] = set(data_array.indexes.dims) - set(final_index_names) + index_names: tuple[str, str, str] = (time_dim_name, x_dim_name, y_dim_name) + extra_dims: set[str] = set(data_array.indexes.dims) - set(index_names) if extra_dims: raise ValueError( - f"Can only reindex using dims: {final_index_names}, extra dim(s): {extra_dims}" + f"Can only reindex using dims: {index_names}, extra dim(s): {extra_dims}" ) coords: dict[str, DataArray] = { time_dim_name: xr_time_series[time_dim_name], @@ -300,9 +310,38 @@ def xr_reproject_crs( data=data_array.to_numpy(), coords=coords, name=variable_name ) without_attributes = without_attributes.rio.write_crs(xr_time_series.rio.crs) - without_attributes_reprojected: DataArray = without_attributes.rio.reproject( - final_crs, resolution=final_resolution - ) + without_attributes_reprojected: T_DataArray + if match_xr_time_series: + if match_xr_time_series_load_func: + match_xr_time_series_load_kwargs = match_xr_time_series_load_kwargs or {} + match_xr_time_series = match_xr_time_series_load_func( + match_xr_time_series, **match_xr_time_series_load_kwargs + ) + if not {x_dim_name, y_dim_name} < match_xr_time_series.dims.keys(): + # If dim name + # likely x, y indexes from a projection like cpm, need to match + logger.debug( + f"'x_dim_name': {x_dim_name} and " + f"'y_dim_name': {y_dim_name} not in " + f"'match_xr_time_series' dims: " + f"{match_xr_time_series.dims.keys()}." + ) + if {"x", "y"} < match_xr_time_series.dims.keys(): + logger.debug( + "Renaming dims: '{x_dim_name}' -> 'x', '{y_dim_name}' -> 'y'" + ) + without_attributes = without_attributes.rename( + {x_dim_name: "x", y_dim_name: "y"} + ) + else: + raise ValueError("Can't match dim names.") + without_attributes_reprojected = without_attributes.rio.reproject_match( + match_xr_time_series, **kwargs + ) + else: + without_attributes_reprojected: T_DataArray = without_attributes.rio.reproject( + final_crs, **kwargs + ) return Dataset({variable_name: without_attributes_reprojected}) @@ -401,54 +440,24 @@ def interpolate_coords( def hads_resample_and_reproject( hads_xr_time_series: T_Dataset | PathLike, variable_name: str, + cpm_to_match: T_Dataset | PathLike, + cpm_to_match_func: Callable | None = cpm_reproject_with_standard_calendar, x_dim_name: str = HADS_RAW_X_COLUMN_NAME, y_dim_name: str = HADS_RAW_Y_COLUMN_NAME, - # x_grid: NDArray | None = None, - # y_grid: NDArray | None = None, - # method: str = "linear", - # source_x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, - # source_y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, - # final_x_coord_column_name: str = FINAL_RESAMPLE_LON_COL, - # final_y_coord_column_name: str = FINAL_RESAMPLE_LAT_COL, - # final_crs: str | None = BRITISH_NATIONAL_GRID_EPSG, - # vars_to_drop: Sequence[str] | None = HADS_DROP_VARS_AFTER_PROJECTION, - # use_reference_grid: bool = False, ) -> T_Dataset: """Resample `HADs` `xarray` time series to 2.2km.""" - hads_xr_time_series, variable_name = check_xarray_path_and_var_name( - hads_xr_time_series, variable_name - ) - # if isinstance(hads_xr_time_series, PathLike): - # hads_xr_time_series = open_dataset(hads_xr_time_series, decode_coords="all") + + if isinstance(cpm_to_match, Dataset) and {"x", "y"} < cpm_to_match.dims.keys(): + cpm_to_match_func = None epsg_277000_2_2km: T_Dataset = xr_reproject_crs( hads_xr_time_series, variable_name=variable_name, x_dim_name=x_dim_name, y_dim_name=y_dim_name, + match_xr_time_series=cpm_to_match, + match_xr_time_series_load_func=cpm_to_match_func, + # match_xr_time_series_load_kwargs=dict(variable_name=variable_name), ) - - # interpolated_hads: T_Dataset = interpolate_coords( - # hads_xr_time_series, - # variable_name=variable_name, - # x_grid=x_grid, - # y_grid=y_grid, - # x_coord_column_name=source_x_coord_column_name, - # y_coord_column_name=source_y_coord_column_name, - # method=method, - # use_reference_grid=use_reference_grid, - # ) - # if vars_to_drop: - # interpolated_hads = interpolated_hads.drop_vars(vars_to_drop) - # - # interpolated_hads = interpolated_hads.rename( - # { - # source_x_coord_column_name: final_x_coord_column_name, - # source_y_coord_column_name: final_y_coord_column_name, - # } - # ) - # if final_crs: - # interpolated_hads.rio.write_crs(final_crs, inplace=True) - # return interpolated_hads return epsg_277000_2_2km diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 076086f4..8e2b080c 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -104,15 +104,15 @@ np.nan, np.nan, np.nan, - 3.39634549, - 2.97574018, - 2.63433646, - 2.62451613, - 2.53676574, - 2.42130933, - 2.66667496, - 2.60239203, - 2.5052739, + 3.61614943, + 3.22494448, + 2.87045363, + 2.62269053, + 2.79705005, + 2.73883926, + 2.48555346, + 2.46462528, + 2.61303118, ) ) @@ -139,14 +139,14 @@ def reference_final_coord_grid() -> T_Dataset: @pytest.fixture -def ukcp_tasmax_raw_mount_path(data_mount_path: Path) -> Path: +def cpm_tasmax_raw_mount_path(data_mount_path: Path) -> Path: return data_mount_path / CPM_TASMAX_DAY_SERVER_PATH @pytest.fixture -def ukcp_tasmax_raw_5_years_paths(ukcp_tasmax_raw_path: Path) -> tuple[Path, ...]: +def cpm_tasmax_raw_5_years_paths(cpm_tasmax_raw_path: Path) -> tuple[Path, ...]: """Return a `tuple` of valid paths for 5 years of""" - return tuple(annual_data_paths_generator(parent_path=ukcp_tasmax_raw_path)) + return tuple(annual_data_paths_generator(parent_path=cpm_tasmax_raw_path)) @pytest.fixture @@ -160,7 +160,7 @@ def hads_tasmax_local_test_path(data_fixtures_path: Path) -> Path: @pytest.fixture -def ukcp_tasmax_local_test_path(data_fixtures_path: Path) -> Path: +def cpm_tasmax_local_test_path(data_fixtures_path: Path) -> Path: return data_fixtures_path / CPM_TASMAX_LOCAL_TEST_PATH @@ -574,7 +574,7 @@ def test_crop_xarray( @pytest.mark.parametrize( "config", ("direct", "range", "direct_provided", "range_provided") ) -def test_ukcp_manager( +def test_cpm_manager( resample_test_cpm_output_path, config: str, tasmax_cpm_1980_raw_path: Path ) -> None: """Test running default CPM calendar fix.""" @@ -733,26 +733,29 @@ def test_hads_resample_and_reproject( reprojected: T_Dataset = hads_resample_and_reproject( tasmax_hads_1980_raw, variable_name=variable_name, + cpm_to_match=tasmax_cpm_1980_raw, ) - # plot_xarray( - # reprojected.tasmax[0], path=output_path / "tasmas-1980.png", time_stamp=True - # ) - # assert_allclose( - # reprojected.tasmax[10][430][230:250], FINAL_HADS_JAN_10_430_X_230_250_Y - # ) assert reprojected.rio.crs.to_epsg() == int(BRITISH_NATIONAL_GRID_EPSG[5:]) export_netcdf_path: Path = results_path( "tasmax-1980-converted", path=output_path, extension="nc" ) reprojected.to_netcdf(export_netcdf_path) read_from_export: T_Dataset = open_dataset(export_netcdf_path, decode_coords="all") + plot_xarray( + read_from_export.tasmax[0], + path=output_path / "tasmax-1980-JAN-1-resampled.png", + time_stamp=True, + ) + assert_allclose( + read_from_export.tasmax[10][430][230:250], FINAL_HADS_JAN_10_430_X_230_250_Y + ) assert read_from_export.dims["time"] == 31 assert ( - read_from_export.dims[FINAL_RESAMPLE_LON_COL] == FINAL_CONVERTED_HADS_WIDTH + read_from_export.dims[FINAL_RESAMPLE_LON_COL] == FINAL_CONVERTED_CPM_WIDTH ) # replaces projection_x_coordinate assert ( - read_from_export.dims[FINAL_RESAMPLE_LAT_COL] == FINAL_CONVERTED_HADS_HEIGHT + read_from_export.dims[FINAL_RESAMPLE_LAT_COL] == FINAL_CONVERTED_CPM_HEIGHT ) # replaces projection_y_coordinate assert reprojected.rio.crs == read_from_export.rio.crs == BRITISH_NATIONAL_GRID_EPSG # Check projection coordinates match for CPM and HADs From 91592bfe94901696b1fed91ce670df943d8cb900 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Thu, 20 Jun 2024 12:36:25 +0100 Subject: [PATCH 33/92] test: add `GeoTransform` checks to `test_hads_resample_and_reproject` --- python/tests/test_resample.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 8e2b080c..b78c969a 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -761,6 +761,10 @@ def test_hads_resample_and_reproject( # Check projection coordinates match for CPM and HADs assert all(cpm_to_match.x == read_from_export.x) assert all(cpm_to_match.y == read_from_export.y) + assert ( + read_from_export.spatial_ref.attrs["GeoTransform"] + == cpm_to_match.spatial_ref.attrs["GeoTransform"] + ) @pytest.mark.localcache From 64ebfdf5737b72ab157bf850055c0f4c65a2cf26 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Mon, 15 Jul 2024 02:43:37 +0100 Subject: [PATCH 34/92] fix: add `gdal_translate_wrapper` and target `gdal@3.8.5` --- python/clim_recal/utils/gdal_formats.py | 9 +- python/clim_recal/utils/xarray.py | 262 ++++++++++++++++++++++-- python/conftest.py | 2 +- python/pdm.lock | 4 +- python/tests/test_resample.py | 22 +- 5 files changed, 277 insertions(+), 22 deletions(-) diff --git a/python/clim_recal/utils/gdal_formats.py b/python/clim_recal/utils/gdal_formats.py index ea8c9341..b40b3ff7 100644 --- a/python/clim_recal/utils/gdal_formats.py +++ b/python/clim_recal/utils/gdal_formats.py @@ -1,4 +1,4 @@ -from typing import Final, Literal +from typing import Final, Literal, get_args CPM_RAW_PROJ4: Final[ str @@ -159,13 +159,16 @@ "HTTP", ] -GDALGeoTiffFormatStr: Final[str] = "GTiff" -GDALNetCDFFormatStr: Final[str] = "netCDF" +GDALGeoTiffFormatStr: Final[str] = get_args(GDALFormatsType)[2] +GDALNetCDFFormatStr: Final[str] = get_args(GDALFormatsType)[42] +GDALVirtualFormatStr: Final[str] = get_args(GDALFormatsType)[0] TIF_EXTENSION_STR: Final[str] = "tif" NETCDF_EXTENSION_STR: Final[str] = "nc" +VIRTUAL_EXTENSION_STR: Final[str] = "vrt" GDALFormatExtensions: Final[dict[str, str]] = { GDALGeoTiffFormatStr: TIF_EXTENSION_STR, GDALNetCDFFormatStr: NETCDF_EXTENSION_STR, + GDALVirtualFormatStr: VIRTUAL_EXTENSION_STR, } diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 2efe9164..a22ee647 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -12,8 +12,9 @@ from numpy import ndarray from numpy.typing import NDArray from osgeo.gdal import Dataset as GDALDataset -from osgeo.gdal import GDALWarpAppOptions, Warp, WarpOptions +from osgeo.gdal import GDALWarpAppOptions, Translate, Warp, WarpOptions from pandas import DatetimeIndex, date_range +from tqdm import tqdm from xarray import CFTimeIndex, DataArray, Dataset, cftime_range, open_dataset from xarray.coding.calendar_ops import convert_calendar from xarray.core.types import ( @@ -43,7 +44,13 @@ ConvertCalendarAlignOptions, XArrayEngineType, ) -from .gdal_formats import NETCDF_EXTENSION_STR, GDALFormatsType, GDALGeoTiffFormatStr +from .gdal_formats import ( + NETCDF_EXTENSION_STR, + VIRTUAL_EXTENSION_STR, + GDALFormatsType, + GDALNetCDFFormatStr, + GDALVirtualFormatStr, +) logger = getLogger(__name__) @@ -160,6 +167,7 @@ def cpm_reproject_with_standard_calendar( variable_name: str | None = None, x_dim_name: str = CPM_RAW_X_COLUMN_NAME, y_dim_name: str = CPM_RAW_Y_COLUMN_NAME, + temp_path: PathLike = "temp_cpm_projection", ) -> T_Dataset: """Convert raw `cpm_xr_time_series` to an 365/366 days and 27700 coords. @@ -207,12 +215,59 @@ def cpm_reproject_with_standard_calendar( >>> tasmax_cpm_1980_365_day.dims FrozenMappingWarningOnValuesAccess({'x': 529, 'y': 653, 'time': 365}) """ - cpm_xr_time_series, variable_name = check_xarray_path_and_var_name( - cpm_xr_time_series, variable_name + # _, variable_name = check_xarray_path_and_var_name( + # cpm_xr_time_series, variable_name + # ) + # cpm_xr_time_series, variable_name = check_xarray_path_and_var_name( + # cpm_xr_time_series, variable_name + # ) + # cpm_xr_time_series + # temp_output = Path(temp_path) / ((variable_name or 'var') + '_projected.' + NETCDF_EXTENSION_STR) + # temp_output = Path(temp_path) / ((variable_name or 'var') + '_projected.' + TIF_EXTENSION_STR) + temp_output = Path(temp_path) / ( + (variable_name or "var") + "_projected." + VIRTUAL_EXTENSION_STR + ) + temp_output.parent.mkdir(exist_ok=True, parents=True) + if isinstance(cpm_xr_time_series, Dataset): + xr_time_series_instance: T_Dataset = cpm_xr_time_series + cpm_xr_time_series = temp_output.parent / ( + (variable_name or "var") + "_copy." + NETCDF_EXTENSION_STR + ) + # cpm_xr_time_series = temp_output.parent / ((variable_name or 'var') + '_copy.' + TIF_EXTENSION_STR) + + xr_time_series_instance.to_netcdf(cpm_xr_time_series) + # xr_time_series_instance.to_raster(cpm_xr_time_series) + assert isinstance(cpm_xr_time_series, PathLike) + # tmp_output = Path(temp_cpm_projection) / ((variable_name or 'var') + NETCDF_EXTENSION_STR) + # tmp_output.parent.mkdir(exist_ok=True, parents=True) + reprojected_path: Path = gdal_warp_wrapper( + cpm_xr_time_series, + output_path=temp_output, + format=GDALVirtualFormatStr, + # format=GDALNetCDFFormatStr, + # format=GDALGeoTiffFormatStr, + ) + # translated_result_path: Path = + translated_path = Path(temp_path) / ( + (variable_name or "var") + "_translated-prog-bar." + NETCDF_EXTENSION_STR ) + assert False + translated_results: GDALDataset | Path = gdal_translate_wrapper( + input_path=reprojected_path, + output_path=translated_path, + return_path=False, + format=GDALNetCDFFormatStr, + ) + # translated_results = Translate( + # destName=translated_temp_path, + # srcDS=reprojected_path, + # format=GDALNetCDFFormatStr) + # reprojected_cpm_xr_time_series, check_variable_name = check_xarray_path_and_var_name( + # reprojected_path, variable_name + # ) standard_calendar_ts: T_Dataset = cpm_xarray_to_standard_calendar( - cpm_xr_time_series + reprojected_cpm_xr_time_series ) subset_within_ensemble: T_Dataset = Dataset( {variable_name: standard_calendar_ts[variable_name][0]} @@ -815,6 +870,41 @@ def interpolate_xr_ts_nans( return interpolated_ts +DEFAULT_WARP_DICT_OPTIONS: dict[str, str | float] = { + "VARIABLES_AS_BANDS": "YES", + "GDAL_NETCDF_VERIFY_DIMS": "STRICT", +} + + +def _gen_progress_bar() -> tuple[tqdm, Callable[float, ...]]: + progress_bar: tqdm = tqdm(total=100) + + def _tqdm_progress_callback_func(progress: float, *args) -> None: + progress_bar.update(progress * 100 - progress_bar.n) + + return progress_bar, _tqdm_progress_callback_func + + +def gdal_translate_wrapper( + input_path: PathLike, + output_path: PathLike, + return_path: bool = True, + translate_format: GDALFormatsType | str = GDALNetCDFFormatStr, + use_tqdm_progress_bar: bool = True, + **kwargs, +) -> Path | GDALDataset: + if use_tqdm_progress_bar: + progress_bar, progress_callback = _gen_progress_bar() + kwargs["callback"] = progress_callback + translation: GDALDataset = Translate( + destName=output_path, srcDS=input_path, format=translate_format, **kwargs + ) + if use_tqdm_progress_bar: + progress_bar.close() + assert translation is not None + return Path(output_path) if return_path else translation + + def gdal_warp_wrapper( input_path: PathLike, output_path: PathLike, @@ -823,8 +913,10 @@ def gdal_warp_wrapper( output_y_resolution: int | None = None, copy_metadata: bool = True, return_path: bool = True, - format: GDALFormatsType | str | None = GDALGeoTiffFormatStr, + format: GDALFormatsType | str | None = GDALNetCDFFormatStr, multithread: bool = True, + warp_dict_options: dict[str, str | float] | None = DEFAULT_WARP_DICT_OPTIONS, + use_tqdm_progress_bar: bool = True, **kwargs, ) -> Path | GDALDataset: """Execute the `gdalwrap` function within `python`. @@ -846,9 +938,8 @@ def gdal_warp_wrapper( Path with `CPRUK` files to resample. `srcDSOrSrcDSTab` in `Warp`. output_path - Path to save resampled `input_path` file(s) to. If equal to - `input_path` then the `overwrite` parameter is called. - `destNameOrDestDS` in `Warp`. + Path to save resampled `input_path` file(s) to `destNameOrDestDS` + in `Warp`. output_crs Coordinate system to convert `input_path` file(s) to. `dstSRS` in `WarpOptions`. @@ -872,24 +963,42 @@ def gdal_warp_wrapper( Any additional parameters to pass to `WarpOption`. """ Path(output_path).parent.mkdir(parents=True, exist_ok=True) + if use_tqdm_progress_bar: + progress_bar = tqdm(total=100) + + def _tqdm_progress_callback_func(progress: float, *args) -> None: + progress_bar.update(progress * 100 - progress_bar.n) + try: assert not Path(output_path).is_dir() except AssertionError: raise FileExistsError(f"Path exists as a directory: {output_path}") - if input_path == output_path: - kwargs["overwrite"] = True - warp_options: GDALWarpAppOptions = WarpOptions( + # if input_path == output_path: + # kwargs["overwrite"] = True + # warp_dict_options: dict[str, Any] = { + # 'VARIABLES_AS_BANDS': 'YES', + # 'GDAL_NETCDF_VERIFY_DIMS': 'STRICT', + # } + # -oo VARIABLES_AS_BANDS=YES -oo GDAL_NETCDF_VERIFY_DIMS=STRICT + warp_config: GDALWarpAppOptions = WarpOptions( dstSRS=output_crs, format=format, xRes=output_x_resolution, yRes=output_y_resolution, copyMetadata=copy_metadata, multithread=multithread, + warpOptions=warp_dict_options, + callback=_tqdm_progress_callback_func if use_tqdm_progress_bar else None, **kwargs, ) + # assert False projection: GDALDataset = Warp( - destNameOrDestDS=output_path, srcDSOrSrcDSTab=input_path, options=warp_options + destNameOrDestDS=output_path, srcDSOrSrcDSTab=input_path, options=warp_config ) + projection.FlushCache() + if use_tqdm_progress_bar: + progress_bar.close() + assert projection is not None return output_path if return_path else projection @@ -929,12 +1038,17 @@ def apply_geo_func( `GDALDataset` (the latter if `gdal_warp_wrapper` is used). **kwargs Other parameters passed to `func` call. + + Returns + ------- + Either a `Path` to generated file or converted `xarray` object. """ if not source_path: raise ValueError( f"Source path must be a folder, currently '{source_path}'. " f"May need to mount drive." ) + # Generate export_path following source_path name export_path: Path = Path(source_path) if new_path_name_func: export_path = new_path_name_func(export_path) @@ -1031,6 +1145,7 @@ def generate_360_to_standard(array_to_expand: T_DataArray) -> T_DataArray: Examples -------- + >>> """ initial_days: int = len(array_to_expand) assert initial_days == 360 @@ -1114,3 +1229,124 @@ def cftime_range_gen(time_data_array: T_DataArray, **kwargs) -> NDArray: # clip_box = transform(project, clip_box) # clipped = grid.rio.clip([clip_box]) # return clipped + + +# @dataclass +# class IntermediateCPMFilesManager: +# +# """Manage intermediate files and paths for CPM calendar projection. +# Parameters +# ---------- +# variable_name +# Name of variable (e.g. `tasmax`). Included in file names. +# output_path +# Folder to save results to. +# subfolder_path +# Path to place intermediate files relative to output_path. +# time_series_start +# Start of time series covered to include in file name. +# time_series_end +# End of time series covered to include in file name. +# file_name_prefix +# str to add at the start of the output file names (after integers). +# subfolder_time_stamp +# Whether to include a time stamp in the subfolder file name. +# Examples +# -------- +# >>> test_path = getfixture('tmp_path') +# >>> intermedate_files_manager: IntermediateCPMFilesManager = IntermediateCPMFilesManager( +# ... file_name_prefix="test-1980", +# ... variable_name="tasmax", +# ... output_path=test_path / 'intermediate_test_folder', +# ... subfolder_path='test_subfolder', +# ... time_series_start=date(1980, 12, 1), +# ... time_series_end=date(1981, 11, 30), +# ... ) +# >>> str(intermedate_files_manager.output_path) +# '.../intermediate_test_folder' +# >>> str(intermedate_files_manager.intermediate_files_folder) +# '.../test_subfolder' +# >>> str(intermedate_files_manager.final_nc_path) +# '.../test_subfolder/3-test-1980-tasmax-19801201-19811130-cpm-365-or-366-27700-final.nc' +# """ +# +# variable_name: str +# output_path: Path | None +# time_series_start: datetime | date | Datetime360Day | DatetimeGregorian +# time_series_end: datetime | date | Datetime360Day | DatetimeGregorian +# subfolder_path: Path # = CPM_LOCAL_INTERMEDIATE_PATH +# file_name_prefix: str = "" +# subfolder_time_stamp: bool = False +# +# def __post_init__(self) -> None: +# """Ensure `output_path`, `time_series_start/end` are set correctly.""" +# self.output_path = Path(self.output_path) if self.output_path else Path() +# if self.output_path.suffix[1:] in GDALFormatExtensions.values(): +# logger.info( +# f"Output path is: '{str(self.output_path)}'\n" +# "Putting intermediate files in parent directory." +# ) +# self._passed_output_path = self.output_path +# self.output_path = self.output_path.parent +# if isinstance(self.time_series_start, Datetime360Day): +# self.time_series_start = cftime360_to_date(self.time_series_start) +# if isinstance(self.time_series_end, Datetime360Day): +# self.time_series_end = cftime360_to_date(self.time_series_end) +# +# def __repr__(self): +# """Summary of config.""" +# return ( +# f"" +# ) +# +# @property +# def date_range_to_str(self) -> str: +# return date_range_to_str(self.time_series_start, self.time_series_end) +# +# @property +# def prefix_var_name_and_date(self) -> str: +# prefix: str = f"{self.variable_name}-{self.date_range_to_str}-" +# if self.file_name_prefix: +# return f"{self.file_name_prefix}-{prefix}" +# else: +# return prefix +# +# @property +# def subfolder(self) -> Path: +# if self.subfolder_time_stamp: +# return Path(Path(self.subfolder_path).name + f"-{time_str()}") +# else: +# return self.subfolder_path +# +# @property +# def intermediate_files_folder(self) -> Path: +# assert self.output_path +# path: Path = self.output_path / self.subfolder +# path.mkdir(exist_ok=True, parents=True) +# assert path.is_dir() +# return path +# +# @property +# def intermediate_nc_path(self) -> Path: +# return self.intermediate_files_folder / ( +# "0-" + self.prefix_var_name_and_date + CPM_365_OR_366_INTERMEDIATE_NC +# ) +# +# @property +# def simplified_nc_path(self) -> Path: +# return self.intermediate_files_folder / ( +# "1-" + self.prefix_var_name_and_date + CPM_365_OR_366_SIMPLIFIED_NC +# ) +# +# @property +# def intermediate_warp_path(self) -> Path: +# return self.intermediate_files_folder / ( +# "2-" + self.prefix_var_name_and_date + CPM_365_OR_366_27700_TIF +# ) +# +# @property +# def final_nc_path(self) -> Path: +# return self.intermediate_files_folder / ( +# "3-" + self.prefix_var_name_and_date + CPM_365_OR_366_27700_FINAL +# ) diff --git a/python/conftest.py b/python/conftest.py index 00c10c7d..f089ca06 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -285,7 +285,7 @@ def pytest_addoption(parser): "--use-async", action=BooleanOptionalAction, default=False, - help="Use asyc if --sync-all is used", + help="If --sync-all, use async calls", ) parser.addoption( "--keep-results", diff --git a/python/pdm.lock b/python/pdm.lock index 526be200..acbeda83 100644 --- a/python/pdm.lock +++ b/python/pdm.lock @@ -4,8 +4,8 @@ [metadata] groups = ["default", "dev"] strategy = ["cross_platform", "inherit_metadata"] -lock_version = "4.4.1" -content_hash = "sha256:edcd2288b6d61726de0d0f6c5a47e2e1317d77f386d29e1aa368a581246f43c0" +lock_version = "4.4.2" +content_hash = "sha256:b8b4cf2772bc66023bff5b3336356d406e83f0b6d33f59230169415f168caa70" [[package]] name = "affine" diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index b78c969a..31b46c06 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -34,6 +34,7 @@ results_path, ) from clim_recal.utils.data import HadUKGrid, UKCPLocalProjections +from clim_recal.utils.gdal_formats import NETCDF_EXTENSION_STR from clim_recal.utils.xarray import ( FINAL_RESAMPLE_LAT_COL, FINAL_RESAMPLE_LON_COL, @@ -447,18 +448,33 @@ def test_cpm_xarray_to_standard_calendar( @pytest.mark.mount @pytest.mark.slow def test_cpm_reproject_with_standard_calendar( - tasmax_cpm_1980_raw: T_Dataset, + tasmax_cpm_1980_raw_path: Path, test_runs_output_path: Path, variable_name: str = "tasmax", ) -> None: """Test all steps around calendar and warping CPM RAW data.""" + # output_path: Path = results_path( + # "test-cpm-warp", path=test_runs_output_path, mkdir=True, extension=TIF_EXTENSION_STR + # ) output_path: Path = results_path( - "test-cpm-warp", path=test_runs_output_path, mkdir=True, extension="nc" + "test-cpm-warp", + path=test_runs_output_path, + mkdir=True, + extension=NETCDF_EXTENSION_STR, ) plot_path: Path = output_path.parent / (output_path.stem + ".png") + # coords_reprojected: Path = gdal_warp_wrapper( + # input_path=tasmax_cpm_1980_raw_path, + # output_path=output_path, + # format=GDALGeoTiffFormatStr) + # coords_reprojected: Path = gdal_warp_wrapper( + # input_path=tasmax_cpm_1980_raw_path, + # output_path=output_path, + # format=GDALNetCDFFormatStr) projected: T_Dataset = cpm_reproject_with_standard_calendar( - tasmax_cpm_1980_raw, + tasmax_cpm_1980_raw_path, ) + assert False assert projected.rio.crs == BRITISH_NATIONAL_GRID_EPSG projected.to_netcdf(output_path) results: T_Dataset = open_dataset(output_path, decode_coords="all") From 2d1aed6f45c4c336e5f0018d468523e7983c9603 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 16 Jul 2024 15:48:22 +0100 Subject: [PATCH 35/92] feat: add `GDAL_CACHEMAX: 20%` for CPM `gdal_translation` --- python/clim_recal/utils/xarray.py | 69 ++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index a22ee647..5b1aa94f 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -240,6 +240,7 @@ def cpm_reproject_with_standard_calendar( assert isinstance(cpm_xr_time_series, PathLike) # tmp_output = Path(temp_cpm_projection) / ((variable_name or 'var') + NETCDF_EXTENSION_STR) # tmp_output.parent.mkdir(exist_ok=True, parents=True) + # assert False reprojected_path: Path = gdal_warp_wrapper( cpm_xr_time_series, output_path=temp_output, @@ -247,7 +248,7 @@ def cpm_reproject_with_standard_calendar( # format=GDALNetCDFFormatStr, # format=GDALGeoTiffFormatStr, ) - # translated_result_path: Path = + # assert False translated_path = Path(temp_path) / ( (variable_name or "var") + "_translated-prog-bar." + NETCDF_EXTENSION_STR ) @@ -256,37 +257,44 @@ def cpm_reproject_with_standard_calendar( input_path=reprojected_path, output_path=translated_path, return_path=False, - format=GDALNetCDFFormatStr, ) + # translate_format=GDALNetCDFFormatStr) # translated_results = Translate( # destName=translated_temp_path, # srcDS=reprojected_path, # format=GDALNetCDFFormatStr) - # reprojected_cpm_xr_time_series, check_variable_name = check_xarray_path_and_var_name( - # reprojected_path, variable_name - # ) - - standard_calendar_ts: T_Dataset = cpm_xarray_to_standard_calendar( - reprojected_cpm_xr_time_series - ) - subset_within_ensemble: T_Dataset = Dataset( - {variable_name: standard_calendar_ts[variable_name][0]} + reprojected_cpm_xr_time_series, _ = check_xarray_path_and_var_name( + translated_path, variable_name ) - subset_in_epsg_27700: T_DataArray = xr_reproject_crs( - subset_within_ensemble, - variable_name=variable_name, - x_dim_name=x_dim_name, - y_dim_name=y_dim_name, - resolution=(CPM_RESOLUTION_METERS, CPM_RESOLUTION_METERS), + standard_calendar_ts: T_Dataset = convert_xr_calendar( + reprojected_cpm_xr_time_series, interpolate_na=True ) - try: - assert (subset_in_epsg_27700.time == standard_calendar_ts.time).all() - except: - raise ValueError( - f"Time series of 'standard_calendar_ts' does not match time series of projection to {BRITISH_NATIONAL_GRID_EPSG}." - ) - return subset_in_epsg_27700 + return standard_calendar_ts + # subset_within_ensemble: T_Dataset = Dataset( + # {variable_name: standard_calendar_ts[variable_name][0]} + # ) + + # subset_in_epsg_27700: T_DataArray = xr_reproject_crs( + # subset_within_ensemble, + # variable_name=variable_name, + # x_dim_name=x_dim_name, + # y_dim_name=y_dim_name, + # resolution=(CPM_RESOLUTION_METERS, CPM_RESOLUTION_METERS), + # ) + # try: + # assert (subset_in_epsg_27700.time == standard_calendar_ts.time).all() + # except: + # raise ValueError( + # f"Time series of 'standard_calendar_ts' does not match time series of projection to {BRITISH_NATIONAL_GRID_EPSG}." + # ) + # try: + # assert (subset_in_epsg_27700.time == standard_calendar_ts.time).all() + # except: + # raise ValueError( + # f"Time series of 'standard_calendar_ts' does not match time series of projection to {BRITISH_NATIONAL_GRID_EPSG}." + # ) + # return subset_in_epsg_27700 def xr_reproject_crs( @@ -875,6 +883,10 @@ def interpolate_xr_ts_nans( "GDAL_NETCDF_VERIFY_DIMS": "STRICT", } +DEFAULT_TRANSLATE_DICT_OPTIONS: dict[str, str | float] = { + "GDAL_CACHEMAX": "20%", +} + def _gen_progress_bar() -> tuple[tqdm, Callable[float, ...]]: progress_bar: tqdm = tqdm(total=100) @@ -889,6 +901,8 @@ def gdal_translate_wrapper( input_path: PathLike, output_path: PathLike, return_path: bool = True, + metadat_options_dict: dict[str, str | float] + | None = DEFAULT_TRANSLATE_DICT_OPTIONS, translate_format: GDALFormatsType | str = GDALNetCDFFormatStr, use_tqdm_progress_bar: bool = True, **kwargs, @@ -897,9 +911,14 @@ def gdal_translate_wrapper( progress_bar, progress_callback = _gen_progress_bar() kwargs["callback"] = progress_callback translation: GDALDataset = Translate( - destName=output_path, srcDS=input_path, format=translate_format, **kwargs + destName=output_path, + srcDS=input_path, + format=translate_format, + metadataOptions=metadat_options_dict, + **kwargs, ) if use_tqdm_progress_bar: + translation.FlushCache() progress_bar.close() assert translation is not None return Path(output_path) if return_path else translation From ee1d3e55009ecfa89eb2e5eaf2756897230f05ea Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 16 Jul 2024 18:05:50 +0100 Subject: [PATCH 36/92] fix: use `tif` format as CPM intermediate before `gdal_translate` --- python/clim_recal/utils/xarray.py | 18 +++++------------- python/tests/test_resample.py | 6 +++--- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 5b1aa94f..83add85a 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -46,10 +46,10 @@ ) from .gdal_formats import ( NETCDF_EXTENSION_STR, - VIRTUAL_EXTENSION_STR, + TIF_EXTENSION_STR, GDALFormatsType, + GDALGeoTiffFormatStr, GDALNetCDFFormatStr, - GDALVirtualFormatStr, ) logger = getLogger(__name__) @@ -225,7 +225,7 @@ def cpm_reproject_with_standard_calendar( # temp_output = Path(temp_path) / ((variable_name or 'var') + '_projected.' + NETCDF_EXTENSION_STR) # temp_output = Path(temp_path) / ((variable_name or 'var') + '_projected.' + TIF_EXTENSION_STR) temp_output = Path(temp_path) / ( - (variable_name or "var") + "_projected." + VIRTUAL_EXTENSION_STR + (variable_name or "var") + "_projected." + TIF_EXTENSION_STR ) temp_output.parent.mkdir(exist_ok=True, parents=True) if isinstance(cpm_xr_time_series, Dataset): @@ -244,15 +244,14 @@ def cpm_reproject_with_standard_calendar( reprojected_path: Path = gdal_warp_wrapper( cpm_xr_time_series, output_path=temp_output, - format=GDALVirtualFormatStr, + # format=GDALVirtualFormatStr, # format=GDALNetCDFFormatStr, - # format=GDALGeoTiffFormatStr, + format=GDALGeoTiffFormatStr, ) # assert False translated_path = Path(temp_path) / ( (variable_name or "var") + "_translated-prog-bar." + NETCDF_EXTENSION_STR ) - assert False translated_results: GDALDataset | Path = gdal_translate_wrapper( input_path=reprojected_path, output_path=translated_path, @@ -883,10 +882,6 @@ def interpolate_xr_ts_nans( "GDAL_NETCDF_VERIFY_DIMS": "STRICT", } -DEFAULT_TRANSLATE_DICT_OPTIONS: dict[str, str | float] = { - "GDAL_CACHEMAX": "20%", -} - def _gen_progress_bar() -> tuple[tqdm, Callable[float, ...]]: progress_bar: tqdm = tqdm(total=100) @@ -901,8 +896,6 @@ def gdal_translate_wrapper( input_path: PathLike, output_path: PathLike, return_path: bool = True, - metadat_options_dict: dict[str, str | float] - | None = DEFAULT_TRANSLATE_DICT_OPTIONS, translate_format: GDALFormatsType | str = GDALNetCDFFormatStr, use_tqdm_progress_bar: bool = True, **kwargs, @@ -914,7 +907,6 @@ def gdal_translate_wrapper( destName=output_path, srcDS=input_path, format=translate_format, - metadataOptions=metadat_options_dict, **kwargs, ) if use_tqdm_progress_bar: diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 31b46c06..bc8c68a8 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -71,8 +71,8 @@ # FINAL_CONVERTED_CPM_WIDTH: Final[int] = 410 # FINAL_CONVERTED_CPM_HEIGHT: Final[int] = 660 -FINAL_CONVERTED_CPM_WIDTH: Final[int] = 529 -FINAL_CONVERTED_CPM_HEIGHT: Final[int] = 653 +FINAL_CONVERTED_CPM_WIDTH: Final[int] = 493 +FINAL_CONVERTED_CPM_HEIGHT: Final[int] = 607 FINAL_CONVERTED_HADS_WIDTH: Final[int] = 410 FINAL_CONVERTED_HADS_HEIGHT: Final[int] = 660 @@ -474,7 +474,6 @@ def test_cpm_reproject_with_standard_calendar( projected: T_Dataset = cpm_reproject_with_standard_calendar( tasmax_cpm_1980_raw_path, ) - assert False assert projected.rio.crs == BRITISH_NATIONAL_GRID_EPSG projected.to_netcdf(output_path) results: T_Dataset = open_dataset(output_path, decode_coords="all") @@ -482,6 +481,7 @@ def test_cpm_reproject_with_standard_calendar( assert results.dims == { FINAL_RESAMPLE_LON_COL: FINAL_CONVERTED_CPM_WIDTH, FINAL_RESAMPLE_LAT_COL: FINAL_CONVERTED_CPM_HEIGHT, + "ensemble_member": 1, "time": 365, } assert results.rio.crs == BRITISH_NATIONAL_GRID_EPSG From 5cb9ee8696544af9ef2dccfd42797f74a6ab956d Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 16 Jul 2024 19:30:29 +0100 Subject: [PATCH 37/92] fix: remove `ensemble_member` index in `cpm_reproject_with_standard_calendar` --- python/clim_recal/utils/xarray.py | 46 +++---------------------------- python/tests/test_resample.py | 34 ++++++++--------------- 2 files changed, 16 insertions(+), 64 deletions(-) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 83add85a..bc6f38e5 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -215,15 +215,6 @@ def cpm_reproject_with_standard_calendar( >>> tasmax_cpm_1980_365_day.dims FrozenMappingWarningOnValuesAccess({'x': 529, 'y': 653, 'time': 365}) """ - # _, variable_name = check_xarray_path_and_var_name( - # cpm_xr_time_series, variable_name - # ) - # cpm_xr_time_series, variable_name = check_xarray_path_and_var_name( - # cpm_xr_time_series, variable_name - # ) - # cpm_xr_time_series - # temp_output = Path(temp_path) / ((variable_name or 'var') + '_projected.' + NETCDF_EXTENSION_STR) - # temp_output = Path(temp_path) / ((variable_name or 'var') + '_projected.' + TIF_EXTENSION_STR) temp_output = Path(temp_path) / ( (variable_name or "var") + "_projected." + TIF_EXTENSION_STR ) @@ -238,9 +229,6 @@ def cpm_reproject_with_standard_calendar( xr_time_series_instance.to_netcdf(cpm_xr_time_series) # xr_time_series_instance.to_raster(cpm_xr_time_series) assert isinstance(cpm_xr_time_series, PathLike) - # tmp_output = Path(temp_cpm_projection) / ((variable_name or 'var') + NETCDF_EXTENSION_STR) - # tmp_output.parent.mkdir(exist_ok=True, parents=True) - # assert False reprojected_path: Path = gdal_warp_wrapper( cpm_xr_time_series, output_path=temp_output, @@ -257,43 +245,17 @@ def cpm_reproject_with_standard_calendar( output_path=translated_path, return_path=False, ) - # translate_format=GDALNetCDFFormatStr) - # translated_results = Translate( - # destName=translated_temp_path, - # srcDS=reprojected_path, - # format=GDALNetCDFFormatStr) reprojected_cpm_xr_time_series, _ = check_xarray_path_and_var_name( translated_path, variable_name ) + reprojected_dropped_ensemble_member = reprojected_cpm_xr_time_series.squeeze( + "ensemble_member" + ).drop("ensemble_member") standard_calendar_ts: T_Dataset = convert_xr_calendar( - reprojected_cpm_xr_time_series, interpolate_na=True + reprojected_dropped_ensemble_member, interpolate_na=True ) return standard_calendar_ts - # subset_within_ensemble: T_Dataset = Dataset( - # {variable_name: standard_calendar_ts[variable_name][0]} - # ) - - # subset_in_epsg_27700: T_DataArray = xr_reproject_crs( - # subset_within_ensemble, - # variable_name=variable_name, - # x_dim_name=x_dim_name, - # y_dim_name=y_dim_name, - # resolution=(CPM_RESOLUTION_METERS, CPM_RESOLUTION_METERS), - # ) - # try: - # assert (subset_in_epsg_27700.time == standard_calendar_ts.time).all() - # except: - # raise ValueError( - # f"Time series of 'standard_calendar_ts' does not match time series of projection to {BRITISH_NATIONAL_GRID_EPSG}." - # ) - # try: - # assert (subset_in_epsg_27700.time == standard_calendar_ts.time).all() - # except: - # raise ValueError( - # f"Time series of 'standard_calendar_ts' does not match time series of projection to {BRITISH_NATIONAL_GRID_EPSG}." - # ) - # return subset_in_epsg_27700 def xr_reproject_crs( diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index bc8c68a8..c9d87554 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -118,18 +118,18 @@ ) -FINAL_CPM_DEC_10_5_X_0_10_Y: Final[NDArray] = np.array( +FINAL_CPM_DEC_10_X_2_Y_200_210: Final[NDArray] = np.array( ( np.nan, np.nan, - np.nan, - np.nan, - np.nan, - np.nan, - 5.131494, - 5.091943, - 5.091943, - 5.057275, + 9.637598, + 9.646631, + 9.636621, + 9.622217, + 9.625147, + 9.640039, + 9.6349125, + 9.509668, ) ) @@ -453,9 +453,6 @@ def test_cpm_reproject_with_standard_calendar( variable_name: str = "tasmax", ) -> None: """Test all steps around calendar and warping CPM RAW data.""" - # output_path: Path = results_path( - # "test-cpm-warp", path=test_runs_output_path, mkdir=True, extension=TIF_EXTENSION_STR - # ) output_path: Path = results_path( "test-cpm-warp", path=test_runs_output_path, @@ -463,14 +460,6 @@ def test_cpm_reproject_with_standard_calendar( extension=NETCDF_EXTENSION_STR, ) plot_path: Path = output_path.parent / (output_path.stem + ".png") - # coords_reprojected: Path = gdal_warp_wrapper( - # input_path=tasmax_cpm_1980_raw_path, - # output_path=output_path, - # format=GDALGeoTiffFormatStr) - # coords_reprojected: Path = gdal_warp_wrapper( - # input_path=tasmax_cpm_1980_raw_path, - # output_path=output_path, - # format=GDALNetCDFFormatStr) projected: T_Dataset = cpm_reproject_with_standard_calendar( tasmax_cpm_1980_raw_path, ) @@ -481,12 +470,13 @@ def test_cpm_reproject_with_standard_calendar( assert results.dims == { FINAL_RESAMPLE_LON_COL: FINAL_CONVERTED_CPM_WIDTH, FINAL_RESAMPLE_LAT_COL: FINAL_CONVERTED_CPM_HEIGHT, - "ensemble_member": 1, "time": 365, } assert results.rio.crs == BRITISH_NATIONAL_GRID_EPSG assert len(results.data_vars) == 1 - assert_allclose(results[variable_name][10][5][:10], FINAL_CPM_DEC_10_5_X_0_10_Y) + assert_allclose( + results[variable_name][10][2][200:210], FINAL_CPM_DEC_10_X_2_Y_200_210 + ) plot_xarray(results.tasmax[0], plot_path, time_stamp=True) From 1bd2272803a871a1a8dddbd5a5388f926f9202e9 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 16 Jul 2024 22:09:08 +0100 Subject: [PATCH 38/92] feat: refactor `cpm_xarray_to_standard_calendar` via `NamedTemporaryFile` --- python/clim_recal/utils/xarray.py | 220 ++++++------------------------ 1 file changed, 42 insertions(+), 178 deletions(-) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index bc6f38e5..92ceafb3 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -2,6 +2,7 @@ from logging import getLogger from os import PathLike from pathlib import Path +from tempfile import NamedTemporaryFile, _TemporaryFileWrapper from typing import Any, Callable, Final import numpy as np @@ -79,6 +80,12 @@ FINAL_RESAMPLE_LAT_COL: Final[str] = "y" +DEFAULT_WARP_DICT_OPTIONS: dict[str, str | float] = { + "VARIABLES_AS_BANDS": "YES", + "GDAL_NETCDF_VERIFY_DIMS": "STRICT", +} + + def cpm_xarray_to_standard_calendar( cpm_xr_time_series: T_Dataset | PathLike, include_bnds_index: bool = False ) -> T_Dataset: @@ -165,9 +172,7 @@ def check_xarray_path_and_var_name( def cpm_reproject_with_standard_calendar( cpm_xr_time_series: T_Dataset | PathLike, variable_name: str | None = None, - x_dim_name: str = CPM_RAW_X_COLUMN_NAME, - y_dim_name: str = CPM_RAW_Y_COLUMN_NAME, - temp_path: PathLike = "temp_cpm_projection", + close_temp_paths: bool = True, ) -> T_Dataset: """Convert raw `cpm_xr_time_series` to an 365/366 days and 27700 coords. @@ -197,15 +202,24 @@ def cpm_reproject_with_standard_calendar( ... cpm_xr_time_series=tasmax_cpm_1980_raw, ... variable_name="tasmax") >>> tasmax_cpm_1980_365_day - Size: 504MB - Dimensions: (x: 529, y: 653, time: 365) + ... + Dimensions: (time: 365, x: 493, y: 607) Coordinates: - * x (x) float64 4kB -3.129e+05 -3.107e+05 ... 8.465e+05 8.487e+05 - * y (y) float64 5kB 1.197e+06 1.195e+06 ... -2.353e+05 -2.375e+05 - * time (time) datetime64[ns] 3kB 1980-12-01T12:00:00 ... 1981-11-30... - spatial_ref int64 8B 0 + * time (time) datetime64[ns] 1980-12-01T12:00:00 ... 1981-1... + * x (x) float64 -3.136e+05 -3.112e+05 ... 8.513e+05 + * y (y) float64 -2.371e+05 -2.348e+05 ... 1.198e+06 + transverse_mercator |S1 ... + spatial_ref int64 0 Data variables: - tasmax (time, y, x) float32 504MB 3.403e+38 3.403e+38 ... 3.403e+38 + tasmax (time, y, x) float32 nan nan nan nan ... nan nan nan + Attributes: (12/18) + GDAL_AREA_OR_POINT: Area + collection: land-cpm + contact: ukcpproject@metoffice.gov.uk + Conventions: CF-1.7 + creation_date: 2021-05-11T14:06:30 + domain: uk + ... ... >>> tasmax_cpm_1980_raw.dims FrozenMappingWarningOnValuesAccess({'ensemble_member': 1, 'time': 360, @@ -213,40 +227,31 @@ def cpm_reproject_with_standard_calendar( 'grid_longitude': 484, 'bnds': 2}) >>> tasmax_cpm_1980_365_day.dims - FrozenMappingWarningOnValuesAccess({'x': 529, 'y': 653, 'time': 365}) + FrozenMappingWarningOnValuesAccess({'time': 365, 'x': 493, 'y': 607}) """ - temp_output = Path(temp_path) / ( - (variable_name or "var") + "_projected." + TIF_EXTENSION_STR + temp_cpm: _TemporaryFileWrapper = NamedTemporaryFile( + suffix="." + NETCDF_EXTENSION_STR + ) + temp_tif: _TemporaryFileWrapper = NamedTemporaryFile(suffix="." + TIF_EXTENSION_STR) + temp_translated_ncf: _TemporaryFileWrapper = NamedTemporaryFile( + suffix="." + NETCDF_EXTENSION_STR ) - temp_output.parent.mkdir(exist_ok=True, parents=True) if isinstance(cpm_xr_time_series, Dataset): xr_time_series_instance: T_Dataset = cpm_xr_time_series - cpm_xr_time_series = temp_output.parent / ( - (variable_name or "var") + "_copy." + NETCDF_EXTENSION_STR - ) - # cpm_xr_time_series = temp_output.parent / ((variable_name or 'var') + '_copy.' + TIF_EXTENSION_STR) - + cpm_xr_time_series = temp_cpm.name xr_time_series_instance.to_netcdf(cpm_xr_time_series) - # xr_time_series_instance.to_raster(cpm_xr_time_series) assert isinstance(cpm_xr_time_series, PathLike) - reprojected_path: Path = gdal_warp_wrapper( + gdal_warp_wrapper( cpm_xr_time_series, - output_path=temp_output, - # format=GDALVirtualFormatStr, - # format=GDALNetCDFFormatStr, + output_path=Path(temp_tif.name), format=GDALGeoTiffFormatStr, ) - # assert False - translated_path = Path(temp_path) / ( - (variable_name or "var") + "_translated-prog-bar." + NETCDF_EXTENSION_STR - ) - translated_results: GDALDataset | Path = gdal_translate_wrapper( - input_path=reprojected_path, - output_path=translated_path, - return_path=False, + gdal_translate_wrapper( + input_path=Path(temp_tif.name), + output_path=Path(temp_translated_ncf.name), ) reprojected_cpm_xr_time_series, _ = check_xarray_path_and_var_name( - translated_path, variable_name + Path(temp_translated_ncf.name), variable_name ) reprojected_dropped_ensemble_member = reprojected_cpm_xr_time_series.squeeze( "ensemble_member" @@ -255,6 +260,10 @@ def cpm_reproject_with_standard_calendar( standard_calendar_ts: T_Dataset = convert_xr_calendar( reprojected_dropped_ensemble_member, interpolate_na=True ) + if close_temp_paths: + temp_cpm.close() + temp_tif.close() + temp_translated_ncf.close() return standard_calendar_ts @@ -839,12 +848,6 @@ def interpolate_xr_ts_nans( return interpolated_ts -DEFAULT_WARP_DICT_OPTIONS: dict[str, str | float] = { - "VARIABLES_AS_BANDS": "YES", - "GDAL_NETCDF_VERIFY_DIMS": "STRICT", -} - - def _gen_progress_bar() -> tuple[tqdm, Callable[float, ...]]: progress_bar: tqdm = tqdm(total=100) @@ -946,13 +949,6 @@ def _tqdm_progress_callback_func(progress: float, *args) -> None: assert not Path(output_path).is_dir() except AssertionError: raise FileExistsError(f"Path exists as a directory: {output_path}") - # if input_path == output_path: - # kwargs["overwrite"] = True - # warp_dict_options: dict[str, Any] = { - # 'VARIABLES_AS_BANDS': 'YES', - # 'GDAL_NETCDF_VERIFY_DIMS': 'STRICT', - # } - # -oo VARIABLES_AS_BANDS=YES -oo GDAL_NETCDF_VERIFY_DIMS=STRICT warp_config: GDALWarpAppOptions = WarpOptions( dstSRS=output_crs, format=format, @@ -964,7 +960,6 @@ def _tqdm_progress_callback_func(progress: float, *args) -> None: callback=_tqdm_progress_callback_func if use_tqdm_progress_bar else None, **kwargs, ) - # assert False projection: GDALDataset = Warp( destNameOrDestDS=output_path, srcDSOrSrcDSTab=input_path, options=warp_config ) @@ -1192,134 +1187,3 @@ def cftime_range_gen(time_data_array: T_DataArray, **kwargs) -> NDArray: ) time_bnds_fix_range_end: CFTimeIndex = time_bnds_fix_range_start + timedelta(days=1) return np.array((time_bnds_fix_range_start, time_bnds_fix_range_end)).T - - -# def tansform_lat_lng_bounding_box(bbox: tuple[float, float] | BoundsTupleType): -# # clip_box = box(*bbox) -# wgs84 = pyproj.CRS('EPSG:4326') -# brit_grid = pyproj.CRS('EPSG:27700') -# project = pyproj.Transformer.from_crs(wgs84, brit_grid, always_xy=True).transform -# clip_box = transform(project, clip_box) -# clipped = grid.rio.clip([clip_box]) -# return clipped - - -# @dataclass -# class IntermediateCPMFilesManager: -# -# """Manage intermediate files and paths for CPM calendar projection. -# Parameters -# ---------- -# variable_name -# Name of variable (e.g. `tasmax`). Included in file names. -# output_path -# Folder to save results to. -# subfolder_path -# Path to place intermediate files relative to output_path. -# time_series_start -# Start of time series covered to include in file name. -# time_series_end -# End of time series covered to include in file name. -# file_name_prefix -# str to add at the start of the output file names (after integers). -# subfolder_time_stamp -# Whether to include a time stamp in the subfolder file name. -# Examples -# -------- -# >>> test_path = getfixture('tmp_path') -# >>> intermedate_files_manager: IntermediateCPMFilesManager = IntermediateCPMFilesManager( -# ... file_name_prefix="test-1980", -# ... variable_name="tasmax", -# ... output_path=test_path / 'intermediate_test_folder', -# ... subfolder_path='test_subfolder', -# ... time_series_start=date(1980, 12, 1), -# ... time_series_end=date(1981, 11, 30), -# ... ) -# >>> str(intermedate_files_manager.output_path) -# '.../intermediate_test_folder' -# >>> str(intermedate_files_manager.intermediate_files_folder) -# '.../test_subfolder' -# >>> str(intermedate_files_manager.final_nc_path) -# '.../test_subfolder/3-test-1980-tasmax-19801201-19811130-cpm-365-or-366-27700-final.nc' -# """ -# -# variable_name: str -# output_path: Path | None -# time_series_start: datetime | date | Datetime360Day | DatetimeGregorian -# time_series_end: datetime | date | Datetime360Day | DatetimeGregorian -# subfolder_path: Path # = CPM_LOCAL_INTERMEDIATE_PATH -# file_name_prefix: str = "" -# subfolder_time_stamp: bool = False -# -# def __post_init__(self) -> None: -# """Ensure `output_path`, `time_series_start/end` are set correctly.""" -# self.output_path = Path(self.output_path) if self.output_path else Path() -# if self.output_path.suffix[1:] in GDALFormatExtensions.values(): -# logger.info( -# f"Output path is: '{str(self.output_path)}'\n" -# "Putting intermediate files in parent directory." -# ) -# self._passed_output_path = self.output_path -# self.output_path = self.output_path.parent -# if isinstance(self.time_series_start, Datetime360Day): -# self.time_series_start = cftime360_to_date(self.time_series_start) -# if isinstance(self.time_series_end, Datetime360Day): -# self.time_series_end = cftime360_to_date(self.time_series_end) -# -# def __repr__(self): -# """Summary of config.""" -# return ( -# f"" -# ) -# -# @property -# def date_range_to_str(self) -> str: -# return date_range_to_str(self.time_series_start, self.time_series_end) -# -# @property -# def prefix_var_name_and_date(self) -> str: -# prefix: str = f"{self.variable_name}-{self.date_range_to_str}-" -# if self.file_name_prefix: -# return f"{self.file_name_prefix}-{prefix}" -# else: -# return prefix -# -# @property -# def subfolder(self) -> Path: -# if self.subfolder_time_stamp: -# return Path(Path(self.subfolder_path).name + f"-{time_str()}") -# else: -# return self.subfolder_path -# -# @property -# def intermediate_files_folder(self) -> Path: -# assert self.output_path -# path: Path = self.output_path / self.subfolder -# path.mkdir(exist_ok=True, parents=True) -# assert path.is_dir() -# return path -# -# @property -# def intermediate_nc_path(self) -> Path: -# return self.intermediate_files_folder / ( -# "0-" + self.prefix_var_name_and_date + CPM_365_OR_366_INTERMEDIATE_NC -# ) -# -# @property -# def simplified_nc_path(self) -> Path: -# return self.intermediate_files_folder / ( -# "1-" + self.prefix_var_name_and_date + CPM_365_OR_366_SIMPLIFIED_NC -# ) -# -# @property -# def intermediate_warp_path(self) -> Path: -# return self.intermediate_files_folder / ( -# "2-" + self.prefix_var_name_and_date + CPM_365_OR_366_27700_TIF -# ) -# -# @property -# def final_nc_path(self) -> Path: -# return self.intermediate_files_folder / ( -# "3-" + self.prefix_var_name_and_date + CPM_365_OR_366_27700_FINAL -# ) From d71f89768694369a61f7fde7c9af8ce9f8e50fb5 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Wed, 17 Jul 2024 15:29:07 +0100 Subject: [PATCH 39/92] feat: add `resampling_method` to `VariableOptions` --- python/clim_recal/utils/data.py | 36 +++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/python/clim_recal/utils/data.py b/python/clim_recal/utils/data.py index 78081b01..cb2fa241 100644 --- a/python/clim_recal/utils/data.py +++ b/python/clim_recal/utils/data.py @@ -2,9 +2,10 @@ from typing import Collection, Union, Callable, Any, Literal, Final, Iterable from os import PathLike from datetime import date -from enum import auto +from enum import auto, IntEnum from pathlib import Path +from rasterio.enums import Resampling from xarray.backends.api import ENGINES from .core import StrEnumReprName @@ -127,12 +128,43 @@ def rioxarry_epsg(self) -> str: ) class VariableOptions(StrEnumReprName): - """Supported options for variables""" + """Supported variables options and related configuration.""" TASMAX = auto() RAINFALL = auto() TASMIN = auto() + @classmethod + def _method_dict(cls) -> dict[str, IntEnum]: + """Return the preferred aggregation method for each option.""" + return { + cls.TASMAX: Resampling.max, + cls.RAINFALL: Resampling.max, + cls.TASMIN: Resampling.min, + } + + @classmethod + def resampling_method(cls, variable: str) -> IntEnum: + """Return resampling method for `variable`. + + Parameters + ---------- + variable + `VariableOptions` attribute to query resampling method from. + + Returns + ------- + Value to access related resampling method. + + Examples + -------- + >>> VariableOptions.resampling_method('rainfall') + + >>> VariableOptions.resampling_method('tasmin') + + """ + return cls._method_dict()[variable.lower()] + @classmethod def cpm_value(cls, variable: str) -> str: """Return `CPM` value equivalent of `variable`. From a1838291592ed88ba3f07ad9282745c84ac8f128 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Fri, 19 Jul 2024 14:10:40 +0100 Subject: [PATCH 40/92] feat: add `_ensumre_resample_method_name` and allow `None` to bypass reprojection --- python/clim_recal/utils/data.py | 22 +++++++++++++---- python/clim_recal/utils/xarray.py | 41 +++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/python/clim_recal/utils/data.py b/python/clim_recal/utils/data.py index cb2fa241..814cec12 100644 --- a/python/clim_recal/utils/data.py +++ b/python/clim_recal/utils/data.py @@ -2,7 +2,7 @@ from typing import Collection, Union, Callable, Any, Literal, Final, Iterable from os import PathLike from datetime import date -from enum import auto, IntEnum +from enum import auto from pathlib import Path from rasterio.enums import Resampling @@ -14,6 +14,8 @@ BRITISH_NATION_GRID_COORDS_NUMBER: Final[int] = 27700 BRITISH_NATIONAL_GRID_EPSG: Final[str] = f"EPSG:{BRITISH_NATION_GRID_COORDS_NUMBER}" +DEFAULT_RESAMPLING_METHOD: Final[Resampling] = Resampling.bilinear + AuthorshipType = Union[ str | tuple[str, ...], dict[str, str] | dict[str, dict[str, str]] | dict[str, Collection[str]] @@ -135,17 +137,25 @@ class VariableOptions(StrEnumReprName): TASMIN = auto() @classmethod - def _method_dict(cls) -> dict[str, IntEnum]: + def default_resample_method(cls) -> Resampling: + """Default resampling method.""" + return DEFAULT_RESAMPLING_METHOD + + + @classmethod + def _method_dict(cls) -> dict[str, Resampling]: """Return the preferred aggregation method for each option.""" return { - cls.TASMAX: Resampling.max, + cls.TASMAX: Resampling.near, cls.RAINFALL: Resampling.max, cls.TASMIN: Resampling.min, } @classmethod - def resampling_method(cls, variable: str) -> IntEnum: + def resampling_method(cls, variable: str | None) -> Resampling: """Return resampling method for `variable`. + + For details see: https://rasterio.readthedocs.io/en/stable/api/rasterio.enums.html#rasterio.enums.Resampling Parameters ---------- @@ -162,8 +172,10 @@ def resampling_method(cls, variable: str) -> IntEnum: >>> VariableOptions.resampling_method('tasmin') + >>> VariableOptions.resampling_method(None) + """ - return cls._method_dict()[variable.lower()] + return cls._method_dict()[variable.lower()] if variable else cls.default_resample_method() @classmethod def cpm_value(cls, variable: str) -> str: diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 92ceafb3..fc7c9c11 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -15,6 +15,7 @@ from osgeo.gdal import Dataset as GDALDataset from osgeo.gdal import GDALWarpAppOptions, Translate, Warp, WarpOptions from pandas import DatetimeIndex, date_range +from rasterio.enums import Resampling from tqdm import tqdm from xarray import CFTimeIndex, DataArray, Dataset, cftime_range, open_dataset from xarray.coding.calendar_ops import convert_calendar @@ -37,12 +38,14 @@ DEFAULT_CALENDAR_ALIGN, DEFAULT_INTERPOLATION_METHOD, DEFAULT_RELATIVE_GRID_DATA_PATH, + DEFAULT_RESAMPLING_METHOD, GLASGOW_GEOM_LOCAL_PATH, NETCDF4_XARRAY_ENGINE, TIME_COLUMN_NAME, BoundingBoxCoords, CFCalendarSTANDARD, ConvertCalendarAlignOptions, + VariableOptions, XArrayEngineType, ) from .gdal_formats import ( @@ -245,10 +248,14 @@ def cpm_reproject_with_standard_calendar( cpm_xr_time_series, output_path=Path(temp_tif.name), format=GDALGeoTiffFormatStr, + # Leaving this if further projection is needed + # resampling_method=VariableOptions.resampling_method(variable=variable_name).name, ) gdal_translate_wrapper( input_path=Path(temp_tif.name), output_path=Path(temp_translated_ncf.name), + # Leaving this if further projection is needed + # resampling_method=VariableOptions.resampling_method(variable=variable_name).name, ) reprojected_cpm_xr_time_series, _ = check_xarray_path_and_var_name( Path(temp_translated_ncf.name), variable_name @@ -277,6 +284,7 @@ def xr_reproject_crs( match_xr_time_series: T_Dataset | PathLike | None = None, match_xr_time_series_load_func: Callable | None = None, match_xr_time_series_load_kwargs: dict[str, Any] | None = None, + resampling_method: Resampling = DEFAULT_RESAMPLING_METHOD, **kwargs, ) -> T_Dataset: """Reproject `source_xr` to `target_xr` coordinate structure. @@ -296,6 +304,8 @@ def xr_reproject_crs( Inferred if `None` assuming only one `data_var` attribute. final_crs Coordinate system `str` to project `xr_time_series` to. + resampling_method + `rasterio` resampling method to apply. Examples -------- @@ -369,15 +379,37 @@ def xr_reproject_crs( else: raise ValueError("Can't match dim names.") without_attributes_reprojected = without_attributes.rio.reproject_match( - match_xr_time_series, **kwargs + match_xr_time_series, resampling=resampling_method.name, **kwargs ) else: without_attributes_reprojected: T_DataArray = without_attributes.rio.reproject( - final_crs, **kwargs + final_crs, resampling=resampling_method.name, **kwargs ) return Dataset({variable_name: without_attributes_reprojected}) +def _ensure_resample_method_name( + method: str | Resampling, allow_none: bool = True +) -> str | None: + """Ensure the correct method name `str` is returned.""" + + def error_message(method: str) -> str: + return f"Method '{method}' not a valid GDAL 'Resampling' method." + + if isinstance(method, str): + try: + assert method in Resampling.__members__ + except KeyError: + raise KeyError(error_message(method)) + return method + elif isinstance(method, Resampling): + return method.name + elif method is None: + return None + else: + raise ValueError(error_message(method)) + + def interpolate_coords( xr_time_series: T_Dataset, variable_name: str, @@ -489,6 +521,7 @@ def hads_resample_and_reproject( y_dim_name=y_dim_name, match_xr_time_series=cpm_to_match, match_xr_time_series_load_func=cpm_to_match_func, + resampling_method=VariableOptions.resampling_method(variable_name) # match_xr_time_series_load_kwargs=dict(variable_name=variable_name), ) return epsg_277000_2_2km @@ -863,6 +896,7 @@ def gdal_translate_wrapper( return_path: bool = True, translate_format: GDALFormatsType | str = GDALNetCDFFormatStr, use_tqdm_progress_bar: bool = True, + resampling_method: Resampling | None = None, **kwargs, ) -> Path | GDALDataset: if use_tqdm_progress_bar: @@ -872,6 +906,7 @@ def gdal_translate_wrapper( destName=output_path, srcDS=input_path, format=translate_format, + resampleAlg=_ensure_resample_method_name(resampling_method), **kwargs, ) if use_tqdm_progress_bar: @@ -893,6 +928,7 @@ def gdal_warp_wrapper( multithread: bool = True, warp_dict_options: dict[str, str | float] | None = DEFAULT_WARP_DICT_OPTIONS, use_tqdm_progress_bar: bool = True, + resampling_method: Resampling | None = None, **kwargs, ) -> Path | GDALDataset: """Execute the `gdalwrap` function within `python`. @@ -957,6 +993,7 @@ def _tqdm_progress_callback_func(progress: float, *args) -> None: copyMetadata=copy_metadata, multithread=multithread, warpOptions=warp_dict_options, + resampleAlg=_ensure_resample_method_name(resampling_method), callback=_tqdm_progress_callback_func if use_tqdm_progress_bar else None, **kwargs, ) From 82b5ff8aa7d607e9f96e8f452a87305fbcd2cb6d Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Fri, 19 Jul 2024 14:17:27 +0100 Subject: [PATCH 41/92] fix: resampling config for `rainfall` and `tasmax` --- python/clim_recal/utils/data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/clim_recal/utils/data.py b/python/clim_recal/utils/data.py index 814cec12..342d674b 100644 --- a/python/clim_recal/utils/data.py +++ b/python/clim_recal/utils/data.py @@ -146,8 +146,8 @@ def default_resample_method(cls) -> Resampling: def _method_dict(cls) -> dict[str, Resampling]: """Return the preferred aggregation method for each option.""" return { - cls.TASMAX: Resampling.near, - cls.RAINFALL: Resampling.max, + cls.TASMAX: Resampling.max, + cls.RAINFALL: Resampling.bilinear, cls.TASMIN: Resampling.min, } From dff84a9284db47099b1c70ab7b43c6b73f3e0c72 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Fri, 19 Jul 2024 15:37:27 +0100 Subject: [PATCH 42/92] fix: `VariableOptions.resampling_method` `doctest` and `conda-lock.yml` --- .conda-linux-64.lock | 280 +-- conda-lock.yml | 3961 ++++++++++++++++--------------- python/clim_recal/utils/data.py | 2 +- 3 files changed, 2212 insertions(+), 2031 deletions(-) diff --git a/.conda-linux-64.lock b/.conda-linux-64.lock index 69111042..8a98e587 100644 --- a/.conda-linux-64.lock +++ b/.conda-linux-64.lock @@ -4,146 +4,131 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://repo.anaconda.com/pkgs/main/linux-64/blas-1.0-openblas.conda#9ddfcaef10d79366c90128f5dc444be8 -https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2024.3.11-h06a4308_0.conda#08529eb3504712baabcbda266a19feb7 +https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2024.7.2-h06a4308_0.conda#5c6799c01e9be4c7ba294f6530b2d562 https://repo.anaconda.com/pkgs/main/noarch/font-ttf-dejavu-sans-mono-2.37-hd3eb1b0_0.conda#95b5078cca69bdf9ac955895b9caf678 https://repo.anaconda.com/pkgs/main/noarch/font-ttf-inconsolata-2.001-hcb22688_0.conda#9e3fa1886c808910ecd9b9be64566410 https://repo.anaconda.com/pkgs/main/noarch/font-ttf-source-code-pro-2.030-hd3eb1b0_0.conda#eb091595cff4c5452f2f409c667aef55 https://repo.anaconda.com/pkgs/main/noarch/font-ttf-ubuntu-0.83-h8b1ccd4_0.conda#a5870ffd24048c1f10af06dd5d0bbe37 https://repo.anaconda.com/pkgs/main/linux-64/ld_impl_linux-64-2.38-h1181459_1.conda#68eedfd9c06f2b0e6888d8db345b7f5b -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 https://repo.anaconda.com/pkgs/main/linux-64/poppler-data-0.4.11-h06a4308_1.conda#fd6d432aa8fcef7896c9fbe683fea831 https://repo.anaconda.com/pkgs/main/noarch/pybind11-abi-5-hd3eb1b0_0.conda#7f0df6639fdf60ccd3045ee6faedd32f https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda#dccc2d142812964fcc6abdc97b672dff https://repo.anaconda.com/pkgs/main/noarch/tzdata-2024a-h04d1e81_0.conda#452af53adae0a5b06eb5d05c707b2f25 https://repo.anaconda.com/pkgs/main/noarch/fonts-anaconda-1-h8fa9717_0.conda#a5efad43de0590ada98f8bcf02ecbfe8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda#abf3fec87c2563697defa759dec3d639 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://repo.anaconda.com/pkgs/main/noarch/fonts-conda-ecosystem-1-hd3eb1b0_0.conda#76790b62a799de73c4364f7cdc445583 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.19-h4ab18f5_0.conda#c6dedd5eab2236f4abb59ade9fb7fd44 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.23-h4ab18f5_0.conda#94d61ae2b2b701008a9d52ce6bbead27 https://repo.anaconda.com/pkgs/main/linux-64/bzip2-1.0.8-h5eee18b_6.conda#f21a3ff51c1b271977f53ce956a69297 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f -https://repo.anaconda.com/pkgs/main/linux-64/expat-2.6.2-h6a678d5_0.conda#55049db2772dae035f6b8a95f72b5970 -https://conda.anaconda.org/conda-forge/linux-64/fmt-10.2.1-h00ab1b0_0.conda#35ef8bc24bd34074ebae3c943d551728 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda#8024af1ee7078e37fa3101c0a0296af2 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff -https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h7ab15ed_0.conda#9961b1f100c3b6852bd97c9233d06979 +https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h1220068_1.conda#f8f0f0c4338bad5c34a4e9e11460481d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://repo.anaconda.com/pkgs/main/linux-64/libabseil-20240116.2-cxx17_h6a678d5_0.conda#7abc574a536f223fe96be4fb7f4207bf -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://repo.anaconda.com/pkgs/main/linux-64/libbrotlicommon-1.0.9-h5eee18b_8.conda#1e9edf233add622312356a40a7d0f8de -https://repo.anaconda.com/pkgs/main/linux-64/libcrc32c-1.1.2-h6a678d5_0.conda#daf778296b4ada0649ecad5e5e320cd0 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://repo.anaconda.com/pkgs/main/linux-64/libev-4.33-h7f8727e_1.conda#5065620db4393fb549f30114a33897d1 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d -https://repo.anaconda.com/pkgs/main/linux-64/libffi-3.4.4-h6a678d5_1.conda#70646cc713f0c43926cfdcfe9b695fe0 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda#c0bd771f09a326fdcd95a60b617795bf +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 +https://repo.anaconda.com/pkgs/main/linux-64/libjpeg-turbo-3.0.3-h5eee18b_0.conda#b02b7690fc803457de68a9829799d874 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://repo.anaconda.com/pkgs/main/linux-64/libsodium-1.0.18-h7b6447c_0.conda#c8783b20f0e14bc1d701352c26c264d5 -https://repo.anaconda.com/pkgs/main/linux-64/libspatialindex-1.9.3-h2531618_0.conda#2944eeda0125389c979af67e4460a510 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda#1cb187a157136398ddbaae90713e2498 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 -https://repo.anaconda.com/pkgs/main/linux-64/libxcb-1.15-h7f8727e_0.conda#ada518dcadd6aaee9aae47ba9a671553 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 -https://repo.anaconda.com/pkgs/main/linux-64/lz4-c-1.9.4-h6a678d5_1.conda#2ee58861f2b92b868ce761abb831819d +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://repo.anaconda.com/pkgs/main/linux-64/lzo-2.10-h7b6447c_2.conda#65722a7644f424de73fea6e87edd7653 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://repo.anaconda.com/pkgs/main/linux-64/nspr-4.35-h6a678d5_0.conda#208fff5d60133bcff6998a70c9f5203b -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda#12ea6d0d4ed54530eaed18e4835c1f7c -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda#e1b454497f9f7c1147fdde4b53f1b512 +https://repo.anaconda.com/pkgs/main/linux-64/pthread-stubs-0.3-h0ce48e5_1.conda#973a642312d2a28927aaf5b477c67250 https://conda.anaconda.org/conda-forge/linux-64/tzcode-2024a-h3f72095_0.conda#32146e34aaec3745a08b6f49af3f41b0 -https://repo.anaconda.com/pkgs/main/linux-64/uriparser-0.9.7-h5eee18b_0.conda#83ea87ede0dd28a0b32747e80812a0ac https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 https://repo.anaconda.com/pkgs/main/linux-64/xorg-xproto-7.0.31-h27cfd23_1007.conda#287ea0f32c5f1c209e5030ead360b613 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://repo.anaconda.com/pkgs/main/linux-64/xz-5.4.6-h5eee18b_1.conda#1562802f843297ee776a50b9329597ed https://repo.anaconda.com/pkgs/main/linux-64/yaml-0.2.5-h7b6447c_0.conda#39fdbf4db769e494ffb06d95680c83d8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.14-h88a6e22_1.conda#7ed63b0e816dd1635903506ef5d2c079 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-h83b837d_6.conda#3e572eacd0ce99a59e1bb9c260ad5b20 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-h83b837d_2.conda#f40c698b4ea90f7fedd187c6639c818b -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-h83b837d_6.conda#7995cb937bdac5913c8904fed6b3729d +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.1-h87b94db_1.conda#2d76d2cfdcfe2d5c3883d33d8be919e7 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-he027950_7.conda#11e5cb0b426772974f6416545baee0ce +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-he027950_3.conda#adbf0c44ca88a3cded175cd809a106b6 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-he027950_7.conda#95611b325a9728ed68b8f7eef2dd3feb +https://repo.anaconda.com/pkgs/main/linux-64/expat-2.6.2-h6a678d5_0.conda#55049db2772dae035f6b8a95f72b5970 +https://conda.anaconda.org/conda-forge/linux-64/fmt-10.2.1-h00ab1b0_0.conda#35ef8bc24bd34074ebae3c943d551728 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://repo.anaconda.com/pkgs/main/linux-64/libabseil-20240116.2-cxx17_h6a678d5_0.conda#7abc574a536f223fe96be4fb7f4207bf +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://repo.anaconda.com/pkgs/main/linux-64/libbrotlidec-1.0.9-h5eee18b_8.conda#2595e6d66d6b9254e18d63458dc27486 https://repo.anaconda.com/pkgs/main/linux-64/libbrotlienc-1.0.9-h5eee18b_8.conda#d9ee310f619a8dc00178fd2ae1667c88 +https://repo.anaconda.com/pkgs/main/linux-64/libcrc32c-1.1.2-h6a678d5_0.conda#daf778296b4ada0649ecad5e5e320cd0 https://repo.anaconda.com/pkgs/main/linux-64/libedit-3.1.20230828-h5eee18b_0.conda#850eb5a9d2d7d3c66cce12e84406ca08 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd +https://repo.anaconda.com/pkgs/main/linux-64/libffi-3.4.4-h6a678d5_1.conda#70646cc713f0c43926cfdcfe9b695fe0 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 -https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h8917695_15.conda#20c3c14bc491f30daecaa6f73e2223ae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda#5d801a4906adc712d480afc362623b59 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hd590300_0.conda#151cba22b85a989c2d6ef9633ffee1e4 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 +https://repo.anaconda.com/pkgs/main/linux-64/lz4-c-1.9.4-h6a678d5_1.conda#2ee58861f2b92b868ce761abb831819d +https://repo.anaconda.com/pkgs/main/linux-64/nspr-4.35-h6a678d5_0.conda#208fff5d60133bcff6998a70c9f5203b +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-h0f59acf_0.conda#3914f7ac1761dce57102c72ca7c35d01 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/popt-1.16-h0b475e3_2002.tar.bz2#78388f97473c02e5ac8a3742eee4c959 https://repo.anaconda.com/pkgs/main/linux-64/readline-8.2-h5eee18b_0.conda#be42180685cce6e6b0329201d9f48efb -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.15-he19d79f_0.conda#4c7cc3fa1d2c5a63f9e2b1e2980a1672 -https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.13.0-hd2e6256_0.conda#18f9348f064632785d54dbd1db9344bb +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.17-he19d79f_0.conda#e25ac9bf10f8e6aa67727b1cdbe762ef +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://repo.anaconda.com/pkgs/main/linux-64/zeromq-4.3.5-h6a678d5_0.conda#354c934a4a5500f4c455c630f2702dbc -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.8-h21d4f22_5.conda#f9dd6e8a46f55f49eae5380d3b922b71 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.10-h826b7d6_1.conda#6961646dded770513a781de4cd5c1fe1 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 https://repo.anaconda.com/pkgs/main/linux-64/brotli-bin-1.0.9-h5eee18b_8.conda#9820670bfb9cae1e93a2646676bc1b7b -https://repo.anaconda.com/pkgs/main/linux-64/freetype-2.12.1-h4a9f257_0.conda#bdc7b5952e9c5dca01bc2f4ccef2f974 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://repo.anaconda.com/pkgs/main/linux-64/gdbm-1.18-hd4cb3f1_4.conda#1c82981848be10bfc91000a0afcefee3 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda#72724f6a78ecb15559396966226d5838 -https://repo.anaconda.com/pkgs/main/linux-64/libkml-1.3.0-h096b73e_7.conda#23f3c95c535e38ee050f9f4bc8eb6bcc +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h8a4344b_1.conda#6ea440297aacee4893f02ad759e6ffbc +https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hbbc8833_1020.conda#6d76c5822cb38bc1ab5a06565c6cf626 https://repo.anaconda.com/pkgs/main/linux-64/libopenblas-0.3.21-h043d6bf_0.conda#7f7324dcc3c4761a14f3e4ac443235a7 -https://repo.anaconda.com/pkgs/main/linux-64/libprotobuf-4.25.3-he621ea3_0.conda#b5bac9ee75a731feb80bfc8c40d1958f -https://repo.anaconda.com/pkgs/main/linux-64/libssh2-1.11.0-h251f7ec_0.conda#ce46cf257d73fe85c18c78597196f0d8 +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 +https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 +https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h8917695_15.conda#20c3c14bc491f30daecaa6f73e2223ae https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://repo.anaconda.com/pkgs/main/linux-64/minizip-4.0.3-hf59b114_0.conda#e1efccc2d4cfe54c7119600ea6dcdbe7 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda#949c4a82290ee58b3c970cef4bcfd4ad -https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 +https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.102-h593d115_0.conda#40e5e48c55a45621c4399ca9236406b7 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.4-h194c7f8_0_cpython.conda#d73490214f536cccb5819e9873048c92 https://conda.anaconda.org/conda-forge/linux-64/rsync-3.3.0-he6cb5fe_0.conda#27da3fb7abe92e3ef592eda5321a0230 -https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.45.3-h5eee18b_0.conda#acf93d6aceb74d6110e20b44cc45939e -https://repo.anaconda.com/pkgs/main/linux-64/tk-8.6.14-h39e8969_0.conda#78dbc5e3c69143ebc037fc5d5b22e597 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-ha47c788_12.conda#8420d8e495a1468f593128e5fbf6748a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.1-h29d6fba_17.conda#c20a29ff47043ba1ec24f45dc68930bf -https://repo.anaconda.com/pkgs/main/linux-64/brotli-1.0.9-h5eee18b_8.conda#b5d5a0d366e8dc1b21c75b8703aaa96a -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://repo.anaconda.com/pkgs/main/linux-64/freexl-2.0.0-hf309648_0.conda#09960bea3a0c12d03b8288e943e799bb -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.conda#a965aeaf060289528a3fbe09326edae2 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 -https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://repo.anaconda.com/pkgs/main/linux-64/perl-5.34.0-h5eee18b_2.conda#2362442477bfdd0ff1ce8d8cc753e7e8 -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda#2540b74d304f71d3e89c81209db4db84 +https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.13.0-hd2e6256_0.conda#18f9348f064632785d54dbd1db9344bb +https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.31.1-h7b6447c_0.conda#c2cae59a837775a03aed11469994981c +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://repo.anaconda.com/pkgs/main/noarch/affine-2.3.0-pyhd3eb1b0_0.conda#b8d56e39137c75029f2a2b21943dc5c8 https://repo.anaconda.com/pkgs/main/linux-64/annotated-types-0.6.0-py312h06a4308_0.conda#03aa1a636640f8f94febe4779e5d37a7 https://repo.anaconda.com/pkgs/main/noarch/appdirs-1.4.4-pyhd3eb1b0_0.conda#5673d98d06171cb6eed03a6736845c4d https://repo.anaconda.com/pkgs/main/linux-64/async-lru-2.0.4-py312h06a4308_0.conda#2806b5842bb2478e127c99feb82a6a88 https://repo.anaconda.com/pkgs/main/linux-64/attrs-23.1.0-py312h06a4308_0.conda#e8016c6839c63842d4a32bace7359ad8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.22-h96bc93b_2.conda#de2b7c9aa9b279cca5542134b7a2b86a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-h759edc4_4.conda#8ced661d9dcece8698922fd8a73b6511 -https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.11.1-h91d86a7_1.conda#2dbab1d281b7e1da05eee544cbdc8af6 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-h7671281_15.conda#3b45b0da170f515de8be68155e14955a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.2-he17ee6b_6.conda#4e3d1bb2ade85619ac2163e695c2cc1b https://conda.anaconda.org/conda-forge/noarch/beartype-0.18.5-pyhd8ed1ab_0.conda#28786996506a2f2dd7819b5f3705f4e4 https://repo.anaconda.com/pkgs/main/linux-64/blinker-1.6.2-py312h06a4308_0.conda#a308ff4a4e682fe7375bea66fec0f818 +https://repo.anaconda.com/pkgs/main/linux-64/brotli-1.0.9-h5eee18b_8.conda#b5d5a0d366e8dc1b21c75b8703aaa96a https://repo.anaconda.com/pkgs/main/linux-64/brotli-python-1.0.9-py312h6a678d5_8.conda#e6bdf1f9e8e1ad3543aaec7e9ecea7e7 https://repo.anaconda.com/pkgs/main/noarch/cached-property-1.5.2-py_0.conda#32deb173c271fa2d09744446024a6340 https://repo.anaconda.com/pkgs/main/noarch/cachy-0.3.0-pyhd3eb1b0_0.conda#fcb19b85ad100b509f744e339c50871e -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e -https://repo.anaconda.com/pkgs/main/linux-64/certifi-2024.2.2-py312h06a4308_0.conda#eb1a84cfcbb04105e1b2d28733773066 +https://repo.anaconda.com/pkgs/main/linux-64/certifi-2024.7.4-py312h06a4308_0.conda#f37039b8ad015d7c025624c7d9264a4e https://repo.anaconda.com/pkgs/main/linux-64/cfgv-3.4.0-py312h06a4308_0.conda#765ea9eb7e1f5cd3791fcbae54fc6a8f -https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.4.0-hbdc6101_1.conda#0ba5a427a51923dcdfe1121115ac8293 +https://repo.anaconda.com/pkgs/main/linux-64/chardet-4.0.0-py312h06a4308_1003.conda#7dd0b18381d4e95f723afbde9171b3cf https://repo.anaconda.com/pkgs/main/noarch/charset-normalizer-2.0.4-pyhd3eb1b0_0.conda#e7a441d94234b2b5fafee06e25dbf076 https://repo.anaconda.com/pkgs/main/linux-64/click-8.1.7-py312h06a4308_0.conda#a0d97fc547780b4ddefc91139e633e02 https://repo.anaconda.com/pkgs/main/linux-64/colorama-0.4.6-py312h06a4308_0.conda#6175699c700cc4e4bf18ffc86778e488 @@ -159,37 +144,40 @@ https://repo.anaconda.com/pkgs/main/linux-64/et_xmlfile-1.1.0-py312h06a4308_1.co https://repo.anaconda.com/pkgs/main/noarch/execnet-1.9.0-pyhd3eb1b0_0.conda#f895937671af67cebb8af617494b3513 https://repo.anaconda.com/pkgs/main/noarch/executing-0.8.3-pyhd3eb1b0_0.conda#7be61d1c3c555fb37682b28d7a53d622 https://repo.anaconda.com/pkgs/main/linux-64/filelock-3.13.1-py312h06a4308_0.conda#6a0b440821945eda176c2bd78fd64a56 -https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda#d427988dc3dbd0a4c136f52db356cc6a +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d +https://repo.anaconda.com/pkgs/main/linux-64/freexl-2.0.0-hf309648_0.conda#09960bea3a0c12d03b8288e943e799bb +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.3-h73ef956_1.conda#99701cdc9a25a333d15265d1d243b2dc https://repo.anaconda.com/pkgs/main/linux-64/h11-0.14.0-py312h06a4308_0.conda#6e32d4e1d4c9409293e63ecf19755482 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_103.conda#ef50687276c086d59006696e1153fd60 https://repo.anaconda.com/pkgs/main/linux-64/idna-3.7-py312h06a4308_0.conda#03cc59cdabff44c47be0fadffcef003c -https://repo.anaconda.com/pkgs/main/linux-64/importlib_resources-6.1.1-py312h06a4308_1.conda#13691687030e6f6b299bd04173696daf +https://repo.anaconda.com/pkgs/main/linux-64/importlib_resources-6.4.0-py312h06a4308_0.conda#eba0787f42c16ce32c303817d17907a9 https://repo.anaconda.com/pkgs/main/noarch/iniconfig-1.1.1-pyhd3eb1b0_0.tar.bz2#e40edff2c5708f342cef43c7f280c507 https://repo.anaconda.com/pkgs/main/noarch/jeepney-0.7.1-pyhd3eb1b0_0.conda#f115ef0af90b59f35ef56743955979a4 -https://repo.anaconda.com/pkgs/main/linux-64/joblib-1.4.0-py312h06a4308_0.conda#5994475da8e256a8be4b7b5f47bd37a3 +https://repo.anaconda.com/pkgs/main/linux-64/joblib-1.4.2-py312h06a4308_0.conda#c191ecf27647a0faee7bcb0b5f0aed71 https://repo.anaconda.com/pkgs/main/noarch/json5-0.9.6-pyhd3eb1b0_0.conda#4e721ee2dbfa20069719d2ee19185031 https://repo.anaconda.com/pkgs/main/linux-64/kiwisolver-1.4.4-py312h6a678d5_0.conda#47e12eaa774b108e6e17011b1d727650 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.24.0-h2736e30_0.conda#34aeee3fa7fca5dc21fad3ac6f4f0ab2 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e https://repo.anaconda.com/pkgs/main/linux-64/markupsafe-2.1.3-py312h5eee18b_0.conda#b5d2615c33773326f8207f7b58df1e2b https://repo.anaconda.com/pkgs/main/linux-64/mdurl-0.1.0-py312h06a4308_0.conda#6bea6d09fe58ac995a64ab45e75cb5e9 https://repo.anaconda.com/pkgs/main/linux-64/mistune-2.0.4-py312h06a4308_0.conda#ebad83b0f2acc0defac5485ea5e71994 https://repo.anaconda.com/pkgs/main/linux-64/more-itertools-10.1.0-py312h06a4308_0.conda#096b075f991f71cf9df2e8064f148bee https://repo.anaconda.com/pkgs/main/linux-64/msgpack-python-1.0.3-py312hdb19cb5_0.conda#9f2369ceffa6420742a233390d2fc295 https://repo.anaconda.com/pkgs/main/linux-64/nest-asyncio-1.6.0-py312h06a4308_0.conda#54db123c667472579092ce402f242702 -https://repo.anaconda.com/pkgs/main/linux-64/networkx-3.1-py312h06a4308_0.conda#8f9cd07ef4c47f326d0bd781d1803f0a +https://repo.anaconda.com/pkgs/main/linux-64/networkx-3.3-py312h06a4308_0.conda#3d6fe63c7b13df13c529e2aace012d80 https://repo.anaconda.com/pkgs/main/linux-64/numpy-base-1.26.4-py312he1a6c75_0.conda#b4f72512033cab6fffe7d72f4585da29 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://repo.anaconda.com/pkgs/main/linux-64/overrides-7.4.0-py312h06a4308_0.conda#b294a9b6e5b7654cc7012f3690a7c57f -https://repo.anaconda.com/pkgs/main/linux-64/packaging-23.2-py312h06a4308_0.conda#6df46fc8a396077102655cc21600723d +https://repo.anaconda.com/pkgs/main/linux-64/packaging-24.1-py312h06a4308_0.conda#756ec42d4f934b642b8476689af2781f https://repo.anaconda.com/pkgs/main/noarch/pandocfilters-1.5.0-pyhd3eb1b0_0.conda#5547ced9e3bb4c513405998957b52c7b -https://conda.anaconda.org/conda-forge/linux-64/parallel-20240522-ha770c72_0.conda#95444bc23d494d0b06405bea54c7cd1f https://repo.anaconda.com/pkgs/main/noarch/parso-0.8.3-pyhd3eb1b0_0.conda#c6f0f6219bf5ce2b510ef4b75cbc3e01 https://repo.anaconda.com/pkgs/main/noarch/pastel-0.2.1-py_0.conda#81a0d5c930710445569d9a2f5137d6a2 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.conda#425bb325f970e57a047ac57c4586489d +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2024.4.24-pyhd8ed1ab_0.conda#4647442ace74db3dd235968a18b090eb +https://repo.anaconda.com/pkgs/main/linux-64/perl-5.34.0-h5eee18b_2.conda#2362442477bfdd0ff1ce8d8cc753e7e8 https://repo.anaconda.com/pkgs/main/linux-64/pkginfo-1.10.0-py312h06a4308_0.conda#2a32de7c1bccd483668b26d4cf589488 https://repo.anaconda.com/pkgs/main/linux-64/platformdirs-3.10.0-py312h06a4308_0.conda#39dc9eb538e73250dadcdec7a8ed6595 https://repo.anaconda.com/pkgs/main/linux-64/pluggy-1.0.0-py312h06a4308_1.conda#65e3925b7c284b6a111d8971cac0d0c7 -https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.3-h8e811e2_0.conda#e4d52462da124ed3792472f95a36fc2a -https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda#113f894e5019db2e2705645ee3bcf91a https://repo.anaconda.com/pkgs/main/linux-64/prometheus_client-0.14.1-py312h06a4308_0.conda#14e1666713d1d750c7294d167e263170 https://repo.anaconda.com/pkgs/main/linux-64/psutil-5.9.0-py312h5eee18b_0.conda#44fe0043384455631a86c8ff948432df https://repo.anaconda.com/pkgs/main/noarch/ptyprocess-0.7.0-pyhd3eb1b0_2.conda#7441d2827d4bfbcc1fa308875a146246 @@ -207,10 +195,10 @@ https://repo.anaconda.com/pkgs/main/noarch/python-tzdata-2023.3-pyhd3eb1b0_0.con https://repo.anaconda.com/pkgs/main/linux-64/pytz-2024.1-py312h06a4308_0.conda#f8a72213ea02624e802216fedff222e1 https://repo.anaconda.com/pkgs/main/linux-64/pyyaml-6.0.1-py312h5eee18b_0.conda#c4dd039d43f1b841661db23e084b5e04 https://repo.anaconda.com/pkgs/main/linux-64/pyzmq-25.1.2-py312h6a678d5_0.conda#e222e50ccfb73d90805aac55b527b6f4 +https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda https://conda.anaconda.org/conda-forge/noarch/resolvelib-1.0.1-pyhd8ed1ab_0.conda#3f9f4ffb76bd4524792f2ff02f446819 https://repo.anaconda.com/pkgs/main/linux-64/rfc3986-validator-0.1.1-py312h06a4308_0.conda#f9800ce161ed779b8cf7a1cd6d7ae0f5 https://repo.anaconda.com/pkgs/main/linux-64/rpds-py-0.10.6-py312hb02cf49_0.conda#f014511c9cf2b20297e4cba31fa9a47d -https://repo.anaconda.com/pkgs/main/linux-64/rtree-1.0.1-py312h06a4308_0.conda#58c4db6c2dca8e026a9c14f85444a006 https://repo.anaconda.com/pkgs/main/linux-64/ruamel.yaml-0.17.21-py312h5eee18b_0.conda#8731b592bb8feb6f50aaeb3173b02ce8 https://repo.anaconda.com/pkgs/main/linux-64/send2trash-1.8.2-py312h06a4308_0.conda#6de7b7d88a0ad8549d30cb9bf1676c7e https://repo.anaconda.com/pkgs/main/linux-64/setuptools-69.5.1-py312h06a4308_0.conda#ce85d9a864a73e0b12d31a97733c9fca @@ -218,71 +206,73 @@ https://repo.anaconda.com/pkgs/main/linux-64/shellingham-1.5.0-py312h06a4308_0.c https://repo.anaconda.com/pkgs/main/noarch/six-1.16.0-pyhd3eb1b0_1.conda#34586824d411d36af2fa40e799c172d0 https://repo.anaconda.com/pkgs/main/noarch/smmap-4.0.0-pyhd3eb1b0_0.conda#ea22ec22100b09799aa81f3e3ef9fa87 https://repo.anaconda.com/pkgs/main/linux-64/sniffio-1.3.0-py312h06a4308_0.conda#895787f939a4b06e04de62aa5ccd36d3 +https://conda.anaconda.org/conda-forge/noarch/socksio-1.0.0-pyhd8ed1ab_0.conda#61c4227968001893dcff60e779289eb5 https://repo.anaconda.com/pkgs/main/linux-64/soupsieve-2.5-py312h06a4308_0.conda#102a7777bdfa79ba339be7bed43f8c7d https://repo.anaconda.com/pkgs/main/linux-64/tabulate-0.9.0-py312h06a4308_0.conda#42a5c8370e1cf09011d5045fb7c7c0e5 https://repo.anaconda.com/pkgs/main/linux-64/termcolor-2.1.0-py312h06a4308_0.conda#e76ea8a401857f9f8a62a33df1cca7df -https://repo.anaconda.com/pkgs/main/noarch/threadpoolctl-2.2.0-pyh0d69192_0.conda#bbfdbae4934150b902f97daaf287efe2 +https://repo.anaconda.com/pkgs/main/linux-64/threadpoolctl-3.5.0-py312he106c6f_0.conda#3ca7192420724484fa1429dd686c91ad https://repo.anaconda.com/pkgs/main/noarch/toml-0.10.2-pyhd3eb1b0_0.conda#cda05f5f6d8509529d1a2743288d197a https://repo.anaconda.com/pkgs/main/linux-64/tomli-2.0.1-py312h06a4308_1.conda#8770c279821e6ba382d5fa7562a8391b https://repo.anaconda.com/pkgs/main/linux-64/tomlkit-0.11.1-py312h06a4308_0.conda#b2061d65b70adf68a4f96dc4fb4ec939 https://repo.anaconda.com/pkgs/main/linux-64/toolz-0.12.0-py312h06a4308_0.conda#8340b47fa0f92e87a9416929dd52a102 -https://repo.anaconda.com/pkgs/main/linux-64/tornado-6.3.3-py312h5eee18b_0.conda#a39237067b4cb774d7826be15439a342 +https://repo.anaconda.com/pkgs/main/linux-64/tornado-6.4.1-py312h5eee18b_0.conda#f4e2217ac077eff9684df8162125acc0 https://repo.anaconda.com/pkgs/main/linux-64/tqdm-4.66.4-py312he106c6f_0.conda#11d1cee87830bbb013896a43f47eafa9 -https://repo.anaconda.com/pkgs/main/linux-64/traitlets-5.7.1-py312h06a4308_0.conda#10e9761815efd157b4f4fc6a216e0c61 -https://repo.anaconda.com/pkgs/main/linux-64/truststore-0.8.0-py312h06a4308_0.conda#ad93bd626fc17c1606394fe258b4ed18 +https://repo.anaconda.com/pkgs/main/linux-64/traitlets-5.14.3-py312h06a4308_0.conda#e597b4bbf8d30abd7ae5ac5d4a436176 https://repo.anaconda.com/pkgs/main/linux-64/typing_extensions-4.11.0-py312h06a4308_0.conda#3045aa097a86bc6a13702fc3c287b5a4 https://repo.anaconda.com/pkgs/main/linux-64/unicodedata2-15.1.0-py312h5eee18b_0.conda#b4759c926ac7543d4c845d7f984250e3 https://repo.anaconda.com/pkgs/main/noarch/wcwidth-0.2.5-pyhd3eb1b0_0.conda#ffa649340272c3f6466ba01da254c3b0 https://repo.anaconda.com/pkgs/main/linux-64/webencodings-0.5.1-py312h06a4308_2.conda#b93cb387bcd155121150257dbcf8eb28 https://repo.anaconda.com/pkgs/main/linux-64/websocket-client-1.8.0-py312h06a4308_0.conda#3c9d8408c05942366b679ff8b439179c -https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-hac6953d_0.conda#63b80ca78d29380fe69e69412dcbe4ac +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 https://repo.anaconda.com/pkgs/main/linux-64/xyzservices-2022.9.0-py312h06a4308_1.conda#3ef654e64fb10094442be905975e83a4 https://repo.anaconda.com/pkgs/main/linux-64/zipp-3.17.0-py312h06a4308_0.conda#0b4e62af7ada176ce15a5551e124225c https://repo.anaconda.com/pkgs/main/linux-64/anyio-4.2.0-py312h06a4308_0.conda#d992c4775da6f3ccb1223d71abe67de9 https://repo.anaconda.com/pkgs/main/noarch/asttokens-2.0.5-pyhd3eb1b0_0.conda#140486e2ce4f3931b44aa5f7ff8d88da https://repo.anaconda.com/pkgs/main/noarch/astunparse-1.6.3-py_0.conda#250bc9eafb39eff7fff001dae10e2d3c -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.9-h594631b_3.conda#47490db1dcddfb1c355251fc427746a6 -https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.6.0-hf1915f5_1.conda#fd11ea65ceb397f9587b1d88a4329d73 -https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.5.0-h94269e2_4.conda#f364272cb4c2f4ce2341067107b82865 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.22-hbd3ac97_10.conda#7ca4abcc98c7521c02f4e8809bbe40df +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-hcd6a914_8.conda#b81c45867558446640306507498b2c6b +https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.12.0-h830ed8b_0.conda#320d066f9cad598854f4af32c7c82931 https://repo.anaconda.com/pkgs/main/linux-64/babel-2.11.0-py312h06a4308_0.conda#677b01819ada8c2e555e55342b1d5433 -https://repo.anaconda.com/pkgs/main/linux-64/beautifulsoup4-4.12.2-py312h06a4308_0.conda#92c78bee4e957e7c931d9f4862eff1c9 +https://repo.anaconda.com/pkgs/main/linux-64/beautifulsoup4-4.12.3-py312h06a4308_0.conda#79afccbd2199c75b590ecac6228716f2 https://repo.anaconda.com/pkgs/main/noarch/bleach-4.1.0-pyhd3eb1b0_0.conda#256eb7e384e35f993ef8ccd6c4f45e58 +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda#fceaedf1cdbcb02df9699a0d9b005292 https://repo.anaconda.com/pkgs/main/linux-64/cffi-1.16.0-py312h5eee18b_1.conda#19c88f9bcbfd0896bc8b5b4758d73b9c +https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.4.1-hf8ad068_0.conda#1b7a01fd02d11efe0eb5a676842a7b7d https://repo.anaconda.com/pkgs/main/linux-64/click-default-group-1.2.2-py312h06a4308_0.conda#040b76037750df8ea6e8d6c3a9167614 https://repo.anaconda.com/pkgs/main/noarch/click-plugins-1.1.1-pyhd3eb1b0_0.conda#c8cc446ac6e7dea55dc7aec091464c7d https://repo.anaconda.com/pkgs/main/noarch/cligj-0.7.2-pyhd3eb1b0_0.conda#a304c2ad08c7d498e7dc9eadc6b36e22 https://conda.anaconda.org/conda-forge/noarch/clikit-0.6.2-pyhd8ed1ab_2.conda#02abb7b66b02e8b9f5a9b05454400087 https://repo.anaconda.com/pkgs/main/linux-64/comm-0.2.1-py312h06a4308_0.conda#7d7b827eee78fd7b62292dc6a44314f2 https://conda.anaconda.org/conda-forge/noarch/coverage-badge-1.1.1-pyhd8ed1ab_0.conda#2b9d71adc9cae0b0eff77cae36f75cf6 -https://repo.anaconda.com/pkgs/main/linux-64/dbus-1.13.18-hb2f20db_0.conda#6a6a6f1391f807847404344489ef6cf4 -https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.2.0-pyhd8ed1ab_0.conda#412c94a992ba8c828624c2ecb476caf7 +https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.2-pyhd8ed1ab_0.conda#3485b77f697e38cbab7b80d01533717a https://conda.anaconda.org/conda-forge/noarch/findpython-0.6.1-pyhd8ed1ab_0.conda#c3562fb8edde4111bd5a11ea30cbc6a7 https://repo.anaconda.com/pkgs/main/linux-64/fonttools-4.51.0-py312h5eee18b_0.conda#592d996d4b654ac2d0b071461f5165d4 -https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.3-h928be8b_0.conda#c0f2468661b7cae54a7a1ff11926e372 https://repo.anaconda.com/pkgs/main/noarch/gitdb-4.0.7-pyhd3eb1b0_0.conda#bdd15a7149734880c003d98110c56b5b +https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.3-h8a4344b_1.conda#a3acc4920c9ca19cb6b295028d606477 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://repo.anaconda.com/pkgs/main/noarch/html5lib-1.1-pyhd3eb1b0_0.conda#24c4f675dfc77f9d1ae6cd3c33731c3c https://repo.anaconda.com/pkgs/main/linux-64/httpcore-1.0.2-py312h06a4308_0.conda#a4e4dd3bd4cec11e72ffb690bafcce90 https://repo.anaconda.com/pkgs/main/linux-64/importlib-metadata-7.0.1-py312h06a4308_0.conda#3882ea712f9fe00625fa0420016dad18 -https://repo.anaconda.com/pkgs/main/noarch/importlib-resources-6.1.1-pyhd3eb1b0_1.conda#3af35c818b28c6c6732a7acafefc9d2a +https://repo.anaconda.com/pkgs/main/noarch/importlib-resources-6.4.0-pyhd3eb1b0_0.conda#aa55412fcedec462ae11b5dc96a47e7d https://repo.anaconda.com/pkgs/main/noarch/jaraco.classes-3.2.1-pyhd3eb1b0_0.conda#7f47c66b55e92b2724174847703df72f -https://repo.anaconda.com/pkgs/main/linux-64/jedi-0.18.1-py312h06a4308_1.conda#6bbccab0eb9ae37d881f84f9f19cea8a +https://repo.anaconda.com/pkgs/main/linux-64/jedi-0.19.1-py312h06a4308_0.conda#67391f5ec297fe536b30d2c450ae4b15 https://repo.anaconda.com/pkgs/main/linux-64/jinja2-3.1.4-py312h06a4308_0.conda#aee50a77b632c39ab72bffc8017d19be -https://repo.anaconda.com/pkgs/main/linux-64/jupyter_core-5.5.0-py312h06a4308_0.conda#36753efd1e28a61039288eddf9935794 +https://repo.anaconda.com/pkgs/main/linux-64/jupyter_core-5.7.2-py312h06a4308_0.conda#f74ba359b10915d569269b982b942455 https://repo.anaconda.com/pkgs/main/noarch/jupyterlab_pygments-0.1.2-py_0.conda#af46aff4922ca45df6ba19b313df6070 -https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hee9dde6_1.conda#c5b7b29e2b66107553d0366538257a51 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.24.0-h3d9a0c8_0.conda#a731371833a7b1ab3a87be0fe7e6235a -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 -https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h5539517_6.conda#1ee26233875c04444bdb2e5a838b5634 +https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 https://repo.anaconda.com/pkgs/main/linux-64/markdown-it-py-2.2.0-py312h06a4308_1.conda#ec0d596109762df09a6ee70dd3327847 https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-inline-0.1.6-py312h06a4308_0.conda#a8e99eeb494e5945aa7e60a660670643 https://repo.anaconda.com/pkgs/main/linux-64/nodeenv-1.7.0-py312h06a4308_0.conda#23c0441e6b4e88642027f364e62f8566 https://repo.anaconda.com/pkgs/main/linux-64/numpy-1.26.4-py312h2809609_0.conda#a4282fd8d475c35059c92025ddf0b8a5 https://repo.anaconda.com/pkgs/main/linux-64/openpyxl-3.1.2-py312h5eee18b_0.conda#7b0e99dc4855ed3f946fdf20d312f806 +https://conda.anaconda.org/conda-forge/linux-64/parallel-20240522-ha770c72_0.conda#95444bc23d494d0b06405bea54c7cd1f https://repo.anaconda.com/pkgs/main/noarch/pexpect-4.8.0-pyhd3eb1b0_3.conda#765b2562d6cdd14bb6d44fc170a04331 -https://conda.anaconda.org/conda-forge/linux-64/poppler-24.04.0-hb6cd0d7_0.conda#d19eed746748f1d44b575662f2bcfe95 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py312h287a98d_0.conda#59ea71eed98aee0bebbbdd3b118167c7 +https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.3-h8e811e2_0.conda#e4d52462da124ed3792472f95a36fc2a +https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-hb784bbd_2.conda#b0683c229de4c4c676450d24ff87538c https://repo.anaconda.com/pkgs/main/linux-64/prompt-toolkit-3.0.43-py312h06a4308_0.conda#1ccee6d6456c5a4c71d52a97e8292432 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312hb591178_6.conda#e5a041de2ecaee7e02c40cf82afa132e -https://repo.anaconda.com/pkgs/main/linux-64/pytest-7.4.0-py312h06a4308_0.conda#7d983fb31c361c499cd2d98f6347e46c +https://repo.anaconda.com/pkgs/main/linux-64/pytest-7.4.4-py312h06a4308_0.conda#297cebe31aed2b64f54ea716a61733c0 https://repo.anaconda.com/pkgs/main/linux-64/python-dateutil-2.9.0post0-py312h06a4308_2.conda#06c8706a892aaaae74325c0b46c86d01 https://repo.anaconda.com/pkgs/main/linux-64/python-dotenv-0.21.0-py312h06a4308_0.conda#f983f4d6278453e00f637442967b29fa https://repo.anaconda.com/pkgs/main/linux-64/referencing-0.30.2-py312h06a4308_0.conda#3113fb44293d20eaae1e67a4876751c9 @@ -294,80 +284,94 @@ https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.con https://repo.anaconda.com/pkgs/main/linux-64/typing-extensions-4.11.0-py312h06a4308_0.conda#181af932ad0824456dc3e6173c38b5c6 https://repo.anaconda.com/pkgs/main/linux-64/virtualenv-20.26.1-py312h06a4308_0.conda#9a27149f4f1db4ada607be0fb5494f1b https://repo.anaconda.com/pkgs/main/linux-64/watchdog-4.0.1-py312h06a4308_0.conda#7cd659167e2c8149985b2d6b14479b11 +https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-h666cd97_1.conda#97e8ef960a53cf08f2c4ceec8cf9e10d https://repo.anaconda.com/pkgs/main/linux-64/argon2-cffi-bindings-21.2.0-py312h5eee18b_0.conda#ed4180dcd3e7c19a9c06a86510ad1ae7 -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.9-he3a8b3b_0.conda#fbe6a256dd70a505730e7c461cd37a35 -https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.10.0-h00ab1b0_1.conda#1e63d3866554a4d2e3d1cba5f21a2841 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.0-h365ddd8_2.conda#22339cf124753bafda336167f80e7860 +https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.8.0-hdb0d106_1.conda#a297ffb4b505f51d0f58352c5c13971b +https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.6.0-he3f277c_1.conda#8a10bb068b138dd473300b5fe34a1865 https://repo.anaconda.com/pkgs/main/linux-64/bottleneck-1.3.7-py312ha883a20_0.conda#51bb23c66f00f6cc89dd0dee32815e67 https://repo.anaconda.com/pkgs/main/linux-64/branca-0.6.0-py312h06a4308_0.conda#0b93373891471306c3d9173cac8d1129 https://repo.anaconda.com/pkgs/main/linux-64/cftime-1.6.2-py312ha883a20_1.conda#dbde55741cb4e19ab3adfa8a223717b0 https://repo.anaconda.com/pkgs/main/linux-64/contourpy-1.2.0-py312hdb19cb5_0.conda#45c70b5ee7202df3c86a586c2736bce7 https://repo.anaconda.com/pkgs/main/linux-64/cryptography-42.0.5-py312hdda0065_1.conda#f224acb5b9a99ce1b715152d1ef7a67e -https://repo.anaconda.com/pkgs/main/linux-64/gitpython-3.1.37-py312h06a4308_0.conda#447f9e5b301814c2e2ad7c485f626731 -https://conda.anaconda.org/conda-forge/noarch/griffe-0.45.2-pyhd8ed1ab_0.conda#409a74bc6c127c7a623777547d03d587 +https://repo.anaconda.com/pkgs/main/linux-64/dbus-1.13.18-hb2f20db_0.conda#6a6a6f1391f807847404344489ef6cf4 +https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.3-hf7fa9e8_1.conda#8ff4fa3ab0b63dc5b214a68839499e41 +https://repo.anaconda.com/pkgs/main/linux-64/gitpython-3.1.43-py312h06a4308_0.conda#a5bb051e5739c6701297408439f7b1fc +https://conda.anaconda.org/conda-forge/noarch/griffe-0.48.0-pyhd8ed1ab_0.conda#73aafef908b0b8948d739e11ebf92d32 https://repo.anaconda.com/pkgs/main/linux-64/httpx-0.26.0-py312h06a4308_0.conda#1773f853d16a8002ac9c8f056acbd5ed https://repo.anaconda.com/pkgs/main/noarch/importlib_metadata-7.0.1-hd3eb1b0_0.conda#f764ec5ca8c8f808464764c83be0ead4 https://repo.anaconda.com/pkgs/main/linux-64/jsonschema-specifications-2023.7.1-py312h06a4308_0.conda#4a3e8dd4b08a13007db2038e6d0ee144 https://repo.anaconda.com/pkgs/main/linux-64/jupyter_client-8.6.0-py312h06a4308_0.conda#fa5c4806fb8923dd99bd6e4117394681 https://repo.anaconda.com/pkgs/main/linux-64/jupyter_server_terminals-0.4.4-py312h06a4308_1.conda#38397ad2c8ba35b0c34082d230f49bd8 +https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hee9dde6_1.conda#c5b7b29e2b66107553d0366538257a51 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.26.0-h26d7fe4_0.conda#7b9d4c93870fb2d644168071d4d76afb +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c +https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h6fbd9c4_7.conda#e39bdbe437c74e43b534e21290ca3897 https://repo.anaconda.com/pkgs/main/linux-64/numexpr-2.8.7-py312he7dcb8a_0.conda#abeab7edb95c5f2adcd741401a2e07dc +https://conda.anaconda.org/conda-forge/linux-64/poppler-24.04.0-hb6cd0d7_0.conda#d19eed746748f1d44b575662f2bcfe95 https://repo.anaconda.com/pkgs/main/noarch/prompt_toolkit-3.0.43-hd3eb1b0_0.conda#244c80adf85e37e2a4158d0f0c199566 https://repo.anaconda.com/pkgs/main/linux-64/pydantic-core-2.14.6-py312hb02cf49_0.conda#e923c263c17acb02e2d48d0349eeeb73 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h5d05ceb_7.conda#b53ddc25da04839cc62b0b158a7ecb38 https://repo.anaconda.com/pkgs/main/linux-64/pytest-cov-4.1.0-py312h06a4308_1.conda#527d99f42aeea2545011a0bb6c7d38b8 https://conda.anaconda.org/conda-forge/noarch/pytest-sugar-1.0.0-pyhd8ed1ab_0.conda#95911286c4f6bcea2bea50b2739c7f8e https://repo.anaconda.com/pkgs/main/linux-64/pytest-xdist-3.5.0-py312h06a4308_0.conda#ef2e7e9b783616dc444ab67fe29b94b5 -https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda#ba445bf767ae6f0d959ff2b40c20912b -https://repo.anaconda.com/pkgs/main/linux-64/scipy-1.13.0-py312h2809609_0.conda#de051a709b27885d13e11e73d7d6375a +https://repo.anaconda.com/pkgs/main/linux-64/rich-13.7.1-py312h06a4308_0.conda#d0f04d8a8f409d70fd0cf7ba3724301a +https://repo.anaconda.com/pkgs/main/linux-64/scipy-1.13.1-py312h2809609_0.conda#a95399b7c0b52a53bfbe9c7d84f0afb6 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312ha5b4d35_1.conda#1248b799f811d8ea215de88f53ae7ffc https://repo.anaconda.com/pkgs/main/noarch/snuggs-1.4.7-pyhd3eb1b0_0.conda#f84b8372cc7b4b7ff2be0c34b26378ae https://repo.anaconda.com/pkgs/main/noarch/stack_data-0.2.0-pyhd3eb1b0_0.conda#6212968e73726f6da42e5ffcd2bea92d https://repo.anaconda.com/pkgs/main/linux-64/ukkonen-1.0.1-py312hdb19cb5_0.conda#12f014642b080b0635c43e4e0d27e690 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h3483029_0.conda#eab52e88c858d87cf5a069f79d10bb50 https://repo.anaconda.com/pkgs/main/noarch/argon2-cffi-21.3.0-pyhd3eb1b0_0.conda#f00b851bc61b4c313903d31c7daecb09 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-hba8bd5f_3.conda#720494d9f06b4aff1270cffb7acc7920 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.27.3-hda66527_2.conda#734875312c8196feecc91f89856da612 +https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.11.0-ha67cba7_1.conda#f03bba57b85a5b3ac443a871787fc429 +https://conda.anaconda.org/conda-forge/noarch/hishel-0.0.30-pyhd8ed1ab_0.conda#d6dea11fccceebd0f67c6f472d66c32e https://repo.anaconda.com/pkgs/main/linux-64/identify-2.5.5-py312h06a4308_0.conda#f41d506d423ed77f2fd4ae67020ae659 -https://repo.anaconda.com/pkgs/main/linux-64/ipython-8.20.0-py312h06a4308_0.conda#acbc198f40955d3ab40f666188371988 +https://repo.anaconda.com/pkgs/main/linux-64/ipython-8.25.0-py312h06a4308_0.conda#2c767a19ad2dee3fffccf0dc57c51c42 https://repo.anaconda.com/pkgs/main/linux-64/jsonschema-4.19.2-py312h06a4308_0.conda#5f74dfc66bdbe28a628b982f2ee0c345 +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.26.0-ha262f82_0.conda#89b53708fd67762b26c38c8ecc5d323d https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-base-3.8.4-py312h526ad5a_0.conda#82aa62c40bd375ed45589ba536312895 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py312h39d4375_101.conda#9033de6c10fd3396990890d8d8a6ac4e -https://repo.anaconda.com/pkgs/main/linux-64/pandas-2.2.1-py312h526ad5a_0.conda#f292b675711a103bf8a3c577d052171a -https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.4.1-pyhd8ed1ab_0.conda#2fffd2371d53e1eefc597bae076eef41 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h1ef7fb6_101.conda#c67cc8e3a34c5cb8920c79918112e96f +https://repo.anaconda.com/pkgs/main/linux-64/pandas-2.2.2-py312h526ad5a_0.conda#931585545b1801a72013bf30186fb51a +https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.5.2-pyhd8ed1ab_0.conda#f8d38e43e2b367976d7135e602b5c9b6 https://repo.anaconda.com/pkgs/main/linux-64/pydantic-2.5.3-py312h06a4308_0.conda#b584f35c1c23cfe8bfa0ec111df2408e https://repo.anaconda.com/pkgs/main/linux-64/pyopenssl-24.0.0-py312h06a4308_0.conda#f93a6ad622b84e53aed3d899b5b36f6a https://repo.anaconda.com/pkgs/main/linux-64/scikit-learn-1.4.2-py312h526ad5a_1.conda#7f8e8d231b3df92ca1821f2062c76306 https://repo.anaconda.com/pkgs/main/linux-64/secretstorage-3.3.1-py312h06a4308_1.conda#790c1839ee84767859d244875a26ad97 https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.3-hd8ed1ab_0.conda#8e56b98837d17e6ace4dc455d905709a -https://conda.anaconda.org/conda-forge/noarch/geopandas-base-0.14.4-pyha770c72_0.conda#b7a9e8e5865cc474fb0856577898316a +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-h46c3b66_9.conda#c840f07ec58dc0b06041e7f36550a539 +https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.0.1-pyha770c72_0.conda#1b7d46173c29e14dde41f97cf5aa61df https://repo.anaconda.com/pkgs/main/linux-64/ipykernel-6.28.0-py312h06a4308_0.conda#b488eb4fadcff89d5a2cf097a5c7a91b -https://repo.anaconda.com/pkgs/main/linux-64/jupyter_events-0.8.0-py312h06a4308_0.conda#64f17e343ab9fb9a6519c64b117e3599 +https://repo.anaconda.com/pkgs/main/linux-64/jupyter_events-0.10.0-py312h06a4308_0.conda#e9def891af369b1d816e08345a42838a https://repo.anaconda.com/pkgs/main/linux-64/keyring-24.3.1-py312h06a4308_0.conda#fff26aca6afa1adcb1cd61d8763639e3 https://repo.anaconda.com/pkgs/main/linux-64/mapclassify-2.5.0-py312h06a4308_0.conda#f4a3cedfd24c1533fd3a0a54a62a62b8 https://repo.anaconda.com/pkgs/main/linux-64/nbformat-5.9.2-py312h06a4308_0.conda#17aa138ac1d11e5a75f9c0c0377b7885 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 https://conda.anaconda.org/conda-forge/noarch/sphobjinv-2.3.1.1-pyhd8ed1ab_0.conda#3503896d50f4e463bb86c77bab85ce07 -https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.23.0-hfa691db_2.conda#f9cd15d6c7deeeb5b60d65fac59b18bc https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda#10efd02b22c39c0a46312ef7cb16d237 -https://repo.anaconda.com/pkgs/main/linux-64/urllib3-1.26.18-py312h06a4308_0.conda#37ba59346fdec674be0d3ec112225bf3 +https://repo.anaconda.com/pkgs/main/linux-64/urllib3-1.26.19-py312h06a4308_0.conda#3e736286f516aa2334bed47bdc0c5a1d https://repo.anaconda.com/pkgs/main/linux-64/xarray-2023.6.0-py312h06a4308_0.conda#b43bba50ad0baabcb3cb1b70d3e6916a -https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.8.5-h77540a9_7.conda#5937eafdfa5713c78a21cbb33a84539e https://repo.anaconda.com/pkgs/main/linux-64/nbclient-0.8.0-py312h06a4308_0.conda#27e95ee551e2a710fe0d96da0ca141fe -https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.2-pyhd8ed1ab_0.conda#9bf1905bef4492b77781e058cc27db35 https://repo.anaconda.com/pkgs/main/linux-64/requests-2.32.2-py312h06a4308_0.conda#8149ef9ed40945df19d2aff5ffd5bae0 +https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.24.2-hc55ee95_2.conda#bc6b3a6693d53e33dea28c89e02745dd https://repo.anaconda.com/pkgs/main/linux-64/cachecontrol-0.14.0-py312h06a4308_1.conda#bf57de67bcf746306cd3e026e6d1cccc https://repo.anaconda.com/pkgs/main/linux-64/ensureconda-1.4.4-py312h06a4308_1.conda#c667ee44114bd2b67633a7cb4dfc02f2 https://repo.anaconda.com/pkgs/main/linux-64/folium-0.14.0-py312h06a4308_0.conda#2f16a00500b1165a9c9a938690ba19ac -https://conda.anaconda.org/conda-forge/linux-64/gdal-3.8.5-py312h86af8fa_7.conda#489da43908a2583ab6a7549747a41e56 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.8.5-he176cbe_11.conda#bf74c88ae705acddbbfc6f1e3f7f0e24 https://repo.anaconda.com/pkgs/main/linux-64/nbconvert-7.10.0-py312h06a4308_0.conda#e913ecbb1401f765ed8631ed511d6788 -https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.10-py312h2447d21_1.conda#e3b23e993698c5afd6ee57e009cabf4c -https://repo.anaconda.com/pkgs/main/linux-64/requests-toolbelt-1.0.0-py312h06a4308_0.conda#7aa77208d296f2bb73e3e71f5614e170 -https://conda.anaconda.org/conda-forge/noarch/unearth-0.15.3-pyhd8ed1ab_0.conda#f32041bd4210adb59aa3b11a4108f33d +https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.5-pyhd8ed1ab_0.conda#e792d8c21d24dbb2b880c07430328536 +https://conda.anaconda.org/conda-forge/noarch/unearth-0.16.1-pyhd8ed1ab_0.conda#7c9b2ea6bbf1fa0018c808763d11721b https://repo.anaconda.com/pkgs/main/linux-64/cachecontrol-with-filecache-0.14.0-py312h06a4308_1.conda#e3f673966a8bfbab947ceceb285f72d0 -https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.6-py312h39f3bbb_2.conda#027c465cb004970543b3641b4a0fef74 -https://repo.anaconda.com/pkgs/main/linux-64/jupyter_server-2.10.0-py312h06a4308_0.conda#49fdb30dd562f6417cc1a621e2f24047 -https://conda.anaconda.org/conda-forge/linux-64/pdm-2.12.4-py312h7900ff3_1.conda#faf91a93a76cd42d9b1fb3ff400b199f -https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.15.5-pyhd8ed1ab_0.conda#cd7e6bfce5f8d758267c79d54bf108e7 +https://conda.anaconda.org/conda-forge/linux-64/gdal-3.8.5-py312h86af8fa_11.conda#5440cac70586e8653b26aa5f2860c101 +https://repo.anaconda.com/pkgs/main/linux-64/jupyter_server-2.14.1-py312h06a4308_0.conda#6ee18118c92c40b045ae6a99d5025da4 +https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.0-pyhd8ed1ab_0.conda#f5967ca19cb8fbd0eb04b8e191ded1e2 +https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.10-py312hd6340be_2.conda#9cee69a489f3b7c6de37bd7021d505cb https://repo.anaconda.com/pkgs/main/linux-64/conda-lock-2.5.6-py312h06a4308_0.conda#1f85a7f30fbd7e1a1061c05ba059e11f -https://conda.anaconda.org/conda-forge/noarch/geopandas-0.14.4-pyhd8ed1ab_0.conda#acc01facf6f915b6289a064957a58cc1 https://repo.anaconda.com/pkgs/main/linux-64/jupyter-lsp-2.2.0-py312h06a4308_0.conda#5ec44afafeffea8c68eb56af4da94dc5 -https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.2-pyhd8ed1ab_0.conda#d1cb7b113daaadd89e5aa6a32b28bf0d +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda#af8239bf1ba7e8c69b689f780f653488 https://repo.anaconda.com/pkgs/main/linux-64/notebook-shim-0.2.3-py312h06a4308_0.conda#1f00239d617e3f323f35899f6254b39c -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.1-pyhd8ed1ab_0.conda#3e7290af6190b29c7017d6a8fb0eaeea +https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.8.0-py312hbedb91a_1.conda#3840cffc5d6c64e179fc54f02714956d +https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.16.0-pyhd8ed1ab_0.conda#e651425fab6f281a049b785d1d630b1a +https://conda.anaconda.org/conda-forge/noarch/geopandas-1.0.1-pyhd8ed1ab_0.conda#efef4ce75a678216d510d08222845c7f +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.4-pyhd8ed1ab_0.conda#28f3334e97c39de2b7ac15743b041784 diff --git a/conda-lock.yml b/conda-lock.yml index 2906e9c6..8c427402 100644 --- a/conda-lock.yml +++ b/conda-lock.yml @@ -481,16 +481,17 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' - aws-c-http: '>=0.8.1,<0.8.2.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + __glibc: '>=2.17,<3.0.a0' + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-http: '>=0.8.2,<0.8.3.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.22-h96bc93b_2.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.22-hbd3ac97_10.conda hash: - md5: de2b7c9aa9b279cca5542134b7a2b86a - sha256: ed64502dbfb2706d730a76f786e718cd149e6fbfc8c7325ddddba42dcf5af858 + md5: 7ca4abcc98c7521c02f4e8809bbe40df + sha256: c8bf9f9901a56a56b18ab044d67ecde69ee1289881267924dd81670ac34591fe category: main optional: false - name: aws-c-auth @@ -498,16 +499,16 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' - aws-c-http: '>=0.8.1,<0.8.2.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-http: '>=0.8.2,<0.8.3.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.22-h38e582b_2.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.22-hf9a33fd_10.conda hash: - md5: 15f1fe6feb33c71f8e7a46d6dcd8f02e - sha256: 43062295f7d21fc29b6135678d035d4b6e7c2cd9a718379b3a45696a241c2b47 + md5: 62b79a7b24bc23fe55257f84ff62d2d0 + sha256: a07a992c975f50e313304625d35304f347da859f2d76c70b054a871eb3bd8fa4 category: main optional: false - name: aws-c-auth @@ -516,92 +517,94 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' - aws-c-http: '>=0.8.1,<0.8.2.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-http: '>=0.8.2,<0.8.3.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.22-hec39e38_2.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.22-h8a62e84_10.conda hash: - md5: 1c81dd08bafdaa47e08b031a6266104c - sha256: a0462fd4f91881b4e6e9047f82edbd0b2c55abe275be0d1572b5f90af1cdf203 + md5: 7a43a23a02f7c952f48d154454336c8c + sha256: 933c77d0c6eb77bc99b2184f3332b8254f3d82624627bdce9885aa7a32186b48 category: main optional: false - name: aws-c-cal - version: 0.6.14 + version: 0.7.1 manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.19,<0.9.20.0a0' + __glibc: '>=2.17,<3.0.a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' libgcc-ng: '>=12' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.14-h88a6e22_1.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.1-h87b94db_1.conda hash: - md5: 7ed63b0e816dd1635903506ef5d2c079 - sha256: 5c0a5bdae01596bf46f190f32e7ceeb7a8e8160196f7565d89f861b80c18ea54 + md5: 2d76d2cfdcfe2d5c3883d33d8be919e7 + sha256: f445f38a4170f0ae02cdf13e1bc23cbb826a4b45f39402f02fe5737b0a8ed3a9 category: main optional: false - name: aws-c-cal - version: 0.6.14 + version: 0.7.1 manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' libgcc-ng: '>=12' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.6.14-he69d4ad_1.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.1-h1194e0d_1.conda hash: - md5: d27088d391691224d8e1808e0192ed85 - sha256: ea2a82f3d2409f84ba43b12649e67d1ccfa636e4169260b9d66aaf97a05dd021 + md5: 3e52b9c84581b52333fbde981f2804a6 + sha256: 2b20411297c770100265ab55be2ac6973f26d3deb1a2af9e8779d561c9be01d0 category: main optional: false - name: aws-c-cal - version: 0.6.14 + version: 0.7.1 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.6.14-h5db4892_1.conda + aws-c-common: '>=0.9.23,<0.9.24.0a0' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.1-h94d0942_1.conda hash: - md5: 2c58877ab4fd2739dbb0cbf35bf96a6f - sha256: f384e001fbb2a3386d9b4f7d5dc7403624d1e9ddfcfbc4ab90421ec5721af3f2 + md5: d70f882eefb9cabf3e18a2f3957936de + sha256: b36692df6896084ecbf370c5a58590ebd0c7e1b9e0a0f27f2de2b81c8e1dca11 category: main optional: false - name: aws-c-common - version: 0.9.19 + version: 0.9.23 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.19-h4ab18f5_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.23-h4ab18f5_0.conda hash: - md5: c6dedd5eab2236f4abb59ade9fb7fd44 - sha256: 96aa405ae28b8b55ec4731c135f38ce9b856d0596f32cedfbe5c62513b0f2dad + md5: 94d61ae2b2b701008a9d52ce6bbead27 + sha256: f3eab0ec3f01ddc3ebdc235d4ae1b3b803d83e40f2cd2389bf8c65ab96e90f02 category: main optional: false - name: aws-c-common - version: 0.9.19 + version: 0.9.23 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.19-h68df207_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.23-h68df207_0.conda hash: - md5: ac4d24be95082f4c135f761946a2a8d9 - sha256: 2467db2867db26ca83f72168f6b55618de9a3fa12597f935c8fcf55dbd880800 + md5: 36159c9ecdcdbf7bf2676510110d7fda + sha256: fa4ca3c29c64c96cf8b208fb5466e425ac2f8998a0022f5404a885253bca4667 category: main optional: false - name: aws-c-common - version: 0.9.19 + version: 0.9.23 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.19-h99b78c6_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.23-h99b78c6_0.conda hash: - md5: 7f42602d986d771c990361ea2dd49ce8 - sha256: c1e4f28581bee31ce0abde35e24d8b2a3e893330ffe433af02d66a5166101088 + md5: d9f2adf47d2078d44a23480140e76550 + sha256: 15e965a0d1c37927e23d46691e632cf8b39afee5c9ba735f2d535fdb7b58b19e category: main optional: false - name: aws-c-compression @@ -609,12 +612,12 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-h83b837d_6.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-he027950_7.conda hash: - md5: 3e572eacd0ce99a59e1bb9c260ad5b20 - sha256: 468b9a95e6a2dda5e7a567228e0cf70d015a2300e3d73a88244be47f7d4f48e1 + md5: 11e5cb0b426772974f6416545baee0ce + sha256: d4c70b8716e19fe56a563ab858ab7440f41c2dd927687357a44e69f23001126d category: main optional: false - name: aws-c-compression @@ -622,12 +625,12 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.18-h9de22bd_6.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.18-h3ff8e8a_7.conda hash: - md5: 1b6c96fa72802e49a2f0b8750c8f3707 - sha256: 77cf8c2811afb3ed97fcb40cc93a23b4b8db2e9a2c434b9922d0fbd6a3f01921 + md5: 134bb356c25e94209744ee664ba8a89a + sha256: 2f7958b624e48424e8e484842cbce323f812adfb22f431889e7e25899907032c category: main optional: false - name: aws-c-compression @@ -636,11 +639,11 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.18-h5db4892_6.conda + aws-c-common: '>=0.9.23,<0.9.24.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.18-h94d0942_7.conda hash: - md5: 20d53ad7e00c702dc798c95ab66be402 - sha256: c95b05ee3cb01f7a628a1cfa8f5b81a08f2091ba04ef6c0d09360c11ceb6fef3 + md5: c9a37f68bef48f48782746404f4050a2 + sha256: d0244c7638853f8f8feb4a3107844fc6be23c6e29312fc5eda9221df5817b8a7 category: main optional: false - name: aws-c-event-stream @@ -648,15 +651,16 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.19,<0.9.20.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + __glibc: '>=2.17,<3.0.a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-ha47c788_12.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-h7671281_15.conda hash: - md5: 8420d8e495a1468f593128e5fbf6748a - sha256: 05a09522a969456a6b1b29d6d92a67747d2829f225ecd4bd8dc8db068194ed00 + md5: 3b45b0da170f515de8be68155e14955a + sha256: b9546f0637c66d4086a169f4210bf0d569140f41c13f0c1c6826355f51f82494 category: main optional: false - name: aws-c-event-stream @@ -664,15 +668,15 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.19,<0.9.20.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.4.2-h660a530_12.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.4.2-h9d161b3_15.conda hash: - md5: 1c32a945796845dd7620b7a6e176f816 - sha256: 04f4663879d548e6b6777b451dbf4c3c8fb27a5c4a0f8eae99fe4a1598b8dd06 + md5: ff2a2cb1a667ce44ddccf87a3858bede + sha256: 80305a933ee51a808c57e6f7a76dec05c02a999b2d5388fd1c906b8475658b8c category: main optional: false - name: aws-c-event-stream @@ -681,106 +685,108 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' libcxx: '>=16' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.4.2-h5eab607_12.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.4.2-hb74cd8f_15.conda hash: - md5: 4c92d2c87cd2bf02506d8742f22e1fa6 - sha256: 5e76e7e040dc6e91d8d9b91f261a3da30787b44742448d7d52cda72a67ab8f19 + md5: e12aae765ef60c989a43f042a4141ab7 + sha256: a28581c0fa33d5bf8f71ca18dc632b997ba83d4442a3c2955e40927708ce8b0b category: main optional: false - name: aws-c-http - version: 0.8.1 + version: 0.8.2 manager: conda platform: linux-64 dependencies: - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' + __glibc: '>=2.17,<3.0.a0' + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' aws-c-compression: '>=0.2.18,<0.2.19.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.1-h29d6fba_17.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.2-he17ee6b_6.conda hash: - md5: c20a29ff47043ba1ec24f45dc68930bf - sha256: 56206b9a856257b42a6a429e26b0e1296dbd7c353e980b259b1282bd5e5a1241 + md5: 4e3d1bb2ade85619ac2163e695c2cc1b + sha256: c2a9501d5e361051457b0afc3ce77496a73c2cf90ad859010812130d512e9271 category: main optional: false - name: aws-c-http - version: 0.8.1 + version: 0.8.2 manager: conda platform: linux-aarch64 dependencies: - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' aws-c-compression: '>=0.2.18,<0.2.19.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.1-hb63d320_17.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.2-h782069e_6.conda hash: - md5: c64103cceb1a36f685184b7915677b1b - sha256: 2e4c8525c5d654a506d1acfcf7827917d6719a0b055a97fa548a89304c179c62 + md5: 1477d77ade38be837f1be9fc5702244c + sha256: 4fc9052d4090f13ecc7d5e2de4fa7f82081fe57e0c365e231364ec06b86ead91 category: main optional: false - name: aws-c-http - version: 0.8.1 + version: 0.8.2 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' aws-c-compression: '>=0.2.18,<0.2.19.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.1-had10953_17.conda + aws-c-io: '>=0.14.10,<0.14.11.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.2-had1507a_6.conda hash: - md5: ef06feb1f7b00aab3bc1bd5efe5c1d6d - sha256: 930600f5dace5eb27dbfaaf839e63444d804bae1119f8bd12216380257296530 + md5: d6a478f39b7ee977690d7dfc4115adfc + sha256: 42a85dee175d2a8a832157ab3fd8c052955f90f65d40f1076d066b486c64d1ed category: main optional: false - name: aws-c-io - version: 0.14.8 + version: 0.14.10 manager: conda platform: linux-64 dependencies: - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' + __glibc: '>=2.17,<3.0.a0' + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' libgcc-ng: '>=12' - s2n: '>=1.4.15,<1.4.16.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.8-h21d4f22_5.conda + s2n: '>=1.4.17,<1.4.18.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.10-h826b7d6_1.conda hash: - md5: f9dd6e8a46f55f49eae5380d3b922b71 - sha256: 53d71956cae757f941ff3f04e2dc9383a725a05c65f232dc69a1740961ad11a7 + md5: 6961646dded770513a781de4cd5c1fe1 + sha256: 68cb6f708e5e1cf50d98f3c896c7a72ab68e71ce9a69be4eea5dbde5c04bebdc category: main optional: false - name: aws-c-io - version: 0.14.8 + version: 0.14.10 manager: conda platform: linux-aarch64 dependencies: - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' libgcc-ng: '>=12' - s2n: '>=1.4.15,<1.4.16.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.8-hc08e167_5.conda + s2n: '>=1.4.17,<1.4.18.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.10-he43bb46_1.conda hash: - md5: c1b095b1cda9e5a6882e4cfff3c231bd - sha256: 17db745ef438263f2a82707e75b28c8453f4f5dbaa13e8eb29032d6fa591e64d + md5: 8cb7305d490469354369e796186d67b5 + sha256: 9d1a34618e380b994bf00b99a75807c3a9cada7e5814f4cf673359251b01d517 category: main optional: false - name: aws-c-io - version: 0.14.8 + version: 0.14.10 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.8-hb5a7b21_5.conda + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.10-hcdb10ff_1.conda hash: - md5: c22a3d0aa06af78f388dd8313977a773 - sha256: d83243cc639b772a5c12e10eccf67bf51ce7d48291a7f20fb23a32cbf0b6452c + md5: e7d85effc69338579c0b928eabe27d67 + sha256: 3b5fcdb83ab4af4b669c753f5ee167502e821180347f2d624bbaf77f9b082eb1 category: main optional: false - name: aws-c-mqtt @@ -788,14 +794,15 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.19,<0.9.20.0a0' - aws-c-http: '>=0.8.1,<0.8.2.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + __glibc: '>=2.17,<3.0.a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-http: '>=0.8.2,<0.8.3.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-h759edc4_4.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-hcd6a914_8.conda hash: - md5: 8ced661d9dcece8698922fd8a73b6511 - sha256: 663b659077570819c649b05b0a1f616373618d89ac5ad6ed93ff4b660b4172dc + md5: b81c45867558446640306507498b2c6b + sha256: aa6100ed16b1b6eabccca1ee5e36039862e37a7ee91c852de8d4ca0082dcd54e category: main optional: false - name: aws-c-mqtt @@ -803,14 +810,14 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.19,<0.9.20.0a0' - aws-c-http: '>=0.8.1,<0.8.2.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-http: '>=0.8.2,<0.8.3.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.4-hb8a7502_4.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.4-h6cc0bdf_8.conda hash: - md5: d5e54de386ccd0ada0645bc13caffd15 - sha256: dda67f98707f836ee9b580bf4614db0f8e7daa052b2a7e53d452723022b7ec26 + md5: eb2b09202bb3ef71e542b76f55c60de5 + sha256: 2ea19007651bfb32767568c044cbbd833630735f25ad348f29c224afdfefeea2 category: main optional: false - name: aws-c-mqtt @@ -819,69 +826,70 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' - aws-c-http: '>=0.8.1,<0.8.2.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.4-h78534b8_4.conda + aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-http: '>=0.8.2,<0.8.3.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.4-h856d8ab_8.conda hash: - md5: 08e6571e2f7065b279a84edfa1b8f997 - sha256: f728f0fcfa6688a088a448be35b6a3f36e4a02316d99bbf8ca09f0ba148ab2f5 + md5: 7a49b5ed4c1676b6aefbd6d7c92d976f + sha256: c2096334214c00905c71a527e330757e9a419c1e290ba515c6a54531f2b975b9 category: main optional: false - name: aws-c-s3 - version: 0.5.9 + version: 0.6.0 manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' aws-c-auth: '>=0.7.22,<0.7.23.0a0' - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' - aws-c-http: '>=0.8.1,<0.8.2.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-http: '>=0.8.2,<0.8.3.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' libgcc-ng: '>=12' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.9-h594631b_3.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.0-h365ddd8_2.conda hash: - md5: 47490db1dcddfb1c355251fc427746a6 - sha256: b7b3c8189526c646b9bcd5dbed1da322076b0f1193a8793c64aae8347c3acca7 + md5: 22339cf124753bafda336167f80e7860 + sha256: 5f82835411b3db3ae9d5db575386d83a8cc6f5f61b414afa6155879b2071c2f6 category: main optional: false - name: aws-c-s3 - version: 0.5.9 + version: 0.6.0 manager: conda platform: linux-aarch64 dependencies: aws-c-auth: '>=0.7.22,<0.7.23.0a0' - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' - aws-c-http: '>=0.8.1,<0.8.2.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-http: '>=0.8.2,<0.8.3.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' libgcc-ng: '>=12' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.5.9-hca2a1cf_3.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.6.0-h9b659bc_2.conda hash: - md5: 33c2cb095f9e95a264956c11b8e66a10 - sha256: aa07fb230bea84aba3b4653c0e7bab1a7d273991cbd2c6d19805ca2d4e1d6861 + md5: 089a61ca4d46ed9fe6613435815e36b2 + sha256: 572c1a14b06a8af5cad56856b555a1b0dc498f6f58f517861e1fa2b2fb7e977f category: main optional: false - name: aws-c-s3 - version: 0.5.9 + version: 0.6.0 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' aws-c-auth: '>=0.7.22,<0.7.23.0a0' - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' - aws-c-http: '>=0.8.1,<0.8.2.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-http: '>=0.8.2,<0.8.3.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.5.9-h1755d02_3.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.6.0-ha9fd6de_2.conda hash: - md5: 2eebcb1608b98b8c17796dbc65c91dcf - sha256: d2a13aba6c23399ccbcfeb939ecc4c6b552c0ba318734b5fb424a6c9186ec951 + md5: a326f688d66aa81fc403a2227e93a327 + sha256: 1c3c682ec25a3b3842f9dc14bcdb01705acf828e37c291cf244032299ae22416 category: main optional: false - name: aws-c-sdkutils @@ -889,12 +897,12 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-h83b837d_2.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-he027950_3.conda hash: - md5: f40c698b4ea90f7fedd187c6639c818b - sha256: d5b350ca00f175866c2a5ef011270496a5061b39bd272a48d3e54ac06f3d890c + md5: adbf0c44ca88a3cded175cd809a106b6 + sha256: 0f957d8cebe9c9b4041c858ca9a20619eb3fa866c71b21478a02d51f219d59cb category: main optional: false - name: aws-c-sdkutils @@ -902,12 +910,12 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.16-h9de22bd_2.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.16-h3ff8e8a_3.conda hash: - md5: 7fc749dd3d5154bd9bf7b38a639df653 - sha256: caa4a4995f3924732580499df00220eca72ce1e884e8d1328673e327af54c187 + md5: 17b4343013540f7cfb0cffb66f1f18fa + sha256: b848559e5e7dafd4c58b16ee1eb6c829d69c20fe089bc6fdf5b8fcdeff1f4d47 category: main optional: false - name: aws-c-sdkutils @@ -916,11 +924,11 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.16-h5db4892_2.conda + aws-c-common: '>=0.9.23,<0.9.24.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.16-h94d0942_3.conda hash: - md5: 743bcf65e2df26d5ee19688078ce25a2 - sha256: 3045df3148c15f606dadb76f871497ee05a4708a1609de6c0442ecc7ed3a0749 + md5: 1f9dd57e79cf2191ed139491aa460e24 + sha256: 4303f310b156abeca86ea8a4b4c8be5cfb96dd4214c2ebcfeef1bec3fa1dc793 category: main optional: false - name: aws-checksums @@ -928,12 +936,12 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-h83b837d_6.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-he027950_7.conda hash: - md5: 7995cb937bdac5913c8904fed6b3729d - sha256: abd21f4d0e34e96538673be11d834360693748d17024d27c4054cf1ebd97069e + md5: 95611b325a9728ed68b8f7eef2dd3feb + sha256: 094cff556dbf8fdd60505c8285b0a873de101374f568200275d8fd7fb77ad5e9 category: main optional: false - name: aws-checksums @@ -941,12 +949,12 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.18-h9de22bd_6.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.18-h3ff8e8a_7.conda hash: - md5: a31ac1531d25731eb717a08982f69731 - sha256: 8b453cc8f8949fe02f091ff377a072b612561e270521abad265c73a5a5784494 + md5: 069ec92cf4097befba1ab4b3f1e9e832 + sha256: c62b6f36f81927f95371f208683d0168cc92fa4cada62a9db197c3932a4750ba category: main optional: false - name: aws-checksums @@ -955,77 +963,78 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.18-h5db4892_6.conda + aws-c-common: '>=0.9.23,<0.9.24.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.18-h94d0942_7.conda hash: - md5: d28c3139c1c0193c633cb5650bf91079 - sha256: 5084ab14a49ebde68e46f87d4b85bedcf1931e2dd051d11fab725ee1ad60b0d1 + md5: fbd0be30bdd84b6735dfa3d6c5916b2e + sha256: cdd08a5b6b4ebadf05087238987681dc370bd0336ed410d0047171020f160187 category: main optional: false - name: aws-crt-cpp - version: 0.26.9 + version: 0.27.3 manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' aws-c-auth: '>=0.7.22,<0.7.23.0a0' - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' - aws-c-http: '>=0.8.1,<0.8.2.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + aws-c-http: '>=0.8.2,<0.8.3.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' aws-c-mqtt: '>=0.10.4,<0.10.5.0a0' - aws-c-s3: '>=0.5.9,<0.5.10.0a0' + aws-c-s3: '>=0.6.0,<0.6.1.0a0' aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.9-he3a8b3b_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.27.3-hda66527_2.conda hash: - md5: fbe6a256dd70a505730e7c461cd37a35 - sha256: bf77a2e96db6ea8271eb5ae1ebeaa4c50c8dcb1f0a5ec998d7601975c6185738 + md5: 734875312c8196feecc91f89856da612 + sha256: 3149277f03a55d7dcffdbe489863cacc36a831dbf38b9725bdc653a8c5de134f category: main optional: false - name: aws-crt-cpp - version: 0.26.9 + version: 0.27.3 manager: conda platform: linux-aarch64 dependencies: aws-c-auth: '>=0.7.22,<0.7.23.0a0' - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' - aws-c-http: '>=0.8.1,<0.8.2.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + aws-c-http: '>=0.8.2,<0.8.3.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' aws-c-mqtt: '>=0.10.4,<0.10.5.0a0' - aws-c-s3: '>=0.5.9,<0.5.10.0a0' + aws-c-s3: '>=0.6.0,<0.6.1.0a0' aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.26.9-h74ed545_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.27.3-h9b188e2_2.conda hash: - md5: c9d31ea9f2869e8927bf10287fe361c0 - sha256: 11e4055a1af742ab7ce5adea99e8e132787a0e9cab765e06924b81f44a6e4458 + md5: 58796590793f302e9f982dfb891c94eb + sha256: 4fc5ebb5c299946576fc4e2a4fd2dfc5f5a0988d0561c844de25fda28c364617 category: main optional: false - name: aws-crt-cpp - version: 0.26.9 + version: 0.27.3 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' aws-c-auth: '>=0.7.22,<0.7.23.0a0' - aws-c-cal: '>=0.6.14,<0.6.15.0a0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-cal: '>=0.7.1,<0.7.2.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' - aws-c-http: '>=0.8.1,<0.8.2.0a0' - aws-c-io: '>=0.14.8,<0.14.9.0a0' + aws-c-http: '>=0.8.2,<0.8.3.0a0' + aws-c-io: '>=0.14.10,<0.14.11.0a0' aws-c-mqtt: '>=0.10.4,<0.10.5.0a0' - aws-c-s3: '>=0.5.9,<0.5.10.0a0' + aws-c-s3: '>=0.6.0,<0.6.1.0a0' aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' libcxx: '>=16' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.26.9-h03bff2b_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.27.3-h9d3339c_2.conda hash: - md5: 690c2700092fbb8f5c36a08328d46e67 - sha256: 7386d9c4dc234b9d6beef421e580e8e78b46ee02ea08db3534c82a8fedc835a9 + md5: bca678a227f7083dffc3d4c0dbd9f2de + sha256: d863e05f421e23a7a7dc1bf545b409857bddac99231290af442a448d26143eb3 category: main optional: false - name: aws-sdk-cpp @@ -1033,19 +1042,20 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.19,<0.9.20.0a0' + __glibc: '>=2.17,<3.0.a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' - aws-crt-cpp: '>=0.26.9,<0.26.10.0a0' + aws-crt-cpp: '>=0.27.3,<0.27.4.0a0' libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<2.0.0a0' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-hba8bd5f_3.conda + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-h46c3b66_9.conda hash: - md5: 720494d9f06b4aff1270cffb7acc7920 - sha256: 62867a00265380921e3fea917031906f0e27887019a1083693e28f29c21193c8 + md5: c840f07ec58dc0b06041e7f36550a539 + sha256: 983f6977cc6b25c8bc785b20859970009242b3812e6b4de592ceb17caf93acb6 category: main optional: false - name: aws-sdk-cpp @@ -1053,19 +1063,19 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' - aws-crt-cpp: '>=0.26.9,<0.26.10.0a0' + aws-crt-cpp: '>=0.27.3,<0.27.4.0a0' libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<2.0.0a0' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.329-h4d1146e_3.conda + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.329-hecfb68f_9.conda hash: - md5: ba2b60503e865dac121c72b590491984 - sha256: b5419b778c99327b916df2459cdc98c862c1bf94e56a36550c31c324156bd0f7 + md5: 074782015c32b2870350b084935fcbe7 + sha256: 806e894bc94e9a9efe437337205ea43c4258f5cb77b1213004a203eb25d6b239 category: main optional: false - name: aws-sdk-cpp @@ -1074,197 +1084,201 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.19,<0.9.20.0a0' + aws-c-common: '>=0.9.23,<0.9.24.0a0' aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' - aws-crt-cpp: '>=0.26.9,<0.26.10.0a0' + aws-crt-cpp: '>=0.27.3,<0.27.4.0a0' libcurl: '>=8.8.0,<9.0a0' libcxx: '>=16' - libzlib: '>=1.2.13,<2.0.0a0' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.329-hb37a6d0_3.conda + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.329-he6360a2_9.conda hash: - md5: 4ff851b78abb8e837837f90c751b5db0 - sha256: fc73df0adaf2b795526bd175773c6bc041d08ba8e0a3490ee39738a7fd4f6a64 + md5: df8458d1bc6ec9616f8e88a0eadb05c7 + sha256: 46e6e18df4c9a8f8cd34ef0a1952dd2d96bf5fe78a1237d4bdeac212de2eb97d category: main optional: false - name: azure-core-cpp - version: 1.11.1 + version: 1.12.0 manager: conda platform: linux-64 dependencies: - libcurl: '>=8.5.0,<9.0a0' + libcurl: '>=8.7.1,<9.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.11.1-h91d86a7_1.conda + openssl: '>=3.3.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.12.0-h830ed8b_0.conda hash: - md5: 2dbab1d281b7e1da05eee544cbdc8af6 - sha256: 810a890bf66d6368637399ef415dcc8152acd28f4b4b61d4048b7be7cba17d4c + md5: 320d066f9cad598854f4af32c7c82931 + sha256: f76438c1f2a2c6142b344652c9fb93304cf1bb1534521f94c9c30fb9b238f0f5 category: main optional: false - name: azure-core-cpp - version: 1.11.1 + version: 1.12.0 manager: conda platform: linux-aarch64 dependencies: - libcurl: '>=8.5.0,<9.0a0' + libcurl: '>=8.7.1,<9.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.11.1-hcd87347_1.conda + openssl: '>=3.3.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.12.0-h60f91e5_0.conda hash: - md5: 4216b1aa6b460414bfc29095805b0b49 - sha256: 4d44a0ec2da59c20a9df6bc31e35309ee0280107ef1f9bd04fa11a7bbcc65bff + md5: efce605a7904816e95b1af4becdc1aac + sha256: 6279337ad9d15c01a6044b93d4074d70c56a5309c48c8dd70a3cc4c46af76870 category: main optional: false - name: azure-core-cpp - version: 1.11.1 + version: 1.12.0 manager: conda platform: osx-arm64 dependencies: - libcurl: '>=8.5.0,<9.0a0' + __osx: '>=11.0' + libcurl: '>=8.7.1,<9.0a0' libcxx: '>=16' - openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.11.1-he231e37_1.conda + openssl: '>=3.3.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.12.0-hd01fc5c_0.conda hash: - md5: db465e5fc631893677ed9a603c168475 - sha256: b923b2d25883569437b343d7223458568a235351871864e233166c0af471b731 + md5: 2accb43f3af2ebf2dbd127978242c10a + sha256: 046435d3502da0f13c13ee6d92d57684624bf18aefc0d84b99d3ed39d034b078 category: main optional: false - name: azure-identity-cpp - version: 1.6.0 + version: 1.8.0 manager: conda platform: linux-64 dependencies: - azure-core-cpp: '>=1.11.1,<1.11.2.0a0' + azure-core-cpp: '>=1.12.0,<1.12.1.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.6.0-hf1915f5_1.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.8.0-hdb0d106_1.conda hash: - md5: fd11ea65ceb397f9587b1d88a4329d73 - sha256: 42a9589abb90133047a6d041f1058c3c334bd1c155b1cc168d60c9d26f6360f1 + md5: a297ffb4b505f51d0f58352c5c13971b + sha256: 87420c137ae4d3e139cace9d9da8d63e6888d206f4eea0082975352d4ee65b14 category: main optional: false - name: azure-identity-cpp - version: 1.6.0 + version: 1.8.0 manager: conda platform: linux-aarch64 dependencies: - azure-core-cpp: '>=1.11.1,<1.11.2.0a0' + azure-core-cpp: '>=1.12.0,<1.12.1.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.6.0-hb6794ad_1.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.8.0-he93b4e3_1.conda hash: - md5: d2fae6c0025b15144fdbd90ccf170ecc - sha256: e44828a4af6c14d395951707048ec9f9a0b809bbe1a84fdda32978f4970951ba + md5: 97ce0ee943c701a57d3e752f477c6d9e + sha256: 7116cb52da12db9acd1c2528ccac1ef26ccffda69ed4f8c10c4bfb2f1b5a8054 category: main optional: false - name: azure-identity-cpp - version: 1.6.0 + version: 1.8.0 manager: conda platform: osx-arm64 dependencies: - azure-core-cpp: '>=1.11.1,<1.11.2.0a0' + __osx: '>=11.0' + azure-core-cpp: '>=1.12.0,<1.12.1.0a0' libcxx: '>=16' - openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.6.0-hd1853d3_1.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.8.0-h0a11218_1.conda hash: - md5: 38325823e16ad6789e3d7397761d18bd - sha256: d4fdbd53b67bd5ac17893cea877ea795f64acf1eb7c1e17dcb8f0120dea3f148 + md5: ed8853eaa0ea62cee06025902a46ff17 + sha256: 2e54b5d0bd189f43d93e5d3f93534d360c071a4fa4c9f1c9e17301cb29943d43 category: main optional: false - name: azure-storage-blobs-cpp - version: 12.10.0 + version: 12.11.0 manager: conda platform: linux-64 dependencies: - azure-core-cpp: '>=1.11.1,<1.11.2.0a0' - azure-storage-common-cpp: '>=12.5.0,<12.5.1.0a0' + azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + azure-storage-common-cpp: '>=12.6.0,<12.6.1.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.10.0-h00ab1b0_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.11.0-ha67cba7_1.conda hash: - md5: 1e63d3866554a4d2e3d1cba5f21a2841 - sha256: c88f6bc72ef42fd09471d4c4b2293fa17f730e3ba10290a0bb86de0ff7e9b195 + md5: f03bba57b85a5b3ac443a871787fc429 + sha256: 1dc694bcecdead2dbd871bb3abe5470c4473a7e46cfa39885aec70c230d3c16e category: main optional: false - name: azure-storage-blobs-cpp - version: 12.10.0 + version: 12.11.0 manager: conda platform: linux-aarch64 dependencies: - azure-core-cpp: '>=1.11.1,<1.11.2.0a0' - azure-storage-common-cpp: '>=12.5.0,<12.5.1.0a0' + azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + azure-storage-common-cpp: '>=12.6.0,<12.6.1.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.10.0-h2a328a1_1.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.11.0-h41c6e6e_1.conda hash: - md5: 6190ec9fd18387429ff3affaa34c2c02 - sha256: f14ce55ea476587331d3b4aa53ee264cf4598715b1d5443913a134dd8473ef42 + md5: 82d0b0535f080f7469a54f6a1c457623 + sha256: fee09cb912b40304cdbe87de3ae110bda2e15239b7e6fbe7e74944a9ccf1a82c category: main optional: false - name: azure-storage-blobs-cpp - version: 12.10.0 + version: 12.11.0 manager: conda platform: osx-arm64 dependencies: - azure-core-cpp: '>=1.11.1,<1.11.2.0a0' - azure-storage-common-cpp: '>=12.5.0,<12.5.1.0a0' + __osx: '>=11.0' + azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + azure-storage-common-cpp: '>=12.6.0,<12.6.1.0a0' libcxx: '>=16' - url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.10.0-h2ffa867_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.11.0-h77cc766_1.conda hash: - md5: 39b3f0ae5d50a2ca0e46386611da6f65 - sha256: 17005aa1dfbcd265ea638bc9566710a6b8c59267b7dae56b36d556f131938f0d + md5: 817fa040e0458866a658a471abc74c64 + sha256: 390ada2bad5c76b33ef3d2e9e03ee54f7245060a34d6b199117e956301101449 category: main optional: false - name: azure-storage-common-cpp - version: 12.5.0 + version: 12.6.0 manager: conda platform: linux-64 dependencies: - azure-core-cpp: '>=1.11.1,<1.11.2.0a0' + azure-core-cpp: '>=1.12.0,<1.12.1.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libxml2: '>=2.12.5,<3.0a0' - openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.5.0-h94269e2_4.conda + libxml2: '>=2.12.7,<3.0a0' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.6.0-he3f277c_1.conda hash: - md5: f364272cb4c2f4ce2341067107b82865 - sha256: 7143e85cfadcc3c789c879e66c3e6dbf8b6d5822d1d75b5b3063955279348233 + md5: 8a10bb068b138dd473300b5fe34a1865 + sha256: 464c687ed110befb4099be88ea69d2d2fd039a428ab6d9575ac9bf88e932dd55 category: main optional: false - name: azure-storage-common-cpp - version: 12.5.0 + version: 12.6.0 manager: conda platform: linux-aarch64 dependencies: - azure-core-cpp: '>=1.11.1,<1.11.2.0a0' + azure-core-cpp: '>=1.12.0,<1.12.1.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libxml2: '>=2.12.5,<3.0a0' - openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.5.0-h1090745_4.conda + libxml2: '>=2.12.7,<3.0a0' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.6.0-hc9a6983_1.conda hash: - md5: e326d1cf91f4b71d7aa3b550335dd06a - sha256: ad0071cd45386412f352cb3d6f05a68c968a2c35e7a9be4c287a5b46035c0be3 + md5: 592f0fcadd51dbaccba5e671cdd9bb11 + sha256: c3c372b24ba86aeb685dddc31d8ae39abf473494186bd5e89db7eade426cd3d5 category: main optional: false - name: azure-storage-common-cpp - version: 12.5.0 + version: 12.6.0 manager: conda platform: osx-arm64 dependencies: - azure-core-cpp: '>=1.11.1,<1.11.2.0a0' + __osx: '>=11.0' + azure-core-cpp: '>=1.12.0,<1.12.1.0a0' libcxx: '>=16' - libxml2: '>=2.12.5,<3.0a0' - openssl: '>=3.2.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.5.0-h09a5875_4.conda + libxml2: '>=2.12.7,<3.0a0' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.6.0-h7024f69_1.conda hash: - md5: 79913037a7d33c1e1246ef3fc95baf6d - sha256: 787ef00c1a57f2b29950854433e1f95bd3acb712bf80ec0f841145f8383b2d1e + md5: e796ec0c1c7486270353910f0683de86 + sha256: fbf126aad4d98627a32334cdff8e8f0626120a641f424e08d741595d8b6dc8de category: main optional: false - name: babel @@ -1343,42 +1357,42 @@ package: category: dev optional: true - name: beautifulsoup4 - version: 4.12.2 + version: 4.12.3 manager: conda platform: linux-64 dependencies: python: '>=3.12,<3.13.0a0' soupsieve: '>1.2' - url: https://repo.anaconda.com/pkgs/main/linux-64/beautifulsoup4-4.12.2-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/beautifulsoup4-4.12.3-py312h06a4308_0.conda hash: - md5: 92c78bee4e957e7c931d9f4862eff1c9 - sha256: 14a8ba1fc7e83db448c64aa7c7c0f9add30640ec0341008e7fabd5d083c7e2e7 + md5: 79afccbd2199c75b590ecac6228716f2 + sha256: da9d244e155f8e91702dc299af233e4092c8400c8fa0c0f9f62601490129b231 category: main optional: false - name: beautifulsoup4 - version: 4.12.2 + version: 4.12.3 manager: conda platform: linux-aarch64 dependencies: python: '>=3.12,<3.13.0a0' soupsieve: '>1.2' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/beautifulsoup4-4.12.2-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/beautifulsoup4-4.12.3-py312hd43f75c_0.conda hash: - md5: e6bcc57c66165eac40489d1b4f491156 - sha256: 819faad2401e2db06bb4fef57b533d7201bcc294590a343f5465495c15328e2d + md5: 3114001d782ce1398cbab98f14d9abb3 + sha256: 0667d75bcde01cf0aa168a49df558f1ece13158d78bb6c77312de691fee9c23c category: main optional: false - name: beautifulsoup4 - version: 4.12.2 + version: 4.12.3 manager: conda platform: osx-arm64 dependencies: python: '>=3.12,<3.13.0a0' soupsieve: '>1.2' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/beautifulsoup4-4.12.2-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/beautifulsoup4-4.12.3-py312hca03da5_0.conda hash: - md5: 1b6e8a8033f1c29e87705e6622c182b1 - sha256: c0b66110eb55c0ad19b8f795afa09b803789b6774672c69d93f2e3e149d21114 + md5: 4e825b5959ab6d043b86d013747a531c + sha256: a8a0f29de49ea1a66d68a07867716b7cefa3cc692ff8cfc52fb037607ca1a756 category: main optional: false - name: blas @@ -1496,54 +1510,54 @@ package: category: main optional: false - name: blosc - version: 1.21.5 + version: 1.21.6 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' lz4-c: '>=1.9.3,<1.10.0a0' snappy: '>=1.2.0,<1.3.0a0' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda hash: - md5: 11d76bee958b1989bd1ac6ee7372ea6d - sha256: fde5e8ad75d2a5f154e29da7763a5dd9ee5b5b5c3fc22a1f5170296c8f6f3f62 + md5: 54fe76ab3d0189acaef95156874db7f9 + sha256: 6cc260f9c6d32c5e728a2099a52fdd7ee69a782fff7b400d0606fcd32e0f5fd1 category: main optional: false - name: blosc - version: 1.21.5 + version: 1.21.6 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' lz4-c: '>=1.9.3,<1.10.0a0' snappy: '>=1.2.0,<1.3.0a0' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/blosc-1.21.5-hb65639f_1.conda + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/blosc-1.21.6-hd2997c2_0.conda hash: - md5: c1013d277e565996406fb6c377186a66 - sha256: 5c7479ead740c09992eba43a66c34f7e14bd41267ebe983163400234133b1d62 + md5: 7e34841d8b76a87cb9ed5b2028f0f37f + sha256: 4349c7227053c2042b0c31daf6782cbb29ed09557d2f08d7d710ef5288040e73 category: main optional: false - name: blosc - version: 1.21.5 + version: 1.21.6 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' libcxx: '>=16' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' lz4-c: '>=1.9.3,<1.10.0a0' snappy: '>=1.2.0,<1.3.0a0' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/blosc-1.21.5-h9c252e8_1.conda + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/blosc-1.21.6-h5499902_0.conda hash: - md5: e1be80625e4f6bdc2154ee099c641683 - sha256: 3b38493b95cc3d9f6369bbcbab55a2cdbbe6bbe32c74b923f8d638e874033139 + md5: e94ca7aec8544f700d45b24aff2dd4d7 + sha256: 5a1e635a371449a750b776cab64ad83f5218b58b3f137ebd33ad3ec17f1ce92e category: main optional: false - name: bottleneck @@ -1788,71 +1802,73 @@ package: category: main optional: false - name: c-ares - version: 1.28.1 + version: 1.32.2 manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda hash: - md5: dcde58ff9a1f30b0037a2315d1846d1f - sha256: cb25063f3342149c7924b21544109696197a9d774f1407567477d4f3026bf38a + md5: 8024af1ee7078e37fa3101c0a0296af2 + sha256: d1b01f9e3d10b97fd09e19fda0caf9bfad3c884a6b19fb3f654a9aed02a70b58 category: main optional: false - name: c-ares - version: 1.28.1 + version: 1.32.2 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.28.1-h31becfc_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.32.2-h68df207_0.conda hash: - md5: a8da75795c853c5fe6d8d1947e16eea8 - sha256: 0d7b310411f069975053ee5ce750fc6d8c368607164ce2a921a7a1a068dc137b + md5: dbb3ce53f75a17cf0da8c856b616b5d7 + sha256: 765ae3240d0e14b458ffa2f6c87652549100c32197ef141dfeb0a8bdf8b6cbb8 category: main optional: false - name: c-ares - version: 1.28.1 + version: 1.32.2 manager: conda platform: osx-arm64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.28.1-h93a5062_0.conda + dependencies: + __osx: '>=11.0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.32.2-h99b78c6_0.conda hash: - md5: 04f776a6139f7eafc2f38668570eb7db - sha256: 2fc553d7a75e912efbdd6b82cd7916cc9cb2773e6cd873b77e02d631dd7be698 + md5: b0bcd3b8a19fb530d6106467dc681bb4 + sha256: c9cb861e4cc5458df7e9277dd16623efc69491d1d74a85d826c121e2d831415c category: main optional: false - name: ca-certificates - version: 2024.3.11 + version: 2024.7.2 manager: conda platform: linux-64 dependencies: {} - url: https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2024.3.11-h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2024.7.2-h06a4308_0.conda hash: - md5: 08529eb3504712baabcbda266a19feb7 - sha256: 24b51217e99c7c4fb6ffe30f07eb93ce105ce1c9d38458b2763870c997825ca8 + md5: 5c6799c01e9be4c7ba294f6530b2d562 + sha256: da17e468bceb6bbb906d399b336cd641d439ee0fe8858f6c6ce7495b44c423c3 category: main optional: false - name: ca-certificates - version: 2024.3.11 + version: 2024.7.2 manager: conda platform: linux-aarch64 dependencies: {} - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/ca-certificates-2024.3.11-hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/ca-certificates-2024.7.2-hd43f75c_0.conda hash: - md5: da179176a7bdb660fca6cc0a200ce7cf - sha256: a17283a3927f112d66871631ef6be54efcbee9156582647d85949a570ee8ad0a + md5: 59816e22a577edcb05d16d81ef1d20df + sha256: e366681af05a10ab9e0b564612bb10eaa2b32e1a9d67a4a5dbc0203a60d1a2f7 category: main optional: false - name: ca-certificates - version: 2024.3.11 + version: 2024.7.2 manager: conda platform: osx-arm64 dependencies: {} - url: https://repo.anaconda.com/pkgs/main/osx-arm64/ca-certificates-2024.3.11-hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/ca-certificates-2024.7.2-hca03da5_0.conda hash: - md5: 16b410a7fcf89040fb5c10b683d6fb7a - sha256: 60ccd9d040e38a244bcab0e0e93cf5107ea552b6f935de5d73ec8d419c9e40df + md5: 7ae048fba174fdb742960fd9690ac553 + sha256: 9dff8a3b5dc03d6e57ad8e665fb9bb5c659bebf783ac9698b6d79c34d8ef25e7 category: main optional: false - name: cachecontrol @@ -2016,27 +2032,28 @@ package: manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' fontconfig: '>=2.14.2,<3.0a0' fonts-conda-ecosystem: '' freetype: '>=2.12.1,<3.0a0' - icu: '>=73.2,<74.0a0' + icu: '>=75.1,<76.0a0' libgcc-ng: '>=12' - libglib: '>=2.78.0,<3.0a0' - libpng: '>=1.6.39,<1.7.0a0' + libglib: '>=2.80.3,<3.0a0' + libpng: '>=1.6.43,<1.7.0a0' libstdcxx-ng: '>=12' - libxcb: '>=1.15,<1.16.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - pixman: '>=0.42.2,<1.0a0' + libxcb: '>=1.16,<1.17.0a0' + libzlib: '>=1.3.1,<2.0a0' + pixman: '>=0.43.2,<1.0a0' xorg-libice: '>=1.1.1,<2.0a0' xorg-libsm: '>=1.2.4,<2.0a0' - xorg-libx11: '>=1.8.6,<2.0a0' + xorg-libx11: '>=1.8.9,<2.0a0' xorg-libxext: '>=1.3.4,<2.0a0' xorg-libxrender: '>=0.9.11,<0.10.0a0' zlib: '' - url: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda hash: - md5: f907bb958910dc404647326ca80c263e - sha256: 142e2639a5bc0e99c44d76f4cc8dce9c6a2d87330c4beeabb128832cd871a86e + md5: fceaedf1cdbcb02df9699a0d9b005292 + sha256: aee5b9e6ef71cdfb2aee9beae3ea91910ca761c01c0ef32052e3f94a252fa173 category: main optional: false - name: cairo @@ -2047,24 +2064,24 @@ package: fontconfig: '>=2.14.2,<3.0a0' fonts-conda-ecosystem: '' freetype: '>=2.12.1,<3.0a0' - icu: '>=73.2,<74.0a0' + icu: '>=75.1,<76.0a0' libgcc-ng: '>=12' - libglib: '>=2.78.0,<3.0a0' - libpng: '>=1.6.39,<1.7.0a0' + libglib: '>=2.80.3,<3.0a0' + libpng: '>=1.6.43,<1.7.0a0' libstdcxx-ng: '>=12' - libxcb: '>=1.15,<1.16.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - pixman: '>=0.42.2,<1.0a0' + libxcb: '>=1.16,<1.17.0a0' + libzlib: '>=1.3.1,<2.0a0' + pixman: '>=0.43.4,<1.0a0' xorg-libice: '>=1.1.1,<2.0a0' xorg-libsm: '>=1.2.4,<2.0a0' - xorg-libx11: '>=1.8.6,<2.0a0' + xorg-libx11: '>=1.8.9,<2.0a0' xorg-libxext: '>=1.3.4,<2.0a0' xorg-libxrender: '>=0.9.11,<0.10.0a0' zlib: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.0-ha13f110_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.0-hdb1a16f_3.conda hash: - md5: 425111f8cc6945c5d1307357dd819b9b - sha256: 79b6323661b535d90aaec0eac0e91ccda88cc5917d9e597a03d7de183bc22f26 + md5: 080659f02bf2202c57f1cda4f9e51f21 + sha256: 8a747ad6ce32228a85c80bef8ec7387d71f8d2b0bf637edb56ff33e09794c616 category: main optional: false - name: cairo @@ -2072,57 +2089,57 @@ package: manager: conda platform: osx-arm64 dependencies: - __osx: '>=10.9' + __osx: '>=11.0' fontconfig: '>=2.14.2,<3.0a0' fonts-conda-ecosystem: '' freetype: '>=2.12.1,<3.0a0' - icu: '>=73.2,<74.0a0' - libcxx: '>=16.0.6' - libglib: '>=2.78.0,<3.0a0' - libpng: '>=1.6.39,<1.7.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - pixman: '>=0.42.2,<1.0a0' + icu: '>=75.1,<76.0a0' + libcxx: '>=16' + libglib: '>=2.80.3,<3.0a0' + libpng: '>=1.6.43,<1.7.0a0' + libzlib: '>=1.3.1,<2.0a0' + pixman: '>=0.43.4,<1.0a0' zlib: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.0-hd1e100b_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.0-hb4a6bf7_3.conda hash: - md5: 3fa6eebabb77f65e82f86b72b95482db - sha256: 599f8820553b3a3405706d9cad390ac199e24515a0a82c87153c9b5b5fdba3b8 + md5: 08bd0752f3de8a2d8a35fd012f09531f + sha256: f7603b7f6ee7c6e07c23d77302420194f4ec1b8e8facfff2b6aab17c7988a102 category: main optional: false - name: certifi - version: 2024.2.2 + version: 2024.7.4 manager: conda platform: linux-64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/certifi-2024.2.2-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/certifi-2024.7.4-py312h06a4308_0.conda hash: - md5: eb1a84cfcbb04105e1b2d28733773066 - sha256: f4fd9a29c2629c04b64a00014d641ee715a88c1a6c9a7d0583d1f6e89ca04165 + md5: f37039b8ad015d7c025624c7d9264a4e + sha256: 18025698641baf4c00db55c12be72ef6feb92ace5bd731f225c071059677e963 category: main optional: false - name: certifi - version: 2024.2.2 + version: 2024.7.4 manager: conda platform: linux-aarch64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/certifi-2024.2.2-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/certifi-2024.7.4-py312hd43f75c_0.conda hash: - md5: 20c57f07f221c0afb1f1b805cad963f3 - sha256: 34a40a45edd64fb82f953666f6387513640d84c7750524be9851113c6c98dc30 + md5: 343f7664a398914e55aba281b032f7dd + sha256: 1b61dc7d9d64bbbd0776a55255ceb6e96615bb36734071d19cd32251b6202668 category: main optional: false - name: certifi - version: 2024.2.2 + version: 2024.7.4 manager: conda platform: osx-arm64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/certifi-2024.2.2-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/certifi-2024.7.4-py312hca03da5_0.conda hash: - md5: 9f0a8caf865ed6690c9c70bc60c2a89d - sha256: 30d8ea5cede058d57b9761d55fd5b27646bc202d296a610bf64edf4f9e385ed4 + md5: c9d5db433e186ce8bf65ec945f048b05 + sha256: 6935058b62616ee31b13acd29f53ba1e87cf0a256562105fe374778d2cd47ba8 category: main optional: false - name: cffi @@ -2206,53 +2223,54 @@ package: category: dev optional: true - name: cfitsio - version: 4.4.0 + version: 4.4.1 manager: conda platform: linux-64 dependencies: bzip2: '>=1.0.8,<2.0a0' - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libgfortran-ng: '' libgfortran5: '>=12.3.0' - libzlib: '>=1.2.13,<2.0.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.4.0-hbdc6101_1.conda + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.4.1-hf8ad068_0.conda hash: - md5: 0ba5a427a51923dcdfe1121115ac8293 - sha256: 7113a60bc4d7cdb6881d01c91e0f1f88f5f625bb7d4c809677d08679c66dda7f + md5: 1b7a01fd02d11efe0eb5a676842a7b7d + sha256: 74ed4d8b327fa775d9c87e476a7221b74fb913aadcef207622596a99683c8faf category: main optional: false - name: cfitsio - version: 4.4.0 + version: 4.4.1 manager: conda platform: linux-aarch64 dependencies: bzip2: '>=1.0.8,<2.0a0' - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libgfortran-ng: '' libgfortran5: '>=12.3.0' - libzlib: '>=1.2.13,<2.0.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/cfitsio-4.4.0-hf28c5f1_1.conda + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/cfitsio-4.4.1-h14ced4b_0.conda hash: - md5: f04132064f0ffe9b19d33c7982b7f20b - sha256: d8f7543c73037c37af58ebfce8be3ab51fc31de149f5f61d4cad7b4d9981fa8b + md5: 48b3df2b55f007499bc4e69e408db019 + sha256: 0f7cbec989bea8c670989cbdeac0088bff4bf36cdc210ca57dad1ab7c98f90d8 category: main optional: false - name: cfitsio - version: 4.4.0 + version: 4.4.1 manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' bzip2: '>=1.0.8,<2.0a0' - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libgfortran: 5.* libgfortran5: '>=13.2.0' - libzlib: '>=1.2.13,<2.0.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/cfitsio-4.4.0-h808cd33_1.conda + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/cfitsio-4.4.1-h793ed5c_0.conda hash: - md5: 9413cd7e8cad79ef5bca73e1ca5a994f - sha256: e45dd58d752e30718422e596b5f98f679c19335c10bd426adb917ca4c5a5b697 + md5: c2a9a79b58d2de021ad9295f53e1f40a + sha256: cad6c9f86f98f1ac980e8229ef76a9bb8f62d167a52d29770e0548c7f9a80eb1 category: main optional: false - name: cftime @@ -2296,6 +2314,42 @@ package: sha256: 752b6470241691873a49ed2f565e48205df670ac49e4ff2dff330e41e50defcc category: main optional: false +- name: chardet + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-64/chardet-4.0.0-py312h06a4308_1003.conda + hash: + md5: 7dd0b18381d4e95f723afbde9171b3cf + sha256: 836353945233177320fa2e5fb127062523818c8107f4bd2aaf5d177e8ff7a8cd + category: main + optional: false +- name: chardet + version: 4.0.0 + manager: conda + platform: linux-aarch64 + dependencies: + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/chardet-4.0.0-py312hd43f75c_1003.conda + hash: + md5: 886d7b5caba55b22814ab1a92a678628 + sha256: f7c4d58aec76c3ba9612578d723f6825d2a0be6a15bf2a215a880a9aa2c05fa5 + category: main + optional: false +- name: chardet + version: 4.0.0 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/osx-arm64/chardet-4.0.0-py312hca03da5_1003.conda + hash: + md5: d277844c6d8c1efb863779c2eaaa5eec + sha256: b5303642fcc5cc70457ecdc606a217e35b0252ae7368f1ad45572ccba2454c08 + category: main + optional: false - name: charset-normalizer version: 2.0.4 manager: conda @@ -3086,42 +3140,42 @@ package: category: main optional: false - name: dep-logic - version: 0.2.0 + version: 0.4.2 manager: conda platform: linux-64 dependencies: packaging: '>=22' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.2.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.2-pyhd8ed1ab_0.conda hash: - md5: 412c94a992ba8c828624c2ecb476caf7 - sha256: 4a0eee0aa137cd11dec264d10afc97b584cf8828e267ec0629cb880728c3ac55 + md5: 3485b77f697e38cbab7b80d01533717a + sha256: 338f3fe279747eb3d81baddcb9a31dc628244b35119c745b0368e46a72588b47 category: main optional: false - name: dep-logic - version: 0.2.0 + version: 0.4.2 manager: conda platform: linux-aarch64 dependencies: packaging: '>=22' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.2.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.2-pyhd8ed1ab_0.conda hash: - md5: 412c94a992ba8c828624c2ecb476caf7 - sha256: 4a0eee0aa137cd11dec264d10afc97b584cf8828e267ec0629cb880728c3ac55 + md5: 3485b77f697e38cbab7b80d01533717a + sha256: 338f3fe279747eb3d81baddcb9a31dc628244b35119c745b0368e46a72588b47 category: main optional: false - name: dep-logic - version: 0.2.0 + version: 0.4.2 manager: conda platform: osx-arm64 dependencies: packaging: '>=22' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.2.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.2-pyhd8ed1ab_0.conda hash: - md5: 412c94a992ba8c828624c2ecb476caf7 - sha256: 4a0eee0aa137cd11dec264d10afc97b584cf8828e267ec0629cb880728c3ac55 + md5: 3485b77f697e38cbab7b80d01533717a + sha256: 338f3fe279747eb3d81baddcb9a31dc628244b35119c745b0368e46a72588b47 category: main optional: false - name: dill @@ -3468,81 +3522,6 @@ package: sha256: dc3fce66b6921ba10f1817b47ab0d3cb2af579b109237d117f3244473f7b6ee6 category: main optional: false -- name: fiona - version: 1.9.6 - manager: conda - platform: linux-64 - dependencies: - attrs: '>=19.2.0' - certifi: '' - click: '>=8.0,<9.dev0' - click-plugins: '>=1.0' - cligj: '>=0.5' - gdal: '' - libgcc-ng: '>=12' - libgdal: '>=3.8.5,<3.9.0a0' - libstdcxx-ng: '>=12' - numpy: '>=1.19,<3' - python: '>=3.12,<3.13.0a0' - python_abi: 3.12.* - shapely: '' - six: '' - url: https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.6-py312h39f3bbb_2.conda - hash: - md5: 027c465cb004970543b3641b4a0fef74 - sha256: d8ae1d5bc9f98c145bfd5c8b32f02ad7efee561b0dcdf69620e1a8e9c66d3eca - category: main - optional: false -- name: fiona - version: 1.9.6 - manager: conda - platform: linux-aarch64 - dependencies: - attrs: '>=19.2.0' - certifi: '' - click: '>=8.0,<9.dev0' - click-plugins: '>=1.0' - cligj: '>=0.5' - gdal: '' - libgcc-ng: '>=12' - libgdal: '>=3.8.5,<3.9.0a0' - libstdcxx-ng: '>=12' - numpy: '>=1.19,<3' - python: '>=3.12,<3.13.0a0' - python_abi: 3.12.* - shapely: '' - six: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/fiona-1.9.6-py312hfb41aa6_2.conda - hash: - md5: 8979b9cd0dcde1ff6e466f9d051e7ae2 - sha256: d5c5a80ffb5e493c1b1640e11df0e25936af02b6fa62979a33847f59df238f71 - category: main - optional: false -- name: fiona - version: 1.9.6 - manager: conda - platform: osx-arm64 - dependencies: - __osx: '>=11.0' - attrs: '>=19.2.0' - certifi: '' - click: '>=8.0,<9.dev0' - click-plugins: '>=1.0' - cligj: '>=0.5' - gdal: '' - libcxx: '>=16' - libgdal: '>=3.8.5,<3.9.0a0' - numpy: '>=1.19,<3' - python: '>=3.12,<3.13.0a0' - python_abi: 3.12.* - shapely: '' - six: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/fiona-1.9.6-py312h831b459_2.conda - hash: - md5: b9b2971bb07836eaaab90615c0fa7711 - sha256: 15654c44027326b1dabaa9dac41e4dd30385478af9358c072dfc9aebc1411b64 - category: main - optional: false - name: fmt version: 10.2.1 manager: conda @@ -3770,7 +3749,7 @@ package: freetype: '>=2.12.1,<3.0a0' libgcc-ng: '>=12' libuuid: '>=2.32.1,<3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda hash: md5: 0f69b688f52ff6da70bccb7ff7001d1d @@ -3786,7 +3765,7 @@ package: freetype: '>=2.12.1,<3.0a0' libgcc-ng: '>=12' libuuid: '>=2.32.1,<3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.14.2-ha9a116f_0.conda hash: md5: 6d2d19ea85f9d41534cd28fdefd59a25 @@ -3800,7 +3779,7 @@ package: dependencies: expat: '>=2.5.0,<3.0a0' freetype: '>=2.12.1,<3.0a0' - libzlib: '>=1.2.13,<1.3.0a0' + libzlib: '>=1.2.13,<2.0.0a0' url: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.14.2-h82840c6_0.conda hash: md5: f77d47ddb6d3cc5b39b9bdf65635afbb @@ -3937,13 +3916,13 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=11.2.0' - libpng: '>=1.6.37,<1.7.0a0' - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/freetype-2.12.1-h4a9f257_0.conda + libgcc-ng: '>=12' + libpng: '>=1.6.39,<1.7.0a0' + libzlib: '>=1.2.13,<2.0.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda hash: - md5: bdc7b5952e9c5dca01bc2f4ccef2f974 - sha256: d40c0f2889023791b4b9115cba9549fe97768bb2fa13d1721d8d095ff4f17a6f + md5: 9ae35c3d96db2c94ce0cef86efdfa2cb + sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 category: main optional: false - name: freetype @@ -3951,13 +3930,13 @@ package: manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=11.2.0' - libpng: '>=1.6.37,<1.7.0a0' - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/freetype-2.12.1-h6df46f4_0.conda + libgcc-ng: '>=12' + libpng: '>=1.6.39,<1.7.0a0' + libzlib: '>=1.2.13,<2.0.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda hash: - md5: 5d3ee61f9b7202230366b42536f9f17c - sha256: a377423cc6e5d11ecf49cb436dd892bc6ca91cbdf1549d777f7a9764bd30ccd6 + md5: a5ab74c5bd158c3d5532b66d8d83d907 + sha256: 7af93030f4407f076dce181062360efac2cd54dce863b5d7765287a6f5382537 category: main optional: false - name: freetype @@ -3965,12 +3944,12 @@ package: manager: conda platform: osx-arm64 dependencies: - libpng: '>=1.6.37,<1.7.0a0' - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/freetype-2.12.1-h1192e45_0.conda + libpng: '>=1.6.39,<1.7.0a0' + libzlib: '>=1.2.13,<2.0.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda hash: - md5: 34e2801b75936fcfe2602485335e8a31 - sha256: 9b3b2a154bdd2780143e952305f536fb8c8b4967a22edad48f34541a307341a2 + md5: e6085e516a3e304ce41a8ee08b9b89ad + sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 category: main optional: false - name: freexl @@ -4029,13 +4008,13 @@ package: libstdcxx-ng: '>=12' libxml2: '>=2.12.7,<3.0a0' numpy: '>=1.19,<3' - openssl: '>=3.3.0,<4.0a0' + openssl: '>=3.3.1,<4.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-64/gdal-3.8.5-py312h86af8fa_7.conda + url: https://conda.anaconda.org/conda-forge/linux-64/gdal-3.8.5-py312h86af8fa_11.conda hash: - md5: 489da43908a2583ab6a7549747a41e56 - sha256: f271bc459a94b81b512b3a5cc2cadf708117c322beae04456efc8c2f51258d52 + md5: 5440cac70586e8653b26aa5f2860c101 + sha256: cd8179599f65f0df37849ada9d1614b98ce9c8097fbfa878f7b25c6f1878768e category: main optional: false - name: gdal @@ -4049,13 +4028,13 @@ package: libstdcxx-ng: '>=12' libxml2: '>=2.12.7,<3.0a0' numpy: '>=1.19,<3' - openssl: '>=3.3.0,<4.0a0' + openssl: '>=3.3.1,<4.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-aarch64/gdal-3.8.5-py312h0d36065_7.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/gdal-3.8.5-py312h0d36065_11.conda hash: - md5: 18263800f50e59548732ea46d097f85e - sha256: de7b9dfd20ff77c017086c0f4d0833af82462de4d125f871e4a69365c6c6ad29 + md5: f2612184568cd842d0afa869afd32172 + sha256: 2b0056af29c9b8373661a03d65511ca63850235b53f3588673db2c2468fcfc49 category: main optional: false - name: gdal @@ -4069,13 +4048,13 @@ package: libgdal: 3.8.5 libxml2: '>=2.12.7,<3.0a0' numpy: '>=1.19,<3' - openssl: '>=3.3.0,<4.0a0' + openssl: '>=3.3.1,<4.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/gdal-3.8.5-py312hf4c14af_7.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/gdal-3.8.5-py312hf4c14af_11.conda hash: - md5: 5ac8c6a4c68f033ee0e21ebafc188434 - sha256: 3410de57b082435626b2e7b19cda00b34d1b4ee22c15137950293381f244ac95 + md5: d10be1493eccf1e9367e8231a13a8c96 + sha256: 32cc32366164b18863dab75113c42a1b452dec8f30cffb70532eb18decbb0f64 category: main optional: false - name: gdbm @@ -4117,108 +4096,108 @@ package: category: main optional: false - name: geopandas - version: 0.14.4 + version: 1.0.1 manager: conda platform: linux-64 dependencies: - fiona: '>=1.8.21' folium: '' - geopandas-base: 0.14.4 + geopandas-base: 1.0.1 mapclassify: '>=2.4.0' matplotlib-base: '' + pyogrio: '>=0.7.2' + pyproj: '>=3.3.0' python: '>=3.9' - rtree: '' xyzservices: '' - url: https://conda.anaconda.org/conda-forge/noarch/geopandas-0.14.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.0.1-pyhd8ed1ab_0.conda hash: - md5: acc01facf6f915b6289a064957a58cc1 - sha256: a08d4c641dbf7b27b1195c270816cea801edae74dd609012d03ae5ad35c9dccc + md5: efef4ce75a678216d510d08222845c7f + sha256: 6d3f8148d88b1f2c100e03fce441f19577f6a4b69e3a2c57d522b48010d84f5f category: main optional: false - name: geopandas - version: 0.14.4 + version: 1.0.1 manager: conda platform: linux-aarch64 dependencies: - fiona: '>=1.8.21' folium: '' - geopandas-base: 0.14.4 + geopandas-base: 1.0.1 mapclassify: '>=2.4.0' matplotlib-base: '' + pyogrio: '>=0.7.2' + pyproj: '>=3.3.0' python: '>=3.9' - rtree: '' xyzservices: '' - url: https://conda.anaconda.org/conda-forge/noarch/geopandas-0.14.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.0.1-pyhd8ed1ab_0.conda hash: - md5: acc01facf6f915b6289a064957a58cc1 - sha256: a08d4c641dbf7b27b1195c270816cea801edae74dd609012d03ae5ad35c9dccc + md5: efef4ce75a678216d510d08222845c7f + sha256: 6d3f8148d88b1f2c100e03fce441f19577f6a4b69e3a2c57d522b48010d84f5f category: main optional: false - name: geopandas - version: 0.14.4 + version: 1.0.1 manager: conda platform: osx-arm64 dependencies: - fiona: '>=1.8.21' folium: '' - geopandas-base: 0.14.4 + geopandas-base: 1.0.1 mapclassify: '>=2.4.0' matplotlib-base: '' + pyogrio: '>=0.7.2' + pyproj: '>=3.3.0' python: '>=3.9' - rtree: '' xyzservices: '' - url: https://conda.anaconda.org/conda-forge/noarch/geopandas-0.14.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.0.1-pyhd8ed1ab_0.conda hash: - md5: acc01facf6f915b6289a064957a58cc1 - sha256: a08d4c641dbf7b27b1195c270816cea801edae74dd609012d03ae5ad35c9dccc + md5: efef4ce75a678216d510d08222845c7f + sha256: 6d3f8148d88b1f2c100e03fce441f19577f6a4b69e3a2c57d522b48010d84f5f category: main optional: false - name: geopandas-base - version: 0.14.4 + version: 1.0.1 manager: conda platform: linux-64 dependencies: + numpy: '>=1.22' packaging: '' pandas: '>=1.4.0' - pyproj: '>=3.3.0' python: '>=3.9' - shapely: '>=1.8.0' - url: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-0.14.4-pyha770c72_0.conda + shapely: '>=2.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.0.1-pyha770c72_0.conda hash: - md5: b7a9e8e5865cc474fb0856577898316a - sha256: 9dc4b7ee08b60be28a7284104e7147ecf23fcbe3718eeb271712deb92ff3ff06 + md5: 1b7d46173c29e14dde41f97cf5aa61df + sha256: b07d76f79cc3b1dc7f5a73aeeb0f7c9977526d73237df7e200582fdff48045d1 category: main optional: false - name: geopandas-base - version: 0.14.4 + version: 1.0.1 manager: conda platform: linux-aarch64 dependencies: + numpy: '>=1.22' packaging: '' pandas: '>=1.4.0' - pyproj: '>=3.3.0' python: '>=3.9' - shapely: '>=1.8.0' - url: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-0.14.4-pyha770c72_0.conda + shapely: '>=2.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.0.1-pyha770c72_0.conda hash: - md5: b7a9e8e5865cc474fb0856577898316a - sha256: 9dc4b7ee08b60be28a7284104e7147ecf23fcbe3718eeb271712deb92ff3ff06 + md5: 1b7d46173c29e14dde41f97cf5aa61df + sha256: b07d76f79cc3b1dc7f5a73aeeb0f7c9977526d73237df7e200582fdff48045d1 category: main optional: false - name: geopandas-base - version: 0.14.4 + version: 1.0.1 manager: conda platform: osx-arm64 dependencies: + numpy: '>=1.22' packaging: '' pandas: '>=1.4.0' - pyproj: '>=3.3.0' python: '>=3.9' - shapely: '>=1.8.0' - url: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-0.14.4-pyha770c72_0.conda + shapely: '>=2.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.0.1-pyha770c72_0.conda hash: - md5: b7a9e8e5865cc474fb0856577898316a - sha256: 9dc4b7ee08b60be28a7284104e7147ecf23fcbe3718eeb271712deb92ff3ff06 + md5: 1b7d46173c29e14dde41f97cf5aa61df + sha256: b07d76f79cc3b1dc7f5a73aeeb0f7c9977526d73237df7e200582fdff48045d1 category: main optional: false - name: geos @@ -4270,13 +4249,13 @@ package: libjpeg-turbo: '>=3.0.0,<4.0a0' libstdcxx-ng: '>=12' libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - proj: '>=9.4.0,<9.4.1.0a0' + libzlib: '>=1.3.1,<2.0a0' + proj: '>=9.4.0,<9.5.0a0' zlib: '' - url: https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.3-h928be8b_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.3-hf7fa9e8_1.conda hash: - md5: c0f2468661b7cae54a7a1ff11926e372 - sha256: 6c516f674c0bee8de4990b47c980461f6943beeaced675f67e0ba94fa2115f4c + md5: 8ff4fa3ab0b63dc5b214a68839499e41 + sha256: df00139c22b1b2ab1e1e48bb94c68febcc40a7ca812bd4f228a3e09ac9d2cdf2 category: main optional: false - name: geotiff @@ -4288,13 +4267,13 @@ package: libjpeg-turbo: '>=3.0.0,<4.0a0' libstdcxx-ng: '>=12' libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - proj: '>=9.4.0,<9.4.1.0a0' + libzlib: '>=1.3.1,<2.0a0' + proj: '>=9.4.0,<9.5.0a0' zlib: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/geotiff-1.7.3-he2c3a67_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/geotiff-1.7.3-h1116711_1.conda hash: - md5: 2b958fc6128429f4ae9eafac2933d171 - sha256: 286d2feac5a1cdd13507e7eb64ff92f733569487e9a5e94358ce761470fa40ec + md5: 59b08de08f514190268471a843a9a44d + sha256: 89c2e04b0ce411787d187d1d4c35832075126ee18ccd5b3b4cd952951a85d65d category: main optional: false - name: geotiff @@ -4306,13 +4285,13 @@ package: libcxx: '>=16' libjpeg-turbo: '>=3.0.0,<4.0a0' libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - proj: '>=9.4.0,<9.4.1.0a0' + libzlib: '>=1.3.1,<2.0a0' + proj: '>=9.4.0,<9.5.0a0' zlib: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/geotiff-1.7.3-h9521f69_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/geotiff-1.7.3-h7e5fb84_1.conda hash: - md5: 0d1bc7bfdeee2e2fb9b683a328c4664f - sha256: 3df1801b2dab8c688e0e81b64bf5012a9c92841409216041607b45b768c29104 + md5: 5e689f0ec059ec6fa91deb388f4d9510 + sha256: d25259c84a706a2bf9568c96b68e198a1155c8761b6788fe00d4b15ca21f12f7 category: main optional: false - name: giflib @@ -4390,142 +4369,142 @@ package: category: main optional: false - name: gitpython - version: 3.1.37 + version: 3.1.43 manager: conda platform: linux-64 dependencies: gitdb: '>=4.0.1,<5' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/gitpython-3.1.37-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/gitpython-3.1.43-py312h06a4308_0.conda hash: - md5: 447f9e5b301814c2e2ad7c485f626731 - sha256: 50494135a61bfc8582c26dbbc5beb2abbcef024bb8c60024cb4e782cfe429075 + md5: a5bb051e5739c6701297408439f7b1fc + sha256: 3ad9f8ff1c848afb42474b7fbbc6cbb6bad562c679a0acd55927ff02e0a08bad category: main optional: false - name: gitpython - version: 3.1.37 + version: 3.1.43 manager: conda platform: linux-aarch64 dependencies: gitdb: '>=4.0.1,<5' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/gitpython-3.1.37-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/gitpython-3.1.43-py312hd43f75c_0.conda hash: - md5: ba6f03fcc673053f93187df426e57b9a - sha256: f932bac04d968bc9925bc5c483254843f6e3c4ddc24a6858da32b8475db42210 + md5: 73bb78a1a27b577b44f41926b2a9f758 + sha256: ec9e05a8af3f5257e515b651c3a4e2128651d01bc047bd2fcd182ebf575ca046 category: main optional: false - name: gitpython - version: 3.1.37 + version: 3.1.43 manager: conda platform: osx-arm64 dependencies: gitdb: '>=4.0.1,<5' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/gitpython-3.1.37-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/gitpython-3.1.43-py312hca03da5_0.conda hash: - md5: d6431718e998be0cf1e950268f07f24d - sha256: e629e8d2a2644dd0118d9ffde390a268250e432992ee2353ceade57a7217da14 + md5: c7b443141a3ffbbaace2dfc4eec3aca2 + sha256: 201f3925677f97375d65cff8290121b1ef74942fa9c9e675b81bd52bfc8ad895 category: main optional: false - name: glib - version: 2.80.2 + version: 2.80.3 manager: conda platform: linux-64 dependencies: - glib-tools: 2.80.2 + glib-tools: 2.80.3 libffi: '>=3.4,<4.0a0' libgcc-ng: '>=12' - libglib: 2.80.2 + libglib: 2.80.3 python: '*' - url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.3-h8a4344b_1.conda hash: - md5: d427988dc3dbd0a4c136f52db356cc6a - sha256: d10a0f194d2c125617352a81a4ff43a17cf5835e88e8f151da9f9710e2db176d + md5: a3acc4920c9ca19cb6b295028d606477 + sha256: 51db16c42f0f07aa9d4f922a629d8f68fe3b2590917b8282b7e8ab5ced45c0f6 category: main optional: false - name: glib - version: 2.80.2 + version: 2.80.3 manager: conda platform: linux-aarch64 dependencies: - glib-tools: 2.80.2 + glib-tools: 2.80.3 libffi: '>=3.4,<4.0a0' libgcc-ng: '>=12' - libglib: 2.80.2 + libglib: 2.80.3 python: '*' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/glib-2.80.2-h34bac0b_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/glib-2.80.3-haee52c6_1.conda hash: - md5: 45c88954bba87523c331588d338e6ad4 - sha256: 81b2c2fb62042f2a0f0aaf57a693f2da903a072b6191117c5e3a516c1cf16de7 + md5: d8e86dad46eb1b1b2748d7b7c2c52517 + sha256: 639f62d8baaff5b273dfc53d0ca0bceed549ef38feaa2a6b0c23da2bfdc6568b category: main optional: false - name: glib-tools - version: 2.80.2 + version: 2.80.3 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' - libglib: 2.80.2 - url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.conda + libglib: 2.80.3 + url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.3-h73ef956_1.conda hash: - md5: a965aeaf060289528a3fbe09326edae2 - sha256: 221cd047f998301b96b1517d9f7d3fb0e459e8ee18778a1211f302496f6e110d + md5: 99701cdc9a25a333d15265d1d243b2dc + sha256: 1cbaa71af8ed506c158e345e3f951b4f36506f96e957b9486dea5eaca86252b2 category: main optional: false - name: glib-tools - version: 2.80.2 + version: 2.80.3 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - libglib: 2.80.2 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/glib-tools-2.80.2-he16435f_0.conda + libglib: 2.80.3 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/glib-tools-2.80.3-hdaf7ded_1.conda hash: - md5: 58c5da9e8928edb925825c22c08a4043 - sha256: 788d1edabf51f7a5e305d4a8c00343770674e7ee0784604b0611958d7ee009c4 + md5: 458c4df163eb4d4eb2fa557b87a84170 + sha256: 5fc61a57d90786742fd23e53e5ff32f276d7e9409b4b42aaf37a20c975c82ccd category: main optional: false - name: griffe - version: 0.45.2 + version: 0.48.0 manager: conda platform: linux-64 dependencies: astunparse: '>=1.6' colorama: '>=0.4' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.45.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.48.0-pyhd8ed1ab_0.conda hash: - md5: 409a74bc6c127c7a623777547d03d587 - sha256: d1e59d459a6e2d14a77bd327523ac19caa1b03bba732622d603b6cbb70b35d6b + md5: 73aafef908b0b8948d739e11ebf92d32 + sha256: 528411c09a2a7bd0a6590601f89ca9a21fe9fb908a67e87d889d2a86205dd850 category: dev optional: true - name: griffe - version: 0.45.2 + version: 0.48.0 manager: conda platform: linux-aarch64 dependencies: astunparse: '>=1.6' colorama: '>=0.4' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.45.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.48.0-pyhd8ed1ab_0.conda hash: - md5: 409a74bc6c127c7a623777547d03d587 - sha256: d1e59d459a6e2d14a77bd327523ac19caa1b03bba732622d603b6cbb70b35d6b + md5: 73aafef908b0b8948d739e11ebf92d32 + sha256: 528411c09a2a7bd0a6590601f89ca9a21fe9fb908a67e87d889d2a86205dd850 category: dev optional: true - name: griffe - version: 0.45.2 + version: 0.48.0 manager: conda platform: osx-arm64 dependencies: astunparse: '>=1.6' colorama: '>=0.4' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.45.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.48.0-pyhd8ed1ab_0.conda hash: - md5: 409a74bc6c127c7a623777547d03d587 - sha256: d1e59d459a6e2d14a77bd327523ac19caa1b03bba732622d603b6cbb70b35d6b + md5: 73aafef908b0b8948d739e11ebf92d32 + sha256: 528411c09a2a7bd0a6590601f89ca9a21fe9fb908a67e87d889d2a86205dd850 category: dev optional: true - name: h11 @@ -4620,11 +4599,11 @@ package: libgfortran5: '>=12.3.0' libstdcxx-ng: '>=12' libzlib: '>=1.2.13,<2.0a0' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_103.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda hash: - md5: ef50687276c086d59006696e1153fd60 - sha256: 2bfb909c1baf041f45ce64c7c76a954e8560b8e7ce5ed22ccb7265168288c771 + md5: 7e1729554e209627636a0f6fabcdd115 + sha256: 2278fa07da6f96e807d402cd55480624d67d2dee202191aaaf278ce5ab23605a category: main optional: false - name: hdf5 @@ -4639,11 +4618,11 @@ package: libgfortran5: '>=12.3.0' libstdcxx-ng: '>=12' libzlib: '>=1.2.13,<2.0a0' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.3-nompi_hd1676c9_103.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.3-nompi_hd1676c9_105.conda hash: - md5: c8a665df88f6d87a04d70a4143d744e8 - sha256: e1a68fa2b125d8f53cd78b5d24412f5185e26d350eb1ca007b077c118f9d14c3 + md5: 55dd1e8edf52fc44e71cf1c6890032c8 + sha256: 1361452c161a780f0e1e7a185917d738b609327350ef1711430cd9e06a881b84 category: main optional: false - name: hdf5 @@ -4658,11 +4637,53 @@ package: libgfortran: 5.* libgfortran5: '>=13.2.0' libzlib: '>=1.2.13,<2.0a0' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.3-nompi_hec07895_103.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.3-nompi_hec07895_105.conda + hash: + md5: f9c8c7304d52c8846eab5d6c34219812 + sha256: 5d87a1b63862e7da78c7bd9c17dea3526c0462c11df9004943cfa4569cc25dd3 + category: main + optional: false +- name: hishel + version: 0.0.30 + manager: conda + platform: linux-64 + dependencies: + httpx: '>=0.22.0' + python: '>=3.8' + typing-extensions: '>=4.8.0' + url: https://conda.anaconda.org/conda-forge/noarch/hishel-0.0.30-pyhd8ed1ab_0.conda + hash: + md5: d6dea11fccceebd0f67c6f472d66c32e + sha256: 8119d8102307be855b1c2d01bd74a2b117cd5a65ebc053b796de32b4a2e6d6a6 + category: main + optional: false +- name: hishel + version: 0.0.30 + manager: conda + platform: linux-aarch64 + dependencies: + httpx: '>=0.22.0' + python: '>=3.8' + typing-extensions: '>=4.8.0' + url: https://conda.anaconda.org/conda-forge/noarch/hishel-0.0.30-pyhd8ed1ab_0.conda hash: - md5: 198270148a9c94ab7b3635e23b0926d4 - sha256: 942970f90942d4f8d71f8a1e17b018084b4f28e9eefa231ff008965b112e7091 + md5: d6dea11fccceebd0f67c6f472d66c32e + sha256: 8119d8102307be855b1c2d01bd74a2b117cd5a65ebc053b796de32b4a2e6d6a6 + category: main + optional: false +- name: hishel + version: 0.0.30 + manager: conda + platform: osx-arm64 + dependencies: + httpx: '>=0.22.0' + python: '>=3.8' + typing-extensions: '>=4.8.0' + url: https://conda.anaconda.org/conda-forge/noarch/hishel-0.0.30-pyhd8ed1ab_0.conda + hash: + md5: d6dea11fccceebd0f67c6f472d66c32e + sha256: 8119d8102307be855b1c2d01bd74a2b117cd5a65ebc053b796de32b4a2e6d6a6 category: main optional: false - name: html5lib @@ -4801,40 +4822,42 @@ package: category: main optional: false - name: icu - version: '73.2' + version: '75.1' manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda hash: - md5: cc47e1facc155f91abd89b11e48e72ff - sha256: e12fd90ef6601da2875ebc432452590bc82a893041473bc1c13ef29001a73ea8 + md5: 8b189310083baabfb622af68fd9d3ae3 + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e category: main optional: false - name: icu - version: '73.2' + version: '75.1' manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-73.2-h787c7f5_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda hash: - md5: 9d3c29d71f28452a2e843aff8cbe09d2 - sha256: aedb9c911ede5596c87e1abd763ed940fab680d71fdb953bce8e4094119d47b3 + md5: 268203e8b983fddb6412b36f2024e75c + sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 category: main optional: false - name: icu - version: '73.2' + version: '75.1' manager: conda platform: osx-arm64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda + dependencies: + __osx: '>=11.0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda hash: - md5: 8521bd47c0e11c5902535bb1a17c565f - sha256: ff9cd0c6cd1349954c801fb443c94192b637e1b414514539f3c49c56a39f51b1 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 category: main optional: false - name: identify @@ -4952,44 +4975,44 @@ package: category: main optional: false - name: importlib-resources - version: 6.1.1 + version: 6.4.0 manager: conda platform: linux-64 dependencies: - importlib_resources: '>=6.1.1,<6.1.2.0a0' + importlib_resources: '>=6.4.0,<6.4.1.0a0' python: '' - url: https://repo.anaconda.com/pkgs/main/noarch/importlib-resources-6.1.1-pyhd3eb1b0_1.conda + url: https://repo.anaconda.com/pkgs/main/noarch/importlib-resources-6.4.0-pyhd3eb1b0_0.conda hash: - md5: 3af35c818b28c6c6732a7acafefc9d2a - sha256: 4d5dce885dc25ec8028f61723a6e482dc95a2167205f0383b3c2e9365f3770f9 - category: dev - optional: true + md5: aa55412fcedec462ae11b5dc96a47e7d + sha256: 8dd1b4fc320f9526e559e32f67e456c5d95c3c3ae4e6edcd012006cb24aa7276 + category: main + optional: false - name: importlib-resources - version: 6.1.1 + version: 6.4.0 manager: conda platform: linux-aarch64 dependencies: - importlib_resources: '>=6.1.1,<6.1.2.0a0' + importlib_resources: '>=6.4.0,<6.4.1.0a0' python: '' - url: https://repo.anaconda.com/pkgs/main/noarch/importlib-resources-6.1.1-pyhd3eb1b0_1.conda + url: https://repo.anaconda.com/pkgs/main/noarch/importlib-resources-6.4.0-pyhd3eb1b0_0.conda hash: - md5: 3af35c818b28c6c6732a7acafefc9d2a - sha256: 4d5dce885dc25ec8028f61723a6e482dc95a2167205f0383b3c2e9365f3770f9 - category: dev - optional: true + md5: aa55412fcedec462ae11b5dc96a47e7d + sha256: 8dd1b4fc320f9526e559e32f67e456c5d95c3c3ae4e6edcd012006cb24aa7276 + category: main + optional: false - name: importlib-resources - version: 6.1.1 + version: 6.4.0 manager: conda platform: osx-arm64 dependencies: - importlib_resources: '>=6.1.1,<6.1.2.0a0' + importlib_resources: '>=6.4.0,<6.4.1.0a0' python: '' - url: https://repo.anaconda.com/pkgs/main/noarch/importlib-resources-6.1.1-pyhd3eb1b0_1.conda + url: https://repo.anaconda.com/pkgs/main/noarch/importlib-resources-6.4.0-pyhd3eb1b0_0.conda hash: - md5: 3af35c818b28c6c6732a7acafefc9d2a - sha256: 4d5dce885dc25ec8028f61723a6e482dc95a2167205f0383b3c2e9365f3770f9 - category: dev - optional: true + md5: aa55412fcedec462ae11b5dc96a47e7d + sha256: 8dd1b4fc320f9526e559e32f67e456c5d95c3c3ae4e6edcd012006cb24aa7276 + category: main + optional: false - name: importlib_metadata version: 7.0.1 manager: conda @@ -5027,39 +5050,39 @@ package: category: main optional: false - name: importlib_resources - version: 6.1.1 + version: 6.4.0 manager: conda platform: linux-64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/importlib_resources-6.1.1-py312h06a4308_1.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/importlib_resources-6.4.0-py312h06a4308_0.conda hash: - md5: 13691687030e6f6b299bd04173696daf - sha256: 8e91d4087ea242761b4fb78d14348e1a85d423ae855db3de79d19c3e34ed2fa8 + md5: eba0787f42c16ce32c303817d17907a9 + sha256: 78a954fb80975380d9f63763d794e3eb3ce8d671887711ee455af8c8a4330631 category: main optional: false - name: importlib_resources - version: 6.1.1 + version: 6.4.0 manager: conda platform: linux-aarch64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/importlib_resources-6.1.1-py312hd43f75c_1.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/importlib_resources-6.4.0-py312hd43f75c_0.conda hash: - md5: 1ad037c2deb3322daff439b1cd71badf - sha256: 8b8a4babc7554803f3696f26ec277bcf37dcf80a265990e1340a17169da0a8c4 + md5: 1637662a3245973bf47f419fc661f7c7 + sha256: da753042b81841a578f934531b3a4312a86ecc168fb5e595d3a33ca8c81c8194 category: main optional: false - name: importlib_resources - version: 6.1.1 + version: 6.4.0 manager: conda platform: osx-arm64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/importlib_resources-6.1.1-py312hca03da5_1.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/importlib_resources-6.4.0-py312hca03da5_0.conda hash: - md5: dae3a06b165c071e86feb8eeeef7518f - sha256: 9bf61f2650055dcfc95316e2b0ed80041c7adc7794802558670b42312364fb12 + md5: c477e70fc2452e2fcda31710d6345df8 + sha256: ebff57483bb00a729c2d1d27f7023a8d02cca840035d35bb776dd91100e28457 category: main optional: false - name: iniconfig @@ -5172,7 +5195,7 @@ package: category: main optional: false - name: ipython - version: 8.20.0 + version: 8.25.0 manager: conda platform: linux-64 dependencies: @@ -5184,15 +5207,15 @@ package: pygments: '>=2.4.0' python: '>=3.12,<3.13.0a0' stack_data: '' - traitlets: '>=5' - url: https://repo.anaconda.com/pkgs/main/linux-64/ipython-8.20.0-py312h06a4308_0.conda + traitlets: '>=5.13.0' + url: https://repo.anaconda.com/pkgs/main/linux-64/ipython-8.25.0-py312h06a4308_0.conda hash: - md5: acbc198f40955d3ab40f666188371988 - sha256: a0dd2e801bf358b5dda8e8ba61140cbf13c5cee73ddea0732705f3fd109466ee + md5: 2c767a19ad2dee3fffccf0dc57c51c42 + sha256: 269718a49e125534f024841e41c3507bf1f266e9c13e1bb32ce2bbb7deb1b6ff category: main optional: false - name: ipython - version: 8.20.0 + version: 8.25.0 manager: conda platform: linux-aarch64 dependencies: @@ -5204,15 +5227,15 @@ package: pygments: '>=2.4.0' python: '>=3.12,<3.13.0a0' stack_data: '' - traitlets: '>=5' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/ipython-8.20.0-py312hd43f75c_0.conda + traitlets: '>=5.13.0' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/ipython-8.25.0-py312hd43f75c_0.conda hash: - md5: 934e2c072cab0f47c1fac67d8a31b85e - sha256: 085b24220b29aea52796d21c0cd2c24cdc5168caa69b88a85739083cacafcfb1 + md5: 90361289fbca22045aab80819be57646 + sha256: bd7a8e9924fc3dc35e50ce0e0ebb5d3064bc8936eba1698d6d03a3f8624ec881 category: main optional: false - name: ipython - version: 8.20.0 + version: 8.25.0 manager: conda platform: osx-arm64 dependencies: @@ -5224,11 +5247,11 @@ package: pygments: '>=2.4.0' python: '>=3.12,<3.13.0a0' stack_data: '' - traitlets: '>=5' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/ipython-8.20.0-py312hca03da5_0.conda + traitlets: '>=5.13.0' + url: https://repo.anaconda.com/pkgs/main/osx-arm64/ipython-8.25.0-py312hca03da5_0.conda hash: - md5: 8a3f1eb8fdff6ede9368e679fc39b880 - sha256: d067ec8b87e6817791324234da90b6bf2013a91a4dcf93f5550ce7c24cbec3b9 + md5: e4c4c44a340cda494b045ce4a5015d80 + sha256: 252a1cd09f2a7cc1bb9742dfb02c5cf324f2b49bafc35d899d34f42b58bf3bf8 category: main optional: false - name: jaraco.classes @@ -5271,42 +5294,42 @@ package: category: main optional: false - name: jedi - version: 0.18.1 + version: 0.19.1 manager: conda platform: linux-64 dependencies: - parso: '>=0.8.0,<0.9.0' + parso: '>=0.8.3,<0.9.0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/jedi-0.18.1-py312h06a4308_1.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/jedi-0.19.1-py312h06a4308_0.conda hash: - md5: 6bbccab0eb9ae37d881f84f9f19cea8a - sha256: ef51c477e2624ea3d898e119f2f3c4cde559d7fbbaab4f5dd91d86be4bfbb0fe + md5: 67391f5ec297fe536b30d2c450ae4b15 + sha256: 0879cb03d4627f1f9f098065e83d66aa7387e2ed6fbad4adf6b1a98ea7a62ea2 category: main optional: false - name: jedi - version: 0.18.1 + version: 0.19.1 manager: conda platform: linux-aarch64 dependencies: - parso: '>=0.8.0,<0.9.0' + parso: '>=0.8.3,<0.9.0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/jedi-0.18.1-py312hd43f75c_1.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/jedi-0.19.1-py312hd43f75c_0.conda hash: - md5: 2aa772694374c01650135998ee5b7246 - sha256: 9acda2ec8d5da2debaa792528815f001ada0dc12e67466431d48480d9834bb0f + md5: afb091e61c6b598d509cbe3c87b87f34 + sha256: b41278ffbe8c34c4fc1ab0bc317f7dbac81b329f91ec4f71ac017a6af56834ee category: main optional: false - name: jedi - version: 0.18.1 + version: 0.19.1 manager: conda platform: osx-arm64 dependencies: - parso: '>=0.8.0,<0.9.0' + parso: '>=0.8.3,<0.9.0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/jedi-0.18.1-py312hca03da5_1.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/jedi-0.19.1-py312hca03da5_0.conda hash: - md5: f084d98023d1fa98d8ffab3eab0100ae - sha256: 495d98882e7f0480748150b20b90b80a337dbc7db047bb025ad66f30385c59fb + md5: 969ee73a78d7e32fa137beb9e8decf55 + sha256: 4687bcf6b9258bf6aed200c74237658c58bd08c9ed859d62210e948437ef9259 category: main optional: false - name: jeepney @@ -5373,39 +5396,39 @@ package: category: main optional: false - name: joblib - version: 1.4.0 + version: 1.4.2 manager: conda platform: linux-64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/joblib-1.4.0-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/joblib-1.4.2-py312h06a4308_0.conda hash: - md5: 5994475da8e256a8be4b7b5f47bd37a3 - sha256: 5c254dc0694d3abcf1e01dfbe49073454fd79d1d15fd77d856b6440d4687982d + md5: c191ecf27647a0faee7bcb0b5f0aed71 + sha256: 1c5d9fb7f4dccf60075b8c6d2d5aec9895b767007425eba1100c33b21cc98e87 category: main optional: false - name: joblib - version: 1.4.0 + version: 1.4.2 manager: conda platform: linux-aarch64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/joblib-1.4.0-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/joblib-1.4.2-py312hd43f75c_0.conda hash: - md5: 848a2ffa6409adc4d377cde27b537627 - sha256: 9b3af7e4e92b75fa512781e41f2f273049e283377cc3ba7f77bd0c9e14a8cc55 + md5: 7429c665e2b5af2052876685766223bf + sha256: eaf339fa98d8cbbfc2992669dce5681f5c5c976da0f9196092286a4d3f62db92 category: main optional: false - name: joblib - version: 1.4.0 + version: 1.4.2 manager: conda platform: osx-arm64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/joblib-1.4.0-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/joblib-1.4.2-py312hca03da5_0.conda hash: - md5: 64cdcb4ea6d6ea5d7ea64b8751bfa84f - sha256: a0d917c3e3689d3947c58b7b7e4571256084394f6309ea88dbe2e7325484983c + md5: 8f05b8323b7f8bd27e6772ba5ec8484a + sha256: 01e25077193c6037a168536ee28947b6346f8fbe02b1ba9a7a2354b64314e93d category: main optional: false - name: json-c @@ -5413,11 +5436,12 @@ package: manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h7ab15ed_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h1220068_1.conda hash: - md5: 9961b1f100c3b6852bd97c9233d06979 - sha256: 5646496ca07dfa1486d27ed07282967007811dfc63d6394652e87f94166ecae3 + md5: f8f0f0c4338bad5c34a4e9e11460481d + sha256: 0caf06ccfbd6f9a7b3a1e09fa83e318c9e84f2d1c1003a9e486f2600f4096720 category: main optional: false - name: json-c @@ -5426,21 +5450,22 @@ package: platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/json-c-0.17-h9d1147b_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/json-c-0.17-hf9262ea_1.conda hash: - md5: d29aae0f70e8082d021842256c86b49f - sha256: 4cd7c08275a91df826d0ffa2d6aa1e3279afdfaf15adcf687c6fb8dd92170c54 + md5: f9f65f64ab18c6bbbd6cd780c8ae3a1f + sha256: 43d4fd9b19a367464d232b6fb0f8ee945328c4ece5c76b6e69b3f23d87f6e42f category: main optional: false - name: json-c version: '0.17' manager: conda platform: osx-arm64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/json-c-0.17-h40ed0f5_0.conda - hash: - md5: 7de5604deb99090c8e8c4863f60568d1 - sha256: d47138a2829ce47d2e9ec1dbe108d1a6fe58c5d8724ea904985a420ad760f93f + dependencies: + __osx: '>=11.0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/json-c-0.17-he54c16a_1.conda + hash: + md5: 4831302cd6badbdb87c0334163fb7d68 + sha256: b12b280c0179628b2aa355286331d48b136104cf96179c355971f2e7c5b226ac category: main optional: false - name: json5 @@ -5657,49 +5682,49 @@ package: category: main optional: false - name: jupyter_core - version: 5.5.0 + version: 5.7.2 manager: conda platform: linux-64 dependencies: platformdirs: '>=2.5' python: '>=3.12,<3.13.0a0' traitlets: '>=5.3' - url: https://repo.anaconda.com/pkgs/main/linux-64/jupyter_core-5.5.0-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/jupyter_core-5.7.2-py312h06a4308_0.conda hash: - md5: 36753efd1e28a61039288eddf9935794 - sha256: de5f902c2fa9a5523b6dd83c64a4e9798b95ed5bc170d1c44e630253fcade619 + md5: f74ba359b10915d569269b982b942455 + sha256: 6d9c3d3fe6da1a4e98fc505fc195360b34f0cdf805cfad7b6aeb3044ef3829c6 category: main optional: false - name: jupyter_core - version: 5.5.0 + version: 5.7.2 manager: conda platform: linux-aarch64 dependencies: platformdirs: '>=2.5' python: '>=3.12,<3.13.0a0' traitlets: '>=5.3' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/jupyter_core-5.5.0-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/jupyter_core-5.7.2-py312hd43f75c_0.conda hash: - md5: fb510c07a1a3b7bce1bc697e52331ef0 - sha256: 10d4bfc0db460fc2d446970d41a97a682ac424b7902e488b348069cba4d89fd0 + md5: ff22df7acacccc07e382ff8b87d21f72 + sha256: 54fac0e2f370d6e5ea2dcd7476c5507cb3aef6bb00c8cfed56e5a72874f7dfa4 category: main optional: false - name: jupyter_core - version: 5.5.0 + version: 5.7.2 manager: conda platform: osx-arm64 dependencies: platformdirs: '>=2.5' python: '>=3.12,<3.13.0a0' traitlets: '>=5.3' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/jupyter_core-5.5.0-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/jupyter_core-5.7.2-py312hca03da5_0.conda hash: - md5: dd6b31ccc1dc5bf02eefcdddd4d1ab77 - sha256: c44b22f9acad7ede7287eb61151a8317f3c43be3365a28877a8a801850c2e392 + md5: f74994ddf14645a4775e9d95ded0c204 + sha256: 62bb332eab471403cf839a6267b798b0f8c6b72395ae8b7eb4adf767b3c1d839 category: main optional: false - name: jupyter_events - version: 0.8.0 + version: 0.10.0 manager: conda platform: linux-64 dependencies: @@ -5711,14 +5736,14 @@ package: rfc3339-validator: '' rfc3986-validator: '>=0.1.1' traitlets: '>=5.3' - url: https://repo.anaconda.com/pkgs/main/linux-64/jupyter_events-0.8.0-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/jupyter_events-0.10.0-py312h06a4308_0.conda hash: - md5: 64f17e343ab9fb9a6519c64b117e3599 - sha256: d86b0f5526b732364f52b06d4db38d1966bb3f7c3ba9c56e0ae58c84e9bf4c60 + md5: e9def891af369b1d816e08345a42838a + sha256: 8a6497e964bf1c3e08124ea179c42cce2f0a941d868820af7f4c446acac1284b category: main optional: false - name: jupyter_events - version: 0.8.0 + version: 0.10.0 manager: conda platform: linux-aarch64 dependencies: @@ -5730,14 +5755,14 @@ package: rfc3339-validator: '' rfc3986-validator: '>=0.1.1' traitlets: '>=5.3' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/jupyter_events-0.8.0-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/jupyter_events-0.10.0-py312hd43f75c_0.conda hash: - md5: 8faa6b567b8232ad4181fd77b86198c8 - sha256: 02843c5a1fd0a7d88c24dcb3eeff78261ef59fa449c4adfbd128d7f743c41f26 + md5: 38f064e6d30962a61259c35c9335e196 + sha256: 0dbbe744c2197b3496bc49156c87e8df0b000a66feda337f735c2a2e599bc2e1 category: main optional: false - name: jupyter_events - version: 0.8.0 + version: 0.10.0 manager: conda platform: osx-arm64 dependencies: @@ -5749,100 +5774,100 @@ package: rfc3339-validator: '' rfc3986-validator: '>=0.1.1' traitlets: '>=5.3' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/jupyter_events-0.8.0-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/jupyter_events-0.10.0-py312hca03da5_0.conda hash: - md5: b33545dbdbdf6f0c63c8211b6382c499 - sha256: bffd51e7b540efd01819c82db632411798189e3a59591518285a941bf2db0d4f + md5: 1b39492055ac5b4397abaa7ae3692a0d + sha256: 70b1c6a021ef1f69e8d577224809c572ab07f183320eafd4a95403f46fc42ecd category: main optional: false - name: jupyter_server - version: 2.10.0 + version: 2.14.1 manager: conda platform: linux-64 dependencies: anyio: '>=3.1.0' - argon2-cffi: '' - jinja2: '' + argon2-cffi: '>=21.1' + jinja2: '>=3.0.3' jupyter_client: '>=7.4.4' jupyter_core: '>=4.12,!=5.0.*' - jupyter_events: '>=0.6.0' - jupyter_server_terminals: '' + jupyter_events: '>=0.9.0' + jupyter_server_terminals: '>=0.4.4' nbconvert: '>=6.4.4' nbformat: '>=5.3.0' - overrides: '' - packaging: '' - prometheus_client: '' + overrides: '>=5.0' + packaging: '>=22.0' + prometheus_client: '>=0.9' python: '>=3.12,<3.13.0a0' pyzmq: '>=24' send2trash: '>=1.8.2' terminado: '>=0.8.3' tornado: '>=6.2.0' traitlets: '>=5.6.0' - websocket-client: '' - url: https://repo.anaconda.com/pkgs/main/linux-64/jupyter_server-2.10.0-py312h06a4308_0.conda + websocket-client: '>=1.7' + url: https://repo.anaconda.com/pkgs/main/linux-64/jupyter_server-2.14.1-py312h06a4308_0.conda hash: - md5: 49fdb30dd562f6417cc1a621e2f24047 - sha256: fdc8a5661d00c7161255cfcedc82d33f6a12767e9aea729b750ff01d28f765da + md5: 6ee18118c92c40b045ae6a99d5025da4 + sha256: 6b7a390411ede9697c981472346e5fa25f87a675830c4c079d081a0c4d28708d category: main optional: false - name: jupyter_server - version: 2.10.0 + version: 2.14.1 manager: conda platform: linux-aarch64 dependencies: anyio: '>=3.1.0' - argon2-cffi: '' - jinja2: '' + argon2-cffi: '>=21.1' + jinja2: '>=3.0.3' jupyter_client: '>=7.4.4' jupyter_core: '>=4.12,!=5.0.*' - jupyter_events: '>=0.6.0' - jupyter_server_terminals: '' + jupyter_events: '>=0.9.0' + jupyter_server_terminals: '>=0.4.4' nbconvert: '>=6.4.4' nbformat: '>=5.3.0' - overrides: '' - packaging: '' - prometheus_client: '' + overrides: '>=5.0' + packaging: '>=22.0' + prometheus_client: '>=0.9' python: '>=3.12,<3.13.0a0' pyzmq: '>=24' send2trash: '>=1.8.2' terminado: '>=0.8.3' tornado: '>=6.2.0' traitlets: '>=5.6.0' - websocket-client: '' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/jupyter_server-2.10.0-py312hd43f75c_0.conda + websocket-client: '>=1.7' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/jupyter_server-2.14.1-py312hd43f75c_0.conda hash: - md5: ee90a1335ee69e42a4d6c699a5665f69 - sha256: 8c783ac317ae5b02d7882071cb5eec7612265be94cc212a2b27536cf1af99b0d + md5: d51171bc97e466c921827cf2f8460dec + sha256: 530c7f299b28918c0d0cbb06dbd2d6e295a02f633fc6e80671d936177d36a72c category: main optional: false - name: jupyter_server - version: 2.10.0 + version: 2.14.1 manager: conda platform: osx-arm64 dependencies: anyio: '>=3.1.0' - argon2-cffi: '' - jinja2: '' + argon2-cffi: '>=21.1' + jinja2: '>=3.0.3' jupyter_client: '>=7.4.4' jupyter_core: '>=4.12,!=5.0.*' - jupyter_events: '>=0.6.0' - jupyter_server_terminals: '' + jupyter_events: '>=0.9.0' + jupyter_server_terminals: '>=0.4.4' nbconvert: '>=6.4.4' nbformat: '>=5.3.0' - overrides: '' - packaging: '' - prometheus_client: '' + overrides: '>=5.0' + packaging: '>=22.0' + prometheus_client: '>=0.9' python: '>=3.12,<3.13.0a0' pyzmq: '>=24' send2trash: '>=1.8.2' terminado: '>=0.8.3' tornado: '>=6.2.0' traitlets: '>=5.6.0' - websocket-client: '' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/jupyter_server-2.10.0-py312hca03da5_0.conda + websocket-client: '>=1.7' + url: https://repo.anaconda.com/pkgs/main/osx-arm64/jupyter_server-2.14.1-py312hca03da5_0.conda hash: - md5: 860e2c082c1ecbae96ed6a50f0bb8a80 - sha256: cc247ab0efd46971741e65e5267090cceea1813b5a730eed90540a6efd3466e3 + md5: e62dbed9f9d20f0e4de3c91fb42a9296 + sha256: 27cd3279d461a1859601f5318fa53f0257b9e68db5ad8761146338887fd943ae category: main optional: false - name: jupyter_server_terminals @@ -5885,7 +5910,7 @@ package: category: main optional: false - name: jupyterlab - version: 4.2.1 + version: 4.2.4 manager: conda platform: linux-64 dependencies: @@ -5902,17 +5927,18 @@ package: notebook-shim: '>=0.2' packaging: '' python: '>=3.8' + setuptools: '>=40.1.0' tomli: '>=1.2.2' tornado: '>=6.2.0' traitlets: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.4-pyhd8ed1ab_0.conda hash: - md5: 3e7290af6190b29c7017d6a8fb0eaeea - sha256: 507f87a6449a7d5d23ad24fcba41aed150770df18ae877a4fdf9da78039f1682 + md5: 28f3334e97c39de2b7ac15743b041784 + sha256: e3b585b55634da48871ed3082c429652a62bf0cf7733641b1382b9c314f1c901 category: main optional: false - name: jupyterlab - version: 4.2.1 + version: 4.2.4 manager: conda platform: linux-aarch64 dependencies: @@ -5929,17 +5955,18 @@ package: notebook-shim: '>=0.2' packaging: '' python: '>=3.8' + setuptools: '>=40.1.0' tomli: '>=1.2.2' tornado: '>=6.2.0' traitlets: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.4-pyhd8ed1ab_0.conda hash: - md5: 3e7290af6190b29c7017d6a8fb0eaeea - sha256: 507f87a6449a7d5d23ad24fcba41aed150770df18ae877a4fdf9da78039f1682 + md5: 28f3334e97c39de2b7ac15743b041784 + sha256: e3b585b55634da48871ed3082c429652a62bf0cf7733641b1382b9c314f1c901 category: main optional: false - name: jupyterlab - version: 4.2.1 + version: 4.2.4 manager: conda platform: osx-arm64 dependencies: @@ -5956,13 +5983,14 @@ package: notebook-shim: '>=0.2' packaging: '' python: '>=3.8' + setuptools: '>=40.1.0' tomli: '>=1.2.2' tornado: '>=6.2.0' traitlets: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.4-pyhd8ed1ab_0.conda hash: - md5: 3e7290af6190b29c7017d6a8fb0eaeea - sha256: 507f87a6449a7d5d23ad24fcba41aed150770df18ae877a4fdf9da78039f1682 + md5: 28f3334e97c39de2b7ac15743b041784 + sha256: e3b585b55634da48871ed3082c429652a62bf0cf7733641b1382b9c314f1c901 category: main optional: false - name: jupyterlab_pygments @@ -6005,7 +6033,7 @@ package: category: main optional: false - name: jupyterlab_server - version: 2.27.2 + version: 2.27.3 manager: conda platform: linux-64 dependencies: @@ -6018,14 +6046,14 @@ package: packaging: '>=21.3' python: '>=3.8' requests: '>=2.31' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda hash: - md5: d1cb7b113daaadd89e5aa6a32b28bf0d - sha256: d4b9f9f46b3c494d678b4f003d7a2f7ac834dba641bd02332079dde5a9a85c98 + md5: af8239bf1ba7e8c69b689f780f653488 + sha256: a23b26d1a35bccdb91b9232119e5f402624e1e1a252b0e64cc20c6eb5b87cefb category: main optional: false - name: jupyterlab_server - version: 2.27.2 + version: 2.27.3 manager: conda platform: linux-aarch64 dependencies: @@ -6038,14 +6066,14 @@ package: packaging: '>=21.3' python: '>=3.8' requests: '>=2.31' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda hash: - md5: d1cb7b113daaadd89e5aa6a32b28bf0d - sha256: d4b9f9f46b3c494d678b4f003d7a2f7ac834dba641bd02332079dde5a9a85c98 + md5: af8239bf1ba7e8c69b689f780f653488 + sha256: a23b26d1a35bccdb91b9232119e5f402624e1e1a252b0e64cc20c6eb5b87cefb category: main optional: false - name: jupyterlab_server - version: 2.27.2 + version: 2.27.3 manager: conda platform: osx-arm64 dependencies: @@ -6058,10 +6086,10 @@ package: packaging: '>=21.3' python: '>=3.8' requests: '>=2.31' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda hash: - md5: d1cb7b113daaadd89e5aa6a32b28bf0d - sha256: d4b9f9f46b3c494d678b4f003d7a2f7ac834dba641bd02332079dde5a9a85c98 + md5: af8239bf1ba7e8c69b689f780f653488 + sha256: a23b26d1a35bccdb91b9232119e5f402624e1e1a252b0e64cc20c6eb5b87cefb category: main optional: false - name: kealib @@ -6215,7 +6243,7 @@ package: category: main optional: false - name: krb5 - version: 1.21.2 + version: 1.21.3 manager: conda platform: linux-64 dependencies: @@ -6223,15 +6251,15 @@ package: libedit: '>=3.1.20191231,<4.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - openssl: '>=3.1.2,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda hash: - md5: cd95826dbd331ed1be26bdf401432844 - sha256: 259bfaae731989b252b7d2228c1330ef91b641c9d68ff87dae02cbae682cb3e4 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 category: main optional: false - name: krb5 - version: 1.21.2 + version: 1.21.3 manager: conda platform: linux-aarch64 dependencies: @@ -6239,25 +6267,26 @@ package: libedit: '>=3.1.20191231,<4.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - openssl: '>=3.1.2,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.2-hc419048_0.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda hash: - md5: 55b51af37bf6fdcfe06f140e62e8c8db - sha256: c3f24ead49fb7d7c29fae491bec3f090f63d77a46954eadbc4463f137e2b42cd + md5: 29c10432a2ca1472b53f299ffb2ffa37 + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 category: main optional: false - name: krb5 - version: 1.21.2 + version: 1.21.3 manager: conda platform: osx-arm64 dependencies: - libcxx: '>=15.0.7' + __osx: '>=11.0' + libcxx: '>=16' libedit: '>=3.1.20191231,<4.0a0' - openssl: '>=3.1.2,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.2-h92f50d5_0.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda hash: - md5: 92f1cff174a538e0722bf2efb16fc0b2 - sha256: 70bdb9b4589ec7c7d440e485ae22b5a352335ffeb91a771d4c162996c3070875 + md5: c6dc8a0fdec13a0565936655c33069a1 + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b category: main optional: false - name: lcms2 @@ -6652,17 +6681,17 @@ package: manager: conda platform: linux-64 dependencies: - krb5: '>=1.21.2,<1.22.0a0' + krb5: '>=1.21.3,<1.22.0a0' libgcc-ng: '>=12' libnghttp2: '>=1.58.0,<2.0a0' libssh2: '>=1.11.0,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - openssl: '>=3.3.0,<4.0a0' + libzlib: '>=1.2.13,<2.0a0' + openssl: '>=3.3.1,<4.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda hash: - md5: f21c27f076a07907e70c49bb57bd0f20 - sha256: 45aec0ffc6fe3fd4c0083b815aa102b8103380acc2b6714fb272d921acc68ab2 + md5: b8afb3e3cb3423cc445cf611ab95fdb0 + sha256: 6b5b64cdcdb643368ebe236de07eedee99b025bb95129bbe317c46e5bdc693f3 category: main optional: false - name: libcurl @@ -6670,17 +6699,17 @@ package: manager: conda platform: linux-aarch64 dependencies: - krb5: '>=1.21.2,<1.22.0a0' + krb5: '>=1.21.3,<1.22.0a0' libgcc-ng: '>=12' libnghttp2: '>=1.58.0,<2.0a0' libssh2: '>=1.11.0,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - openssl: '>=3.3.0,<4.0a0' + libzlib: '>=1.2.13,<2.0a0' + openssl: '>=3.3.1,<4.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.8.0-h4e8248e_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.8.0-h4e8248e_1.conda hash: - md5: 75bfffa16b18674b16144780a46ac77f - sha256: 5a47624e64f7216ed2631d936755bc1d5ea09e45d7632b564083b7449baf3787 + md5: d3629660719854a4fc487c6a3dcd66b3 + sha256: 26e97d16d80beea469b85706f954978ff224e8b18c2b5e8f093bfb0406ba927f category: main optional: false - name: libcurl @@ -6688,28 +6717,28 @@ package: manager: conda platform: osx-arm64 dependencies: - krb5: '>=1.21.2,<1.22.0a0' + krb5: '>=1.21.3,<1.22.0a0' libnghttp2: '>=1.58.0,<2.0a0' libssh2: '>=1.11.0,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - openssl: '>=3.3.0,<4.0a0' + libzlib: '>=1.2.13,<2.0a0' + openssl: '>=3.3.1,<4.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.8.0-h7b6f9a7_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.8.0-h7b6f9a7_1.conda hash: - md5: 245b30f99dc5379ebe1c78899be8d3f5 - sha256: b83aa249e7c8abc1aa56593ad50d1b4c0a52f5f3d5fd7c489c2ccfc3a548f391 + md5: e9580b0bb247a2ccf937b16161478f19 + sha256: 9da82a9bd72e9872941da32be54543076c92dbeb2aba688a1c24adbc1c699e64 category: main optional: false - name: libcxx - version: 17.0.6 + version: 18.1.8 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-17.0.6-h5f092b4_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-18.1.8-h167917d_0.conda hash: - md5: a96fd5dda8ce56c86a971e0fa02751d0 - sha256: 119d3d9306f537d4c89dc99ed99b94c396d262f0b06f7833243646f68884f2c2 + md5: c891c2eeabd7d67fbc38e012cc6045d6 + sha256: a598062f2d1522fc3727c16620fbc2bc913c1069342671428a92fcf4eb02ec12 category: main optional: false - name: libdeflate @@ -6893,28 +6922,28 @@ package: category: main optional: false - name: libgcc-ng - version: 13.2.0 + version: 14.1.0 manager: conda platform: linux-64 dependencies: _libgcc_mutex: '0.1' _openmp_mutex: '>=4.5' - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda hash: - md5: 72ec1b1b04c4d15d4204ece1ecea5978 - sha256: 62af2b89acbe74a21606c8410c276e57309c0a2ab8a9e8639e3c8131c0b60c92 + md5: ca0fad6a41ddaef54a153b78eccb5037 + sha256: b8e869ac96591cda2704bf7e77a301025e405227791a0bddf14a3dac65125538 category: main optional: false - name: libgcc-ng - version: 13.2.0 + version: 14.1.0 manager: conda platform: linux-aarch64 dependencies: _openmp_mutex: '>=4.5' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-13.2.0-he277a41_7.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.1.0-he277a41_0.conda hash: - md5: 01c5b27ce46f50abab2dc8454842c792 - sha256: ef2f338b3342b51700e6cda10831d27bb2983fe64d7e75e30e9ffb7f9cf76571 + md5: 47ecd1292a3fd78b616640b35dd9632c + sha256: b9ca03216bc089c0c46f008bc6f447bc0df8dc826d9801fb4283e49fa89c877e category: main optional: false - name: libgdal @@ -6923,8 +6952,8 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - blosc: '>=1.21.5,<2.0a0' - cfitsio: '>=4.4.0,<4.4.1.0a0' + blosc: '>=1.21.6,<2.0a0' + cfitsio: '>=4.4.1,<4.4.2.0a0' freexl: '>=2.0.0,<3.0a0' geos: '>=3.12.1,<3.12.2.0a0' geotiff: '>=1.7.1,<1.8.0a0' @@ -6935,8 +6964,8 @@ package: kealib: '>=1.5.3,<1.6.0a0' lerc: '>=4.0.0,<5.0a0' libaec: '>=1.1.3,<2.0a0' - libarchive: '>=3.7.2,<3.8.0a0' - libcurl: '>=8.7.1,<9.0a0' + libarchive: '>=3.7.4,<3.8.0a0' + libcurl: '>=8.8.0,<9.0a0' libdeflate: '>=1.20,<1.21.0a0' libexpat: '>=2.6.2,<3.0a0' libgcc-ng: '>=12' @@ -6947,28 +6976,28 @@ package: libpng: '>=1.6.43,<1.7.0a0' libpq: '>=16.3,<17.0a0' libspatialite: '>=5.1.0,<5.2.0a0' - libsqlite: '>=3.45.3,<4.0a0' + libsqlite: '>=3.46.0,<4.0a0' libstdcxx-ng: '>=12' libtiff: '>=4.6.0,<4.7.0a0' libuuid: '>=2.38.1,<3.0a0' libwebp-base: '>=1.4.0,<2.0a0' libxml2: '>=2.12.7,<3.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' lz4-c: '>=1.9.3,<1.10.0a0' openjpeg: '>=2.5.2,<3.0a0' - openssl: '>=3.3.0,<4.0a0' - pcre2: '>=10.43,<10.44.0a0' + openssl: '>=3.3.1,<4.0a0' + pcre2: '>=10.44,<10.45.0a0' poppler: '>=24.4.0,<24.5.0a0' postgresql: '' - proj: '>=9.4.0,<9.4.1.0a0' - tiledb: '>=2.23.0,<2.24.0a0' + proj: '>=9.4.0,<9.5.0a0' + tiledb: '>=2.24.1,<2.25.0a0' xerces-c: '>=3.2.5,<3.3.0a0' xz: '>=5.2.6,<6.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.8.5-h77540a9_7.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.8.5-he176cbe_11.conda hash: - md5: 5937eafdfa5713c78a21cbb33a84539e - sha256: fbfe96e76cd8730d7b60b270e539181c1e12df312e9e08b0217154b7a8838f0c + md5: bf74c88ae705acddbbfc6f1e3f7f0e24 + sha256: 11c4f1741de6ea4a3a32f6adc564b8351d4a8572eaac98b5ee865f24e806b889 category: main optional: false - name: libgdal @@ -6976,8 +7005,8 @@ package: manager: conda platform: linux-aarch64 dependencies: - blosc: '>=1.21.5,<2.0a0' - cfitsio: '>=4.4.0,<4.4.1.0a0' + blosc: '>=1.21.6,<2.0a0' + cfitsio: '>=4.4.1,<4.4.2.0a0' freexl: '>=2.0.0,<3.0a0' geos: '>=3.12.1,<3.12.2.0a0' geotiff: '>=1.7.1,<1.8.0a0' @@ -6988,8 +7017,8 @@ package: kealib: '>=1.5.3,<1.6.0a0' lerc: '>=4.0.0,<5.0a0' libaec: '>=1.1.3,<2.0a0' - libarchive: '>=3.7.2,<3.8.0a0' - libcurl: '>=8.7.1,<9.0a0' + libarchive: '>=3.7.4,<3.8.0a0' + libcurl: '>=8.8.0,<9.0a0' libdeflate: '>=1.20,<1.21.0a0' libexpat: '>=2.6.2,<3.0a0' libgcc-ng: '>=12' @@ -7000,28 +7029,28 @@ package: libpng: '>=1.6.43,<1.7.0a0' libpq: '>=16.3,<17.0a0' libspatialite: '>=5.1.0,<5.2.0a0' - libsqlite: '>=3.45.3,<4.0a0' + libsqlite: '>=3.46.0,<4.0a0' libstdcxx-ng: '>=12' libtiff: '>=4.6.0,<4.7.0a0' libuuid: '>=2.38.1,<3.0a0' libwebp-base: '>=1.4.0,<2.0a0' libxml2: '>=2.12.7,<3.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' lz4-c: '>=1.9.3,<1.10.0a0' openjpeg: '>=2.5.2,<3.0a0' - openssl: '>=3.3.0,<4.0a0' - pcre2: '>=10.43,<10.44.0a0' + openssl: '>=3.3.1,<4.0a0' + pcre2: '>=10.44,<10.45.0a0' poppler: '>=24.4.0,<24.5.0a0' postgresql: '' - proj: '>=9.4.0,<9.4.1.0a0' - tiledb: '>=2.23.0,<2.24.0a0' + proj: '>=9.4.0,<9.5.0a0' + tiledb: '>=2.24.1,<2.25.0a0' xerces-c: '>=3.2.5,<3.3.0a0' xz: '>=5.2.6,<6.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgdal-3.8.5-h3e254f6_7.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgdal-3.8.5-h768874b_11.conda hash: - md5: b62f422055f6f941cb36522781417f13 - sha256: 0a6337687303be3cfc6a9300b6bac9ff34773976419bd20e9cd9dbebec33d480 + md5: 61c624684dc529153416d661027f4fe4 + sha256: 375eb81f2e06f20c9136d314a57f9decc973ad3b8e0124599c099c40be9ea4bb category: main optional: false - name: libgdal @@ -7030,8 +7059,8 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - blosc: '>=1.21.5,<2.0a0' - cfitsio: '>=4.4.0,<4.4.1.0a0' + blosc: '>=1.21.6,<2.0a0' + cfitsio: '>=4.4.1,<4.4.2.0a0' freexl: '>=2.0.0,<3.0a0' geos: '>=3.12.1,<3.12.2.0a0' geotiff: '>=1.7.1,<1.8.0a0' @@ -7042,8 +7071,8 @@ package: kealib: '>=1.5.3,<1.6.0a0' lerc: '>=4.0.0,<5.0a0' libaec: '>=1.1.3,<2.0a0' - libarchive: '>=3.7.2,<3.8.0a0' - libcurl: '>=8.7.1,<9.0a0' + libarchive: '>=3.7.4,<3.8.0a0' + libcurl: '>=8.8.0,<9.0a0' libcxx: '>=16' libdeflate: '>=1.20,<1.21.0a0' libexpat: '>=2.6.2,<3.0a0' @@ -7054,26 +7083,26 @@ package: libpng: '>=1.6.43,<1.7.0a0' libpq: '>=16.3,<17.0a0' libspatialite: '>=5.1.0,<5.2.0a0' - libsqlite: '>=3.45.3,<4.0a0' + libsqlite: '>=3.46.0,<4.0a0' libtiff: '>=4.6.0,<4.7.0a0' libwebp-base: '>=1.4.0,<2.0a0' libxml2: '>=2.12.7,<3.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' lz4-c: '>=1.9.3,<1.10.0a0' openjpeg: '>=2.5.2,<3.0a0' - openssl: '>=3.3.0,<4.0a0' - pcre2: '>=10.43,<10.44.0a0' + openssl: '>=3.3.1,<4.0a0' + pcre2: '>=10.44,<10.45.0a0' poppler: '>=24.4.0,<24.5.0a0' postgresql: '' - proj: '>=9.4.0,<9.4.1.0a0' - tiledb: '>=2.23.0,<2.24.0a0' + proj: '>=9.4.0,<9.5.0a0' + tiledb: '>=2.24.1,<2.25.0a0' xerces-c: '>=3.2.5,<3.3.0a0' xz: '>=5.2.6,<6.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-3.8.5-hb08d262_7.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-3.8.5-h0bd8f10_11.conda hash: - md5: 2533c6279bb9e14a5f5b7315a191a91f - sha256: c99c1dd8b9c4ebbec3a1deb0785e601028900ed297b0f3cf6a84ec52b01bc150 + md5: 61114b25d4f02f3dd09ad9ddc3982445 + sha256: 5b55d6755f5b6a36eb4d1a6c2c38dac68334bd97dfea06009f59154f7744aad2 category: main optional: false - name: libgfortran @@ -7089,51 +7118,51 @@ package: category: main optional: false - name: libgfortran-ng - version: 13.2.0 + version: 14.1.0 manager: conda platform: linux-64 dependencies: - libgfortran5: 13.2.0 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda + libgfortran5: 14.1.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda hash: - md5: 1b84f26d9f4f6026e179e7805d5a15cd - sha256: a588e69f96b8e0983a8cdfdbf1dc75eb48189f5420ec71150c8d8cdc0a811a9b + md5: f4ca84fbd6d06b0a052fb2d5b96dde41 + sha256: ef624dacacf97b2b0af39110b36e2fd3e39e358a1a6b7b21b85c9ac22d8ffed9 category: main optional: false - name: libgfortran-ng - version: 13.2.0 + version: 14.1.0 manager: conda platform: linux-aarch64 dependencies: - libgfortran5: 13.2.0 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-13.2.0-he9431aa_7.conda + libgfortran5: 14.1.0 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-14.1.0-he9431aa_0.conda hash: - md5: d714db6ba9d67d55d21cf96316714ec8 - sha256: 295d9d4266894d7b5c65950e6f6e91c8b8e1730a540fa5bcc488192b76277913 + md5: a50ae662c1e7f26f0f2c99e31d1bf614 + sha256: 72d7aa3d0b20b9d64a2f1c72f016c5a8a19594bb56857267e9fc7c1fc0f13223 category: main optional: false - name: libgfortran5 - version: 13.2.0 + version: 14.1.0 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=13.2.0' - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda + libgcc-ng: '>=14.1.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda hash: - md5: c0bd771f09a326fdcd95a60b617795bf - sha256: 754ab038115edce550fdccdc9ddf7dead2fa8346b8cdd4428c59ae1e83293978 + md5: 6456c2620c990cd8dde2428a27ba0bc5 + sha256: a67d66b1e60a8a9a9e4440cee627c959acb4810cb182e089a4b0729bfdfbdf90 category: main optional: false - name: libgfortran5 - version: 13.2.0 + version: 14.1.0 manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=13.2.0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-13.2.0-h87d9d71_7.conda + libgcc-ng: '>=14.1.0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.1.0-h9420597_0.conda hash: - md5: 423eb7de085dd6b46928723edf5f8767 - sha256: 6fc946955668102fe1e73614810a24e2a2f50aa87390d68e757380fea8551e16 + md5: b907b29b964b8ebd7be215e47a659179 + sha256: 34a339c50c0fd2944ea31a013336b500f91f2e00ccfa0607f1bcc5d0a3378373 category: main optional: false - name: libgfortran5 @@ -7149,39 +7178,39 @@ package: category: main optional: false - name: libglib - version: 2.80.2 + version: 2.80.3 manager: conda platform: linux-64 dependencies: libffi: '>=3.4,<4.0a0' libgcc-ng: '>=12' libiconv: '>=1.17,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - pcre2: '>=10.43,<10.44.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda + libzlib: '>=1.3.1,<2.0a0' + pcre2: '>=10.44,<10.45.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h8a4344b_1.conda hash: - md5: 72724f6a78ecb15559396966226d5838 - sha256: 93e03b6cf4765bc06d64fa3dac65f22c53ae4a30247bb0e2dea0bd9c47a3fb26 + md5: 6ea440297aacee4893f02ad759e6ffbc + sha256: 5f5854a7cee117d115009d8f22a70d5f9e28f09cb6e453e8f1dd712e354ecec9 category: main optional: false - name: libglib - version: 2.80.2 + version: 2.80.3 manager: conda platform: linux-aarch64 dependencies: libffi: '>=3.4,<4.0a0' libgcc-ng: '>=12' libiconv: '>=1.17,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - pcre2: '>=10.43,<10.44.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.80.2-h34bac0b_0.conda + libzlib: '>=1.3.1,<2.0a0' + pcre2: '>=10.44,<10.45.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.80.3-haee52c6_1.conda hash: - md5: 8cb9a8fb29f3d33aaee8c209a98e7212 - sha256: 21088a09ac0efd28660fd86c8de60d7cdd81726d2ebd41364ab317c6d8bcd811 + md5: 50ed8a077706cfe3da719deb71001f2c + sha256: 8e9a0d14118d99d56f6bd8fb52655362a89bea773d83a7b0c6ec2fbca458ce8c category: main optional: false - name: libglib - version: 2.80.2 + version: 2.80.3 manager: conda platform: osx-arm64 dependencies: @@ -7189,112 +7218,114 @@ package: libffi: '>=3.4,<4.0a0' libiconv: '>=1.17,<2.0a0' libintl: '>=0.22.5,<1.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - pcre2: '>=10.43,<10.44.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.2-h535f939_0.conda + libzlib: '>=1.3.1,<2.0a0' + pcre2: '>=10.44,<10.45.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.3-h59d46d9_1.conda hash: - md5: 4ac7cb698ca919924e205af3ab3aacf3 - sha256: 3f0c9f25748787ab5475c5ce8267184d6637e8a5b7ca55ef2f3a0d7bff2f537f + md5: 2fd194003b4e69ab690f18994a71fd70 + sha256: 92f9ca586a0d8070ae2c8924cbc7cc4fd79d47ff9cce58336984c86a197ab181 category: main optional: false - name: libgomp - version: 13.2.0 + version: 14.1.0 manager: conda platform: linux-64 dependencies: _libgcc_mutex: '0.1' - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda hash: - md5: abf3fec87c2563697defa759dec3d639 - sha256: 781444fa069d3b50e8ed667b750571cacda785761c7fc2a89ece1ac49693d4ad + md5: ae061a5ed5f05818acdf9adab72c146d + sha256: 7699df61a1f6c644b3576a40f54791561f2845983120477a16116b951c9cdb05 category: main optional: false - name: libgomp - version: 13.2.0 + version: 14.1.0 manager: conda platform: linux-aarch64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.2.0-he277a41_7.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.1.0-he277a41_0.conda hash: - md5: 1d1691ec9e5be799f86310fa38f00b9f - sha256: bb3bc7e03f1add861884d8bad79b359ad991025570625e1f979964e82f1f8d9e + md5: 434ccc943b843117e4cebc97265f2504 + sha256: 11f326e49e0fb92c2a52e870c029fc26b4b6d3eb9414fa4374cb8496b231a730 category: main optional: false - name: libgoogle-cloud - version: 2.24.0 + version: 2.26.0 manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' libabseil: '>=20240116.2,<20240117.0a0' - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libgrpc: '>=1.62.2,<1.63.0a0' libprotobuf: '>=4.25.3,<4.25.4.0a0' libstdcxx-ng: '>=12' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.24.0-h2736e30_0.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.26.0-h26d7fe4_0.conda hash: - md5: 34aeee3fa7fca5dc21fad3ac6f4f0ab2 - sha256: 324ae4d0ad4fbd350b14ebcc8880f7dc4d8ab3952eadaa79dea96373cd254a0d + md5: 7b9d4c93870fb2d644168071d4d76afb + sha256: c6caa2d4c375c6c5718e6223bb20ccf6305313c0fef2a66499b4f6cdaa299635 category: main optional: false - name: libgoogle-cloud - version: 2.24.0 + version: 2.26.0 manager: conda platform: linux-aarch64 dependencies: libabseil: '>=20240116.2,<20240117.0a0' - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libgrpc: '>=1.62.2,<1.63.0a0' libprotobuf: '>=4.25.3,<4.25.4.0a0' libstdcxx-ng: '>=12' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.24.0-hc02380a_0.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.26.0-hc02380a_0.conda hash: - md5: bb6c28f9c036faeb1217e2a6c40d2dc7 - sha256: 3adb745616619ff322670e9252085b1e44817d149d70c92a263f36122a74d587 + md5: 64eb6bf3c63accd7ca9d171ba630128b + sha256: bf8f9f0c8065a910da1438e6b898950bc10527cf245667ed8b3cfb9966b6203c category: main optional: false - name: libgoogle-cloud - version: 2.24.0 + version: 2.26.0 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' libabseil: '>=20240116.2,<20240117.0a0' - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libcxx: '>=16' libgrpc: '>=1.62.2,<1.63.0a0' libprotobuf: '>=4.25.3,<4.25.4.0a0' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.24.0-hfe08963_0.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.26.0-hfe08963_0.conda hash: - md5: 86e190704e0f94314d232632383c1d6c - sha256: 9c116fb902cacfc4cd8a4686fb1ed5525b7ea2a01371b8cd20d52fa202f75680 + md5: db7ab92239aeb06c3c52de90cc1e6f7a + sha256: 6753beade8465987399e85ca47c94814e8e24c58cf0ff5591545e6cbe7172ec5 category: main optional: false - name: libgoogle-cloud-storage - version: 2.24.0 + version: 2.26.0 manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' libabseil: '' libcrc32c: '>=1.1.2,<1.2.0a0' libcurl: '' libgcc-ng: '>=12' - libgoogle-cloud: 2.24.0 + libgoogle-cloud: 2.26.0 libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' openssl: '' - url: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.24.0-h3d9a0c8_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.26.0-ha262f82_0.conda hash: - md5: a731371833a7b1ab3a87be0fe7e6235a - sha256: 6fb9272759da37a203d996397757d4f44c47eab90fa6432c58ebdb92a459b9e1 + md5: 89b53708fd67762b26c38c8ecc5d323d + sha256: 7c16bf2e5aa6b5e42450c218fdfa7d5ff1da952c5a5c821c001ab3fd940c2aed category: main optional: false - name: libgoogle-cloud-storage - version: 2.24.0 + version: 2.26.0 manager: conda platform: linux-aarch64 dependencies: @@ -7302,18 +7333,18 @@ package: libcrc32c: '>=1.1.2,<1.2.0a0' libcurl: '' libgcc-ng: '>=12' - libgoogle-cloud: 2.24.0 + libgoogle-cloud: 2.26.0 libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' openssl: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.24.0-haca2cfa_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.26.0-hd572f31_0.conda hash: - md5: 18c690b4967f955d4dca04e09f692d86 - sha256: 61402586bd7f2ae446baf70439541f2fd67787a9b3bc060e13130c135e998dc4 + md5: c3416132d0d0b173f4ce4561dd02664c + sha256: 548d737fdee350b31061423d63367093cb8c213377787b823af15381bd1d6eb9 category: main optional: false - name: libgoogle-cloud-storage - version: 2.24.0 + version: 2.26.0 manager: conda platform: osx-arm64 dependencies: @@ -7322,13 +7353,13 @@ package: libcrc32c: '>=1.1.2,<1.2.0a0' libcurl: '' libcxx: '>=16' - libgoogle-cloud: 2.24.0 - libzlib: '>=1.2.13,<2.0.0a0' + libgoogle-cloud: 2.26.0 + libzlib: '>=1.3.1,<2.0a0' openssl: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.24.0-h3fa5b87_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.26.0-h1466eeb_0.conda hash: - md5: 46def62d7a52852d120d77a0d70f76b2 - sha256: 0526b9f9b9fba41afad322ac2b2d511b2eae1e213751ed7845ff97b9fd1f245f + md5: 385940a9a022e911e88f4e9ea45e47b3 + sha256: b4c37ebd74a1453ee1cf561e40354544866d1816fa12637b7076377d0ef205ae category: main optional: false - name: libgrpc @@ -7438,38 +7469,38 @@ package: category: main optional: false - name: libjpeg-turbo - version: 3.0.0 + version: 3.0.3 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + libgcc-ng: '>=11.2.0' + url: https://repo.anaconda.com/pkgs/main/linux-64/libjpeg-turbo-3.0.3-h5eee18b_0.conda hash: - md5: ea25936bb4080d843790b586850f82b8 - sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f + md5: b02b7690fc803457de68a9829799d874 + sha256: 6753f709ff594c59b4d3c311aadf28870be93787c2ecd82c24bd644ddd10d3e3 category: main optional: false - name: libjpeg-turbo - version: 3.0.0 + version: 3.0.3 manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + libgcc-ng: '>=11.2.0' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/libjpeg-turbo-3.0.3-h998d150_0.conda hash: - md5: ed24e702928be089d9ba3f05618515c6 - sha256: 675bc1f2a8581cd34a86c412663ec29c5f90c1d9f8d11866aa1ade5cdbdf8429 + md5: fe7f3055f979a1a8efb262e1624d0d13 + sha256: 647390c965c0f12cb002fb0e4e39369be6c1f8abe51789cd555f557feb2372f4 category: main optional: false - name: libjpeg-turbo - version: 3.0.0 + version: 3.0.3 manager: conda platform: osx-arm64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/libjpeg-turbo-3.0.3-h80987f9_0.conda hash: - md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 - sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 + md5: 146550cc4d03c0450e044d6766cea46f + sha256: 32cbbd85b2fddd630eb11b7a31081bec10735ad2ca1cc376997d6854bf65b52c category: main optional: false - name: libkml @@ -7477,15 +7508,16 @@ package: manager: conda platform: linux-64 dependencies: - expat: '>=2.4.9,<3.0a0' - libgcc-ng: '>=11.2.0' - libstdcxx-ng: '>=11.2.0' - uriparser: '>=0.9.7,<1.0a0' - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/libkml-1.3.0-h096b73e_7.conda + __glibc: '>=2.17,<3.0.a0' + libexpat: '>=2.6.2,<3.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.3.1,<2.0a0' + uriparser: '>=0.9.8,<1.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hbbc8833_1020.conda hash: - md5: 23f3c95c535e38ee050f9f4bc8eb6bcc - sha256: b35ded3cb5e689e3e7b989767b91ab380c3e46845f8746dbc4d2f27e2ad98dad + md5: 6d76c5822cb38bc1ab5a06565c6cf626 + sha256: 5bd19933cb3790ec8632c11fa67c25d82654bea6c2bc4f51f8bcd8b122ae96c8 category: main optional: false - name: libkml @@ -7493,15 +7525,15 @@ package: manager: conda platform: linux-aarch64 dependencies: - expat: '>=2.4.9,<3.0a0' - libgcc-ng: '>=11.2.0' - libstdcxx-ng: '>=11.2.0' - uriparser: '>=0.9.7,<1.0a0' - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/libkml-1.3.0-hadc4260_7.conda + libexpat: '>=2.6.2,<3.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.3.1,<2.0a0' + uriparser: '>=0.9.8,<1.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libkml-1.3.0-hcbe7090_1020.conda hash: - md5: dbb4369faba27105ee43d02c0b79e533 - sha256: 42f7fe0878b1c13fcc4531a3e22c11466465edd2b401f16d27fcaff75ac3fdd7 + md5: b19b2f671f59e22b82fc735679b5e2a4 + sha256: 95af37fa9263f9f075291456b51382c35ac79427647aa1476fa91e3062c615de category: main optional: false - name: libkml @@ -7509,14 +7541,15 @@ package: manager: conda platform: osx-arm64 dependencies: - expat: '>=2.4.9,<3.0a0' - libcxx: '>=14.0.6' - uriparser: '>=0.9.7,<1.0a0' - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/libkml-1.3.0-hc4d7c42_7.conda + __osx: '>=11.0' + libcxx: '>=16' + libexpat: '>=2.6.2,<3.0a0' + libzlib: '>=1.3.1,<2.0a0' + uriparser: '>=0.9.8,<1.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libkml-1.3.0-h00ed6cc_1020.conda hash: - md5: df23911a311ac8014b45ce67bd9aea38 - sha256: 57d7aeb4c6e139f103638511e1e15cc0cd4e422af2028c7468a113743d5b8bbd + md5: 628dcff1d0a6bb93fc114bf09dd65470 + sha256: 254156e86db817d7f312441837ebf3835b01d83e939e1ce54664dd160b6ad716 category: main optional: false - name: libnetcdf @@ -7528,20 +7561,20 @@ package: bzip2: '>=1.0.8,<2.0a0' hdf4: '>=4.2.15,<4.2.16.0a0' hdf5: '>=1.14.3,<1.14.4.0a0' - libaec: '>=1.1.2,<2.0a0' - libcurl: '>=8.5.0,<9.0a0' + libaec: '>=1.1.3,<2.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libxml2: '>=2.12.2,<3.0.0a0' + libxml2: '>=2.12.7,<3.0a0' libzip: '>=1.10.1,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - openssl: '>=3.2.0,<4.0a0' + libzlib: '>=1.2.13,<2.0a0' + openssl: '>=3.3.1,<4.0a0' zlib: '' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda hash: - md5: b2414908e43c442ddc68e6148774a304 - sha256: 0b4d984c7be21531e9254ce742e04101f7f7e77c0bbb7074855c0806c28323b0 + md5: a908e463c710bd6b10a9eaa89fdf003c + sha256: 055572a4c8a1c3f9ac60071ee678f5ea49cfd7ac60a636d817988a6f9d6de6ae category: main optional: false - name: libnetcdf @@ -7553,20 +7586,20 @@ package: bzip2: '>=1.0.8,<2.0a0' hdf4: '>=4.2.15,<4.2.16.0a0' hdf5: '>=1.14.3,<1.14.4.0a0' - libaec: '>=1.1.2,<2.0a0' - libcurl: '>=8.5.0,<9.0a0' + libaec: '>=1.1.3,<2.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - libxml2: '>=2.12.2,<3.0.0a0' + libxml2: '>=2.12.7,<3.0a0' libzip: '>=1.10.1,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - openssl: '>=3.2.0,<4.0a0' + libzlib: '>=1.2.13,<2.0a0' + openssl: '>=3.3.1,<4.0a0' zlib: '' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libnetcdf-4.9.2-nompi_h33102a8_113.conda + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libnetcdf-4.9.2-nompi_h9180261_114.conda hash: - md5: ea31ab8d4f2168dd9e9f5d15ede2bb48 - sha256: 008812a7ea975706fcd451576c67f48c380cb03260da8caed51fcb8570bdd0a5 + md5: 11142bc63a8d949f5f7e1f7c90c08f4a + sha256: 287922068a7d6289c924377056e70697bc394d77e4f49206e6fa66167140d410 category: main optional: false - name: libnetcdf @@ -7574,24 +7607,24 @@ package: manager: conda platform: osx-arm64 dependencies: - __osx: '>=10.9' + __osx: '>=11.0' blosc: '>=1.21.5,<2.0a0' bzip2: '>=1.0.8,<2.0a0' hdf4: '>=4.2.15,<4.2.16.0a0' hdf5: '>=1.14.3,<1.14.4.0a0' - libaec: '>=1.1.2,<2.0a0' - libcurl: '>=8.5.0,<9.0a0' - libcxx: '>=16.0.6' - libxml2: '>=2.12.2,<3.0.0a0' + libaec: '>=1.1.3,<2.0a0' + libcurl: '>=8.8.0,<9.0a0' + libcxx: '>=16' + libxml2: '>=2.12.7,<3.0a0' libzip: '>=1.10.1,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - openssl: '>=3.2.0,<4.0a0' + libzlib: '>=1.2.13,<2.0a0' + openssl: '>=3.3.1,<4.0a0' zlib: '' - zstd: '>=1.5.5,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libnetcdf-4.9.2-nompi_h291a7c2_113.conda + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libnetcdf-4.9.2-nompi_he469be0_114.conda hash: - md5: ad4f2f848502515d706cecd73ac9ec86 - sha256: e5c0e8071029fdffc4219fa03bf2cb05e910459e1d55da3bc0d8ab70ddd0325e + md5: 8fd3ce6d910ed831c130c391c4364d3f + sha256: aeac591ba859f9cf775993e8b7f21e50803405d41ef363dc4981d114e8df88a8 category: main optional: false - name: libnghttp2 @@ -7798,14 +7831,14 @@ package: manager: conda platform: linux-64 dependencies: - libabseil: '>=20240116.2,<20240116.3.0a0' - libgcc-ng: '>=11.2.0' - libstdcxx-ng: '>=11.2.0' - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/libprotobuf-4.25.3-he621ea3_0.conda + libabseil: '>=20240116.1,<20240117.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<2.0.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda hash: - md5: b5bac9ee75a731feb80bfc8c40d1958f - sha256: faf9d9816acb4f1f4646106fd5b21270f1d34631111a495c870966dbd9472e89 + md5: 6945825cebd2aeb16af4c69d97c32c13 + sha256: 70e0eef046033af2e8d21251a785563ad738ed5281c74e21c31c457780845dcd category: main optional: false - name: libprotobuf @@ -7813,14 +7846,14 @@ package: manager: conda platform: linux-aarch64 dependencies: - libabseil: '>=20240116.2,<20240116.3.0a0' - libgcc-ng: '>=11.2.0' - libstdcxx-ng: '>=11.2.0' - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/libprotobuf-4.25.3-h94b7715_0.conda + libabseil: '>=20240116.1,<20240117.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<2.0.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-4.25.3-h648ac29_0.conda hash: - md5: 4d762ab8f491349fa5016ce9aca52d00 - sha256: 5d57467b328ae326209f28d1f435678bdcfc68d8a28aa23760654046c135ff9e + md5: a239d63913ec9e008bdbe35899f677f4 + sha256: 76775a1457b2d4de1097bec2fda16b8e6e80f761d11aa7a525fa215bff4ab87c category: main optional: false - name: libprotobuf @@ -7828,13 +7861,13 @@ package: manager: conda platform: osx-arm64 dependencies: - libabseil: '>=20240116.2,<20240116.3.0a0' - libcxx: '>=14.0.6' - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/libprotobuf-4.25.3-h514c7bf_0.conda + libabseil: '>=20240116.1,<20240117.0a0' + libcxx: '>=16' + libzlib: '>=1.2.13,<2.0.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-4.25.3-hbfab5d5_0.conda hash: - md5: 76a4b8a344012a9facc05512742ef39f - sha256: 4ccd32643dd576f42b4f45e8b10b7aec5cb012d210309117cd8ff09c43a54616 + md5: 5f70b2b945a9741cba7e6dfe735a02a7 + sha256: d754519abc3ddbdedab2a38d0639170f5347c1573eef80c707f3a8dc5dff706a category: main optional: false - name: libre2-11 @@ -7955,44 +7988,6 @@ package: sha256: 6ecab6e5366696ec3329a13e55fa563f018e328c5d9b7a16ce02e3e8a1be09d5 category: main optional: false -- name: libspatialindex - version: 1.9.3 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=7.3.0' - libstdcxx-ng: '>=7.3.0' - url: https://repo.anaconda.com/pkgs/main/linux-64/libspatialindex-1.9.3-h2531618_0.conda - hash: - md5: 2944eeda0125389c979af67e4460a510 - sha256: ace5622050c0bc5dde819d360b2c0de86487152b9fc7d9069ffc96d8509b913e - category: main - optional: false -- name: libspatialindex - version: 1.9.3 - manager: conda - platform: linux-aarch64 - dependencies: - libgcc-ng: '>=10.2.0' - libstdcxx-ng: '>=10.2.0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/libspatialindex-1.9.3-h7c1a80f_0.conda - hash: - md5: 14db3432f106fd94cce31962c46375d4 - sha256: 8f9d6b4c98e9f355b9b72b1ab3681605fbcd1b45ac195d9bcfbbd80c8c921fc1 - category: main - optional: false -- name: libspatialindex - version: 1.9.3 - manager: conda - platform: osx-arm64 - dependencies: - libcxx: '>=12.0.0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/libspatialindex-1.9.3-hc377ac9_0.conda - hash: - md5: 7323469d324e6753d60276132cd51483 - sha256: 789d68a3df32c6e3b256c5c8c8f8a7a01789683446fd79ca448fef20a246ce9e - category: main - optional: false - name: libspatialite version: 5.1.0 manager: conda @@ -8005,14 +8000,14 @@ package: libsqlite: '>=3.45.3,<4.0a0' libstdcxx-ng: '>=12' libxml2: '>=2.12.7,<3.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - proj: '>=9.4.0,<9.4.1.0a0' + libzlib: '>=1.3.1,<2.0a0' + proj: '>=9.4.0,<9.5.0a0' sqlite: '' zlib: '' - url: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h5539517_6.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h6fbd9c4_7.conda hash: - md5: 1ee26233875c04444bdb2e5a838b5634 - sha256: b7fb427a35891b750d8b891735c16f813bfc4f8642367acb4b169a36c9c75923 + md5: e39bdbe437c74e43b534e21290ca3897 + sha256: 1cc07bc239174385f35cce30494356437b247faa023f9f946a37926c313cf71d category: main optional: false - name: libspatialite @@ -8027,14 +8022,14 @@ package: libsqlite: '>=3.45.3,<4.0a0' libstdcxx-ng: '>=12' libxml2: '>=2.12.7,<3.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - proj: '>=9.4.0,<9.4.1.0a0' + libzlib: '>=1.3.1,<2.0a0' + proj: '>=9.4.0,<9.5.0a0' sqlite: '' zlib: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libspatialite-5.1.0-h171d06b_6.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libspatialite-5.1.0-h6894ac2_7.conda hash: - md5: 4387eef76c3f34f4fd5ea5bc150e71b0 - sha256: 554938e68cd59465af10b97f90a7461a90c4ab6c4ea90be0cf35ed4e1cb81932 + md5: 071529f42792bb3bc49452b74e92f996 + sha256: 671e0fd5f1fc5489ff92b2de6a5107b5b0d99144e7a45cce932b461439167fa6 category: main optional: false - name: libspatialite @@ -8050,52 +8045,53 @@ package: librttopo: '>=1.1.0,<1.2.0a0' libsqlite: '>=3.45.3,<4.0a0' libxml2: '>=2.12.7,<3.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - proj: '>=9.4.0,<9.4.1.0a0' + libzlib: '>=1.3.1,<2.0a0' + proj: '>=9.4.0,<9.5.0a0' sqlite: '' zlib: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libspatialite-5.1.0-h0c1f73d_6.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libspatialite-5.1.0-h64db68f_7.conda hash: - md5: 545c929e5f6b29a5e47481f0435db889 - sha256: f3f18e03ded7d21904a5c0b920cd0c746f724ecf4c353dd0e835d4f98433c65a + md5: 4ec26751fa4bd250077583a4dfe0692a + sha256: aaccef6b3efaf82ed2d95ae232b9da20730f6037a08ad6322c0302f657cde12f category: main optional: false - name: libsqlite - version: 3.45.3 + version: 3.46.0 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' - libzlib: '>=1.2.13,<2.0.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda + libzlib: '>=1.2.13,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda hash: - md5: b3316cbe90249da4f8e84cd66e1cc55b - sha256: e2273d6860eadcf714a759ffb6dc24a69cfd01f2a0ea9d6c20f86049b9334e0c + md5: 18aa975d2094c34aef978060ae7da7d8 + sha256: daee3f68786231dad457d0dfde3f7f1f9a7f2018adabdbb864226775101341a8 category: main optional: false - name: libsqlite - version: 3.45.3 + version: 3.46.0 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - libzlib: '>=1.2.13,<2.0.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.45.3-h194ca79_0.conda + libzlib: '>=1.2.13,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.0-hf51ef55_0.conda hash: - md5: fb35b8afbe9e92467ac7b5608d60b775 - sha256: be87d8b67bdf892665c709d82c48011991fbf2fa15c19b006379b03ed494b070 + md5: a8ae63fd6fb7d007f74ef3df95e5edf3 + sha256: 7b48d006be6cd089105687fb524a2c93c4218bfc398d0611340cafec55249977 category: main optional: false - name: libsqlite - version: 3.45.3 + version: 3.46.0 manager: conda platform: osx-arm64 dependencies: - libzlib: '>=1.2.13,<2.0.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda + __osx: '>=11.0' + libzlib: '>=1.2.13,<2.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.0-hfb93653_0.conda hash: - md5: c8c1186c7f3351f6ffddb97b1f54fc58 - sha256: 4337f466eb55bbdc74e168b52ec8c38f598e3664244ec7a2536009036e2066cc + md5: 12300188028c9bc02da965128b91b517 + sha256: 73048f9cb8647d3d3bfe6021c0b7d663e12cffbe9b4f31bd081e713b0a9ad8f9 category: main optional: false - name: libssh2 @@ -8103,13 +8099,13 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=11.2.0' - openssl: '>=3.0.13,<4.0a0' - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/libssh2-1.11.0-h251f7ec_0.conda + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<2.0.0a0' + openssl: '>=3.1.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda hash: - md5: ce46cf257d73fe85c18c78597196f0d8 - sha256: b4b1558307da733cb097f9581793535a0f70821c412d12904f5a3354c7f6c1d2 + md5: 1f5a58e686b13bcfde88b93f547d23fe + sha256: 50e47fd9c4f7bf841a11647ae7486f65220cfc988ec422a4475fe8d5a823824d category: main optional: false - name: libssh2 @@ -8117,13 +8113,13 @@ package: manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=11.2.0' - openssl: '>=3.0.13,<4.0a0' - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/libssh2-1.11.0-hfa2bbb0_0.conda + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<2.0.0a0' + openssl: '>=3.1.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.0-h492db2e_0.conda hash: - md5: e7e4e44bf61a166c60ddb7c66314ea58 - sha256: 953e670fdf8d217c43de92f69d99d02b57f32af8df8d61bc2f244812285205b1 + md5: 45532845e121677ad328c9af9953f161 + sha256: 409163dd4a888b9266369f1bce57b5ca56c216e34249637c3e10eb404e356171 category: main optional: false - name: libssh2 @@ -8131,34 +8127,36 @@ package: manager: conda platform: osx-arm64 dependencies: - openssl: '>=3.0.13,<4.0a0' - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/libssh2-1.11.0-h3e2b118_0.conda + libzlib: '>=1.2.13,<2.0.0a0' + openssl: '>=3.1.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.0-h7a5bd25_0.conda hash: - md5: a2c10e819e80bfd0cf517d140ca08200 - sha256: b80c7f6afa0743749f611ac2feacdd7e239465c046988c5d2b30cb3fa297c2b2 + md5: 029f7dc931a3b626b94823bc77830b01 + sha256: bb57d0c53289721fff1eeb3103a1c6a988178e88d8a8f4345b0b91a35f0e0015 category: main optional: false - name: libstdcxx-ng - version: 13.2.0 + version: 14.1.0 manager: conda platform: linux-64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda + dependencies: + libgcc-ng: 14.1.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda hash: - md5: 53ebd4c833fa01cb2c6353e99f905406 - sha256: 35f1e08be0a84810c9075f5bd008495ac94e6c5fe306dfe4b34546f11fed850f + md5: 1cb187a157136398ddbaae90713e2498 + sha256: 88c42b388202ffe16adaa337e36cf5022c63cf09b0405cf06fc6aeacccbe6146 category: main optional: false - name: libstdcxx-ng - version: 13.2.0 + version: 14.1.0 manager: conda platform: linux-aarch64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.2.0-h3f4de04_7.conda + dependencies: + libgcc-ng: 14.1.0 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.1.0-h3f4de04_0.conda hash: - md5: 2a54872c7fab2db99b0074212d8efe64 - sha256: ed58d37fde428858e0efa4022c758beb2ea5ae7be93ccfb548f95ef9b60c2ef5 + md5: 2f84852b723ac4389eb188db695526bb + sha256: 4f2f35b78258d1a1e56b1b0e61091862c10ec76bf67ca1b0ff99dd5e07e76271 category: main optional: false - name: libtiff @@ -8280,41 +8278,47 @@ package: category: main optional: false - name: libxcb - version: '1.15' + version: '1.16' manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=7.5.0' - url: https://repo.anaconda.com/pkgs/main/linux-64/libxcb-1.15-h7f8727e_0.conda + libgcc-ng: '>=12' + pthread-stubs: '' + xorg-libxau: '>=1.0.11,<2.0a0' + xorg-libxdmcp: '' + url: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hd590300_0.conda hash: - md5: ada518dcadd6aaee9aae47ba9a671553 - sha256: 9feb197125e4803d702cfdf10116c856e381b59f845b3346f50cb10e9bb8c643 + md5: 151cba22b85a989c2d6ef9633ffee1e4 + sha256: 7180375f37fd264bb50672a63da94536d4abd81ccec059e932728ae056324b3a category: main optional: false - name: libxcb - version: '1.15' + version: '1.16' manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=10.2.0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/libxcb-1.15-h2f4d8fa_0.conda + libgcc-ng: '>=12' + pthread-stubs: '' + xorg-libxau: '>=1.0.11,<2.0a0' + xorg-libxdmcp: '' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.16-h7935292_0.conda hash: - md5: 2aad335d1da7c0f04debb65b9dc0cd4a - sha256: 8f26033b848734839db4e610ee859a1ecfceb02f526d1da9139f3b5defaa5943 + md5: 93c0136e9cba96657339dfe25fba4da7 + sha256: 5e4fec0243dca4af29cce38182b5a1b109a32f064421389f1a44aa883de79a1b category: main optional: false - name: libxcb - version: '1.15' + version: '1.16' manager: conda platform: osx-arm64 dependencies: pthread-stubs: '' - xorg-libxau: '' + xorg-libxau: '>=1.0.11,<2.0a0' xorg-libxdmcp: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.15-hf346824_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.16-hf2054a2_0.conda hash: - md5: 988d5f86ab60fa6de91b3ee3a88a3af9 - sha256: 6eaa87760ff3e91bb5524189700139db46f8946ff6331f4e571e4a9356edbb0d + md5: 55b5ed79062edde70459943d2d430d99 + sha256: ebf4b797f18de4280548520c97ca1528bcb5a8bc721e3bb133a4e3c930a5320f category: main optional: false - name: libxcrypt @@ -8346,15 +8350,16 @@ package: manager: conda platform: linux-64 dependencies: - icu: '>=73.2,<74.0a0' + __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' libgcc-ng: '>=12' libiconv: '>=1.17,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' xz: '>=5.2.6,<6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda hash: - md5: 5d801a4906adc712d480afc362623b59 - sha256: 2d8c402687f7045295d78d66688b140e3310857c7a070bba7547a3b9fcad5e7d + md5: 08a9265c637230c37cb1be4a6cad4536 + sha256: 10e9e0ac52b9a516a17edbc07f8d559e23778e54f1a7721b2e0e8219284fed3b category: main optional: false - name: libxml2 @@ -8362,15 +8367,15 @@ package: manager: conda platform: linux-aarch64 dependencies: - icu: '>=73.2,<74.0a0' + icu: '>=75.1,<76.0a0' libgcc-ng: '>=12' libiconv: '>=1.17,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' xz: '>=5.2.6,<6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.7-h49dc7a2_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.7-h00a45b3_4.conda hash: - md5: 3201713ddfaa8daba3702eeddf690d25 - sha256: 658fba82346e14cebe0d7972b84510e5cc4c3abd6c59be28405170cb442584fd + md5: d25c3e16ee77cd25342e4e235424c758 + sha256: 1ce32ab0ffbc8938f0820949ea733eb11f2f05355034af12fc6fe708f184fac1 category: main optional: false - name: libxml2 @@ -8379,14 +8384,14 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - icu: '>=73.2,<74.0a0' + icu: '>=75.1,<76.0a0' libiconv: '>=1.17,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' xz: '>=5.2.6,<6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-ha661575_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-h01dff8b_4.conda hash: - md5: 3de3b94d23f85429b87cf1e00c02582d - sha256: 10635eb2785aa9eb3d7f710c489e57eba71374f379b10da86bb257b941ab16ec + md5: 1265488dc5035457b729583119ad4a1b + sha256: a9a76cdc6e93c0182bc2ac58b1ea0152be1a16a5d23f4dc7b8df282a7aef8d20 category: main optional: false - name: libzip @@ -8434,39 +8439,39 @@ package: category: main optional: false - name: libzlib - version: 1.2.13 + version: 1.3.1 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda hash: - md5: 27329162c0dc732bcf67a4e0cd488125 - sha256: 8ced4afed6322172182af503f21725d072a589a6eb918f8a58135c1e00d35980 + md5: 57d7dc60e9325e3de37ff8dffd18e814 + sha256: adf6096f98b537a11ae3729eaa642b0811478f0ea0402ca67b5108fe2cb0010d category: main optional: false - name: libzlib - version: 1.2.13 + version: 1.3.1 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.2.13-h68df207_6.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h68df207_1.conda hash: - md5: d69c6550eaf76e8e385f75e5ed60aed9 - sha256: 4dafc31c913daae67d20a95fc2cac5a6d8bf1d5810d663e23b3335f9ae6f411d + md5: b13fb82f88902e34dd0638cd7d378c21 + sha256: 0d6dfd1e36e10c205ff1fdcf42d42289ff0f50be7a4eaa7b34f086a5e22a0734 category: main optional: false - name: libzlib - version: 1.2.13 + version: 1.3.1 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-hfb2fe0b_6.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-hfb2fe0b_1.conda hash: - md5: 9c4e121cd926cab631bd1c4a61d18b17 - sha256: 8b29a2386d99b8f58178951dcf19117b532cd9c4aa07623bf1667eae99755d32 + md5: 636077128927cf79fd933276dc3aed47 + sha256: c34365dd37b0eab27b9693af32a1f7f284955517c2cc91f1b88a7ef4738ff03e category: main optional: false - name: llvm-openmp @@ -8828,59 +8833,60 @@ package: category: main optional: false - name: minizip - version: 4.0.3 + version: 4.0.7 manager: conda platform: linux-64 dependencies: bzip2: '>=1.0.8,<2.0a0' - libgcc-ng: '>=11.2.0' - libiconv: '>=1.16,<2.0a0' - libstdcxx-ng: '>=11.2.0' - openssl: '>=3.0.12,<4.0a0' - xz: '>=5.4.5,<6.0a0' - zlib: '>=1.2.13,<1.3.0a0' - zstd: '>=1.5.2,<1.6.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/minizip-4.0.3-hf59b114_0.conda + libgcc-ng: '>=12' + libiconv: '>=1.17,<2.0a0' + libstdcxx-ng: '>=12' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.3.1,<4.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda hash: - md5: e1efccc2d4cfe54c7119600ea6dcdbe7 - sha256: 8128f95d8036736accd35b1f6c595c8ee9c7ecfc901bbf0cb20fa48f6d6b7bb5 + md5: 4474532a312b2245c5c77f1176989b46 + sha256: 6315ea87d094418e744deb79a22331718b36a0e6e107cd7fc3c52c7922bc8133 category: main optional: false - name: minizip - version: 4.0.3 + version: 4.0.7 manager: conda platform: linux-aarch64 dependencies: bzip2: '>=1.0.8,<2.0a0' - libgcc-ng: '>=11.2.0' - libiconv: '>=1.16,<2.0a0' - libstdcxx-ng: '>=11.2.0' - openssl: '>=3.0.12,<4.0a0' - xz: '>=5.4.5,<6.0a0' - zlib: '>=1.2.13,<1.3.0a0' - zstd: '>=1.5.2,<1.6.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/minizip-4.0.3-ha60d17d_0.conda + libgcc-ng: '>=12' + libiconv: '>=1.17,<2.0a0' + libstdcxx-ng: '>=12' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.3.1,<4.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/minizip-4.0.7-h77a9e90_0.conda hash: - md5: bd7e85af694e14b56f0bf10bacd421a3 - sha256: 0dc1fe052b41c80ceb6730da0ceb000deaddc730cd0a1d624a778c80f36d0b96 + md5: 7c8cd307bc5c00bdba33e1c11685b3b4 + sha256: 76bfb9973b32f8d9e4740ca6854e7c0daea5e66a28352e5999de0ea06faf0085 category: main optional: false - name: minizip - version: 4.0.3 + version: 4.0.7 manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' bzip2: '>=1.0.8,<2.0a0' - libcxx: '>=14.0.6' - libiconv: '>=1.16,<2.0a0' - openssl: '>=3.0.12,<4.0a0' - xz: '>=5.4.5,<6.0a0' - zlib: '>=1.2.13,<1.3.0a0' - zstd: '>=1.5.2,<1.6.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/minizip-4.0.3-ha89c15f_0.conda + libcxx: '>=16' + libiconv: '>=1.17,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.3.1,<4.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/minizip-4.0.7-h27ee973_0.conda hash: - md5: 28d75d7708d729568597844a4095ac07 - sha256: 8337d9fd2545fbf4db7f3b1c99481a02aa84c984ff2df1ef5bec57e662df1ee3 + md5: 73dcdab1f21da49048a4f26d648c87a9 + sha256: 8216190bed8462758d1fea34964f4f46e6314e92696d8b6607bde588895663ad category: main optional: false - name: mistune @@ -9245,7 +9251,7 @@ package: category: main optional: false - name: netcdf4 - version: 1.6.5 + version: 1.7.1 manager: conda platform: linux-64 dependencies: @@ -9254,19 +9260,19 @@ package: hdf5: '>=1.14.3,<1.14.4.0a0' libgcc-ng: '>=12' libnetcdf: '>=4.9.2,<4.9.3.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' numpy: '>=1.19,<3' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* setuptools: '' - url: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py312h39d4375_101.conda + url: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h1ef7fb6_101.conda hash: - md5: 9033de6c10fd3396990890d8d8a6ac4e - sha256: 8f7d27f14fd08ae7cf8d8ad21566ce45b2d38fc4c66d6a38951abbed934d62cd + md5: c67cc8e3a34c5cb8920c79918112e96f + sha256: 4a9db499859641461c3b77bf8f4d152bc4106a0c85273fc64a4eaf8661f9bd50 category: main optional: false - name: netcdf4 - version: 1.6.5 + version: 1.7.1 manager: conda platform: linux-aarch64 dependencies: @@ -9275,19 +9281,19 @@ package: hdf5: '>=1.14.3,<1.14.4.0a0' libgcc-ng: '>=12' libnetcdf: '>=4.9.2,<4.9.3.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' numpy: '>=1.19,<3' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* setuptools: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/netcdf4-1.6.5-nompi_py312h8cc4812_101.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/netcdf4-1.7.1-nompi_py312h6d1f968_101.conda hash: - md5: 7b2f09bd0e15c8961b7087649cd9df3d - sha256: dae62d76674b49ea94d1d0c754120f8e12e3c7b8bf9973ef1453d66d057c8f06 + md5: 23cfe78e207336d67e9b07f7abfc3d88 + sha256: bc2a2f2fb5d06e7ffc33b2a5c3faede123a60c647712c68cdf2ff88e5197088a category: main optional: false - name: netcdf4 - version: 1.6.5 + version: 1.7.1 manager: conda platform: osx-arm64 dependencies: @@ -9296,51 +9302,51 @@ package: cftime: '' hdf5: '>=1.14.3,<1.14.4.0a0' libnetcdf: '>=4.9.2,<4.9.3.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' numpy: '>=1.19,<3' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* setuptools: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/netcdf4-1.6.5-nompi_py312h30cf68c_101.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/netcdf4-1.7.1-nompi_py312hec02768_101.conda hash: - md5: 85c577a2e3ce1781368ccb6c2c763109 - sha256: e12fba777b21aa79bd4614e6db39a80f1bdf85d36e63111e6018c96379839651 + md5: 9199ca08a0a8ccb6778ec72d3db1d51a + sha256: 5bc799edff740d891550d2f69108c5d5aaf26f0bf46e2d7ca0259a877ce01104 category: main optional: false - name: networkx - version: '3.1' + version: '3.3' manager: conda platform: linux-64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/networkx-3.1-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/networkx-3.3-py312h06a4308_0.conda hash: - md5: 8f9cd07ef4c47f326d0bd781d1803f0a - sha256: f48d5e85fbf1c4afb65af8d693a1720221c282b18ae0392c7c516d8a1685b251 + md5: 3d6fe63c7b13df13c529e2aace012d80 + sha256: 398342cc71b7451158af62e598f6498c950142222310720fc1c4319f06cacecf category: main optional: false - name: networkx - version: '3.1' + version: '3.3' manager: conda platform: linux-aarch64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/networkx-3.1-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/networkx-3.3-py312hd43f75c_0.conda hash: - md5: b42d1c7920fc453994eb23a178308a24 - sha256: c39f5af5c15756c4c571ab97b18ab55c5f2908df3bbb2d1d2f63e8375c05f6c2 + md5: d31b9a56604cba2e8f1111bf5ff198a2 + sha256: 323d5afb4f88b57f5ca3b569ed019e29da90eccd4366885d7e012bf54d9bf598 category: main optional: false - name: networkx - version: '3.1' + version: '3.3' manager: conda platform: osx-arm64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/networkx-3.1-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/networkx-3.3-py312hca03da5_0.conda hash: - md5: 698c825547c44e61cad7c9294fb703cd - sha256: ea0dabd4bc68f0c208f93155ec931d8b5ca74c56b9cab58e529fa9d73065a609 + md5: 2fccdabeec4d97981d1e9719f5de633e + sha256: 9ce646f31ab881d84a54f29736598da0f1b6a17f63f7d291a84a3debe658b5aa category: main optional: false - name: nodeenv @@ -9460,52 +9466,52 @@ package: category: main optional: false - name: nss - version: '3.100' + version: '3.102' manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc-ng: '>=12' - libsqlite: '>=3.45.3,<4.0a0' + libsqlite: '>=3.46.0,<4.0a0' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' nspr: '>=4.35,<5.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/nss-3.102-h593d115_0.conda hash: - md5: 949c4a82290ee58b3c970cef4bcfd4ad - sha256: a4146d2b6636999a21afcaf957029d066637bf26239fd3170242501e38fb1fa4 + md5: 40e5e48c55a45621c4399ca9236406b7 + sha256: 5e5dbae2f5bc55646a9d70601432ea71b867ce06bccd174e479ac36abf5d0807 category: main optional: false - name: nss - version: '3.100' + version: '3.102' manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - libsqlite: '>=3.45.3,<4.0a0' + libsqlite: '>=3.46.0,<4.0a0' libstdcxx-ng: '>=12' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' nspr: '>=4.35,<5.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.100-h8c4e863_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.102-hfe4779c_0.conda hash: - md5: 6029b52dd71a51b08ecf62cbf374ac5e - sha256: a11d29bee156be646897cdd95c99b207889dd55b7f5c80519987e138f70a1730 + md5: bde53c4591a8b703bb8f6cb7b08333e6 + sha256: fad4fba3eca660819a7424f09248e8fe9dca2745b3539a8d8c984819531693ab category: main optional: false - name: nss - version: '3.100' + version: '3.102' manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' libcxx: '>=16' - libsqlite: '>=3.45.3,<4.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libsqlite: '>=3.46.0,<4.0a0' + libzlib: '>=1.3.1,<2.0a0' nspr: '>=4.35,<5.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.100-hc6e9f88_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.102-hc42bcbf_0.conda hash: - md5: 5510f8855b43310ed7609395f8d777dd - sha256: e6da8091c7a522f0ce1ba363efd563de0c796d0b53a43d127af2e4cbe584ccbd + md5: 8e6786925188583c0c18920545bb0d72 + sha256: 15f521cae90a27ff42b5de3f40cf76f574e0e703c51aa4c882a3590eef284edf category: main optional: false - name: numexpr @@ -9740,42 +9746,43 @@ package: category: main optional: false - name: openssl - version: 3.3.0 + version: 3.3.1 manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' ca-certificates: '' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda hash: - md5: 12ea6d0d4ed54530eaed18e4835c1f7c - sha256: 33dcea0ed3a61b2de6b66661cdd55278640eb99d676cd129fbff3e53641fa125 + md5: e1b454497f9f7c1147fdde4b53f1b512 + sha256: b294b3cc706ad1048cdb514f0db3da9f37ae3fcc0c53a7104083dd0918adb200 category: main optional: false - name: openssl - version: 3.3.0 + version: 3.3.1 manager: conda platform: linux-aarch64 dependencies: ca-certificates: '' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.0-h68df207_3.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.1-h68df207_2.conda hash: - md5: f2dec4814ac9649cd3d3e474cd0b9a58 - sha256: f9e595c35fe111aca838233b5d553cac61f9041c445b770458749ddd995e32a4 + md5: e53f74e640d477466e04bae394b0d163 + sha256: 6c15fd3e6c1dd92b17533fe307cb758be88e85e32e1b988507708905357acb60 category: main optional: false - name: openssl - version: 3.3.0 + version: 3.3.1 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' ca-certificates: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-hfb2fe0b_3.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.1-hfb2fe0b_2.conda hash: - md5: 730f618b008b3c13c1e3f973408ddd67 - sha256: 6f41c163ab57e7499dff092be4498614651f0f6432e12c2b9f06859a8bc39b75 + md5: 9b551a504c1cc8f8b7b22c01814da8ba + sha256: dd7d988636f74473ebdfe15e05c5aabdb53a1d2a846c839d62289b0c37f81548 category: main optional: false - name: overrides @@ -9815,43 +9822,43 @@ package: category: main optional: false - name: packaging - version: '23.2' + version: '24.1' manager: conda platform: linux-64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/packaging-23.2-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/packaging-24.1-py312h06a4308_0.conda hash: - md5: 6df46fc8a396077102655cc21600723d - sha256: 50c2a28dc25712bd7031011e9d4e28340d7488c3484fb27c05d725172ebb5da4 + md5: 756ec42d4f934b642b8476689af2781f + sha256: 962a78d7747a61b60aeb0f65c75abfada1a74480c75cd85d1f4f8b761a38ecb0 category: main optional: false - name: packaging - version: '23.2' + version: '24.1' manager: conda platform: linux-aarch64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/packaging-23.2-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/packaging-24.1-py312hd43f75c_0.conda hash: - md5: 2ba44fbb5d1cd675922b2259e207c94e - sha256: 7210f48a0dbfbb7bc4f0555b80c87a69403a0e7d5f8a4aae0d151b735c26e1b8 + md5: 30cd7bfa62cb87302835e9e8f88d3014 + sha256: 7a03ba105a8c646e70cacff920359985bf62d19741dc946e76e9dd5794a2e569 category: main optional: false - name: packaging - version: '23.2' + version: '24.1' manager: conda platform: osx-arm64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/packaging-23.2-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/packaging-24.1-py312hca03da5_0.conda hash: - md5: ad88d714049917482d98b67f197a1507 - sha256: bb3c4baccb57583a368e8c3ee9ef720350b281f7bc5a2210f93e0e316afc375d + md5: 74c2b9d014eb632562b83305c1138571 + sha256: ee154b699865a87ee8d3d9286e6a9179e855d8c0dc2c6684416897a273393fab category: main optional: false - name: pandas - version: 2.2.1 + version: 2.2.2 manager: conda platform: linux-64 dependencies: @@ -9864,14 +9871,14 @@ package: python-dateutil: '>=2.8.2' python-tzdata: '>=2022.7' pytz: '>=2020.1' - url: https://repo.anaconda.com/pkgs/main/linux-64/pandas-2.2.1-py312h526ad5a_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/pandas-2.2.2-py312h526ad5a_0.conda hash: - md5: f292b675711a103bf8a3c577d052171a - sha256: a8afcecf19d5d84ea35be1d6141fa88f22ac1e17692bf49dc0d79346dc400fd1 + md5: 931585545b1801a72013bf30186fb51a + sha256: a3a5a4df30f1869322b6d0534ce2e0b862396dc9632539b9c11125f26fcd7318 category: main optional: false - name: pandas - version: 2.2.1 + version: 2.2.2 manager: conda platform: linux-aarch64 dependencies: @@ -9884,14 +9891,14 @@ package: python-dateutil: '>=2.8.2' python-tzdata: '>=2022.7' pytz: '>=2020.1' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/pandas-2.2.1-py312h0f5fa8b_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/pandas-2.2.2-py312h0f5fa8b_0.conda hash: - md5: 2a7315dbb1eef6d17eacd4075891e7ce - sha256: e60415f044e9c30ef751c7a527373952388ebf7da11dc2f0060b293ca03b7967 + md5: c8da011ebba7bc8ebc2b97f1c459533e + sha256: 20bfccd6bdfd5ebdcb2976a783dbd94fac5ae49600f3316db15ae1d57ce023e3 category: main optional: false - name: pandas - version: 2.2.1 + version: 2.2.2 manager: conda platform: osx-arm64 dependencies: @@ -9903,10 +9910,10 @@ package: python-dateutil: '>=2.8.2' python-tzdata: '>=2022.7' pytz: '>=2020.1' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/pandas-2.2.1-py312hd77ebd4_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/pandas-2.2.2-py312hd77ebd4_0.conda hash: - md5: f5430750e7c073b4ef6b51eb82c54258 - sha256: fb87cdb794bbfbc7790e89967dfc38311bd7296cc1e81cfe49a5981a8146bf41 + md5: d9dc9125223910881bb53d61f6867fbd + sha256: e01dd8668a0fdc40d042c75930167b1edabc96f8a05723e2ddfe188c3984ffca category: main optional: false - name: pandocfilters @@ -10053,141 +10060,199 @@ package: sha256: 670d1a67c20bba49d2e3983300c05d9ab095473cf95473147afa4b88703716cb category: main optional: false -- name: pcre2 - version: '10.43' +- name: pbs-installer + version: 2024.4.24 manager: conda platform: linux-64 dependencies: - bzip2: '>=1.0.8,<2.0a0' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2024.4.24-pyhd8ed1ab_0.conda + hash: + md5: 4647442ace74db3dd235968a18b090eb + sha256: e20dfd49362a571774a587671d79f5b1af30444f6bd92001a621bd529da58385 + category: main + optional: false +- name: pbs-installer + version: 2024.4.24 + manager: conda + platform: linux-aarch64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2024.4.24-pyhd8ed1ab_0.conda + hash: + md5: 4647442ace74db3dd235968a18b090eb + sha256: e20dfd49362a571774a587671d79f5b1af30444f6bd92001a621bd529da58385 + category: main + optional: false +- name: pbs-installer + version: 2024.4.24 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2024.4.24-pyhd8ed1ab_0.conda + hash: + md5: 4647442ace74db3dd235968a18b090eb + sha256: e20dfd49362a571774a587671d79f5b1af30444f6bd92001a621bd529da58385 + category: main + optional: false +- name: pcre2 + version: '10.44' + manager: conda + platform: linux-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' libgcc-ng: '>=12' - libzlib: '>=1.2.13,<2.0.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-h0f59acf_0.conda hash: - md5: 8292dea9e022d9610a11fce5e0896ed8 - sha256: 766dd986a7ed6197676c14699000bba2625fd26c8a890fcb7a810e5cf56155bc + md5: 3914f7ac1761dce57102c72ca7c35d01 + sha256: 90646ad0d8f9d0fd896170c4f3d754e88c4ba0eaf856c24d00842016f644baab category: main optional: false - name: pcre2 - version: '10.43' + version: '10.44' manager: conda platform: linux-aarch64 dependencies: bzip2: '>=1.0.8,<2.0a0' libgcc-ng: '>=12' - libzlib: '>=1.2.13,<2.0.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.43-hd0f9c67_0.conda + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_0.conda hash: - md5: 1275fa549338ecdc8b7793589ac09150 - sha256: 1bac2077caa28f0764f955e522468b98316b99b2d0904e9d93a01297fe1b7ba2 + md5: e5c5c5acdd1f52508f5e9938b454ae5d + sha256: 5d3c562785526fc4d2f0f4eff7edf94d3afbef92a6290e8bc0bff88fa664fba0 category: main optional: false - name: pcre2 - version: '10.43' + version: '10.44' manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' bzip2: '>=1.0.8,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.43-h26f9a81_0.conda + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.44-h297a79d_0.conda hash: - md5: 1ddc87f00014612830f3235b5ad6d821 - sha256: 4bf7b5fa091f5e7ab0b78778458be1e81c1ffa182b63795734861934945a63a7 + md5: 62f8d7e2ef03b0aae64185b0f38316eb + sha256: 23ddc5022a1025027ac1957dc1947c70d93a78414fbb183026457a537e8b3770 category: main optional: false - name: pdm - version: 2.12.4 + version: 2.17.0 manager: conda platform: linux-64 dependencies: blinker: '' - cachecontrol: '>=0.13.0' - certifi: '' - dep-logic: '>=0.2.0,<1.0' - filelock: '>=3.8.0' - findpython: '>=0.4.0,<1.0.0a0' + chardet: '' + dep-logic: '>=0.4.0' + filelock: '>=3.13' + findpython: '>=0.6.0,<1.0.0a0' + hishel: '>=0.0.24,<0.1.0' + httpx: <1,>0.20 + idna: '' + importlib-metadata: '>=3.6' + importlib-resources: '>=5' + msgpack-python: '>=1.0' packaging: '>=20.9,!=22.0' + pbs-installer: '>=2024.4.18' platformdirs: '' pyproject_hooks: '' - python: '>=3.12,<3.13.0a0' + python: '>=3.8,<3.13' python-dotenv: '>=0.15' python-installer: <0.8,>=0.7 - python_abi: 3.12.* - requests-toolbelt: '' + requests: '' resolvelib: '>=1.0.1' rich: '>=12.3.0' shellingham: '>=1.3.2' + socksio: '>=1,<2' + tomli: '>=1.1.0' tomlkit: '>=0.11.1,<1' - truststore: '' - unearth: '>=0.12.1' + unearth: '>=0.16.0' virtualenv: '>=20' - url: https://conda.anaconda.org/conda-forge/linux-64/pdm-2.12.4-py312h7900ff3_1.conda + zstandard: '>=0.21.0' + url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.0-pyhd8ed1ab_0.conda hash: - md5: faf91a93a76cd42d9b1fb3ff400b199f - sha256: fef1def0232702f120243fc08582e60a00806d14403dbe32e9ac52f9a171b948 + md5: f5967ca19cb8fbd0eb04b8e191ded1e2 + sha256: 1589cbc07bf97d0bc3c21bbc339079b021e8fe76e71b14dae5815c691dad4c96 category: main optional: false - name: pdm - version: 2.12.4 + version: 2.17.0 manager: conda platform: linux-aarch64 dependencies: blinker: '' - cachecontrol: '>=0.13.0' - certifi: '' - dep-logic: '>=0.2.0,<1.0' - filelock: '>=3.8.0' - findpython: '>=0.4.0,<1.0.0a0' + chardet: '' + dep-logic: '>=0.4.0' + filelock: '>=3.13' + findpython: '>=0.6.0,<1.0.0a0' + hishel: '>=0.0.24,<0.1.0' + httpx: <1,>0.20 + idna: '' + importlib-metadata: '>=3.6' + importlib-resources: '>=5' + msgpack-python: '>=1.0' packaging: '>=20.9,!=22.0' + pbs-installer: '>=2024.4.18' platformdirs: '' pyproject_hooks: '' - python: '>=3.12,<3.13.0a0' + python: '>=3.8,<3.13' python-dotenv: '>=0.15' python-installer: <0.8,>=0.7 - python_abi: 3.12.* - requests-toolbelt: '' + requests: '' resolvelib: '>=1.0.1' rich: '>=12.3.0' shellingham: '>=1.3.2' + socksio: '>=1,<2' + tomli: '>=1.1.0' tomlkit: '>=0.11.1,<1' - truststore: '' - unearth: '>=0.12.1' + unearth: '>=0.16.0' virtualenv: '>=20' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/pdm-2.12.4-py312h996f985_1.conda + zstandard: '>=0.21.0' + url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.0-pyhd8ed1ab_0.conda hash: - md5: 21b9060bc29b39a7d0ac9f8d327a47b9 - sha256: a748010fd66b940bf13dee2f4629b81e1b338f727d0ec306dd8d9d28814e2f98 + md5: f5967ca19cb8fbd0eb04b8e191ded1e2 + sha256: 1589cbc07bf97d0bc3c21bbc339079b021e8fe76e71b14dae5815c691dad4c96 category: main optional: false - name: pdm - version: 2.12.4 + version: 2.17.0 manager: conda platform: osx-arm64 dependencies: blinker: '' - cachecontrol: '>=0.13.0' - certifi: '' - dep-logic: '>=0.2.0,<1.0' - filelock: '>=3.8.0' - findpython: '>=0.4.0,<1.0.0a0' + chardet: '' + dep-logic: '>=0.4.0' + filelock: '>=3.13' + findpython: '>=0.6.0,<1.0.0a0' + hishel: '>=0.0.24,<0.1.0' + httpx: <1,>0.20 + idna: '' + importlib-metadata: '>=3.6' + importlib-resources: '>=5' + msgpack-python: '>=1.0' packaging: '>=20.9,!=22.0' + pbs-installer: '>=2024.4.18' platformdirs: '' pyproject_hooks: '' - python: '>=3.12,<3.13.0a0' + python: '>=3.8,<3.13' python-dotenv: '>=0.15' python-installer: <0.8,>=0.7 - python_abi: 3.12.* - requests-toolbelt: '' + requests: '' resolvelib: '>=1.0.1' rich: '>=12.3.0' shellingham: '>=1.3.2' + socksio: '>=1,<2' + tomli: '>=1.1.0' tomlkit: '>=0.11.1,<1' - truststore: '' - unearth: '>=0.12.1' + unearth: '>=0.16.0' virtualenv: '>=20' - url: https://conda.anaconda.org/conda-forge/osx-arm64/pdm-2.12.4-py312h81bd7bf_1.conda + zstandard: '>=0.21.0' + url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.0-pyhd8ed1ab_0.conda hash: - md5: 942f768ee895d91fa08744d9da51072a - sha256: 985d84afe2967dc85cfd91fdb1925f65b9415fbfb23300b053e8e7a1d8440183 + md5: f5967ca19cb8fbd0eb04b8e191ded1e2 + sha256: 1589cbc07bf97d0bc3c21bbc339079b021e8fe76e71b14dae5815c691dad4c96 category: main optional: false - name: perl @@ -10268,7 +10333,7 @@ package: category: main optional: false - name: pillow - version: 10.3.0 + version: 10.4.0 manager: conda platform: linux-64 dependencies: @@ -10277,21 +10342,21 @@ package: libgcc-ng: '>=12' libjpeg-turbo: '>=3.0.0,<4.0a0' libtiff: '>=4.6.0,<4.7.0a0' - libwebp-base: '>=1.3.2,<2.0a0' - libxcb: '>=1.15,<1.16.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libwebp-base: '>=1.4.0,<2.0a0' + libxcb: '>=1.16,<1.17.0a0' + libzlib: '>=1.3.1,<2.0a0' openjpeg: '>=2.5.2,<3.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* tk: '>=8.6.13,<8.7.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py312h287a98d_0.conda hash: - md5: 425bb325f970e57a047ac57c4586489d - sha256: a7fdcc1e56b66d95622bad073cc8d347cc180988040419754abb2a4ed7b29471 + md5: 59ea71eed98aee0bebbbdd3b118167c7 + sha256: f3bca9472702f32bf85196efbf013e9dabe130776e76c7f81062f18682f33a05 category: main optional: false - name: pillow - version: 10.3.0 + version: 10.4.0 manager: conda platform: linux-aarch64 dependencies: @@ -10300,39 +10365,40 @@ package: libgcc-ng: '>=12' libjpeg-turbo: '>=3.0.0,<4.0a0' libtiff: '>=4.6.0,<4.7.0a0' - libwebp-base: '>=1.3.2,<2.0a0' - libxcb: '>=1.15,<1.16.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libwebp-base: '>=1.4.0,<2.0a0' + libxcb: '>=1.16,<1.17.0a0' + libzlib: '>=1.3.1,<2.0a0' openjpeg: '>=2.5.2,<3.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* tk: '>=8.6.13,<8.7.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-10.3.0-py312h317ddc0_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-10.4.0-py312hc0f7016_0.conda hash: - md5: e13ac7228bc74789e99d038aa7fcfd21 - sha256: 37845380f991b4013ce12e4d05da05817af7dc0a6fa6cb323e574f8fa15b490f + md5: 1fbb8afc7df88dad0d7ccfed6c647179 + sha256: 522d20c70fdd0c7f117cf652363ef312e4db308d99c4d28199c45bbfeb25481e category: main optional: false - name: pillow - version: 10.3.0 + version: 10.4.0 manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' freetype: '>=2.12.1,<3.0a0' lcms2: '>=2.16,<3.0a0' libjpeg-turbo: '>=3.0.0,<4.0a0' libtiff: '>=4.6.0,<4.7.0a0' - libwebp-base: '>=1.3.2,<2.0a0' - libxcb: '>=1.15,<1.16.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libwebp-base: '>=1.4.0,<2.0a0' + libxcb: '>=1.16,<1.17.0a0' + libzlib: '>=1.3.1,<2.0a0' openjpeg: '>=2.5.2,<3.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* tk: '>=8.6.13,<8.7.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.3.0-py312h8a801b1_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.4.0-py312h39b1d8d_0.conda hash: - md5: 1d42544faaed27dce36268912b8dfedf - sha256: 26bc04e81ae5fce70e4b72478dadea29d32b693eed17640be7721108a3c9af0d + md5: 461c9897622e08c614087f9c9b9a22ce + sha256: 7c4244fa62cf630375531723631764a276eb06eeb5cc345a8e55a091aec1e52d category: main optional: false - name: pixman @@ -10482,45 +10548,45 @@ package: category: dev optional: true - name: plum-dispatch - version: 2.4.1 + version: 2.5.2 manager: conda platform: linux-64 dependencies: beartype: '>=0.12' python: '>=3.8' rich: '>=10.0' - url: https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.4.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.5.2-pyhd8ed1ab_0.conda hash: - md5: 2fffd2371d53e1eefc597bae076eef41 - sha256: 4179a0b71a0ff5f4def6a2e353cb3f00bf884a8ba384c07c995ffffc37a2a20c + md5: f8d38e43e2b367976d7135e602b5c9b6 + sha256: 164be5a53d1ed46f3465f805588dec1b23e5e9a2f2f68f2a8b5297917b1ef68e category: dev optional: true - name: plum-dispatch - version: 2.4.1 + version: 2.5.2 manager: conda platform: linux-aarch64 dependencies: beartype: '>=0.12' python: '>=3.8' rich: '>=10.0' - url: https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.4.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.5.2-pyhd8ed1ab_0.conda hash: - md5: 2fffd2371d53e1eefc597bae076eef41 - sha256: 4179a0b71a0ff5f4def6a2e353cb3f00bf884a8ba384c07c995ffffc37a2a20c + md5: f8d38e43e2b367976d7135e602b5c9b6 + sha256: 164be5a53d1ed46f3465f805588dec1b23e5e9a2f2f68f2a8b5297917b1ef68e category: dev optional: true - name: plum-dispatch - version: 2.4.1 + version: 2.5.2 manager: conda platform: osx-arm64 dependencies: beartype: '>=0.12' python: '>=3.8' rich: '>=10.0' - url: https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.4.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.5.2-pyhd8ed1ab_0.conda hash: - md5: 2fffd2371d53e1eefc597bae076eef41 - sha256: 4179a0b71a0ff5f4def6a2e353cb3f00bf884a8ba384c07c995ffffc37a2a20c + md5: f8d38e43e2b367976d7135e602b5c9b6 + sha256: 164be5a53d1ed46f3465f805588dec1b23e5e9a2f2f68f2a8b5297917b1ef68e category: dev optional: true - name: poppler @@ -10797,16 +10863,16 @@ package: manager: conda platform: linux-64 dependencies: - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libsqlite: '>=3.45.3,<4.0a0' libstdcxx-ng: '>=12' libtiff: '>=4.6.0,<4.7.0a0' sqlite: '' - url: https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-hb784bbd_2.conda hash: - md5: 113f894e5019db2e2705645ee3bcf91a - sha256: 06926e821e808cf27cdede5807d2cfc152d4a6276d7d6c5bae80b1a4904265eb + md5: b0683c229de4c4c676450d24ff87538c + sha256: 81b8754365af4ff5a70b5d53a83464836062ab66aa9573f830a1f98d3d2cd412 category: main optional: false - name: proj @@ -10814,16 +10880,16 @@ package: manager: conda platform: linux-aarch64 dependencies: - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libsqlite: '>=3.45.3,<4.0a0' libstdcxx-ng: '>=12' libtiff: '>=4.6.0,<4.7.0a0' sqlite: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/proj-9.4.0-h7b42f86_1.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/proj-9.4.0-hd5926b2_2.conda hash: - md5: bc557a0ac5cc1441215837ab91dc1040 - sha256: 4c100e2c3276266114a462f360496b02e3d69e12d68acb82354d5816076c8509 + md5: cd9e2a83ec5f40ff1e5917f2048b6dce + sha256: d1e34566e6583305728d595474c62cdbbd55fd8da745941b0aa8492d4814bdb4 category: main optional: false - name: proj @@ -10831,15 +10897,16 @@ package: manager: conda platform: osx-arm64 dependencies: - libcurl: '>=8.7.1,<9.0a0' + __osx: '>=11.0' + libcurl: '>=8.8.0,<9.0a0' libcxx: '>=16' libsqlite: '>=3.45.3,<4.0a0' libtiff: '>=4.6.0,<4.7.0a0' sqlite: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/proj-9.4.0-h52fb9d0_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/proj-9.4.0-hfb94cee_2.conda hash: - md5: 9f6e04af24aa75390e5a140120da880f - sha256: 7e985783fe8da33292b90658ce4cce1f01777c9588f57ce6ea1c2ac46866703e + md5: 9e435db055ee4effcb3817891960ce02 + sha256: 513a718cb2233165f0bc7bda127b74b5bf9a54725387cb0d9edb6cd3ab9181b0 category: main optional: false - name: prometheus_client @@ -10991,6 +11058,30 @@ package: sha256: b92db3502e5c02e7cc8f4032499ae9db5af71351f0db7ba1d389ff0cf8f66cca category: main optional: false +- name: pthread-stubs + version: '0.3' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=7.2.0' + url: https://repo.anaconda.com/pkgs/main/linux-64/pthread-stubs-0.3-h0ce48e5_1.conda + hash: + md5: 973a642312d2a28927aaf5b477c67250 + sha256: 119c5ad43fb92b2f14a25c53276072ee77ff6b40c72e6617b523b9de0eb0822a + category: main + optional: false +- name: pthread-stubs + version: '0.3' + manager: conda + platform: linux-aarch64 + dependencies: + libgcc-ng: '>=10.2.0' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/pthread-stubs-0.3-hfd63f10_1.conda + hash: + md5: bd26b7e13996984230e8ec67f3ebd4c7 + sha256: 8127d83effe9e77fbcff1dfd1ad61ecb02251615501a9af524a690e573bbc9af + category: main + optional: false - name: pthread-stubs version: '0.3' manager: conda @@ -11301,6 +11392,63 @@ package: sha256: 51c480043149445a01025377ef9deb2ef47d982ad469b821af31bbd2a094988c category: main optional: false +- name: pyogrio + version: 0.8.0 + manager: conda + platform: linux-64 + dependencies: + gdal: '' + libgcc-ng: '>=12' + libgdal: '>=3.8.5,<3.9.0a0' + libstdcxx-ng: '>=12' + numpy: '' + packaging: '' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.8.0-py312hbedb91a_1.conda + hash: + md5: 3840cffc5d6c64e179fc54f02714956d + sha256: 2a6775e23380b04d532eaa44393b98dabca7ecea1023c42438d60a51295091f1 + category: main + optional: false +- name: pyogrio + version: 0.8.0 + manager: conda + platform: linux-aarch64 + dependencies: + gdal: '' + libgcc-ng: '>=12' + libgdal: '>=3.8.5,<3.9.0a0' + libstdcxx-ng: '>=12' + numpy: '' + packaging: '' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pyogrio-0.8.0-py312h30f640e_1.conda + hash: + md5: 0aad9ed2b2322f8fa8d804bb398aaf74 + sha256: 44d42d9bb9562837706135934966f548fe17c914547751625ddc0b15c35e2d8c + category: main + optional: false +- name: pyogrio + version: 0.8.0 + manager: conda + platform: osx-arm64 + dependencies: + __osx: '>=11.0' + gdal: '' + libcxx: '>=16' + libgdal: '>=3.8.5,<3.9.0a0' + numpy: '' + packaging: '' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyogrio-0.8.0-py312hda5527f_1.conda + hash: + md5: 3bf41b1350f1d3a5fbbcd47b54fff3bc + sha256: 1f9bc12c854585d1309325393051bfd7ef9e3d6162a9c250bb538b2108626fd1 + category: main + optional: false - name: pyopenssl version: 24.0.0 manager: conda @@ -11383,13 +11531,13 @@ package: dependencies: certifi: '' libgcc-ng: '>=12' - proj: '>=9.4.0,<9.4.1.0a0' + proj: '>=9.4.0,<9.5.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312hb591178_6.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h5d05ceb_7.conda hash: - md5: e5a041de2ecaee7e02c40cf82afa132e - sha256: 19d49427fa8d685b4b16831a4915dcd4c6a4511c7cd6ed52d669e39abd0618e7 + md5: b53ddc25da04839cc62b0b158a7ecb38 + sha256: 76a8d7c8ff3f0f9ea265622517c194a05084dca584e8eb1b38fe9ef74bde1b39 category: main optional: false - name: pyproj @@ -11399,13 +11547,13 @@ package: dependencies: certifi: '' libgcc-ng: '>=12' - proj: '>=9.4.0,<9.4.1.0a0' + proj: '>=9.4.0,<9.5.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-aarch64/pyproj-3.6.1-py312hef94e87_6.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pyproj-3.6.1-py312hfe6cc31_7.conda hash: - md5: 8ee3314c7680431dbda9e18eda3b48f8 - sha256: ae359ce15829f71392e195ec22780fcdcb910c6be3ed34b5d7c3b604c0f09da8 + md5: 89d563737fc528ca9389d91c9ae8e657 + sha256: 47c2ed8c6e279b2e127f6037785f51daa200e7693119ff735dad8061eb7eece0 category: main optional: false - name: pyproj @@ -11413,14 +11561,15 @@ package: manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' certifi: '' - proj: '>=9.4.0,<9.4.1.0a0' + proj: '>=9.4.0,<9.5.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyproj-3.6.1-py312h71aa0db_6.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyproj-3.6.1-py312h64656f7_7.conda hash: - md5: b3f679072b35d5fbd9eca585ee28f5c8 - sha256: 83a3dcf0ddafe43bdc15d146f7ccaeaed300ad49035ccd5e6a7a9887a0bc6998 + md5: c8b38bd60f269e40f308ba82a2585977 + sha256: 00598ea92c31ab46e5b1c70daa9625279d68e1c166944fc12cc91b3596ecc743 category: main optional: false - name: pyproject_hooks @@ -11496,7 +11645,7 @@ package: category: main optional: false - name: pytest - version: 7.4.0 + version: 7.4.4 manager: conda platform: linux-64 dependencies: @@ -11504,14 +11653,14 @@ package: packaging: '' pluggy: '>=0.12,<2.0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/pytest-7.4.0-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/pytest-7.4.4-py312h06a4308_0.conda hash: - md5: 7d983fb31c361c499cd2d98f6347e46c - sha256: 781950e9c1effd82e0d50e05df9f26a8c5eecedb2063a33471ad0bea330459ae + md5: 297cebe31aed2b64f54ea716a61733c0 + sha256: d9455e915495acf9b41f5a187f39972ca41f80654d2f5c57c89a1d52f550555b category: dev optional: true - name: pytest - version: 7.4.0 + version: 7.4.4 manager: conda platform: linux-aarch64 dependencies: @@ -11519,14 +11668,14 @@ package: packaging: '' pluggy: '>=0.12,<2.0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/pytest-7.4.0-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/pytest-7.4.4-py312hd43f75c_0.conda hash: - md5: a8f43f4c46d4b8a1523cff17a576956e - sha256: 06a2721e1c3eb425aaa6718c7dfcb4812445a3b4cb870ddbd19e695dcf4181e3 + md5: eab96dd221f517b42eb56b48bf756c34 + sha256: 83ce3dd59f4e976c28c23cc753e3b490357d99d931d5b72d853e68246dc4fc52 category: dev optional: true - name: pytest - version: 7.4.0 + version: 7.4.4 manager: conda platform: osx-arm64 dependencies: @@ -11534,10 +11683,10 @@ package: packaging: '' pluggy: '>=0.12,<2.0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/pytest-7.4.0-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/pytest-7.4.4-py312hca03da5_0.conda hash: - md5: edc610f3f7d635b1d58cb599e3fb85ce - sha256: 8f51086628fc4f16af891b5e7137dec1a9242362bc641c03750548cc40564ff6 + md5: 3a6d50e545b9297412417f380394551b + sha256: 931c53316fd3361c45166712d3e5a1fe3def0b89cedb313e1ac63f1239ec2312 category: dev optional: true - name: pytest-cov @@ -11673,7 +11822,7 @@ package: category: dev optional: true - name: python - version: 3.12.3 + version: 3.12.4 manager: conda platform: linux-64 dependencies: @@ -11683,24 +11832,24 @@ package: libffi: '>=3.4,<4.0a0' libgcc-ng: '>=12' libnsl: '>=2.0.1,<2.1.0a0' - libsqlite: '>=3.45.2,<4.0a0' + libsqlite: '>=3.46.0,<4.0a0' libuuid: '>=2.38.1,<3.0a0' libxcrypt: '>=4.4.36' - libzlib: '>=1.2.13,<2.0.0a0' - ncurses: '>=6.4.20240210,<7.0a0' - openssl: '>=3.2.1,<4.0a0' + libzlib: '>=1.3.1,<2.0a0' + ncurses: '>=6.5,<7.0a0' + openssl: '>=3.3.1,<4.0a0' readline: '>=8.2,<9.0a0' 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.3-hab00c5b_0_cpython.conda + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.4-h194c7f8_0_cpython.conda hash: - md5: 2540b74d304f71d3e89c81209db4db84 - sha256: f9865bcbff69f15fd89a33a2da12ad616e98d65ce7c83c644b92e66e5016b227 + md5: d73490214f536cccb5819e9873048c92 + sha256: 97a78631e6c928bf7ad78d52f7f070fcf3bd37619fa48dc4394c21cf3058cdee category: main optional: false - name: python - version: 3.12.3 + version: 3.12.4 manager: conda platform: linux-aarch64 dependencies: @@ -11710,24 +11859,24 @@ package: libffi: '>=3.4,<4.0a0' libgcc-ng: '>=12' libnsl: '>=2.0.1,<2.1.0a0' - libsqlite: '>=3.45.2,<4.0a0' + libsqlite: '>=3.46.0,<4.0a0' libuuid: '>=2.38.1,<3.0a0' libxcrypt: '>=4.4.36' - libzlib: '>=1.2.13,<2.0.0a0' - ncurses: '>=6.4.20240210,<7.0a0' - openssl: '>=3.2.1,<4.0a0' + libzlib: '>=1.3.1,<2.0a0' + ncurses: '>=6.5,<7.0a0' + openssl: '>=3.3.1,<4.0a0' readline: '>=8.2,<9.0a0' tk: '>=8.6.13,<8.7.0a0' tzdata: '' xz: '>=5.2.6,<6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.3-h43d1f9e_0_cpython.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.4-h829453d_0_cpython.conda hash: - md5: dc93ad1d2ba17ebc948bf5434ffa864b - sha256: e186f3ee570464241c844adff6a3ba8f395cef15c5d46c0a8f784cfd97b3bdca + md5: 48c28e5926b7c8ffe58f77991a43ca23 + sha256: 21a308f92f6988e1a8169a8d46b43fbd1a6b638d0964d015a4444d7af05f00e1 category: main optional: false - name: python - version: 3.12.3 + version: 3.12.4 manager: conda platform: osx-arm64 dependencies: @@ -11735,18 +11884,18 @@ package: bzip2: '>=1.0.8,<2.0a0' libexpat: '>=2.6.2,<3.0a0' libffi: '>=3.4,<4.0a0' - libsqlite: '>=3.45.2,<4.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - ncurses: '>=6.4.20240210,<7.0a0' - openssl: '>=3.2.1,<4.0a0' + libsqlite: '>=3.46.0,<4.0a0' + libzlib: '>=1.3.1,<2.0a0' + ncurses: '>=6.5,<7.0a0' + openssl: '>=3.3.1,<4.0a0' readline: '>=8.2,<9.0a0' 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.3-h4a7b5fc_0_cpython.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.4-h30c5eda_0_cpython.conda hash: - md5: 8643ab37bece6ae8f112464068d9df9c - sha256: c761fb3713ea66bce3889b33b6f400afb2dd192d1fc2686446e9d8166cfcec6b + md5: e3e44e0e72aed46dcb810fa3e96784be + sha256: 107824b584eb5e43f71df8cb2741019f5c377c734f8309899aa2a6ed53b79a47 category: main optional: false - name: python-dateutil @@ -12126,7 +12275,7 @@ package: category: main optional: false - name: quartodoc - version: 0.7.2 + version: 0.7.5 manager: conda platform: linux-64 dependencies: @@ -12138,18 +12287,19 @@ package: pydantic: '' python: '>=3.10' pyyaml: '' + requests: '' sphobjinv: '>=2.3.1' tabulate: '>=0.9.0' typing-extensions: '>=4.4.0' watchdog: '>=3.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.5-pyhd8ed1ab_0.conda hash: - md5: 9bf1905bef4492b77781e058cc27db35 - sha256: 1a214d61abb5a7f424e1397d06595eac4b62b4f4c8190994da23123d5b9bb0f9 + md5: e792d8c21d24dbb2b880c07430328536 + sha256: b274b1715455b4cc629fff973fa74cf7c712072d25c24fc1c01396778d3be567 category: dev optional: true - name: quartodoc - version: 0.7.2 + version: 0.7.5 manager: conda platform: linux-aarch64 dependencies: @@ -12161,18 +12311,19 @@ package: pydantic: '' python: '>=3.10' pyyaml: '' + requests: '' sphobjinv: '>=2.3.1' tabulate: '>=0.9.0' typing-extensions: '>=4.4.0' watchdog: '>=3.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.5-pyhd8ed1ab_0.conda hash: - md5: 9bf1905bef4492b77781e058cc27db35 - sha256: 1a214d61abb5a7f424e1397d06595eac4b62b4f4c8190994da23123d5b9bb0f9 + md5: e792d8c21d24dbb2b880c07430328536 + sha256: b274b1715455b4cc629fff973fa74cf7c712072d25c24fc1c01396778d3be567 category: dev optional: true - name: quartodoc - version: 0.7.2 + version: 0.7.5 manager: conda platform: osx-arm64 dependencies: @@ -12184,14 +12335,15 @@ package: pydantic: '' python: '>=3.10' pyyaml: '' + requests: '' sphobjinv: '>=2.3.1' tabulate: '>=0.9.0' typing-extensions: '>=4.4.0' watchdog: '>=3.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.5-pyhd8ed1ab_0.conda hash: - md5: 9bf1905bef4492b77781e058cc27db35 - sha256: 1a214d61abb5a7f424e1397d06595eac4b62b4f4c8190994da23123d5b9bb0f9 + md5: e792d8c21d24dbb2b880c07430328536 + sha256: b274b1715455b4cc629fff973fa74cf7c712072d25c24fc1c01396778d3be567 category: dev optional: true - name: rasterio @@ -12208,16 +12360,16 @@ package: libgcc-ng: '>=12' libgdal: '>=3.8.5,<3.9.0a0' libstdcxx-ng: '>=12' - numpy: '>=1.26.4,<2.0a0' + numpy: '>=1.19,<3' proj: '>=9.4.0,<9.4.1.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* setuptools: '>=0.9.8' snuggs: '>=1.4.1' - url: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.10-py312h2447d21_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.10-py312hd6340be_2.conda hash: - md5: e3b23e993698c5afd6ee57e009cabf4c - sha256: 57949cd80a28489f35e56cee4ebd9a087e37241ae2f77ecca778d1ef52020ac3 + md5: 9cee69a489f3b7c6de37bd7021d505cb + sha256: bab8b9f7cc9730ea447bc842e0d40717b2ce9609f6dd92b0a9f9b60ffc86a077 category: main optional: false - name: rasterio @@ -12234,16 +12386,16 @@ package: libgcc-ng: '>=12' libgdal: '>=3.8.5,<3.9.0a0' libstdcxx-ng: '>=12' - numpy: '>=1.26.4,<2.0a0' + numpy: '>=1.19,<3' proj: '>=9.4.0,<9.4.1.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* setuptools: '>=0.9.8' snuggs: '>=1.4.1' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/rasterio-1.3.10-py312h38e2d64_1.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/rasterio-1.3.10-py312h0c11edb_2.conda hash: - md5: e2c87fb273aa470f08bb472e8f7140c8 - sha256: 387fcac82e6e2141c8747cef667fd0b9b901ee492081af7b1a4c9447c077b0f1 + md5: 6955de075d84ff6e6ded42de855ab3a7 + sha256: 4c58e060afa298c74d5ca6a71f3a52f488bb7e0c689090aded923b389d08e95c category: main optional: false - name: rasterio @@ -12260,16 +12412,16 @@ package: cligj: '>=0.5' libcxx: '>=16' libgdal: '>=3.8.5,<3.9.0a0' - numpy: '>=1.26.4,<2.0a0' + numpy: '>=1.19,<3' proj: '>=9.4.0,<9.4.1.0a0' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* setuptools: '>=0.9.8' snuggs: '>=1.4.1' - url: https://conda.anaconda.org/conda-forge/osx-arm64/rasterio-1.3.10-py312h7fdb319_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/rasterio-1.3.10-py312h90d5f4c_2.conda hash: - md5: ef433a506198d601478974fd80f64a72 - sha256: ba406b00a0272f585bb5aeeb0ccaa39392b0be2601aa12603c0195e0d896a9fd + md5: fc6ed77abb9b1b7841d623db95248b04 + sha256: 21ef0488d887f13bffaadfc2e6723d6618f9c593ddd8a56caa15f5bb79a39f4a category: main optional: false - name: re2 @@ -12436,45 +12588,6 @@ package: sha256: ed30695fd8eea42d282930d59f434dd1652e07e58d3bd409680dcd1d6795aa17 category: main optional: false -- name: requests-toolbelt - version: 1.0.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.12,<3.13.0a0' - requests: '>=2.0.1,<3.0.0' - url: https://repo.anaconda.com/pkgs/main/linux-64/requests-toolbelt-1.0.0-py312h06a4308_0.conda - hash: - md5: 7aa77208d296f2bb73e3e71f5614e170 - sha256: 728a5e39804fd2cd2144ec8ab40513a0095585d8289be25bc808488064b05cb3 - category: main - optional: false -- name: requests-toolbelt - version: 1.0.0 - manager: conda - platform: linux-aarch64 - dependencies: - python: '>=3.12,<3.13.0a0' - requests: '>=2.0.1,<3.0.0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/requests-toolbelt-1.0.0-py312hd43f75c_0.conda - hash: - md5: 359a7d9f16d03c08e8f65ede1bb9124e - sha256: 0d6c703e084e12241685aeb0d2136ee9b35a0390634fb7fabd0b8d83c61b999d - category: main - optional: false -- name: requests-toolbelt - version: 1.0.0 - manager: conda - platform: osx-arm64 - dependencies: - python: '>=3.12,<3.13.0a0' - requests: '>=2.0.1,<3.0.0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/requests-toolbelt-1.0.0-py312hca03da5_0.conda - hash: - md5: 9b9e8abee5d07c5f03cf07738f076cca - sha256: 1155ac6708b5bd9edb09c806f02ae1dfd166017bc658a261d823da4d86fccd5f - category: main - optional: false - name: resolvelib version: 1.0.1 manager: conda @@ -12591,14 +12704,13 @@ package: manager: conda platform: linux-64 dependencies: - markdown-it-py: '>=2.2.0' + markdown-it-py: '>=2.2.0,<3.0.0' pygments: '>=2.13.0,<3.0.0' - python: '>=3.7.0' - typing_extensions: '>=4.0.0,<5.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-64/rich-13.7.1-py312h06a4308_0.conda hash: - md5: ba445bf767ae6f0d959ff2b40c20912b - sha256: 2b26d58aa59e46f933c3126367348651b0dab6e0bf88014e857415bb184a4667 + md5: d0f04d8a8f409d70fd0cf7ba3724301a + sha256: 2c504d4bf4b912de196f8ab567f82ed34df60cb6a8d22a963f3fd8b62cb9726b category: main optional: false - name: rich @@ -12606,14 +12718,13 @@ package: manager: conda platform: linux-aarch64 dependencies: - markdown-it-py: '>=2.2.0' + markdown-it-py: '>=2.2.0,<3.0.0' pygments: '>=2.13.0,<3.0.0' - python: '>=3.7.0' - typing_extensions: '>=4.0.0,<5.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/rich-13.7.1-py312hd43f75c_0.conda hash: - md5: ba445bf767ae6f0d959ff2b40c20912b - sha256: 2b26d58aa59e46f933c3126367348651b0dab6e0bf88014e857415bb184a4667 + md5: 2979589f525e878325fbfdaf94f59e18 + sha256: 6d1f915e7b2563a06fba0e22e901a2e8b31da6b8a2d55a9738a38dcd77811174 category: main optional: false - name: rich @@ -12621,18 +12732,17 @@ package: manager: conda platform: osx-arm64 dependencies: - markdown-it-py: '>=2.2.0' + markdown-it-py: '>=2.2.0,<3.0.0' pygments: '>=2.13.0,<3.0.0' - python: '>=3.7.0' - typing_extensions: '>=4.0.0,<5.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/osx-arm64/rich-13.7.1-py312hca03da5_0.conda hash: - md5: ba445bf767ae6f0d959ff2b40c20912b - sha256: 2b26d58aa59e46f933c3126367348651b0dab6e0bf88014e857415bb184a4667 + md5: 6946d7387735968457d2ab9ac0a1cc99 + sha256: 22fea48237c18bd61e57f38fe610c2de91b384e5fdca33e8a1a5e389fe5e62f8 category: main optional: false - name: rioxarray - version: 0.15.5 + version: 0.16.0 manager: conda platform: linux-64 dependencies: @@ -12643,14 +12753,14 @@ package: rasterio: '>=1.3' scipy: '' xarray: '>=2022.3.0' - url: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.15.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.16.0-pyhd8ed1ab_0.conda hash: - md5: cd7e6bfce5f8d758267c79d54bf108e7 - sha256: 1baa985465cefbe7a2a33e000afeee1044833d0bac2dc6364b5b4a326040b7db + md5: e651425fab6f281a049b785d1d630b1a + sha256: b63b43fac200261b2667666f45894fbe068101e4a57926b72f4d82fe2e5b78c1 category: main optional: false - name: rioxarray - version: 0.15.5 + version: 0.16.0 manager: conda platform: linux-aarch64 dependencies: @@ -12661,14 +12771,14 @@ package: rasterio: '>=1.3' scipy: '' xarray: '>=2022.3.0' - url: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.15.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.16.0-pyhd8ed1ab_0.conda hash: - md5: cd7e6bfce5f8d758267c79d54bf108e7 - sha256: 1baa985465cefbe7a2a33e000afeee1044833d0bac2dc6364b5b4a326040b7db + md5: e651425fab6f281a049b785d1d630b1a + sha256: b63b43fac200261b2667666f45894fbe068101e4a57926b72f4d82fe2e5b78c1 category: main optional: false - name: rioxarray - version: 0.15.5 + version: 0.16.0 manager: conda platform: osx-arm64 dependencies: @@ -12679,10 +12789,10 @@ package: rasterio: '>=1.3' scipy: '' xarray: '>=2022.3.0' - url: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.15.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.16.0-pyhd8ed1ab_0.conda hash: - md5: cd7e6bfce5f8d758267c79d54bf108e7 - sha256: 1baa985465cefbe7a2a33e000afeee1044833d0bac2dc6364b5b4a326040b7db + md5: e651425fab6f281a049b785d1d630b1a + sha256: b63b43fac200261b2667666f45894fbe068101e4a57926b72f4d82fe2e5b78c1 category: main optional: false - name: rpds-py @@ -12780,45 +12890,6 @@ package: sha256: 809f3a2cb948be4e948b27689b1bc62c2e5364a2a8c312f0cd3c9efcba7a98d4 category: main optional: false -- name: rtree - version: 1.0.1 - manager: conda - platform: linux-64 - dependencies: - libspatialindex: '>=1.9.3,<1.9.4.0a0' - python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/rtree-1.0.1-py312h06a4308_0.conda - hash: - md5: 58c4db6c2dca8e026a9c14f85444a006 - sha256: b0922676c0338213e457f686f756e6b8fdc99973728bd8d17468bb5c68fa2d22 - category: main - optional: false -- name: rtree - version: 1.0.1 - manager: conda - platform: linux-aarch64 - dependencies: - libspatialindex: '>=1.9.3,<1.9.4.0a0' - python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/rtree-1.0.1-py312hd43f75c_0.conda - hash: - md5: a90b053d8b2790ae62d095302e1e272b - sha256: 45a3973c76b1b1085c6cd97fc5f8fb45cf6dc1d0d57d1e8096d450156bc4f140 - category: main - optional: false -- name: rtree - version: 1.0.1 - manager: conda - platform: osx-arm64 - dependencies: - libspatialindex: '>=1.9.3,<1.9.4.0a0' - python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/rtree-1.0.1-py312hca03da5_0.conda - hash: - md5: 102d574160dea535dae412a624230f6c - sha256: 04c9b12ff0034388d301f6b7487b5073328457a394b95ac893e8d9454d3a8e70 - category: main - optional: false - name: ruamel.yaml version: 0.17.21 manager: conda @@ -12858,29 +12929,29 @@ package: category: main optional: false - name: s2n - version: 1.4.15 + version: 1.4.17 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.15-he19d79f_0.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.17-he19d79f_0.conda hash: - md5: 4c7cc3fa1d2c5a63f9e2b1e2980a1672 - sha256: e19fb5bfef25ebfcdb56c87f4c9f2b4e04933ae227f0803443e1539f7f59722a + md5: e25ac9bf10f8e6aa67727b1cdbe762ef + sha256: 6d1aa582964771a6cf47d120e2c5cdc700fe3744101cd5660af1eb81d47d689a category: main optional: false - name: s2n - version: 1.4.15 + version: 1.4.17 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.4.15-h52a6840_0.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.4.17-h52a6840_0.conda hash: - md5: 3bf0e01d41c6f88d5555161d3d03d5ec - sha256: 70d0842e60840e8e037888d07a7eedf0d05aabc5f0efa9b162be9d74a99b7548 + md5: d43af76177a3d24cf735b92496417759 + sha256: 22019588bdd02a6a6956762c0f43be44444cf50fcc005e2758d7612ec5610f9f category: main optional: false - name: scikit-learn @@ -12940,7 +13011,7 @@ package: category: main optional: false - name: scipy - version: 1.13.0 + version: 1.13.1 manager: conda platform: linux-64 dependencies: @@ -12953,14 +13024,14 @@ package: numpy: '>=1.26.4,<1.29' pybind11-abi: '5' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/scipy-1.13.0-py312h2809609_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/scipy-1.13.1-py312h2809609_0.conda hash: - md5: de051a709b27885d13e11e73d7d6375a - sha256: 9bed256e42bdc55ed10b85ec95b87f22ca2b1a4f2c33c3358af0f70c830eaa33 + md5: a95399b7c0b52a53bfbe9c7d84f0afb6 + sha256: c7865f63eb39ab5a8d6b42525268d50df545644e486753be023cc3586709a0e2 category: main optional: false - name: scipy - version: 1.13.0 + version: 1.13.1 manager: conda platform: linux-aarch64 dependencies: @@ -12973,29 +13044,29 @@ package: numpy: '>=1.26.4,<1.29' pybind11-abi: '5' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/scipy-1.13.0-py312hdb1dca2_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/scipy-1.13.1-py312hdb1dca2_0.conda hash: - md5: b631f7836b1a1799672e686759b9d07f - sha256: 6228dea4dcd15729c869c4c5ad9d96b79e21858bfbf78c97b301c3841cb874ba + md5: 9e63e8cce8f83b9127c4ad426d6a7039 + sha256: 9d56251f7e7b362588ad32cf279a5facd803348613cf02523b2eda6e82fdb760 category: main optional: false - name: scipy - version: 1.13.0 + version: 1.13.1 manager: conda platform: osx-arm64 dependencies: blas: '*' - libcxx: '>=12.0.0' + libcxx: '>=14.0.6' libgfortran: 5.* libgfortran5: '>=11.3.0' libopenblas: '>=0.3.21,<1.0a0' numpy: '>=1.26.4,<1.29' pybind11-abi: '5' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/scipy-1.13.0-py312hfa28a95_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/scipy-1.13.1-py312ha409365_0.conda hash: - md5: 3fa921ac4585f7f7746f2468c057b215 - sha256: 84d0c0a021fa9de6148e71d89b9cb67f46d3e766fc446788e41c4d9dd93f661a + md5: 3d3f9165d4e7f793263b6ebddaaad21a + sha256: ce3a0bea1c770d875ffdc6fd98f9bca9a41d39a34955248d072550fb18cb07c8 category: main optional: false - name: seaborn-base @@ -13305,41 +13376,42 @@ package: category: main optional: false - name: snappy - version: 1.2.0 + version: 1.2.1 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda hash: - md5: 843bbb8ace1d64ac50d64639ff38b014 - sha256: bb87116b8c6198f6979b3d212e9af12e08e12f2bf09970d0f9b4582607648b22 + md5: 6b7dcc7349efd123d493d2dbe85a045f + sha256: dc7c8e0e8c3e8702aae81c52d940bfaabe756953ee51b1f1757e891bab62cf7f category: main optional: false - name: snappy - version: 1.2.0 + version: 1.2.1 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.0-h8d0c38d_1.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-h1088aeb_0.conda hash: - md5: 7875fcea9277713d1744d188ececb767 - sha256: d02c479500a72d0d79891dac6ae0f564f7c5cd8aad7c2c7168cb48f0a1aee14a + md5: e4ed5b015f525b56f95c26d85a4ea208 + sha256: 79f5d0a9098acf2ed16e6ecc4c11472b50ccf59feea37a7d585fd43888d7e41f category: main optional: false - name: snappy - version: 1.2.0 + version: 1.2.1 manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' libcxx: '>=16' - url: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.0-hd04f947_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-hd02b534_0.conda hash: - md5: 32cf833d440ee18d3c4c04ec38cf2b01 - sha256: 88afe00f550e1e2d66326516e5372aa1834c51fb6b53afa7a3636c65cd75ce42 + md5: 69d0f9694f3294418ee935da3d5f7272 + sha256: cb7a9440241c6092e0f1c795fdca149c4767023e783eaf9cfebc501f906b4897 category: main optional: false - name: sniffio @@ -13420,6 +13492,42 @@ package: sha256: 094879260481f9b8a80c2cbf782540963df4e485da9e5f1de2632e846617f57b category: main optional: false +- name: socksio + version: 1.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/socksio-1.0.0-pyhd8ed1ab_0.conda + hash: + md5: 61c4227968001893dcff60e779289eb5 + sha256: abb70405b0ae8ff568eb8c94a2dbaffa8feeab41491ad180a60bce1a0d7bd608 + category: main + optional: false +- name: socksio + version: 1.0.0 + manager: conda + platform: linux-aarch64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/socksio-1.0.0-pyhd8ed1ab_0.conda + hash: + md5: 61c4227968001893dcff60e779289eb5 + sha256: abb70405b0ae8ff568eb8c94a2dbaffa8feeab41491ad180a60bce1a0d7bd608 + category: main + optional: false +- name: socksio + version: 1.0.0 + manager: conda + platform: osx-arm64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/socksio-1.0.0-pyhd8ed1ab_0.conda + hash: + md5: 61c4227968001893dcff60e779289eb5 + sha256: abb70405b0ae8ff568eb8c94a2dbaffa8feeab41491ad180a60bce1a0d7bd608 + category: main + optional: false - name: soupsieve version: '2.5' manager: conda @@ -13543,47 +13651,48 @@ package: category: dev optional: true - name: sqlite - version: 3.45.3 + version: 3.31.1 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=11.2.0' - ncurses: '>=6.4,<7.0a0' - readline: '>=8.0,<9.0a0' - zlib: '>=1.2.13,<2.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.45.3-h5eee18b_0.conda + libedit: '>=3.1.20181209,<3.2.0a0' + libgcc-ng: '>=7.3.0' + url: https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.31.1-h7b6447c_0.conda hash: - md5: acf93d6aceb74d6110e20b44cc45939e - sha256: 74b61ac1a7df6777b759680047b9d67ba8ac1a921f56de42e09c99b5cc2f778a + md5: c2cae59a837775a03aed11469994981c + sha256: 38cfe7b8c9512ef1792acaef347f9ffc241be71b85142f680d9eeb2fbc36ba1f category: main optional: false - name: sqlite - version: 3.45.3 + version: 3.46.0 manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=11.2.0' - ncurses: '>=6.4,<7.0a0' - readline: '>=8.1.2,<9.0a0' - zlib: '>=1.2.13,<2.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/sqlite-3.45.3-h998d150_0.conda + libgcc-ng: '>=12' + libsqlite: 3.46.0 + libzlib: '>=1.2.13,<2.0a0' + ncurses: '>=6.5,<7.0a0' + readline: '>=8.2,<9.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.46.0-hdc7ab3c_0.conda hash: - md5: a760da65a886c78c80a7d5a04850204a - sha256: 5741744539e344d3b2db7b4aa07ef46711ab90de8daa621b588982d1e6c59393 + md5: e0e3a71d3b7092af7cb9e0696f6d0869 + sha256: d6425bffe24f02a0a2e4e4f228aeca16bde76074b9bce311a976c948f802aebe category: main optional: false - name: sqlite - version: 3.45.3 + version: 3.46.0 manager: conda platform: osx-arm64 dependencies: - ncurses: '>=6.4,<7.0a0' - readline: '>=8.1.2,<9.0a0' - zlib: '>=1.2.13,<2.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/sqlite-3.45.3-h80987f9_0.conda + __osx: '>=11.0' + libsqlite: 3.46.0 + libzlib: '>=1.2.13,<2.0a0' + ncurses: '>=6.5,<7.0a0' + readline: '>=8.2,<9.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.46.0-h5838104_0.conda hash: - md5: b81acdca67ae414177b550758d2d77a6 - sha256: 247a94c1f825ce386aeb27f2d40521a0e8b24155ce2112ee5435e0bbb43db03c + md5: 05c5dc8cd793dcfc5849d0569da9b175 + sha256: e13b719f70b3a20f40b59f814d32483ae8cd95fef83224127b10091828026f7d category: main optional: false - name: stack_data @@ -13785,132 +13894,133 @@ package: category: main optional: false - name: threadpoolctl - version: 2.2.0 + version: 3.5.0 manager: conda platform: linux-64 dependencies: - python: '>=3.6' - url: https://repo.anaconda.com/pkgs/main/noarch/threadpoolctl-2.2.0-pyh0d69192_0.conda + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-64/threadpoolctl-3.5.0-py312he106c6f_0.conda hash: - md5: bbfdbae4934150b902f97daaf287efe2 - sha256: 440bc067a57f888fb602339e2d1a1661ffee79244cd9c5179fc3bbc560efc56b + md5: 3ca7192420724484fa1429dd686c91ad + sha256: 0fed6f1864f8bb15570597727ba6e7053280377aca8297a8e72c4bb64f1a6d47 category: main optional: false - name: threadpoolctl - version: 2.2.0 + version: 3.5.0 manager: conda platform: linux-aarch64 dependencies: - python: '>=3.6' - url: https://repo.anaconda.com/pkgs/main/noarch/threadpoolctl-2.2.0-pyh0d69192_0.conda + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/threadpoolctl-3.5.0-py312h42ac6d5_0.conda hash: - md5: bbfdbae4934150b902f97daaf287efe2 - sha256: 440bc067a57f888fb602339e2d1a1661ffee79244cd9c5179fc3bbc560efc56b + md5: 6eff011b910e4d88b31b3bd8d10b1abd + sha256: f45c12579d12f6f6f1b0427a211de18e4946e784b5fd929dd3e953756a57e789 category: main optional: false - name: threadpoolctl - version: 2.2.0 + version: 3.5.0 manager: conda platform: osx-arm64 dependencies: - python: '>=3.6' - url: https://repo.anaconda.com/pkgs/main/noarch/threadpoolctl-2.2.0-pyh0d69192_0.conda + python: '>=3.12,<3.13.0a0' + url: https://repo.anaconda.com/pkgs/main/osx-arm64/threadpoolctl-3.5.0-py312h989b03a_0.conda hash: - md5: bbfdbae4934150b902f97daaf287efe2 - sha256: 440bc067a57f888fb602339e2d1a1661ffee79244cd9c5179fc3bbc560efc56b + md5: 6174cf17cd8de8b24ff3786aa955252d + sha256: eaab908d01426e3b0cf0d834866d925d596c295d2ea135c6f484495d3d9d9f0e category: main optional: false - name: tiledb - version: 2.23.0 + version: 2.24.2 manager: conda platform: linux-64 dependencies: - aws-crt-cpp: '>=0.26.9,<0.26.10.0a0' + __glibc: '>=2.17,<3.0.a0' + aws-crt-cpp: '>=0.27.3,<0.27.4.0a0' aws-sdk-cpp: '>=1.11.329,<1.11.330.0a0' - azure-core-cpp: '>=1.11.1,<1.11.2.0a0' - azure-identity-cpp: '>=1.6.0,<1.6.1.0a0' - azure-storage-blobs-cpp: '>=12.10.0,<12.10.1.0a0' - azure-storage-common-cpp: '>=12.5.0,<12.5.1.0a0' + azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + azure-identity-cpp: '>=1.8.0,<1.8.1.0a0' + azure-storage-blobs-cpp: '>=12.11.0,<12.11.1.0a0' + azure-storage-common-cpp: '>=12.6.0,<12.6.1.0a0' bzip2: '>=1.0.8,<2.0a0' fmt: '>=10.2.1,<11.0a0' libabseil: '>=20240116.2,<20240117.0a0' libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' - libgoogle-cloud: '>=2.24.0,<2.25.0a0' - libgoogle-cloud-storage: '>=2.24.0,<2.25.0a0' + libgoogle-cloud: '>=2.26.0,<2.27.0a0' + libgoogle-cloud-storage: '>=2.26.0,<2.27.0a0' libstdcxx-ng: '>=12' libwebp-base: '>=1.4.0,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' lz4-c: '>=1.9.3,<1.10.0a0' - openssl: '>=3.3.0,<4.0a0' + openssl: '>=3.3.1,<4.0a0' spdlog: '>=1.13.0,<1.14.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.23.0-hfa691db_2.conda + url: https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.24.2-hc55ee95_2.conda hash: - md5: f9cd15d6c7deeeb5b60d65fac59b18bc - sha256: ff6cf1bb8e28f2cb04eaeec07166d97f415e003eecd70c23e531b73403a956f8 + md5: bc6b3a6693d53e33dea28c89e02745dd + sha256: 9a84b39d158d72ff96143b6b532fe93001f1b1171ddbbf9b42ac12a22252d739 category: main optional: false - name: tiledb - version: 2.23.0 + version: 2.24.2 manager: conda platform: linux-aarch64 dependencies: - aws-crt-cpp: '>=0.26.9,<0.26.10.0a0' + aws-crt-cpp: '>=0.27.3,<0.27.4.0a0' aws-sdk-cpp: '>=1.11.329,<1.11.330.0a0' - azure-core-cpp: '>=1.11.1,<1.11.2.0a0' - azure-identity-cpp: '>=1.6.0,<1.6.1.0a0' - azure-storage-blobs-cpp: '>=12.10.0,<12.10.1.0a0' - azure-storage-common-cpp: '>=12.5.0,<12.5.1.0a0' + azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + azure-identity-cpp: '>=1.8.0,<1.8.1.0a0' + azure-storage-blobs-cpp: '>=12.11.0,<12.11.1.0a0' + azure-storage-common-cpp: '>=12.6.0,<12.6.1.0a0' bzip2: '>=1.0.8,<2.0a0' fmt: '>=10.2.1,<11.0a0' libabseil: '>=20240116.2,<20240117.0a0' libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' - libgoogle-cloud: '>=2.24.0,<2.25.0a0' - libgoogle-cloud-storage: '>=2.24.0,<2.25.0a0' + libgoogle-cloud: '>=2.26.0,<2.27.0a0' + libgoogle-cloud-storage: '>=2.26.0,<2.27.0a0' libstdcxx-ng: '>=12' libwebp-base: '>=1.4.0,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' lz4-c: '>=1.9.3,<1.10.0a0' - openssl: '>=3.3.0,<4.0a0' + openssl: '>=3.3.1,<4.0a0' spdlog: '>=1.13.0,<1.14.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/tiledb-2.23.0-h58f92de_2.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/tiledb-2.24.2-h5af2130_2.conda hash: - md5: 2849e9e572004516705478e0e32c7ddd - sha256: 1dd866d31f3938c1efce7c2bd30d894b8d1d2b36dafd8b0ff096d03df2fde015 + md5: 7c39717dec8b7ce7f0b1b372a5cdf6a9 + sha256: 568e14f980b935284054e1e2544510efee60a1235b4f96100fbd7c89b3e0a886 category: main optional: false - name: tiledb - version: 2.23.0 + version: 2.24.2 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-crt-cpp: '>=0.26.9,<0.26.10.0a0' + aws-crt-cpp: '>=0.27.3,<0.27.4.0a0' aws-sdk-cpp: '>=1.11.329,<1.11.330.0a0' - azure-core-cpp: '>=1.11.1,<1.11.2.0a0' - azure-identity-cpp: '>=1.6.0,<1.6.1.0a0' - azure-storage-blobs-cpp: '>=12.10.0,<12.10.1.0a0' - azure-storage-common-cpp: '>=12.5.0,<12.5.1.0a0' + azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + azure-identity-cpp: '>=1.8.0,<1.8.1.0a0' + azure-storage-blobs-cpp: '>=12.11.0,<12.11.1.0a0' + azure-storage-common-cpp: '>=12.6.0,<12.6.1.0a0' bzip2: '>=1.0.8,<2.0a0' fmt: '>=10.2.1,<11.0a0' libabseil: '>=20240116.2,<20240117.0a0' libcurl: '>=8.8.0,<9.0a0' libcxx: '>=16' - libgoogle-cloud: '>=2.24.0,<2.25.0a0' - libgoogle-cloud-storage: '>=2.24.0,<2.25.0a0' + libgoogle-cloud: '>=2.26.0,<2.27.0a0' + libgoogle-cloud-storage: '>=2.26.0,<2.27.0a0' libwebp-base: '>=1.4.0,<2.0a0' - libzlib: '>=1.2.13,<2.0.0a0' + libzlib: '>=1.3.1,<2.0a0' lz4-c: '>=1.9.3,<1.10.0a0' - openssl: '>=3.3.0,<4.0a0' + openssl: '>=3.3.1,<4.0a0' spdlog: '>=1.13.0,<1.14.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/tiledb-2.23.0-h6a2131e_2.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/tiledb-2.24.2-h5def871_2.conda hash: - md5: a193de9a1a7b10ea36add60c67dcfce2 - sha256: 4f9a720487173ae29f26147df6f8f8030cc91e430e79be8dca7198b93a2460d2 + md5: 324ed9291d2eba902557876197cec529 + sha256: 66c9f8d45ff614af969ded3dc271354bc1885c97fae946bad361a471ae0d629e category: main optional: false - name: tinycss2 @@ -13953,41 +14063,41 @@ package: category: main optional: false - name: tk - version: 8.6.14 + version: 8.6.13 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=11.2.0' - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/tk-8.6.14-h39e8969_0.conda + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<2.0.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda hash: - md5: 78dbc5e3c69143ebc037fc5d5b22e597 - sha256: a390949ede5d6ff36a67e87c742099e5468f2fc0f33109fb3e0f39a3dcd4251e + md5: d453b98d9c83e71da0741bb0ff4d76bc + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e category: main optional: false - name: tk - version: 8.6.14 + version: 8.6.13 manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=11.2.0' - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/tk-8.6.14-h987d8db_0.conda + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<2.0.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda hash: - md5: a8b37241af55b4f6fe13cfbe995b7243 - sha256: 4e5de532f177f23501ca64cd00fb0e68a4c7aeca5040869b36383d638e527f57 + md5: f75105e0585851f818e0009dd1dde4dc + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 category: main optional: false - name: tk - version: 8.6.14 + version: 8.6.13 manager: conda platform: osx-arm64 dependencies: - zlib: '>=1.2.13,<1.3.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/tk-8.6.14-h6ba3021_0.conda + libzlib: '>=1.2.13,<2.0.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda hash: - md5: 9e668a25312fe740947fa53fd078145e - sha256: 7099df0dd85631be2cfd05d365fe95a6089ad0f13a42bb0b154e92b52c491e29 + md5: b50a57ba89c32b62428b71a875291c9b + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 category: main optional: false - name: toml @@ -14135,41 +14245,41 @@ package: category: main optional: false - name: tornado - version: 6.3.3 + version: 6.4.1 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=11.2.0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/tornado-6.3.3-py312h5eee18b_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/tornado-6.4.1-py312h5eee18b_0.conda hash: - md5: a39237067b4cb774d7826be15439a342 - sha256: 5c1b64c482f2ed01867582b2eb6824d6d8024bb2df947bb6a2001f1100d4c775 + md5: f4e2217ac077eff9684df8162125acc0 + sha256: ec34c437b623678d4e002f5a50fe2e133286855fe15620dc6c3cfee0ba8b27e6 category: main optional: false - name: tornado - version: 6.3.3 + version: 6.4.1 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=11.2.0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/tornado-6.3.3-py312h998d150_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/tornado-6.4.1-py312h998d150_0.conda hash: - md5: 883fc4b0a49ac9d0393af7680dcd33a3 - sha256: bcc20fb2e67c55b69e989cdf0aa883339ddeaac22b97aeb086fd42cf358a7b23 + md5: 42502e8dc8b9e5b7c799990c851abfd3 + sha256: 85be8983958ad29b6fb3e88c10840177e5eeab518ac27ed5c8e37c4533cb3799 category: main optional: false - name: tornado - version: 6.3.3 + version: 6.4.1 manager: conda platform: osx-arm64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/tornado-6.3.3-py312h80987f9_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/tornado-6.4.1-py312h80987f9_0.conda hash: - md5: 99a828db2bef631bdc95615e856bf368 - sha256: 01751c15e74af625d3adc18825d4da3527cd92bf42a6e1d5c597806f028986d2 + md5: 7c8fcd0a4af518e3f49a0a4f2a6329b3 + sha256: c6b45e1e7aebe6fcb72e0ee7a8400d3362ed75e3f704fd4f1fd35f122845dd87 category: main optional: false - name: tqdm @@ -14209,75 +14319,39 @@ package: category: main optional: false - name: traitlets - version: 5.7.1 + version: 5.14.3 manager: conda platform: linux-64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/traitlets-5.7.1-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/traitlets-5.14.3-py312h06a4308_0.conda hash: - md5: 10e9761815efd157b4f4fc6a216e0c61 - sha256: 8f4c4e1f7b26430c59b6b02b0a98acff04f7f1e8245c468970505d2558d19d70 + md5: e597b4bbf8d30abd7ae5ac5d4a436176 + sha256: 261b950bc64b1347c081f6c13ba36e19423d648950f5872323a5ff5baa4e1482 category: main optional: false - name: traitlets - version: 5.7.1 + version: 5.14.3 manager: conda platform: linux-aarch64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/traitlets-5.7.1-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/traitlets-5.14.3-py312hd43f75c_0.conda hash: - md5: 66e14c5d6c7eb12448319938dd1a47cc - sha256: 87dda0bffc792b446393fa3ac421f32cb21093f969cbf2c8774ea93a7130a0c8 + md5: a187c50491ecec8c87128ce5f00527f1 + sha256: a290f67b4a3e430247c8d9efabe4919d68ab4ee895c63f1ac56f1ae94f1e1f90 category: main optional: false - name: traitlets - version: 5.7.1 + version: 5.14.3 manager: conda platform: osx-arm64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/traitlets-5.7.1-py312hca03da5_0.conda - hash: - md5: a3424d02c464f1cbf82af11bcb2c2495 - sha256: 315b5dbb8fdc3b0466d7b6d4d56d469cb1728c7531c81a192c8a81b280ea0e5e - category: main - optional: false -- name: truststore - version: 0.8.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/truststore-0.8.0-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/traitlets-5.14.3-py312hca03da5_0.conda hash: - md5: ad93bd626fc17c1606394fe258b4ed18 - sha256: d398f8bac0ac5c0d5d4bcdd1d03300e4a2f5e5244a731415327660f61470b769 - category: main - optional: false -- name: truststore - version: 0.8.0 - manager: conda - platform: linux-aarch64 - dependencies: - python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/truststore-0.8.0-py312hd43f75c_0.conda - hash: - md5: 8cb7cade6d2fa965786c474207d23fe3 - sha256: dd47688e3ee15db9c1ec9791de541b7bb5a2efacdc394673354b1d5b3304df50 - category: main - optional: false -- name: truststore - version: 0.8.0 - manager: conda - platform: osx-arm64 - dependencies: - python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/truststore-0.8.0-py312hca03da5_0.conda - hash: - md5: 80b506936404b456b6d40141c3b187b9 - sha256: 011e9b255d705fe391293d362a1bd28e6db7726fbca1d056ba3a2a4e19f99945 + md5: fb90f58a075adf8f91ffee40a8836730 + sha256: b0728aecc85c055c12a9874264b72f2e0834b7af75673e99c5b102cc396365ba category: main optional: false - name: typer @@ -14592,7 +14666,7 @@ package: category: dev optional: true - name: unearth - version: 0.15.3 + version: 0.16.1 manager: conda platform: linux-64 dependencies: @@ -14601,14 +14675,14 @@ package: packaging: '>=20' python: '>=3.7' requests: '>=2.25' - url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.15.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.16.1-pyhd8ed1ab_0.conda hash: - md5: f32041bd4210adb59aa3b11a4108f33d - sha256: f8d7065e9cd67e0eeb24b91001ccff369eef124a8ecfee59882c210846c01bb4 + md5: 7c9b2ea6bbf1fa0018c808763d11721b + sha256: 7701c9999e313089c2f34d3a6200115e3956462cd4571bcd0423f19deb6e3276 category: main optional: false - name: unearth - version: 0.15.3 + version: 0.16.1 manager: conda platform: linux-aarch64 dependencies: @@ -14617,14 +14691,14 @@ package: packaging: '>=20' python: '>=3.7' requests: '>=2.25' - url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.15.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.16.1-pyhd8ed1ab_0.conda hash: - md5: f32041bd4210adb59aa3b11a4108f33d - sha256: f8d7065e9cd67e0eeb24b91001ccff369eef124a8ecfee59882c210846c01bb4 + md5: 7c9b2ea6bbf1fa0018c808763d11721b + sha256: 7701c9999e313089c2f34d3a6200115e3956462cd4571bcd0423f19deb6e3276 category: main optional: false - name: unearth - version: 0.15.3 + version: 0.16.1 manager: conda platform: osx-arm64 dependencies: @@ -14633,10 +14707,10 @@ package: packaging: '>=20' python: '>=3.7' requests: '>=2.25' - url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.15.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.16.1-pyhd8ed1ab_0.conda hash: - md5: f32041bd4210adb59aa3b11a4108f33d - sha256: f8d7065e9cd67e0eeb24b91001ccff369eef124a8ecfee59882c210846c01bb4 + md5: 7c9b2ea6bbf1fa0018c808763d11721b + sha256: 7701c9999e313089c2f34d3a6200115e3956462cd4571bcd0423f19deb6e3276 category: main optional: false - name: unicodedata2 @@ -14678,42 +14752,46 @@ package: category: main optional: false - name: uriparser - version: 0.9.7 + version: 0.9.8 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=11.2.0' - url: https://repo.anaconda.com/pkgs/main/linux-64/uriparser-0.9.7-h5eee18b_0.conda + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda hash: - md5: 83ea87ede0dd28a0b32747e80812a0ac - sha256: 6127d3e44004cb7e24936a73c597ec4554b5addc27b9b8773c122d7dc375319f + md5: d71d3a66528853c0a1ac2c02d79a0284 + sha256: 2aad2aeff7c69a2d7eecd7b662eef756b27d6a6b96f3e2c2a7071340ce14543e category: main optional: false - name: uriparser - version: 0.9.7 + version: 0.9.8 manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=11.2.0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/uriparser-0.9.7-h998d150_0.conda + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/uriparser-0.9.8-h0a1ffab_0.conda hash: - md5: 18a08efa365afc130b8475cae00f5196 - sha256: 13d1e682c14ce7a9b921d1c687ccdaa181064d82dd8fb0dfec80ba56ad1eef27 + md5: 7e9a7e1e1e9d6e827d2cfda21c22853e + sha256: e77ca5aea9a200f751bbc29ec926315d6d04240e7f4f8895ac13c438aafde422 category: main optional: false - name: uriparser - version: 0.9.7 + version: 0.9.8 manager: conda platform: osx-arm64 - dependencies: {} - url: https://repo.anaconda.com/pkgs/main/osx-arm64/uriparser-0.9.7-h80987f9_0.conda + dependencies: + __osx: '>=11.0' + libcxx: '>=16' + url: https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.8-h00cdb27_0.conda hash: - md5: 04e45ae787eac11dcc20aaddb89630ec - sha256: 735ef232ff71f13dd881e14b94e0fefaa3fb2ba5232e370b53d16cf051fd2491 + md5: e8ff9e11babbc8cd77af5a4258dc2802 + sha256: fa0bcbfb20a508ca9bf482236fe799581cbd0eab016e47a865e9fa44dbe3c512 category: main optional: false - name: urllib3 - version: 1.26.18 + version: 1.26.19 manager: conda platform: linux-64 dependencies: @@ -14724,14 +14802,14 @@ package: pyopenssl: '>=0.14' pysocks: '>=1.5.6,<2.0,!=1.5.7' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/urllib3-1.26.18-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/urllib3-1.26.19-py312h06a4308_0.conda hash: - md5: 37ba59346fdec674be0d3ec112225bf3 - sha256: d1b13dbd251915b1196702dfd09b6b546a7d1292f5fd4bdf76297a8d578b9afc + md5: 3e736286f516aa2334bed47bdc0c5a1d + sha256: f1c361ae6a5a8a84171b4dccb59dc54853357e0caade677babfef78d465f86de category: main optional: false - name: urllib3 - version: 1.26.18 + version: 1.26.19 manager: conda platform: linux-aarch64 dependencies: @@ -14742,14 +14820,14 @@ package: pyopenssl: '>=0.14' pysocks: '>=1.5.6,<2.0,!=1.5.7' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/urllib3-1.26.18-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/urllib3-1.26.19-py312hd43f75c_0.conda hash: - md5: 612b56d05b3dd04c29d4a96cc372ff75 - sha256: 7d41c5ed906e01a8445c1c4e5f767d3f5e05e29a39fb676c302da27356116574 + md5: a475a5c298527cae38376e17b52b57e3 + sha256: d89e4f38f70a78251dfc5b74250b034147ea542b2541727a56916b8d7b909820 category: main optional: false - name: urllib3 - version: 1.26.18 + version: 1.26.19 manager: conda platform: osx-arm64 dependencies: @@ -14760,10 +14838,10 @@ package: pyopenssl: '>=0.14' pysocks: '>=1.5.6,<2.0,!=1.5.7' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/urllib3-1.26.18-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/urllib3-1.26.19-py312hca03da5_0.conda hash: - md5: 81139007524f09d0db162b8a2cebe0f7 - sha256: dc043e6203bf9a50eba8f5a880b88e328461b79cf8098c26bad9eb4522969087 + md5: 7995162c9d14f7ba7a4cac7f6d7a104b + sha256: e7a214ae50a26578bb902abb3b11415f912ec601fe398cf364f700a0bcc944c6 category: main optional: false - name: virtualenv @@ -15008,15 +15086,16 @@ package: manager: conda platform: linux-64 dependencies: - icu: '>=73.2,<74.0a0' - libcurl: '>=8.5.0,<9.0a0' + __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libnsl: '>=2.0.1,<2.1.0a0' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-hac6953d_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-h666cd97_1.conda hash: - md5: 63b80ca78d29380fe69e69412dcbe4ac - sha256: 75d06ca406f03f653d7a3183f2a1ccfdb3a3c6c830493933ec4c3c98e06a32bb + md5: 97e8ef960a53cf08f2c4ceec8cf9e10d + sha256: ae917685dc70a66800216343eef82f14a508cbad27e71d4caf17fcbda9e8b2d0 category: main optional: false - name: xerces-c @@ -15024,15 +15103,15 @@ package: manager: conda platform: linux-aarch64 dependencies: - icu: '>=73.2,<74.0a0' - libcurl: '>=8.5.0,<9.0a0' + icu: '>=75.1,<76.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libnsl: '>=2.0.1,<2.1.0a0' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/xerces-c-3.2.5-hf13c1fb_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xerces-c-3.2.5-h76197be_1.conda hash: - md5: 5c6a84e179f9fc7f8e0890c28704a8ce - sha256: 6e64e9dc8d9f8bee4bdef16e946be658da3744e40fdd5ca881ac2219a1aba479 + md5: c3b0932526560ba8ab3ed324eaeabc79 + sha256: bb4b6cffe1fe81f28a9c470df597f2543148f37e0e98764c2b777dd0557fd9dc category: main optional: false - name: xerces-c @@ -15040,13 +15119,14 @@ package: manager: conda platform: osx-arm64 dependencies: - icu: '>=73.2,<74.0a0' - libcurl: '>=8.5.0,<9.0a0' - libcxx: '>=15' - url: https://conda.anaconda.org/conda-forge/osx-arm64/xerces-c-3.2.5-hf393695_0.conda + __osx: '>=11.0' + icu: '>=75.1,<76.0a0' + libcurl: '>=8.8.0,<9.0a0' + libcxx: '>=16' + url: https://conda.anaconda.org/conda-forge/osx-arm64/xerces-c-3.2.5-h0a46525_1.conda hash: - md5: 5e4741a1e687aee5fc9c409a0476bef2 - sha256: 8ad901a5fe535ebd16b469cf8e46cf174f7e6e4d9b432cc8cc02666a87e7e2ee + md5: efab20c557a133ad1760f085af7b1bfa + sha256: a68b3a96251891310b769b30a64038b37536dead8c2303f9442589f1737e2fdb category: main optional: false - name: xorg-kbproto @@ -15131,14 +15211,14 @@ package: platform: linux-64 dependencies: libgcc-ng: '>=12' - libxcb: '>=1.15,<1.16.0a0' + libxcb: '>=1.16,<1.17.0a0' xorg-kbproto: '' xorg-xextproto: '>=7.3.0,<8.0a0' xorg-xproto: '' - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda hash: - md5: 077b6e8ad6a3ddb741fce2496dd01bec - sha256: 3e53ba247f1ad68353f18aceba5bf8ce87e3dea930de85d36946844a7658c9fb + md5: 4a6d410296d7e39f00bacdee7df046e9 + sha256: 66eabe62b66c1597c4a755dcd3f4ce2c78adaf7b32e25dfee45504d67d7735c1 category: main optional: false - name: xorg-libx11 @@ -15147,14 +15227,38 @@ package: platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - libxcb: '>=1.15,<1.16.0a0' + libxcb: '>=1.16,<1.17.0a0' xorg-kbproto: '' xorg-xextproto: '>=7.3.0,<8.0a0' xorg-xproto: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.9-h055a233_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.9-h08be655_1.conda + hash: + md5: 66470f69e83673153ef02a2ebc018915 + sha256: 3595f5a30d1fecf2a8b8639eebf9ba831e3b76eef25820b806468fa670ef9d62 + category: main + optional: false +- name: xorg-libxau + version: 1.0.11 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda + hash: + md5: 2c80dc38fface310c9bd81b17037fee5 + sha256: 309751371d525ce50af7c87811b435c176915239fc9e132b99a25d5e1703f2d4 + category: main + optional: false +- name: xorg-libxau + version: 1.0.11 + manager: conda + platform: linux-aarch64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.11-h31becfc_0.conda hash: - md5: d5f0529d3568a2ce38a9aed44a9a8029 - sha256: fe6adc8f0ab7ea026b8ccd5c8c8843e5a01f49bcd193eacec9af1626f0db1194 + md5: 13de34f69cb73165dbe08c1e9148bedb + sha256: c00a8909e783ba7f4ada7256f0385ae46fc21322f4090fa396c80b4481abd5f4 category: main optional: false - name: xorg-libxau @@ -15168,6 +15272,30 @@ package: sha256: 02c313a1cada46912e5b9bdb355cfb4534bfe22143b4ea4ecc419690e793023b category: main optional: false +- name: xorg-libxdmcp + version: 1.1.3 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2 + hash: + md5: be93aabceefa2fac576e971aef407908 + sha256: 4df7c5ee11b8686d3453e7f3f4aa20ceef441262b49860733066c52cfd0e4a77 + category: main + optional: false +- name: xorg-libxdmcp + version: 1.1.3 + manager: conda + platform: linux-aarch64 + dependencies: + libgcc-ng: '>=9.3.0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.3-h3557bc0_0.tar.bz2 + hash: + md5: a6c9016ae1ca5c47a3603ed4cd65fedd + sha256: 2aad9a0b57796170b8fb40317598fd79cfc7ae27fa7fb68c417d815e44499d59 + category: main + optional: false - name: xorg-libxdmcp version: 1.1.3 manager: conda @@ -15526,42 +15654,91 @@ package: category: main optional: false - name: zlib - version: 1.2.13 + version: 1.3.1 manager: conda platform: linux-64 dependencies: libgcc-ng: '>=12' - libzlib: 1.2.13 - url: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda + libzlib: 1.3.1 + url: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda hash: - md5: 559d338a4234c2ad6e676f460a093e67 - sha256: 534824ea44939f3e59ca8ebb95e3ece6f50f9d2a0e69999fbc692311252ed6ac + md5: 9653f1bf3766164d0e65fa723cabbc54 + sha256: cee16ab07a11303de721915f0a269e8c7a54a5c834aa52f74b1cc3a59000ade8 category: main optional: false - name: zlib - version: 1.2.13 + version: 1.3.1 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - libzlib: 1.2.13 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.2.13-h68df207_6.conda + libzlib: 1.3.1 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h68df207_1.conda hash: - md5: 11012f81be8e7dae8495df7ec17c0cc5 - sha256: 67d2e05bb76308ad2e6d8bd27d54e5f8d866d7900826a13f22b66ecacce02fed + md5: 6031f9e32654fbdb9fdba406ab980517 + sha256: 7d4f12a602447c00f65f99fcf332f350cc49161a4f215466e9eb1bbe51852978 category: main optional: false - name: zlib - version: 1.2.13 + version: 1.3.1 + manager: conda + platform: osx-arm64 + dependencies: + __osx: '>=11.0' + libzlib: 1.3.1 + url: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-hfb2fe0b_1.conda + hash: + md5: f27e021db7862b6ddbc1d3578f10d883 + sha256: 87360c2dc662916aac37cf01e53324b4f4f78db6f399220818076752b093ede5 + category: main + optional: false +- name: zstandard + version: 0.23.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.11' + libgcc-ng: '>=12' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h3483029_0.conda + hash: + md5: eab52e88c858d87cf5a069f79d10bb50 + sha256: 7e1e105ea7eab2af591faebf743ff2493f53c313079e316419577925e4492b03 + category: main + optional: false +- name: zstandard + version: 0.23.0 + manager: conda + platform: linux-aarch64 + dependencies: + cffi: '>=1.11' + libgcc-ng: '>=12' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312h9fc3309_0.conda + hash: + md5: 1903935398241d9772c260a4d0ee5bc3 + sha256: 65c201c2f3e120c57e2c2eae8fb30254fbe249adb2df0a3073ce4b30fd3004ca + category: main + optional: false +- name: zstandard + version: 0.23.0 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - libzlib: 1.2.13 - url: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-hfb2fe0b_6.conda + cffi: '>=1.11' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + zstd: '>=1.5.6,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h721a963_0.conda hash: - md5: 88cf27df3eff5813734b538461f4c8cf - sha256: c09c9cb6de86d87b9267a6331c74cc8fb05bae5ee7749070a5e8883c3eff5424 + md5: caf7f5b85615a132c0fa586b82bd59e6 + sha256: 6fc0d2f7a0a49a7c1453bb9eacd5456214b6cf000760067d72f0cce464975fa1 category: main optional: false - name: zstd diff --git a/python/clim_recal/utils/data.py b/python/clim_recal/utils/data.py index 342d674b..de9a38f7 100644 --- a/python/clim_recal/utils/data.py +++ b/python/clim_recal/utils/data.py @@ -169,7 +169,7 @@ def resampling_method(cls, variable: str | None) -> Resampling: Examples -------- >>> VariableOptions.resampling_method('rainfall') - + >>> VariableOptions.resampling_method('tasmin') >>> VariableOptions.resampling_method(None) From 1e3b3a4e5ceac56981db2b4e2203d4a2b8aa177d Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Fri, 19 Jul 2024 17:23:03 +0100 Subject: [PATCH 43/92] fix(test): fix `--local-cache` test options and add `--skip-cropping` `cli` option --- python/clim_recal/cli.py | 2 ++ python/clim_recal/pipeline.py | 3 ++- python/clim_recal/utils/xarray.py | 36 +++++++++++-------------------- python/conftest.py | 20 +++++++++++++---- 4 files changed, 33 insertions(+), 28 deletions(-) diff --git a/python/clim_recal/cli.py b/python/clim_recal/cli.py index 2089e0bc..856476c7 100644 --- a/python/clim_recal/cli.py +++ b/python/clim_recal/cli.py @@ -50,6 +50,7 @@ def pipeline( skip_hads_projection: Annotated[ bool, typer.Option("--skip-hads-projection") ] = False, + skip_cropping: Annotated[bool, typer.Option("--skip-cropping")] = True, execute: Annotated[bool, typer.Option("--execute")] = False, start_index: Annotated[int, typer.Option("--start-index", "-s", min=0)] = 0, total: Annotated[int, typer.Option("--total-from-index", "-t", min=0)] = 0, @@ -69,6 +70,7 @@ def pipeline( execute=execute, skip_cpm_standard_calendar_projection=skip_cpm_projection, skip_hads_spatial_2k_projection=skip_hads_projection, + skip_cropping=skip_cropping, start_index=start_index, total=total, multiprocess=multiprocess, diff --git a/python/clim_recal/pipeline.py b/python/clim_recal/pipeline.py index 75f9ae8c..0fc4fd4c 100644 --- a/python/clim_recal/pipeline.py +++ b/python/clim_recal/pipeline.py @@ -166,6 +166,7 @@ def main( all_methods: bool = False, skip_cpm_standard_calendar_projection: bool = False, skip_hads_spatial_2k_projection: bool = False, + skip_cropping: bool = True, crop_cpm: bool = False, crop_hads: bool = False, cpus: int | None = None, @@ -288,7 +289,7 @@ def main( multiprocess=multiprocess, cpus=cpus ) print(hads_resamplers[:print_range_length]) - if skip_cropping: + if skip_cropping or (not crop_cpm and not crop_hads): print("Skipping cropping.") else: if skip_cpm_standard_calendar_projection and not crop_cpm: diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index fc7c9c11..09855dec 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -205,32 +205,20 @@ def cpm_reproject_with_standard_calendar( ... cpm_xr_time_series=tasmax_cpm_1980_raw, ... variable_name="tasmax") >>> tasmax_cpm_1980_365_day - ... + Dimensions: (time: 365, x: 493, y: 607) Coordinates: - * time (time) datetime64[ns] 1980-12-01T12:00:00 ... 1981-1... - * x (x) float64 -3.136e+05 -3.112e+05 ... 8.513e+05 - * y (y) float64 -2.371e+05 -2.348e+05 ... 1.198e+06 - transverse_mercator |S1 ... - spatial_ref int64 0 + * time (time) datetime64[ns]... + * x (x) float64... + * y (y) float64... + transverse_mercator |S1... + spatial_ref int64... Data variables: - tasmax (time, y, x) float32 nan nan nan nan ... nan nan nan + tasmax (time, y, x) float32... Attributes: (12/18) - GDAL_AREA_OR_POINT: Area - collection: land-cpm - contact: ukcpproject@metoffice.gov.uk - Conventions: CF-1.7 - creation_date: 2021-05-11T14:06:30 - domain: uk - ... ... - >>> tasmax_cpm_1980_raw.dims - FrozenMappingWarningOnValuesAccess({'ensemble_member': 1, - 'time': 360, - 'grid_latitude': 606, - 'grid_longitude': 484, - 'bnds': 2}) + ... >>> tasmax_cpm_1980_365_day.dims - FrozenMappingWarningOnValuesAccess({'time': 365, 'x': 493, 'y': 607}) + Frozen...({'time': 365, 'x': 493, 'y': 607}) """ temp_cpm: _TemporaryFileWrapper = NamedTemporaryFile( suffix="." + NETCDF_EXTENSION_STR @@ -243,7 +231,7 @@ def cpm_reproject_with_standard_calendar( xr_time_series_instance: T_Dataset = cpm_xr_time_series cpm_xr_time_series = temp_cpm.name xr_time_series_instance.to_netcdf(cpm_xr_time_series) - assert isinstance(cpm_xr_time_series, PathLike) + assert isinstance(cpm_xr_time_series, PathLike | str) gdal_warp_wrapper( cpm_xr_time_series, output_path=Path(temp_tif.name), @@ -882,7 +870,9 @@ def interpolate_xr_ts_nans( def _gen_progress_bar() -> tuple[tqdm, Callable[float, ...]]: - progress_bar: tqdm = tqdm(total=100) + progress_bar: tqdm = tqdm( + total=100, bar_format="{desc}: {percentage:3.2f}%|{bar}{r_bar}" + ) def _tqdm_progress_callback_func(progress: float, *args) -> None: progress_bar.update(progress * 100 - progress_bar.n) diff --git a/python/conftest.py b/python/conftest.py index f089ca06..effd5aa5 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -162,9 +162,15 @@ def local_cache_fixtures( @pytest.fixture(scope="session") def tasmax_cpm_1980_raw( local_cache: bool, + local_cpm_cache_path: Path, local_cache_fixtures: LocalCachesManager, -) -> T_Dataset: - return local_cache_fixtures["tasmax_cpm_1980_raw"].read(cache_path=local_cache) +) -> T_Dataset | None: + if local_cache: + return local_cache_fixtures["tasmax_cpm_1980_raw"].read( + cache_path=local_cpm_cache_path + ) + else: + return None @pytest.fixture(scope="session") @@ -181,9 +187,15 @@ def tasmax_cpm_1980_raw_path( @pytest.fixture(scope="session") def tasmax_hads_1980_raw( local_cache: bool, + local_hads_cache_path: Path, local_cache_fixtures: LocalCachesManager, ) -> T_Dataset | None: - return local_cache_fixtures["tasmax_hads_1980_raw"].read(cache_path=local_cache) + if local_cache: + return local_cache_fixtures["tasmax_hads_1980_raw"].read( + cache_path=local_hads_cache_path + ) + else: + return None @pytest.fixture(scope="session") @@ -272,7 +284,7 @@ def pytest_addoption(parser): parser.addoption( "--local-cache", action=BooleanOptionalAction, - default=True, + default=False, help="use 'local_cache' data fixtures", ) parser.addoption( From 81ecbac32b47d1029caa2c146b6548a02d648959 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Fri, 19 Jul 2024 19:39:40 +0100 Subject: [PATCH 44/92] feat: add ` _progress_bar_file_description` and use `tqdm.richer` for `gdal` --- python/clim_recal/utils/xarray.py | 89 ++++++++++++++++++++++++------- 1 file changed, 71 insertions(+), 18 deletions(-) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 09855dec..b9483e43 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -13,10 +13,18 @@ from numpy import ndarray from numpy.typing import NDArray from osgeo.gdal import Dataset as GDALDataset -from osgeo.gdal import GDALWarpAppOptions, Translate, Warp, WarpOptions +from osgeo.gdal import ( + GDALTranslateOptions, + GDALWarpAppOptions, + Translate, + TranslateOptions, + Warp, + WarpOptions, +) +from osgeo.gdal import config_option as config_GDAL_option from pandas import DatetimeIndex, date_range from rasterio.enums import Resampling -from tqdm import tqdm +from tqdm.rich import tqdm from xarray import CFTimeIndex, DataArray, Dataset, cftime_range, open_dataset from xarray.coding.calendar_ops import convert_calendar from xarray.core.types import ( @@ -88,6 +96,8 @@ "GDAL_NETCDF_VERIFY_DIMS": "STRICT", } +TQDM_FILE_NAME_PRINT_CHARS_INDEX: Final[int] = -7 + def cpm_xarray_to_standard_calendar( cpm_xr_time_series: T_Dataset | PathLike, include_bnds_index: bool = False @@ -204,6 +214,8 @@ def cpm_reproject_with_standard_calendar( >>> tasmax_cpm_1980_365_day: T_Dataset = cpm_reproject_with_standard_calendar( ... cpm_xr_time_series=tasmax_cpm_1980_raw, ... variable_name="tasmax") + Warp: ...nc 100% ... + Translate: ...tif 100% ... >>> tasmax_cpm_1980_365_day Dimensions: (time: 365, x: 493, y: 607) @@ -869,10 +881,17 @@ def interpolate_xr_ts_nans( return interpolated_ts -def _gen_progress_bar() -> tuple[tqdm, Callable[float, ...]]: - progress_bar: tqdm = tqdm( - total=100, bar_format="{desc}: {percentage:3.2f}%|{bar}{r_bar}" - ) +def _progress_bar_file_description( + input_path: PathLike, + prefix: str = "", + tqdm_file_name_chars: int = TQDM_FILE_NAME_PRINT_CHARS_INDEX, + suffix: str = "", +) -> str: + return f"{prefix}{Path(input_path).name[tqdm_file_name_chars:]}{suffix}" + + +def _gen_progress_bar(description: str = "") -> tuple[tqdm, Callable[..., None]]: + progress_bar: tqdm = tqdm(total=100, desc=description) def _tqdm_progress_callback_func(progress: float, *args) -> None: progress_bar.update(progress * 100 - progress_bar.n) @@ -886,19 +905,38 @@ def gdal_translate_wrapper( return_path: bool = True, translate_format: GDALFormatsType | str = GDALNetCDFFormatStr, use_tqdm_progress_bar: bool = True, + tqdm_file_name_chars: int = TQDM_FILE_NAME_PRINT_CHARS_INDEX, resampling_method: Resampling | None = None, + supress_warnings: bool = True, **kwargs, ) -> Path | GDALDataset: if use_tqdm_progress_bar: - progress_bar, progress_callback = _gen_progress_bar() + description: str = _progress_bar_file_description( + input_path=input_path, + prefix="Translate: ", + tqdm_file_name_chars=tqdm_file_name_chars, + ) + progress_bar, progress_callback = _gen_progress_bar(description=description) kwargs["callback"] = progress_callback - translation: GDALDataset = Translate( - destName=output_path, - srcDS=input_path, + translate_options: GDALTranslateOptions = TranslateOptions( format=translate_format, resampleAlg=_ensure_resample_method_name(resampling_method), **kwargs, ) + translation: GDALDataset + if supress_warnings: + with config_GDAL_option("CPL_LOG", "gdal_warnings.log"): + translation = Translate( + destName=output_path, + srcDS=input_path, + options=translate_options, + ) + else: + translation = Translate( + destName=output_path, + srcDS=input_path, + options=translate_options, + ) if use_tqdm_progress_bar: translation.FlushCache() progress_bar.close() @@ -918,7 +956,9 @@ def gdal_warp_wrapper( multithread: bool = True, warp_dict_options: dict[str, str | float] | None = DEFAULT_WARP_DICT_OPTIONS, use_tqdm_progress_bar: bool = True, + tqdm_file_name_chars: int = TQDM_FILE_NAME_PRINT_CHARS_INDEX, resampling_method: Resampling | None = None, + supress_warnings: bool = True, **kwargs, ) -> Path | GDALDataset: """Execute the `gdalwrap` function within `python`. @@ -966,10 +1006,13 @@ def gdal_warp_wrapper( """ Path(output_path).parent.mkdir(parents=True, exist_ok=True) if use_tqdm_progress_bar: - progress_bar = tqdm(total=100) - - def _tqdm_progress_callback_func(progress: float, *args) -> None: - progress_bar.update(progress * 100 - progress_bar.n) + description: str = _progress_bar_file_description( + input_path=input_path, + prefix="Warp: ", + tqdm_file_name_chars=tqdm_file_name_chars, + ) + progress_bar, progress_callback = _gen_progress_bar(description=description) + kwargs["callback"] = progress_callback try: assert not Path(output_path).is_dir() @@ -984,12 +1027,22 @@ def _tqdm_progress_callback_func(progress: float, *args) -> None: multithread=multithread, warpOptions=warp_dict_options, resampleAlg=_ensure_resample_method_name(resampling_method), - callback=_tqdm_progress_callback_func if use_tqdm_progress_bar else None, **kwargs, ) - projection: GDALDataset = Warp( - destNameOrDestDS=output_path, srcDSOrSrcDSTab=input_path, options=warp_config - ) + projection: GDALDataset + if supress_warnings: + with config_GDAL_option("CPL_LOG", "gdal_warnings.log"): + projection = Warp( + destNameOrDestDS=output_path, + srcDSOrSrcDSTab=input_path, + options=warp_config, + ) + else: + projection = Warp( + destNameOrDestDS=output_path, + srcDSOrSrcDSTab=input_path, + options=warp_config, + ) projection.FlushCache() if use_tqdm_progress_bar: progress_bar.close() From 29d570f97811e97307e6abeec7113f60dc71c8b8 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Fri, 19 Jul 2024 19:47:53 +0100 Subject: [PATCH 45/92] fix(ci): remove `not localcache` from `github` `ci.yaml` --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9f2a561f..f195451a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -70,7 +70,7 @@ jobs: - name: Run Python Tests run: | - mamba run -n ${{ env.CONDA_ENV_NAME }} --cwd python pytest -m "not darwin and not mount and not localcache" + mamba run -n ${{ env.CONDA_ENV_NAME }} --cwd python pytest -m "not darwin and not mount" - name: Copy test coverage results run: | From bd69fb8476559380fd3da41039c8a9c9fa50adf5 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Fri, 19 Jul 2024 21:25:37 +0100 Subject: [PATCH 46/92] ci: draft to fix `CI` `pytest` --- .github/workflows/ci.yaml | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f195451a..f05e52e7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -5,7 +5,7 @@ env: DOCKER_BUILDKIT: 1 COMPOSE_DOCKER_CLI_BUILD: 1 CONDA_ENV_NAME: clim-recal - CONDA_ENV_PATH: .conda-linux-64.lock + CONDA_ENV_PATH: conda-lock.yml MIN_PYTHON_VERSION: 3.12 PYTHON_MODULE_FOLDER: python/ COVERAGE_SVG_FOLDER: docs/assets/ @@ -60,17 +60,30 @@ jobs: uses: actions/checkout@main - name: Build Conda Environment - uses: conda-incubator/setup-miniconda@v3 + uses: mamba-org/setup-micromamba@v1 with: - auto-update-conda: false - activate-environment: ${{ env.CONDA_ENV_NAME }} + # auto-update-conda: false + # activate-environment: ${{ env.CONDA_ENV_NAME }} environment-file: ${{ env.CONDA_ENV_PATH }} - miniforge-version: latest - use-mamba: true + environment-name: ${{ env.CONDA_ENV_NAME }} + generate-run-shell: true + # create-args: >- + # pytest-cov + # pytest-xdist + # coverage-badge + create-args: >- + --dev-dependencies + # custom-args: >- + # --dev-dependencies + # miniforge-version: latest + # use-mamba: true - name: Run Python Tests run: | - mamba run -n ${{ env.CONDA_ENV_NAME }} --cwd python pytest -m "not darwin and not mount" + cd python + pytest -m "not darwin and not mount" + # shell: bash -el {0} + shell: micromamba-shell {0} - name: Copy test coverage results run: | From 67c7686581b529a9e9bf9c08e833ad7575b98b8b Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sat, 20 Jul 2024 19:15:45 +0100 Subject: [PATCH 47/92] fix(ci): add `libsqlite --fore-reinstall` to `ci.yaml` --- .github/workflows/ci.yaml | 56 ++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f05e52e7..ad8899fa 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -5,8 +5,9 @@ env: DOCKER_BUILDKIT: 1 COMPOSE_DOCKER_CLI_BUILD: 1 CONDA_ENV_NAME: clim-recal - CONDA_ENV_PATH: conda-lock.yml - MIN_PYTHON_VERSION: 3.12 + # CONDA_ENV_PATH: conda-lock.yml + CONDA_ENV_PATH: .conda-linux-64.lock + MIN_PYTHON_VERSION: 3.13 PYTHON_MODULE_FOLDER: python/ COVERAGE_SVG_FOLDER: docs/assets/ COVERAGE_SVG_FILE_NAME: coverage.svg @@ -60,30 +61,43 @@ jobs: uses: actions/checkout@main - name: Build Conda Environment - uses: mamba-org/setup-micromamba@v1 + uses: conda-incubator/setup-miniconda@v3 with: - # auto-update-conda: false - # activate-environment: ${{ env.CONDA_ENV_NAME }} + activate-environment: ${{ env.CONDA_ENV_NAME }} environment-file: ${{ env.CONDA_ENV_PATH }} - environment-name: ${{ env.CONDA_ENV_NAME }} - generate-run-shell: true - # create-args: >- - # pytest-cov - # pytest-xdist - # coverage-badge - create-args: >- - --dev-dependencies - # custom-args: >- - # --dev-dependencies - # miniforge-version: latest - # use-mamba: true + auto-activate-base: false + miniforge-version: latest + use-mamba: true + # - name: Build Conda Environment + # uses: mamba-org/setup-micromamba@v1 + # with: + # auto-update-conda: false + # activate-environment: ${{ env.CONDA_ENV_NAME }} + # # environment-file: ${{ env.CONDA_ENV_PATH }} + # # environment-name: ${{ env.CONDA_ENV_NAME }} + # # generate-run-shell: true + # # create-args: >- + # # pytest-cov + # # pytest-xdist + # # coverage-badge + # create-args: >- + # --dev-dependencies + # # custom-args: >- + # # --dev-dependencies + # # miniforge-version: latest + # # use-mamba: true - name: Run Python Tests + # The first line below may be temporary, follows this solution: + # https://github.com/pyenv/pyenv/issues/2625 run: | - cd python - pytest -m "not darwin and not mount" - # shell: bash -el {0} - shell: micromamba-shell {0} + mamba install libsqlite --force-reinstall + mamba run -n ${{ env.CONDA_ENV_NAME }} --cwd python pytest -m "not darwin and not mount" + # run: | + # cd python + # pytest -m "not darwin and not mount" + shell: bash -el {0} + # shell: micromamba-shell {0} - name: Copy test coverage results run: | From 57d73c48ef96dc953394beb82ea1a5d13784f4e3 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sat, 20 Jul 2024 19:19:52 +0100 Subject: [PATCH 48/92] fix(ci): set `github` `python` version to `3.12` --- .github/workflows/ci.yaml | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ad8899fa..44694821 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -7,7 +7,7 @@ env: CONDA_ENV_NAME: clim-recal # CONDA_ENV_PATH: conda-lock.yml CONDA_ENV_PATH: .conda-linux-64.lock - MIN_PYTHON_VERSION: 3.13 + MIN_PYTHON_VERSION: 3.12 PYTHON_MODULE_FOLDER: python/ COVERAGE_SVG_FOLDER: docs/assets/ COVERAGE_SVG_FILE_NAME: coverage.svg @@ -68,36 +68,15 @@ jobs: auto-activate-base: false miniforge-version: latest use-mamba: true - # - name: Build Conda Environment - # uses: mamba-org/setup-micromamba@v1 - # with: - # auto-update-conda: false - # activate-environment: ${{ env.CONDA_ENV_NAME }} - # # environment-file: ${{ env.CONDA_ENV_PATH }} - # # environment-name: ${{ env.CONDA_ENV_NAME }} - # # generate-run-shell: true - # # create-args: >- - # # pytest-cov - # # pytest-xdist - # # coverage-badge - # create-args: >- - # --dev-dependencies - # # custom-args: >- - # # --dev-dependencies - # # miniforge-version: latest - # # use-mamba: true - name: Run Python Tests - # The first line below may be temporary, follows this solution: + # The first line below may be temporary, + # see this solution: # https://github.com/pyenv/pyenv/issues/2625 run: | mamba install libsqlite --force-reinstall mamba run -n ${{ env.CONDA_ENV_NAME }} --cwd python pytest -m "not darwin and not mount" - # run: | - # cd python - # pytest -m "not darwin and not mount" shell: bash -el {0} - # shell: micromamba-shell {0} - name: Copy test coverage results run: | From 0f97894c23180164f6a44a68e7b2de9447733ab9 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 21 Jul 2024 00:47:02 +0100 Subject: [PATCH 49/92] doc: fix `quartodoc` `pydandic` dependency version --- .conda-linux-64.lock | 12 +-- conda-lock.yml | 165 ++++++++++++++++++++++-------------------- python/pdm.lock | 88 +++++++++++----------- python/pyproject.toml | 3 +- 4 files changed, 137 insertions(+), 131 deletions(-) diff --git a/.conda-linux-64.lock b/.conda-linux-64.lock index 8a98e587..fc513629 100644 --- a/.conda-linux-64.lock +++ b/.conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: e93d626994b24acc9824124ff7f680fce2a576875f8b1052dd7b9635db71c386 +# input_hash: 39afbc7e61dc8d1f80c0d072d56e538eefdac01b4eaba0079e090148ca8d862f @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://repo.anaconda.com/pkgs/main/linux-64/blas-1.0-openblas.conda#9ddfcaef10d79366c90128f5dc444be8 @@ -245,7 +245,7 @@ https://repo.anaconda.com/pkgs/main/noarch/cligj-0.7.2-pyhd3eb1b0_0.conda#a304c2 https://conda.anaconda.org/conda-forge/noarch/clikit-0.6.2-pyhd8ed1ab_2.conda#02abb7b66b02e8b9f5a9b05454400087 https://repo.anaconda.com/pkgs/main/linux-64/comm-0.2.1-py312h06a4308_0.conda#7d7b827eee78fd7b62292dc6a44314f2 https://conda.anaconda.org/conda-forge/noarch/coverage-badge-1.1.1-pyhd8ed1ab_0.conda#2b9d71adc9cae0b0eff77cae36f75cf6 -https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.2-pyhd8ed1ab_0.conda#3485b77f697e38cbab7b80d01533717a +https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.3-pyhd8ed1ab_0.conda#396864473cf7cf2dcbc17bb3bdcef665 https://conda.anaconda.org/conda-forge/noarch/findpython-0.6.1-pyhd8ed1ab_0.conda#c3562fb8edde4111bd5a11ea30cbc6a7 https://repo.anaconda.com/pkgs/main/linux-64/fonttools-4.51.0-py312h5eee18b_0.conda#592d996d4b654ac2d0b071461f5165d4 https://repo.anaconda.com/pkgs/main/noarch/gitdb-4.0.7-pyhd3eb1b0_0.conda#bdd15a7149734880c003d98110c56b5b @@ -310,7 +310,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h6fbd9c4_7.c https://repo.anaconda.com/pkgs/main/linux-64/numexpr-2.8.7-py312he7dcb8a_0.conda#abeab7edb95c5f2adcd741401a2e07dc https://conda.anaconda.org/conda-forge/linux-64/poppler-24.04.0-hb6cd0d7_0.conda#d19eed746748f1d44b575662f2bcfe95 https://repo.anaconda.com/pkgs/main/noarch/prompt_toolkit-3.0.43-hd3eb1b0_0.conda#244c80adf85e37e2a4158d0f0c199566 -https://repo.anaconda.com/pkgs/main/linux-64/pydantic-core-2.14.6-py312hb02cf49_0.conda#e923c263c17acb02e2d48d0349eeeb73 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.20.1-py312hf008fa9_0.conda#8cc8f335b7e355558854236d86b2bea4 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h5d05ceb_7.conda#b53ddc25da04839cc62b0b158a7ecb38 https://repo.anaconda.com/pkgs/main/linux-64/pytest-cov-4.1.0-py312h06a4308_1.conda#527d99f42aeea2545011a0bb6c7d38b8 https://conda.anaconda.org/conda-forge/noarch/pytest-sugar-1.0.0-pyhd8ed1ab_0.conda#95911286c4f6bcea2bea50b2739c7f8e @@ -334,7 +334,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-base-3.8.4-py312h526ad5a https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h1ef7fb6_101.conda#c67cc8e3a34c5cb8920c79918112e96f https://repo.anaconda.com/pkgs/main/linux-64/pandas-2.2.2-py312h526ad5a_0.conda#931585545b1801a72013bf30186fb51a https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.5.2-pyhd8ed1ab_0.conda#f8d38e43e2b367976d7135e602b5c9b6 -https://repo.anaconda.com/pkgs/main/linux-64/pydantic-2.5.3-py312h06a4308_0.conda#b584f35c1c23cfe8bfa0ec111df2408e +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda#539a038a24a959662df1fcaa2cfc5c3e https://repo.anaconda.com/pkgs/main/linux-64/pyopenssl-24.0.0-py312h06a4308_0.conda#f93a6ad622b84e53aed3d899b5b36f6a https://repo.anaconda.com/pkgs/main/linux-64/scikit-learn-1.4.2-py312h526ad5a_1.conda#7f8e8d231b3df92ca1821f2062c76306 https://repo.anaconda.com/pkgs/main/linux-64/secretstorage-3.3.1-py312h06a4308_1.conda#790c1839ee84767859d244875a26ad97 @@ -365,13 +365,13 @@ https://conda.anaconda.org/conda-forge/noarch/unearth-0.16.1-pyhd8ed1ab_0.conda# https://repo.anaconda.com/pkgs/main/linux-64/cachecontrol-with-filecache-0.14.0-py312h06a4308_1.conda#e3f673966a8bfbab947ceceb285f72d0 https://conda.anaconda.org/conda-forge/linux-64/gdal-3.8.5-py312h86af8fa_11.conda#5440cac70586e8653b26aa5f2860c101 https://repo.anaconda.com/pkgs/main/linux-64/jupyter_server-2.14.1-py312h06a4308_0.conda#6ee18118c92c40b045ae6a99d5025da4 -https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.0-pyhd8ed1ab_0.conda#f5967ca19cb8fbd0eb04b8e191ded1e2 +https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.1-pyhd8ed1ab_0.conda#3da349945f818b5ef7591fa13742d2d9 https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.10-py312hd6340be_2.conda#9cee69a489f3b7c6de37bd7021d505cb https://repo.anaconda.com/pkgs/main/linux-64/conda-lock-2.5.6-py312h06a4308_0.conda#1f85a7f30fbd7e1a1061c05ba059e11f https://repo.anaconda.com/pkgs/main/linux-64/jupyter-lsp-2.2.0-py312h06a4308_0.conda#5ec44afafeffea8c68eb56af4da94dc5 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.27.3-pyhd8ed1ab_0.conda#af8239bf1ba7e8c69b689f780f653488 https://repo.anaconda.com/pkgs/main/linux-64/notebook-shim-0.2.3-py312h06a4308_0.conda#1f00239d617e3f323f35899f6254b39c https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.8.0-py312hbedb91a_1.conda#3840cffc5d6c64e179fc54f02714956d -https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.16.0-pyhd8ed1ab_0.conda#e651425fab6f281a049b785d1d630b1a +https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.17.0-pyhd8ed1ab_0.conda#160464c6f979eb68e9a9ea31dd6b5aa6 https://conda.anaconda.org/conda-forge/noarch/geopandas-1.0.1-pyhd8ed1ab_0.conda#efef4ce75a678216d510d08222845c7f https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.4-pyhd8ed1ab_0.conda#28f3334e97c39de2b7ac15743b041784 diff --git a/conda-lock.yml b/conda-lock.yml index 8c427402..78ca24c4 100644 --- a/conda-lock.yml +++ b/conda-lock.yml @@ -15,9 +15,9 @@ version: 1 metadata: content_hash: - osx-arm64: e6085e96c1ef1b76328590db946e02019a43602a6bfb5964669ea986efa533c6 - linux-64: e93d626994b24acc9824124ff7f680fce2a576875f8b1052dd7b9635db71c386 - linux-aarch64: db00b5eb96e5e331116ea643b28eca6b8bb41be698198b6bc678518d5384e367 + osx-arm64: 02143e847fa02a655e42c0abfe768bed11438816f9805fa37888a0172b9d74a6 + linux-64: 39afbc7e61dc8d1f80c0d072d56e538eefdac01b4eaba0079e090148ca8d862f + linux-aarch64: 04a25f0b3dfc53876614711d86b8a3b56fdd7d4ed5eb620327975aed1e1fd6c0 channels: - url: r used_env_vars: [] @@ -3140,42 +3140,42 @@ package: category: main optional: false - name: dep-logic - version: 0.4.2 + version: 0.4.3 manager: conda platform: linux-64 dependencies: packaging: '>=22' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.3-pyhd8ed1ab_0.conda hash: - md5: 3485b77f697e38cbab7b80d01533717a - sha256: 338f3fe279747eb3d81baddcb9a31dc628244b35119c745b0368e46a72588b47 + md5: 396864473cf7cf2dcbc17bb3bdcef665 + sha256: c02a4a4f721f6c4ad6b95bb22457fda11d6b3b687630f3e4878bd7a27d720e8b category: main optional: false - name: dep-logic - version: 0.4.2 + version: 0.4.3 manager: conda platform: linux-aarch64 dependencies: packaging: '>=22' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.3-pyhd8ed1ab_0.conda hash: - md5: 3485b77f697e38cbab7b80d01533717a - sha256: 338f3fe279747eb3d81baddcb9a31dc628244b35119c745b0368e46a72588b47 + md5: 396864473cf7cf2dcbc17bb3bdcef665 + sha256: c02a4a4f721f6c4ad6b95bb22457fda11d6b3b687630f3e4878bd7a27d720e8b category: main optional: false - name: dep-logic - version: 0.4.2 + version: 0.4.3 manager: conda platform: osx-arm64 dependencies: packaging: '>=22' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.3-pyhd8ed1ab_0.conda hash: - md5: 3485b77f697e38cbab7b80d01533717a - sha256: 338f3fe279747eb3d81baddcb9a31dc628244b35119c745b0368e46a72588b47 + md5: 396864473cf7cf2dcbc17bb3bdcef665 + sha256: c02a4a4f721f6c4ad6b95bb22457fda11d6b3b687630f3e4878bd7a27d720e8b category: main optional: false - name: dill @@ -10139,13 +10139,13 @@ package: category: main optional: false - name: pdm - version: 2.17.0 + version: 2.17.1 manager: conda platform: linux-64 dependencies: blinker: '' chardet: '' - dep-logic: '>=0.4.0' + dep-logic: '>=0.4.3' filelock: '>=3.13' findpython: '>=0.6.0,<1.0.0a0' hishel: '>=0.0.24,<0.1.0' @@ -10171,20 +10171,20 @@ package: unearth: '>=0.16.0' virtualenv: '>=20' zstandard: '>=0.21.0' - url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.1-pyhd8ed1ab_0.conda hash: - md5: f5967ca19cb8fbd0eb04b8e191ded1e2 - sha256: 1589cbc07bf97d0bc3c21bbc339079b021e8fe76e71b14dae5815c691dad4c96 + md5: 3da349945f818b5ef7591fa13742d2d9 + sha256: 0e361e083e62ee24c1e1e269e3e34bb78cd70f4130d52325b69174d2e989f8e2 category: main optional: false - name: pdm - version: 2.17.0 + version: 2.17.1 manager: conda platform: linux-aarch64 dependencies: blinker: '' chardet: '' - dep-logic: '>=0.4.0' + dep-logic: '>=0.4.3' filelock: '>=3.13' findpython: '>=0.6.0,<1.0.0a0' hishel: '>=0.0.24,<0.1.0' @@ -10210,20 +10210,20 @@ package: unearth: '>=0.16.0' virtualenv: '>=20' zstandard: '>=0.21.0' - url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.1-pyhd8ed1ab_0.conda hash: - md5: f5967ca19cb8fbd0eb04b8e191ded1e2 - sha256: 1589cbc07bf97d0bc3c21bbc339079b021e8fe76e71b14dae5815c691dad4c96 + md5: 3da349945f818b5ef7591fa13742d2d9 + sha256: 0e361e083e62ee24c1e1e269e3e34bb78cd70f4130d52325b69174d2e989f8e2 category: main optional: false - name: pdm - version: 2.17.0 + version: 2.17.1 manager: conda platform: osx-arm64 dependencies: blinker: '' chardet: '' - dep-logic: '>=0.4.0' + dep-logic: '>=0.4.3' filelock: '>=3.13' findpython: '>=0.6.0,<1.0.0a0' hishel: '>=0.0.24,<0.1.0' @@ -10249,10 +10249,10 @@ package: unearth: '>=0.16.0' virtualenv: '>=20' zstandard: '>=0.21.0' - url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.1-pyhd8ed1ab_0.conda hash: - md5: f5967ca19cb8fbd0eb04b8e191ded1e2 - sha256: 1589cbc07bf97d0bc3c21bbc339079b021e8fe76e71b14dae5815c691dad4c96 + md5: 3da349945f818b5ef7591fa13742d2d9 + sha256: 0e361e083e62ee24c1e1e269e3e34bb78cd70f4130d52325b69174d2e989f8e2 category: main optional: false - name: perl @@ -11235,89 +11235,94 @@ package: category: main optional: false - name: pydantic - version: 2.5.3 + version: 2.8.2 manager: conda platform: linux-64 dependencies: annotated-types: '>=0.4.0' - pydantic-core: 2.14.6 - python: '>=3.12,<3.13.0a0' + pydantic-core: 2.20.1 + python: '>=3.7' typing-extensions: '>=4.6.1' - url: https://repo.anaconda.com/pkgs/main/linux-64/pydantic-2.5.3-py312h06a4308_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda hash: - md5: b584f35c1c23cfe8bfa0ec111df2408e - sha256: 8f0c2974da93d851da01616ff67725b251f2760bb36c523dfe7b7cbd26571725 - category: main - optional: false + md5: 539a038a24a959662df1fcaa2cfc5c3e + sha256: 5a877153f7eaaab9724db5b64366a35e346007c9c104c1d6a6042f83b2f4f0df + category: dev + optional: true - name: pydantic - version: 2.5.3 + version: 2.8.2 manager: conda platform: linux-aarch64 dependencies: annotated-types: '>=0.4.0' - pydantic-core: 2.14.6 - python: '>=3.12,<3.13.0a0' + pydantic-core: 2.20.1 + python: '>=3.7' typing-extensions: '>=4.6.1' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/pydantic-2.5.3-py312hd43f75c_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda hash: - md5: 4b637586e860aebd8559ea925e19cb67 - sha256: 3bf8ac615d7400a2f2d7edf2e4fd0153f1c099f76c27776146169143d5cf1b4f - category: main - optional: false + md5: 539a038a24a959662df1fcaa2cfc5c3e + sha256: 5a877153f7eaaab9724db5b64366a35e346007c9c104c1d6a6042f83b2f4f0df + category: dev + optional: true - name: pydantic - version: 2.5.3 + version: 2.8.2 manager: conda platform: osx-arm64 dependencies: annotated-types: '>=0.4.0' - pydantic-core: 2.14.6 - python: '>=3.12,<3.13.0a0' + pydantic-core: 2.20.1 + python: '>=3.7' typing-extensions: '>=4.6.1' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/pydantic-2.5.3-py312hca03da5_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda hash: - md5: 2593931785f1c55101aed1e611ac63eb - sha256: 3ac368b70b0f310b288caebb557b61220ddfdc95dcf156cc4000c49f8134ef99 - category: main - optional: false + md5: 539a038a24a959662df1fcaa2cfc5c3e + sha256: 5a877153f7eaaab9724db5b64366a35e346007c9c104c1d6a6042f83b2f4f0df + category: dev + optional: true - name: pydantic-core - version: 2.14.6 + version: 2.20.1 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=11.2.0' + __glibc: '>=2.17,<3.0.a0' + libgcc-ng: '>=12' python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* typing-extensions: '>=4.6.0,!=4.7.0' - url: https://repo.anaconda.com/pkgs/main/linux-64/pydantic-core-2.14.6-py312hb02cf49_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.20.1-py312hf008fa9_0.conda hash: - md5: e923c263c17acb02e2d48d0349eeeb73 - sha256: 912632661783ebca87424899f76d27adbf25eb420ca397cbac591ead856292bc + md5: 8cc8f335b7e355558854236d86b2bea4 + sha256: adf117d3289c8dd97ffdb3076bc488217fedd02f3d96d35cc971f4de33460602 category: main optional: false - name: pydantic-core - version: 2.14.6 + version: 2.20.1 manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=11.2.0' + libgcc-ng: '>=12' python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* typing-extensions: '>=4.6.0,!=4.7.0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/pydantic-core-2.14.6-py312h7f3cb11_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.20.1-py312h3dd116e_0.conda hash: - md5: 6afced7b5b042056fa109295995272dd - sha256: ecd663d55e09253e7ebaad29c703597853f48906d6a34adec6af79a766f5e325 + md5: db340c73d8a147ae99fb521634e8b638 + sha256: 15d7b422ce912775ccc4c48a73fe011dbcb78554b4b29cad888701fe1d2f4a65 category: main optional: false - name: pydantic-core - version: 2.14.6 + version: 2.20.1 manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* typing-extensions: '>=4.6.0,!=4.7.0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/pydantic-core-2.14.6-py312hf0e4da2_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.20.1-py312h552d48e_0.conda hash: - md5: abf001863fd32aa7171630abfbac6eaf - sha256: 91c94819242bdc5d9b40d3835d4158822a7c93cf085135983460ff257913c089 + md5: b0b8cd2d2e6aa1620dfea907706f94b4 + sha256: 5a6381ce4a5ecaeffe92f6c05fc4a70290140364e56c715a9de9c939c2bf46de category: main optional: false - name: pygments @@ -12742,7 +12747,7 @@ package: category: main optional: false - name: rioxarray - version: 0.16.0 + version: 0.17.0 manager: conda platform: linux-64 dependencies: @@ -12753,14 +12758,14 @@ package: rasterio: '>=1.3' scipy: '' xarray: '>=2022.3.0' - url: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.16.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.17.0-pyhd8ed1ab_0.conda hash: - md5: e651425fab6f281a049b785d1d630b1a - sha256: b63b43fac200261b2667666f45894fbe068101e4a57926b72f4d82fe2e5b78c1 + md5: 160464c6f979eb68e9a9ea31dd6b5aa6 + sha256: 992ce1a2667dd2beac45157dcb9058775e0522ebf1a70f1563c0fd0608f9480a category: main optional: false - name: rioxarray - version: 0.16.0 + version: 0.17.0 manager: conda platform: linux-aarch64 dependencies: @@ -12771,14 +12776,14 @@ package: rasterio: '>=1.3' scipy: '' xarray: '>=2022.3.0' - url: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.16.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.17.0-pyhd8ed1ab_0.conda hash: - md5: e651425fab6f281a049b785d1d630b1a - sha256: b63b43fac200261b2667666f45894fbe068101e4a57926b72f4d82fe2e5b78c1 + md5: 160464c6f979eb68e9a9ea31dd6b5aa6 + sha256: 992ce1a2667dd2beac45157dcb9058775e0522ebf1a70f1563c0fd0608f9480a category: main optional: false - name: rioxarray - version: 0.16.0 + version: 0.17.0 manager: conda platform: osx-arm64 dependencies: @@ -12789,10 +12794,10 @@ package: rasterio: '>=1.3' scipy: '' xarray: '>=2022.3.0' - url: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.16.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.17.0-pyhd8ed1ab_0.conda hash: - md5: e651425fab6f281a049b785d1d630b1a - sha256: b63b43fac200261b2667666f45894fbe068101e4a57926b72f4d82fe2e5b78c1 + md5: 160464c6f979eb68e9a9ea31dd6b5aa6 + sha256: 992ce1a2667dd2beac45157dcb9058775e0522ebf1a70f1563c0fd0608f9480a category: main optional: false - name: rpds-py diff --git a/python/pdm.lock b/python/pdm.lock index acbeda83..b72655dd 100644 --- a/python/pdm.lock +++ b/python/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.4.2" -content_hash = "sha256:b8b4cf2772bc66023bff5b3336356d406e83f0b6d33f59230169415f168caa70" +content_hash = "sha256:bd9f6356c4fe7670347a625ffb68759281d11149eff00ef86a0bb48c323c8052" [[package]] name = "affine" @@ -335,7 +335,7 @@ name = "charset-normalizer" version = "3.3.2" requires_python = ">=3.7.0" summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -groups = ["default"] +groups = ["default", "dev"] files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, @@ -1027,7 +1027,7 @@ name = "idna" version = "3.7" requires_python = ">=3.5" summary = "Internationalized Domain Names in Applications (IDNA)" -groups = ["default"] +groups = ["default", "dev"] files = [ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, @@ -2145,23 +2145,23 @@ files = [ [[package]] name = "pydantic" -version = "2.7.1" +version = "2.8.2" requires_python = ">=3.8" summary = "Data validation using Python type hints" groups = ["default", "dev"] dependencies = [ "annotated-types>=0.4.0", - "pydantic-core==2.18.2", - "typing-extensions>=4.6.1", + "pydantic-core==2.20.1", + "typing-extensions>=4.6.1; python_version < \"3.13\"", ] files = [ - {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, - {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, ] [[package]] name = "pydantic-core" -version = "2.18.2" +version = "2.20.1" requires_python = ">=3.8" summary = "Core functionality for Pydantic validation and serialization" groups = ["default", "dev"] @@ -2169,36 +2169,35 @@ dependencies = [ "typing-extensions!=4.7.0,>=4.6.0", ] files = [ - {file = "pydantic_core-2.18.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"}, - {file = "pydantic_core-2.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c"}, - {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241"}, - {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3"}, - {file = "pydantic_core-2.18.2-cp312-none-win32.whl", hash = "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038"}, - {file = "pydantic_core-2.18.2-cp312-none-win_amd64.whl", hash = "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438"}, - {file = "pydantic_core-2.18.2-cp312-none-win_arm64.whl", hash = "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374"}, - {file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, + {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, + {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, ] [[package]] @@ -2474,7 +2473,7 @@ files = [ [[package]] name = "quartodoc" -version = "0.7.2" +version = "0.7.5" requires_python = ">=3.9" summary = "Generate API documentation with Quarto." groups = ["dev"] @@ -2486,14 +2485,15 @@ dependencies = [ "plum-dispatch>2.0.0; python_version >= \"3.10\"", "pydantic", "pyyaml", + "requests", "sphobjinv>=2.3.1", "tabulate>=0.9.0", "typing-extensions>=4.4.0", "watchdog>=3.0.0", ] files = [ - {file = "quartodoc-0.7.2-py3-none-any.whl", hash = "sha256:adff974296c013308f4e06cadea8b71b90d334dcb1510d2bd0ef9cea06d8be98"}, - {file = "quartodoc-0.7.2.tar.gz", hash = "sha256:58f98c88065ce0b4a857f13282d1e38bb2cd4757b481a4c6279bdca89ba5640b"}, + {file = "quartodoc-0.7.5-py3-none-any.whl", hash = "sha256:293c45c4b1b10936d562921ff32f7a5d3e24bde250c638f0033c0c38ecbc9a92"}, + {file = "quartodoc-0.7.5.tar.gz", hash = "sha256:328d40374fa4397cab67a820cdac3dca47a90eb0a33328ccf50c8f41507ef125"}, ] [[package]] @@ -2541,7 +2541,7 @@ name = "requests" version = "2.31.0" requires_python = ">=3.7" summary = "Python HTTP for Humans." -groups = ["default"] +groups = ["default", "dev"] dependencies = [ "certifi>=2017.4.17", "charset-normalizer<4,>=2", @@ -3151,7 +3151,7 @@ name = "urllib3" version = "1.26.18" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" summary = "HTTP library with thread-safe connection pooling, file post, and more." -groups = ["default"] +groups = ["default", "dev"] files = [ {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, diff --git a/python/pyproject.toml b/python/pyproject.toml index 63839a39..e008de5a 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -54,11 +54,12 @@ all = true dev = [ "pytest-cov<5.0.0,>=4.1.0", "pytest-sugar<2.0.0,>=1.0.0", - "quartodoc<1.0.0,>=0.7.2", + "quartodoc>=0.7.5", "pre-commit<4.0.0,>=3.6.2", "coverage-badge<2.0.0,>=1.1.0", "pytest-xdist>=3.5.0", "sysrsync>=1.1.1", + "pydantic>=2.8.2", ] [tool.pdm.build] From 6f0fb1bec03bd15f60d921299c25544e57f29b45 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 21 Jul 2024 15:17:20 +0100 Subject: [PATCH 50/92] fix: enforce `numpy<2` and update `.pre-commit` and fix macOS processing import error --- .conda-linux-64.lock | 4 +- .pre-commit-config.yaml | 6 +- conda-lock.yml | 30 +- python/clim_recal/utils/core.py | 5 + python/pdm.lock | 939 +++++++++++++++++--------------- python/pyproject.toml | 1 + 6 files changed, 512 insertions(+), 473 deletions(-) diff --git a/.conda-linux-64.lock b/.conda-linux-64.lock index fc513629..c7207834 100644 --- a/.conda-linux-64.lock +++ b/.conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 39afbc7e61dc8d1f80c0d072d56e538eefdac01b4eaba0079e090148ca8d862f +# input_hash: 2b519e031a7313cf1177defbb5591df97a746f96bfb527d745b65470b3097ab4 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://repo.anaconda.com/pkgs/main/linux-64/blas-1.0-openblas.conda#9ddfcaef10d79366c90128f5dc444be8 @@ -266,7 +266,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-inline-0.1.6-py312h06a43 https://repo.anaconda.com/pkgs/main/linux-64/nodeenv-1.7.0-py312h06a4308_0.conda#23c0441e6b4e88642027f364e62f8566 https://repo.anaconda.com/pkgs/main/linux-64/numpy-1.26.4-py312h2809609_0.conda#a4282fd8d475c35059c92025ddf0b8a5 https://repo.anaconda.com/pkgs/main/linux-64/openpyxl-3.1.2-py312h5eee18b_0.conda#7b0e99dc4855ed3f946fdf20d312f806 -https://conda.anaconda.org/conda-forge/linux-64/parallel-20240522-ha770c72_0.conda#95444bc23d494d0b06405bea54c7cd1f +https://conda.anaconda.org/conda-forge/linux-64/parallel-20240722-ha770c72_0.conda#acad361a391f190dc2fa629a2814fdcf https://repo.anaconda.com/pkgs/main/noarch/pexpect-4.8.0-pyhd3eb1b0_3.conda#765b2562d6cdd14bb6d44fc170a04331 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py312h287a98d_0.conda#59ea71eed98aee0bebbbdd3b118167c7 https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.3-h8e811e2_0.conda#e4d52462da124ed3792472f95a36fc2a diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0cd67fa7..91d26eff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,12 +1,12 @@ exclude: "data" repos: - repo: https://github.com/psf/black - rev: "23.12.1" + rev: "24.4.2" hooks: - id: black-jupyter - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 + rev: v4.6.0 hooks: - id: check-added-large-files - id: check-case-conflict @@ -27,7 +27,7 @@ repos: - id: rst-inline-touching-normal - repo: https://github.com/pdm-project/pdm - rev: 2.12.4 # a PDM release exposing the hook + rev: 2.17.1 # a PDM release exposing the hook hooks: - id: pdm-lock-check args: [--lockfile, python/pdm.lock] diff --git a/conda-lock.yml b/conda-lock.yml index 78ca24c4..995a4601 100644 --- a/conda-lock.yml +++ b/conda-lock.yml @@ -15,9 +15,9 @@ version: 1 metadata: content_hash: - osx-arm64: 02143e847fa02a655e42c0abfe768bed11438816f9805fa37888a0172b9d74a6 - linux-64: 39afbc7e61dc8d1f80c0d072d56e538eefdac01b4eaba0079e090148ca8d862f - linux-aarch64: 04a25f0b3dfc53876614711d86b8a3b56fdd7d4ed5eb620327975aed1e1fd6c0 + osx-arm64: 5562ebbbde26d06224cb64f7d420208fab18e9445bc7bc30a7cb3f9c5c26a2a7 + linux-64: 2b519e031a7313cf1177defbb5591df97a746f96bfb527d745b65470b3097ab4 + linux-aarch64: 7de86e8d53c5d2e40886c674b7867d8799c24b61cebf2e747ddd68c961de0dc9 channels: - url: r used_env_vars: [] @@ -9953,39 +9953,39 @@ package: category: main optional: false - name: parallel - version: '20240522' + version: '20240722' manager: conda platform: linux-64 dependencies: perl: '' - url: https://conda.anaconda.org/conda-forge/linux-64/parallel-20240522-ha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/parallel-20240722-ha770c72_0.conda hash: - md5: 95444bc23d494d0b06405bea54c7cd1f - sha256: 853a34145a584b216871b7eca3c23933d4ce76ae6d38eeca75a99f234aceba38 + md5: acad361a391f190dc2fa629a2814fdcf + sha256: ad0f93d7a5f2a232babfebc1dc0545a25be1394b09a18f67a80b3471ed4a6347 category: main optional: false - name: parallel - version: '20240522' + version: '20240722' manager: conda platform: linux-aarch64 dependencies: perl: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/parallel-20240522-h8af1aa0_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/parallel-20240722-h8af1aa0_0.conda hash: - md5: 91d3aff938f0d0ecc768fec2b1bfdfc3 - sha256: 59496282c2e76ee467fd3002dd2e8d02482ea357b99ec7e35141a6ddcad3e524 + md5: bb06bd54a3692d852b48b678475afdee + sha256: b34d2dbfb75aa8fa3ef34415645e19d7e0b2dc715f48c363d5a6876fa64b6191 category: main optional: false - name: parallel - version: '20240522' + version: '20240722' manager: conda platform: osx-arm64 dependencies: perl: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/parallel-20240522-hce30654_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/parallel-20240722-hce30654_0.conda hash: - md5: f3f54087f73541d64f2565ddaad0f4bd - sha256: 64726a8ea0dcd5de7e3e5879abf1b066c43d85fd7c9e587ad888da9eeafdc7c0 + md5: c3cda7d28dbae805de91662e10fa6031 + sha256: b0b0aec16eebac1c1d005259086ba7ca5d200bb56856731e5ed907fd874eb0a6 category: main optional: false - name: parso diff --git a/python/clim_recal/utils/core.py b/python/clim_recal/utils/core.py index c2eddc1d..25c1d949 100644 --- a/python/clim_recal/utils/core.py +++ b/python/clim_recal/utils/core.py @@ -1,4 +1,5 @@ """Utility functions.""" + import sys import warnings from collections.abc import KeysView @@ -205,6 +206,10 @@ def multiprocess_execute( else: logger.warning(f"'total_cpus' not checkable, running with 'cpus': {cpus}") params_tuples: list[tuple[Any, str]] = [(item, method_name) for item in iter] + # Had build errors when generating a wheel, + # Followed solution here: + # https://stackoverflow.com/questions/45720153/python-multiprocessing-error-attributeerror-module-main-has-no-attribute + __spec__ = None with Pool(processes=cpus) as pool: results = list( tqdm(pool.starmap(run_callable_attr, params_tuples), total=len(iter)) diff --git a/python/pdm.lock b/python/pdm.lock index b72655dd..a6973901 100644 --- a/python/pdm.lock +++ b/python/pdm.lock @@ -3,9 +3,12 @@ [metadata] groups = ["default", "dev"] -strategy = ["cross_platform", "inherit_metadata"] -lock_version = "4.4.2" -content_hash = "sha256:bd9f6356c4fe7670347a625ffb68759281d11149eff00ef86a0bb48c323c8052" +strategy = ["inherit_metadata"] +lock_version = "4.5.0" +content_hash = "sha256:7c3054f2a787c280df57211415a3aa43486b31fc48359d47e9d9b3e9ac27c10f" + +[[metadata.targets]] +requires_python = "==3.12.*" [[package]] name = "affine" @@ -20,28 +23,33 @@ files = [ [[package]] name = "annotated-types" -version = "0.6.0" +version = "0.7.0" requires_python = ">=3.8" summary = "Reusable constraint types to use with typing.Annotated" groups = ["default", "dev"] +dependencies = [ + "typing-extensions>=4.0.0; python_version < \"3.9\"", +] files = [ - {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, - {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] [[package]] name = "anyio" -version = "4.3.0" +version = "4.4.0" requires_python = ">=3.8" summary = "High level compatibility layer for multiple asynchronous event loop implementations" groups = ["default"] dependencies = [ + "exceptiongroup>=1.0.2; python_version < \"3.11\"", "idna>=2.8", "sniffio>=1.1", + "typing-extensions>=4.1; python_version < \"3.11\"", ] files = [ - {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, - {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, ] [[package]] @@ -74,6 +82,7 @@ summary = "Argon2 for Python" groups = ["default"] dependencies = [ "argon2-cffi-bindings", + "typing-extensions; python_version < \"3.8\"", ] files = [ {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, @@ -135,6 +144,7 @@ summary = "Annotate AST trees with source code positions" groups = ["default"] dependencies = [ "six>=1.12.0", + "typing; python_version < \"3.5\"", ] files = [ {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, @@ -147,6 +157,9 @@ version = "2.0.4" requires_python = ">=3.8" summary = "Simple LRU cache for asyncio" groups = ["default"] +dependencies = [ + "typing-extensions>=4.0.0; python_version < \"3.11\"", +] files = [ {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, @@ -158,6 +171,9 @@ version = "23.2.0" requires_python = ">=3.7" summary = "Classes Without Boilerplate" groups = ["default", "dev"] +dependencies = [ + "importlib-metadata; python_version < \"3.8\"", +] files = [ {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, @@ -169,6 +185,9 @@ version = "2.15.0" requires_python = ">=3.8" summary = "Internationalization utilities" groups = ["default"] +dependencies = [ + "pytz>=2015.7; python_version < \"3.9\"", +] files = [ {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, @@ -180,7 +199,6 @@ version = "0.18.5" requires_python = ">=3.8.0" summary = "Unbearably fast runtime type checking in pure Python." groups = ["dev"] -marker = "python_version >= \"3.10\"" files = [ {file = "beartype-0.18.5-py3-none-any.whl", hash = "sha256:5301a14f2a9a5540fe47ec6d34d758e9cd8331d36c4760fc7a5499ab86310089"}, {file = "beartype-0.18.5.tar.gz", hash = "sha256:264ddc2f1da9ec94ff639141fbe33d22e12a9f75aa863b83b7046ffff1381927"}, @@ -270,13 +288,13 @@ files = [ [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.7.4" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." groups = ["default", "dev"] files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -315,19 +333,22 @@ files = [ [[package]] name = "cftime" -version = "1.6.3" +version = "1.6.4" requires_python = ">=3.8" summary = "Time-handling functionality from netcdf4-python" groups = ["default"] dependencies = [ + "numpy>1.13.3; python_version < \"3.12.0.rc1\"", "numpy>=1.26.0b1; python_version >= \"3.12.0.rc1\"", ] files = [ - {file = "cftime-1.6.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2d113a01ab924445e61d65c26bbd95bc08e4a22878d3b947064bba056c884c4a"}, - {file = "cftime-1.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f11685663a6af97418908060492a07663c16d42519c139ca03c2ffb1377fd25"}, - {file = "cftime-1.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a98abb1d46d118e52b0611ce668a0b714b407be26177ef0581ecf5e95f894725"}, - {file = "cftime-1.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:4d6fbd5f41b322cfa7b0ac3aaadeceb4450100a164b5bccbbb9e7c5048489a88"}, - {file = "cftime-1.6.3.tar.gz", hash = "sha256:d0a6b29f72a13f08e008b9becff247cc75c84acb213332ede18879c5b6aa4dfd"}, + {file = "cftime-1.6.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392"}, + {file = "cftime-1.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8"}, + {file = "cftime-1.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd"}, + {file = "cftime-1.6.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654"}, + {file = "cftime-1.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7"}, + {file = "cftime-1.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667"}, + {file = "cftime-1.6.4.tar.gz", hash = "sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc"}, ] [[package]] @@ -364,6 +385,7 @@ summary = "Composable command line interface toolkit" groups = ["default", "dev"] dependencies = [ "colorama; platform_system == \"Windows\"", + "importlib-metadata; python_version < \"3.8\"", ] files = [ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, @@ -419,8 +441,11 @@ summary = "CliKit is a group of utilities to build beautiful and testable comman groups = ["default"] dependencies = [ "crashtest<0.4.0,>=0.3.0; python_version ~= \"3.6\"", + "enum34<2.0,>=1.1; python_version >= \"2.7\" and python_version < \"2.8\"", "pastel<0.3.0,>=0.2.0", "pylev<2.0,>=1.3", + "typing-extensions<4.0,>=3.6; python_version >= \"3.5\" and python_full_version < \"3.5.4\"", + "typing<4.0,>=3.6; python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.4\" and python_version < \"3.5\"", ] files = [ {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"}, @@ -477,6 +502,7 @@ dependencies = [ "requests>=2.18", "ruamel-yaml", "setuptools", + "tomli; python_version < \"3.11\"", "tomlkit>=0.7.0", "toolz<1.0.0,>=0.12.0", "typing-extensions", @@ -516,23 +542,23 @@ files = [ [[package]] name = "coverage" -version = "7.5.1" +version = "7.6.0" requires_python = ">=3.8" summary = "Code coverage measurement for Python" groups = ["dev"] files = [ - {file = "coverage-7.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206"}, - {file = "coverage-7.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7"}, - {file = "coverage-7.5.1-cp312-cp312-win32.whl", hash = "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19"}, - {file = "coverage-7.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596"}, - {file = "coverage-7.5.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312"}, - {file = "coverage-7.5.1.tar.gz", hash = "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, + {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, + {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, + {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, + {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, ] [[package]] @@ -550,27 +576,28 @@ files = [ [[package]] name = "coverage" -version = "7.5.1" +version = "7.6.0" extras = ["toml"] requires_python = ">=3.8" summary = "Code coverage measurement for Python" groups = ["dev"] dependencies = [ - "coverage==7.5.1", + "coverage==7.6.0", + "tomli; python_full_version <= \"3.11.0a6\"", ] files = [ - {file = "coverage-7.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206"}, - {file = "coverage-7.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7"}, - {file = "coverage-7.5.1-cp312-cp312-win32.whl", hash = "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19"}, - {file = "coverage-7.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596"}, - {file = "coverage-7.5.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312"}, - {file = "coverage-7.5.1.tar.gz", hash = "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, + {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, + {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, + {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, + {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, ] [[package]] @@ -586,7 +613,7 @@ files = [ [[package]] name = "cryptography" -version = "42.0.7" +version = "43.0.0" requires_python = ">=3.7" summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." groups = ["default"] @@ -595,38 +622,33 @@ dependencies = [ "cffi>=1.12; platform_python_implementation != \"PyPy\"", ] files = [ - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, - {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, - {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, - {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, - {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, - {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, - {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, + {file = "cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431"}, + {file = "cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc"}, + {file = "cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778"}, + {file = "cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b"}, + {file = "cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf"}, + {file = "cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1"}, + {file = "cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e"}, ] [[package]] @@ -642,17 +664,17 @@ files = [ [[package]] name = "debugpy" -version = "1.8.1" +version = "1.8.2" requires_python = ">=3.8" summary = "An implementation of the Debug Adapter Protocol for Python" groups = ["default"] files = [ - {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, - {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, - {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, - {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, - {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, - {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, + {file = "debugpy-1.8.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835"}, + {file = "debugpy-1.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3"}, + {file = "debugpy-1.8.2-cp312-cp312-win32.whl", hash = "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e"}, + {file = "debugpy-1.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859"}, + {file = "debugpy-1.8.2-py2.py3-none-any.whl", hash = "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca"}, + {file = "debugpy-1.8.2.zip", hash = "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00"}, ] [[package]] @@ -679,7 +701,7 @@ files = [ [[package]] name = "dep-logic" -version = "0.2.0" +version = "0.4.3" requires_python = ">=3.8" summary = "Python dependency specifications supporting logical operations" groups = ["default"] @@ -687,8 +709,8 @@ dependencies = [ "packaging>=22", ] files = [ - {file = "dep_logic-0.2.0-py3-none-any.whl", hash = "sha256:af439c2acaf7522dd321a71f30e0c4fd59b7553eb99967af07d53320902cde39"}, - {file = "dep_logic-0.2.0.tar.gz", hash = "sha256:cff502b515aff2d413d19d6afc70174fc67da19e821be4a9b68460ccee2514c9"}, + {file = "dep_logic-0.4.3-py3-none-any.whl", hash = "sha256:03f2740fc40e2848f2a4c77baddcc8f5e3773c304da947815306d1e616f3942c"}, + {file = "dep_logic-0.4.3.tar.gz", hash = "sha256:e4768f0a26c8c1c0e39fd520f3e0bd099ca528ec6a8f20359fbc89ffcdf8da45"}, ] [[package]] @@ -765,23 +787,23 @@ files = [ [[package]] name = "fastjsonschema" -version = "2.19.1" +version = "2.20.0" summary = "Fastest Python implementation of JSON schema" groups = ["default"] files = [ - {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, - {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, + {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, + {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, ] [[package]] name = "filelock" -version = "3.14.0" +version = "3.15.4" requires_python = ">=3.8" summary = "A platform independent file lock." groups = ["default", "dev"] files = [ - {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, - {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, ] [[package]] @@ -798,45 +820,23 @@ files = [ {file = "findpython-0.6.1.tar.gz", hash = "sha256:56e52b409a92bcbd495cf981c85acf137f3b3e51cc769b46eba219bb1ab7533c"}, ] -[[package]] -name = "fiona" -version = "1.9.6" -requires_python = ">=3.7" -summary = "Fiona reads and writes spatial data files" -groups = ["default"] -dependencies = [ - "attrs>=19.2.0", - "certifi", - "click-plugins>=1.0", - "click~=8.0", - "cligj>=0.5", - "six", -] -files = [ - {file = "fiona-1.9.6-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:42d8a0e5570948d3821c493b6141866d9a4d7a64edad2be4ecbb89f81904baac"}, - {file = "fiona-1.9.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39819fb8f5ec6d9971cb01b912b4431615a3d3f50c83798565d8ce41917930db"}, - {file = "fiona-1.9.6-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:9b53034efdf93ada9295b081e6a8280af7c75496a20df82d4c2ca46d65b85905"}, - {file = "fiona-1.9.6-cp312-cp312-win_amd64.whl", hash = "sha256:1dcd6eca7524535baf2a39d7981b4a46d33ae28c313934a7c3eae62eecf9dfa5"}, - {file = "fiona-1.9.6.tar.gz", hash = "sha256:791b3494f8b218c06ea56f892bd6ba893dfa23525347761d066fb7738acda3b1"}, -] - [[package]] name = "fonttools" -version = "4.51.0" +version = "4.53.1" requires_python = ">=3.8" summary = "Tools to manipulate font files" groups = ["default"] files = [ - {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba"}, - {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc"}, - {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a"}, - {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2"}, - {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671"}, - {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5"}, - {file = "fonttools-4.51.0-cp312-cp312-win32.whl", hash = "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15"}, - {file = "fonttools-4.51.0-cp312-cp312-win_amd64.whl", hash = "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e"}, - {file = "fonttools-4.51.0-py3-none-any.whl", hash = "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f"}, - {file = "fonttools-4.51.0.tar.gz", hash = "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, + {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, + {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, + {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, + {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, ] [[package]] @@ -845,6 +845,9 @@ version = "1.5.1" requires_python = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" summary = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" groups = ["default"] +dependencies = [ + "cached-property>=1.3.0; python_version < \"3.8\"", +] files = [ {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, @@ -862,21 +865,21 @@ files = [ [[package]] name = "geopandas" -version = "0.14.4" +version = "1.0.1" requires_python = ">=3.9" summary = "Geographic pandas extensions" groups = ["default"] dependencies = [ - "fiona>=1.8.21", "numpy>=1.22", "packaging", "pandas>=1.4.0", + "pyogrio>=0.7.2", "pyproj>=3.3.0", - "shapely>=1.8.0", + "shapely>=2.0.0", ] files = [ - {file = "geopandas-0.14.4-py3-none-any.whl", hash = "sha256:3bb6473cb59d51e1a7fe2dbc24a1a063fb0ebdeddf3ce08ddbf8c7ddc99689aa"}, - {file = "geopandas-0.14.4.tar.gz", hash = "sha256:56765be9d58e2c743078085db3bd07dc6be7719f0dbe1dfdc1d705cb80be7c25"}, + {file = "geopandas-1.0.1-py3-none-any.whl", hash = "sha256:01e147d9420cc374d26f51fc23716ac307f32b49406e4bd8462c07e82ed1d3d6"}, + {file = "geopandas-1.0.1.tar.gz", hash = "sha256:b8bf70a5534588205b7a56646e2082fb1de9a03599651b3d80c99ea4c2ca08ab"}, ] [[package]] @@ -901,6 +904,7 @@ summary = "GitPython is a Python library used to interact with Git repositories" groups = ["default"] dependencies = [ "gitdb<5,>=4.0.1", + "typing-extensions>=3.7.4.3; python_version < \"3.8\"", ] files = [ {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, @@ -909,16 +913,18 @@ files = [ [[package]] name = "griffe" -version = "0.45.0" +version = "0.48.0" requires_python = ">=3.8" summary = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." groups = ["dev"] dependencies = [ + "astunparse>=1.6; python_version < \"3.9\"", + "backports-strenum>=1.3; python_version < \"3.11\"", "colorama>=0.4", ] files = [ - {file = "griffe-0.45.0-py3-none-any.whl", hash = "sha256:90fe5c90e1b0ca7dd6fee78f9009f4e01b37dbc9ab484a9b2c1578915db1e571"}, - {file = "griffe-0.45.0.tar.gz", hash = "sha256:85cb2868d026ea51c89bdd589ad3ccc94abc5bd8d5d948e3d4450778a2a05b4a"}, + {file = "griffe-0.48.0-py3-none-any.whl", hash = "sha256:f944c6ff7bd31cf76f264adcd6ab8f3d00a2f972ae5cc8db2d7b6dcffeff65a2"}, + {file = "griffe-0.48.0.tar.gz", hash = "sha256:f099461c02f016b6be4af386d5aa92b01fb4efe6c1c2c360dda9a5d0a863bb7f"}, ] [[package]] @@ -927,6 +933,9 @@ version = "0.14.0" requires_python = ">=3.7" summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" groups = ["default"] +dependencies = [ + "typing-extensions; python_version < \"3.8\"", +] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -934,7 +943,7 @@ files = [ [[package]] name = "hishel" -version = "0.0.26" +version = "0.0.30" requires_python = ">=3.8" summary = "Persistent cache implementation for httpx and httpcore" groups = ["default"] @@ -943,8 +952,8 @@ dependencies = [ "typing-extensions>=4.8.0", ] files = [ - {file = "hishel-0.0.26-py3-none-any.whl", hash = "sha256:63cd3fee495124e0ed3461b374c43eab3e9deb2f01ba72eafe36d7df5fcf8b46"}, - {file = "hishel-0.0.26.tar.gz", hash = "sha256:f0ae2766214499cb0253a5ec7694f0d6e3835c9a35634356f8926fb7a1cf379e"}, + {file = "hishel-0.0.30-py3-none-any.whl", hash = "sha256:0c73a779a6b554b52dff75e5962057df25764fd798c31b9435ce6398b1b171c8"}, + {file = "hishel-0.0.30.tar.gz", hash = "sha256:656393ee77e9c39a0d6c527c74810e15d96e598dcb9b191f20a788608ceaca99"}, ] [[package]] @@ -1013,13 +1022,13 @@ files = [ [[package]] name = "identify" -version = "2.5.36" +version = "2.6.0" requires_python = ">=3.8" summary = "File identification library for Python" groups = ["dev"] files = [ - {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, - {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, + {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, + {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, ] [[package]] @@ -1035,16 +1044,17 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "8.0.0" requires_python = ">=3.8" summary = "Read metadata from Python packages" groups = ["dev"] dependencies = [ + "typing-extensions>=3.6.4; python_version < \"3.8\"", "zipp>=0.5", ] files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, + {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, ] [[package]] @@ -1053,6 +1063,9 @@ version = "6.4.0" requires_python = ">=3.8" summary = "Read resources from Python packages" groups = ["dev"] +dependencies = [ + "zipp>=3.1.0; python_version < \"3.10\"", +] files = [ {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, @@ -1082,7 +1095,7 @@ files = [ [[package]] name = "ipykernel" -version = "6.29.4" +version = "6.29.5" requires_python = ">=3.8" summary = "IPython Kernel for Jupyter" groups = ["default"] @@ -1102,19 +1115,20 @@ dependencies = [ "traitlets>=5.4.0", ] files = [ - {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, - {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, ] [[package]] name = "ipython" -version = "8.24.0" +version = "8.26.0" requires_python = ">=3.10" summary = "IPython: Productive Interactive Computing" groups = ["default"] dependencies = [ "colorama; sys_platform == \"win32\"", "decorator", + "exceptiongroup; python_version < \"3.11\"", "jedi>=0.16", "matplotlib-inline", "pexpect>4.3; sys_platform != \"win32\" and sys_platform != \"emscripten\"", @@ -1122,10 +1136,11 @@ dependencies = [ "pygments>=2.4.0", "stack-data", "traitlets>=5.13.0", + "typing-extensions>=4.6; python_version < \"3.12\"", ] files = [ - {file = "ipython-8.24.0-py3-none-any.whl", hash = "sha256:d7bf2f6c4314984e3e02393213bab8703cf163ede39672ce5918c51fe253a2a3"}, - {file = "ipython-8.24.0.tar.gz", hash = "sha256:010db3f8a728a578bb641fdd06c063b9fb8e96a9464c63aec6310fbcb5e80501"}, + {file = "ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff"}, + {file = "ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c"}, ] [[package]] @@ -1162,6 +1177,9 @@ version = "5.3.0" requires_python = ">=3.8" summary = "Useful decorators and context managers" groups = ["default"] +dependencies = [ + "backports-tarfile; python_version < \"3.12\"", +] files = [ {file = "jaraco.context-5.3.0-py3-none-any.whl", hash = "sha256:3e16388f7da43d384a1a7cd3452e72e14732ac9fe459678773a3608a812bf266"}, {file = "jaraco.context-5.3.0.tar.gz", hash = "sha256:c2f67165ce1f9be20f32f650f25d8edfc1646a8aeee48ae06fb35f90763576d2"}, @@ -1234,30 +1252,32 @@ files = [ [[package]] name = "jsonpointer" -version = "2.4" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +version = "3.0.0" +requires_python = ">=3.7" summary = "Identify specific nodes in a JSON document (RFC 6901) " groups = ["default"] files = [ - {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, ] [[package]] name = "jsonschema" -version = "4.22.0" +version = "4.23.0" requires_python = ">=3.8" summary = "An implementation of JSON Schema validation for Python" groups = ["default", "dev"] dependencies = [ "attrs>=22.2.0", + "importlib-resources>=1.4.0; python_version < \"3.9\"", "jsonschema-specifications>=2023.03.6", + "pkgutil-resolve-name>=1.3.10; python_version < \"3.9\"", "referencing>=0.28.4", "rpds-py>=0.7.1", ] files = [ - {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, - {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, ] [[package]] @@ -1267,6 +1287,7 @@ requires_python = ">=3.8" summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" groups = ["default", "dev"] dependencies = [ + "importlib-resources>=1.4.0; python_version < \"3.9\"", "referencing>=0.31.0", ] files = [ @@ -1276,7 +1297,7 @@ files = [ [[package]] name = "jsonschema" -version = "4.22.0" +version = "4.23.0" extras = ["format-nongpl"] requires_python = ">=3.8" summary = "An implementation of JSON Schema validation for Python" @@ -1286,24 +1307,25 @@ dependencies = [ "idna", "isoduration", "jsonpointer>1.13", - "jsonschema==4.22.0", + "jsonschema==4.23.0", "rfc3339-validator", "rfc3986-validator>0.1.0", "uri-template", - "webcolors>=1.11", + "webcolors>=24.6.0", ] files = [ - {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, - {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, ] [[package]] name = "jupyter-client" -version = "8.6.1" +version = "8.6.2" requires_python = ">=3.8" summary = "Jupyter protocol implementation and client libraries" groups = ["default"] dependencies = [ + "importlib-metadata>=4.8.3; python_version < \"3.10\"", "jupyter-core!=5.0.*,>=4.12", "python-dateutil>=2.8.2", "pyzmq>=23.0", @@ -1311,8 +1333,8 @@ dependencies = [ "traitlets>=5.3", ] files = [ - {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, - {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, + {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, + {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, ] [[package]] @@ -1358,6 +1380,7 @@ requires_python = ">=3.8" summary = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" groups = ["default"] dependencies = [ + "importlib-metadata>=4.8.3; python_version < \"3.10\"", "jupyter-server>=1.1.2", ] files = [ @@ -1367,7 +1390,7 @@ files = [ [[package]] name = "jupyter-server" -version = "2.14.0" +version = "2.14.2" requires_python = ">=3.8" summary = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." groups = ["default"] @@ -1393,8 +1416,8 @@ dependencies = [ "websocket-client>=1.7", ] files = [ - {file = "jupyter_server-2.14.0-py3-none-any.whl", hash = "sha256:fb6be52c713e80e004fac34b35a0990d6d36ba06fd0a2b2ed82b899143a64210"}, - {file = "jupyter_server-2.14.0.tar.gz", hash = "sha256:659154cea512083434fd7c93b7fe0897af7a2fd0b9dd4749282b42eaac4ae677"}, + {file = "jupyter_server-2.14.2-py3-none-any.whl", hash = "sha256:47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd"}, + {file = "jupyter_server-2.14.2.tar.gz", hash = "sha256:66095021aa9638ced276c248b1d81862e4c50f292d575920bbe960de1c56b12b"}, ] [[package]] @@ -1414,13 +1437,15 @@ files = [ [[package]] name = "jupyterlab" -version = "4.2.0" +version = "4.2.4" requires_python = ">=3.8" summary = "JupyterLab computational environment" groups = ["default"] dependencies = [ "async-lru>=1.0.0", "httpx>=0.25.0", + "importlib-metadata>=4.8.3; python_version < \"3.10\"", + "importlib-resources>=1.4; python_version < \"3.9\"", "ipykernel>=6.5.0", "jinja2>=3.0.3", "jupyter-core", @@ -1429,12 +1454,14 @@ dependencies = [ "jupyterlab-server<3,>=2.27.1", "notebook-shim>=0.2", "packaging", + "setuptools>=40.1.0", + "tomli>=1.2.2; python_version < \"3.11\"", "tornado>=6.2.0", "traitlets", ] files = [ - {file = "jupyterlab-4.2.0-py3-none-any.whl", hash = "sha256:0dfe9278e25a145362289c555d9beb505697d269c10e99909766af7c440ad3cc"}, - {file = "jupyterlab-4.2.0.tar.gz", hash = "sha256:356e9205a6a2ab689c47c8fe4919dba6c076e376d03f26baadc05748c2435dd5"}, + {file = "jupyterlab-4.2.4-py3-none-any.whl", hash = "sha256:807a7ec73637744f879e112060d4b9d9ebe028033b7a429b2d1f4fc523d00245"}, + {file = "jupyterlab-4.2.4.tar.gz", hash = "sha256:343a979fb9582fd08c8511823e320703281cd072a0049bcdafdc7afeda7f2537"}, ] [[package]] @@ -1450,12 +1477,13 @@ files = [ [[package]] name = "jupyterlab-server" -version = "2.27.1" +version = "2.27.3" requires_python = ">=3.8" summary = "A set of server components for JupyterLab and JupyterLab like applications." groups = ["default"] dependencies = [ "babel>=2.10", + "importlib-metadata>=4.8.3; python_version < \"3.10\"", "jinja2>=3.0.3", "json5>=0.9.0", "jsonschema>=4.18.0", @@ -1464,8 +1492,8 @@ dependencies = [ "requests>=2.31", ] files = [ - {file = "jupyterlab_server-2.27.1-py3-none-any.whl", hash = "sha256:f5e26156e5258b24d532c84e7c74cc212e203bff93eb856f81c24c16daeecc75"}, - {file = "jupyterlab_server-2.27.1.tar.gz", hash = "sha256:097b5ac709b676c7284ac9c5e373f11930a561f52cd5a86e4fc7e5a9c8a8631d"}, + {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, + {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, ] [[package]] @@ -1476,6 +1504,8 @@ summary = "Store and access your passwords safely." groups = ["default"] dependencies = [ "SecretStorage>=3.2; sys_platform == \"linux\"", + "importlib-metadata>=4.11.4; python_version < \"3.12\"", + "importlib-resources; python_version < \"3.9\"", "jaraco-classes", "jaraco-context", "jaraco-functools", @@ -1493,6 +1523,9 @@ version = "1.4.5" requires_python = ">=3.7" summary = "A fast implementation of the Cassowary constraint solver" groups = ["default"] +dependencies = [ + "typing-extensions; python_version < \"3.8\"", +] files = [ {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, @@ -1563,7 +1596,7 @@ files = [ [[package]] name = "matplotlib" -version = "3.9.0" +version = "3.9.1" requires_python = ">=3.9" summary = "Python plotting package" groups = ["default"] @@ -1571,6 +1604,7 @@ dependencies = [ "contourpy>=1.0.1", "cycler>=0.10", "fonttools>=4.22.0", + "importlib-resources>=3.2.0; python_version < \"3.10\"", "kiwisolver>=1.3.1", "numpy>=1.23", "packaging>=20.0", @@ -1579,17 +1613,17 @@ dependencies = [ "python-dateutil>=2.7", ] files = [ - {file = "matplotlib-3.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c79f3a585f1368da6049318bdf1f85568d8d04b2e89fc24b7e02cc9b62017382"}, - {file = "matplotlib-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bdd1ecbe268eb3e7653e04f451635f0fb0f77f07fd070242b44c076c9106da84"}, - {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d38e85a1a6d732f645f1403ce5e6727fd9418cd4574521d5803d3d94911038e5"}, - {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a490715b3b9984fa609116481b22178348c1a220a4499cda79132000a79b4db"}, - {file = "matplotlib-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8146ce83cbc5dc71c223a74a1996d446cd35cfb6a04b683e1446b7e6c73603b7"}, - {file = "matplotlib-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:d91a4ffc587bacf5c4ce4ecfe4bcd23a4b675e76315f2866e588686cc97fccdf"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bd4f2831168afac55b881db82a7730992aa41c4f007f1913465fb182d6fb20c0"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:290d304e59be2b33ef5c2d768d0237f5bd132986bdcc66f80bc9bcc300066a03"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff2e239c26be4f24bfa45860c20ffccd118d270c5b5d081fa4ea409b5469fcd"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:af4001b7cae70f7eaacfb063db605280058246de590fa7874f00f62259f2df7e"}, - {file = "matplotlib-3.9.0.tar.gz", hash = "sha256:e6d29ea6c19e34b30fb7d88b7081f869a03014f66fe06d62cc77d5a6ea88ed7a"}, + {file = "matplotlib-3.9.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:565d572efea2b94f264dd86ef27919515aa6d629252a169b42ce5f570db7f37b"}, + {file = "matplotlib-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d397fd8ccc64af2ec0af1f0efc3bacd745ebfb9d507f3f552e8adb689ed730a"}, + {file = "matplotlib-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26040c8f5121cd1ad712abffcd4b5222a8aec3a0fe40bc8542c94331deb8780d"}, + {file = "matplotlib-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12cb1837cffaac087ad6b44399d5e22b78c729de3cdae4629e252067b705e2b"}, + {file = "matplotlib-3.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0e835c6988edc3d2d08794f73c323cc62483e13df0194719ecb0723b564e0b5c"}, + {file = "matplotlib-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:44a21d922f78ce40435cb35b43dd7d573cf2a30138d5c4b709d19f00e3907fd7"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3fda72d4d472e2ccd1be0e9ccb6bf0d2eaf635e7f8f51d737ed7e465ac020cb3"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:84b3ba8429935a444f1fdc80ed930babbe06725bcf09fbeb5c8757a2cd74af04"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b918770bf3e07845408716e5bbda17eadfc3fcbd9307dc67f37d6cf834bb3d98"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f1f2e5d29e9435c97ad4c36fb6668e89aee13d48c75893e25cef064675038ac9"}, + {file = "matplotlib-3.9.1.tar.gz", hash = "sha256:de06b19b8db95dd33d0dc17c926c7c9ebed9f572074b6fac4f65068a6814d010"}, ] [[package]] @@ -1630,13 +1664,13 @@ files = [ [[package]] name = "more-itertools" -version = "10.2.0" +version = "10.3.0" requires_python = ">=3.8" summary = "More routines for operating on iterables, beyond itertools" groups = ["default"] files = [ - {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"}, - {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"}, + {file = "more-itertools-10.3.0.tar.gz", hash = "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463"}, + {file = "more_itertools-10.3.0-py3-none-any.whl", hash = "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320"}, ] [[package]] @@ -1687,6 +1721,7 @@ dependencies = [ "beautifulsoup4", "bleach!=5.0.0", "defusedxml", + "importlib-metadata>=3.6; python_version < \"3.10\"", "jinja2>=3.0", "jupyter-core>=4.7", "jupyterlab-pygments", @@ -1735,8 +1770,8 @@ files = [ [[package]] name = "netcdf4" -version = "1.6.5" -requires_python = ">=3.7" +version = "1.7.1.post1" +requires_python = ">=3.8" summary = "Provides an object-oriented python interface to the netCDF version 4 library" groups = ["default"] dependencies = [ @@ -1745,26 +1780,23 @@ dependencies = [ "numpy", ] files = [ - {file = "netCDF4-1.6.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:19e16c63cdd7c0dbffe284a4a65f226ba1026f476f35cbedd099b4792b395f69"}, - {file = "netCDF4-1.6.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b994afce2ca4073f6b757385a6c0ffec25ecaae2b8821535b303c7cdbf6de42b"}, - {file = "netCDF4-1.6.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0187646e3348e7a8cd654617dda65517df138042c94c2fcc6682ff7c8c6654dc"}, - {file = "netCDF4-1.6.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1ab5dabac27d25fcc82c52dc29a74a6585e865208cce35f4e285df83d3df0b2"}, - {file = "netCDF4-1.6.5-cp312-cp312-win_amd64.whl", hash = "sha256:081e9043ac6160989f60570928eabe803c88ce7df1d3f79f2345dc48f68ef752"}, - {file = "netCDF4-1.6.5.tar.gz", hash = "sha256:824881d0aacfde5bd982d6adedd8574259c85553781e7b83e0ce82b890bfa0ef"}, + {file = "netCDF4-1.7.1.post1-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:75bba24ef0354fb6913bc3acdcb3790534e86bf329bbeaaf54122b18e5fd05ea"}, + {file = "netCDF4-1.7.1.post1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:ce7f89b98dbb3acd9582db30e6478ce7a7003b2cb70dc20d85fe9506e65ab001"}, + {file = "netCDF4-1.7.1.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac4e30a0d5a8e227d6a890502cfa201388acf606c0c73a5a7594232f3a74e67e"}, + {file = "netCDF4-1.7.1.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:988c45f9122337a12267fb158953c0609e3ea50a557335a3105f104416a4821a"}, + {file = "netCDF4-1.7.1.post1-cp312-cp312-win_amd64.whl", hash = "sha256:8fb3ed3541fa1b5b46e9d92d7e803734a1a3f37d8f5adf5fdf7957c7750cb20e"}, + {file = "netcdf4-1.7.1.post1.tar.gz", hash = "sha256:797f0b25d87827fc6821e415d9e15a2068604b18c3be62563e72682bcba76548"}, ] [[package]] name = "nodeenv" -version = "1.8.0" -requires_python = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +version = "1.9.1" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Node.js virtual environment builder" groups = ["dev"] -dependencies = [ - "setuptools", -] files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] [[package]] @@ -1796,24 +1828,21 @@ files = [ {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] name = "openpyxl" -version = "3.1.2" -requires_python = ">=3.6" +version = "3.1.5" +requires_python = ">=3.8" summary = "A Python library to read/write Excel 2010 xlsx/xlsm files" groups = ["default"] dependencies = [ "et-xmlfile", ] files = [ - {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, - {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, + {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, + {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, ] [[package]] @@ -1822,6 +1851,9 @@ version = "7.7.0" requires_python = ">=3.6" summary = "A decorator to automatically detect mismatch when overriding a method." groups = ["default"] +dependencies = [ + "typing; python_version < \"3.5\"", +] files = [ {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, @@ -1829,13 +1861,13 @@ files = [ [[package]] name = "packaging" -version = "24.0" -requires_python = ">=3.7" +version = "24.1" +requires_python = ">=3.8" summary = "Core utilities for Python packages" groups = ["default", "dev"] files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -1845,6 +1877,8 @@ requires_python = ">=3.9" summary = "Powerful data structures for data analysis, time series, and statistics" groups = ["default"] dependencies = [ + "numpy>=1.22.4; python_version < \"3.11\"", + "numpy>=1.23.2; python_version == \"3.11\"", "numpy>=1.26.0; python_version >= \"3.12\"", "python-dateutil>=2.8.2", "pytz>=2020.1", @@ -1905,53 +1939,40 @@ files = [ {file = "pbs_installer-2024.4.24.tar.gz", hash = "sha256:19224733068b0ffa39b53afbb61544bee8ecb9503e7222ba034f07b9913e2c1c"}, ] -[[package]] -name = "pbs-installer" -version = "2024.4.24" -extras = ["install"] -requires_python = ">=3.8" -summary = "Installer for Python Build Standalone" -groups = ["default"] -dependencies = [ - "pbs-installer==2024.4.24", - "zstandard>=0.21.0", -] -files = [ - {file = "pbs_installer-2024.4.24-py3-none-any.whl", hash = "sha256:f8291f0231003d279d0de8fde88fa87b7c6d7fabc2671235113cf67513ff74f5"}, - {file = "pbs_installer-2024.4.24.tar.gz", hash = "sha256:19224733068b0ffa39b53afbb61544bee8ecb9503e7222ba034f07b9913e2c1c"}, -] - [[package]] name = "pdm" -version = "2.15.2" +version = "2.17.1" requires_python = ">=3.8" summary = "A modern Python package and dependency manager supporting the latest PEP standards" groups = ["default"] dependencies = [ "blinker", - "dep-logic<1.0,>=0.2.0", + "dep-logic>=0.4.3", "filelock>=3.13", "findpython<1.0.0a0,>=0.6.0", "hishel<0.1.0,>=0.0.24", "httpx[socks]<1,>0.20", + "importlib-metadata>=3.6; python_version < \"3.10\"", + "importlib-resources>=5; python_version < \"3.9\"", "installer<0.8,>=0.7", "msgpack>=1.0", "packaging!=22.0,>=20.9", - "pbs-installer[install]", + "pbs-installer>=2024.4.18", "platformdirs", "pyproject-hooks", "python-dotenv>=0.15", "resolvelib>=1.0.1", "rich>=12.3.0", "shellingham>=1.3.2", + "tomli>=1.1.0; python_version < \"3.11\"", "tomlkit<1,>=0.11.1", "truststore; python_version >= \"3.10\"", - "unearth>=0.15.0", + "unearth>=0.16.0", "virtualenv>=20", ] files = [ - {file = "pdm-2.15.2-py3-none-any.whl", hash = "sha256:04cf106fbf2cf4564eda70b40ffb33acf4637e1cee55d6cec8f8c21fe1f70b65"}, - {file = "pdm-2.15.2.tar.gz", hash = "sha256:c08e87078c29c00e7ad9681dc6a23419dc5617dcbe6cc205024ef4b4e7e28475"}, + {file = "pdm-2.17.1-py3-none-any.whl", hash = "sha256:2ef7bb1424217f267b81e40f9c5326af27a519e9535e3272aa3b454ad5ab096c"}, + {file = "pdm-2.17.1.tar.gz", hash = "sha256:9e1a28ecca83f3627aa700b1e3d52cd3f82f10fc908ac6499119baf7a3d4ea6c"}, ] [[package]] @@ -1970,48 +1991,48 @@ files = [ [[package]] name = "pillow" -version = "10.3.0" +version = "10.4.0" requires_python = ">=3.8" summary = "Python Imaging Library (Fork)" groups = ["default"] files = [ - {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, - {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, - {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, - {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, - {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] [[package]] name = "pkginfo" -version = "1.10.0" -requires_python = ">=3.6" +version = "1.11.1" +requires_python = ">=3.8" summary = "Query metadata from sdists / bdists / installed packages." groups = ["default"] files = [ - {file = "pkginfo-1.10.0-py3-none-any.whl", hash = "sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097"}, - {file = "pkginfo-1.10.0.tar.gz", hash = "sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297"}, + {file = "pkginfo-1.11.1-py3-none-any.whl", hash = "sha256:bfa76a714fdfc18a045fcd684dbfc3816b603d9d075febef17cb6582bea29573"}, + {file = "pkginfo-1.11.1.tar.gz", hash = "sha256:2e0dca1cf4c8e39644eed32408ea9966ee15e0d324c62ba899a393b3c6b467aa"}, ] [[package]] @@ -2038,18 +2059,18 @@ files = [ [[package]] name = "plum-dispatch" -version = "2.3.6" +version = "2.5.2" requires_python = ">=3.8" summary = "Multiple dispatch in Python" groups = ["dev"] -marker = "python_version >= \"3.10\"" dependencies = [ "beartype>=0.16.2", "rich>=10.0", + "typing-extensions>=4.9.0", ] files = [ - {file = "plum_dispatch-2.3.6-py3-none-any.whl", hash = "sha256:ad0e6f1aa40f6b0bd286e0c24bc5928545095e61dc7b07d19455a7f3b064c907"}, - {file = "plum_dispatch-2.3.6.tar.gz", hash = "sha256:664e79003076aac754127fe9d667f43cf22e448a179d46ddfe298f18c012551d"}, + {file = "plum_dispatch-2.5.2-py3-none-any.whl", hash = "sha256:49f1e1487028849451454c59e330f800aac6ec520a432a0ed3ea6e04b74e2e31"}, + {file = "plum_dispatch-2.5.2.tar.gz", hash = "sha256:1abfccc5a9c751f20dcdb1020c645968dfbc1c33ad3a9a47780834ec332cfe9e"}, ] [[package]] @@ -2083,7 +2104,7 @@ files = [ [[package]] name = "prompt-toolkit" -version = "3.0.43" +version = "3.0.47" requires_python = ">=3.7.0" summary = "Library for building powerful interactive command lines in Python" groups = ["default"] @@ -2091,24 +2112,25 @@ dependencies = [ "wcwidth", ] files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, + {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, + {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, ] [[package]] name = "psutil" -version = "5.9.8" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +version = "6.0.0" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" summary = "Cross-platform lib for process and system monitoring in Python." groups = ["default"] files = [ - {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, - {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, - {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, - {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, - {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, ] [[package]] @@ -2152,6 +2174,7 @@ groups = ["default", "dev"] dependencies = [ "annotated-types>=0.4.0", "pydantic-core==2.20.1", + "typing-extensions>=4.12.2; python_version >= \"3.13\"", "typing-extensions>=4.6.1; python_version < \"3.13\"", ] files = [ @@ -2221,6 +2244,26 @@ files = [ {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, ] +[[package]] +name = "pyogrio" +version = "0.9.0" +requires_python = ">=3.8" +summary = "Vectorized spatial vector file format I/O using GDAL/OGR" +groups = ["default"] +dependencies = [ + "certifi", + "numpy", + "packaging", +] +files = [ + {file = "pyogrio-0.9.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2e98913fa183f7597c609e774820a149e9329fd2a0f8d33978252fbd00ae87e6"}, + {file = "pyogrio-0.9.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:f8bf193269ea9d347ac3ddada960a59f1ab2e4a5c009be95dc70e6505346b2fc"}, + {file = "pyogrio-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f964002d445521ad5b8e732a6b5ef0e2d2be7fe566768e5075c1d71398da64a"}, + {file = "pyogrio-0.9.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:083351b258b3e08b6c6085dac560bd321b68de5cb4a66229095da68d5f3d696b"}, + {file = "pyogrio-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:796e4f6a4e769b2eb6fea9a10546ea4bdee16182d1e29802b4d6349363c3c1d7"}, + {file = "pyogrio-0.9.0.tar.gz", hash = "sha256:6a6fa2e8cf95b3d4a7c0fac48bce6e5037579e28d3eb33b53349d6e11f15e5a8"}, +] + [[package]] name = "pyparsing" version = "3.1.2" @@ -2266,19 +2309,21 @@ files = [ [[package]] name = "pytest" -version = "8.2.0" +version = "8.3.1" requires_python = ">=3.8" summary = "pytest: simple powerful testing with Python" groups = ["dev"] dependencies = [ "colorama; sys_platform == \"win32\"", + "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", "iniconfig", "packaging", - "pluggy<2.0,>=1.5", + "pluggy<2,>=1.5", + "tomli>=1; python_version < \"3.11\"", ] files = [ - {file = "pytest-8.2.0-py3-none-any.whl", hash = "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233"}, - {file = "pytest-8.2.0.tar.gz", hash = "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f"}, + {file = "pytest-8.3.1-py3-none-any.whl", hash = "sha256:e9600ccf4f563976e2c99fa02c7624ab938296551f280835ee6516df8bc4ae8c"}, + {file = "pytest-8.3.1.tar.gz", hash = "sha256:7e8e5c5abd6e93cb1cc151f23e57adc31fcf8cfd2a3ff2da63e23f732de35db6"}, ] [[package]] @@ -2482,6 +2527,7 @@ dependencies = [ "griffe>=0.33", "importlib-metadata>=5.1.0", "importlib-resources>=5.10.2", + "plum-dispatch<2.0.0; python_version < \"3.10\"", "plum-dispatch>2.0.0; python_version >= \"3.10\"", "pydantic", "pyyaml", @@ -2509,6 +2555,7 @@ dependencies = [ "click-plugins", "click>=4.0", "cligj>=0.5", + "importlib-metadata; python_version < \"3.10\"", "numpy", "setuptools", "snuggs>=1.4.1", @@ -2538,8 +2585,8 @@ files = [ [[package]] name = "requests" -version = "2.31.0" -requires_python = ">=3.7" +version = "2.32.3" +requires_python = ">=3.8" summary = "Python HTTP for Humans." groups = ["default", "dev"] dependencies = [ @@ -2549,8 +2596,8 @@ dependencies = [ "urllib3<3,>=1.21.1", ] files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [[package]] @@ -2597,6 +2644,7 @@ groups = ["default", "dev"] dependencies = [ "markdown-it-py>=2.2.0", "pygments<3.0.0,>=2.13.0", + "typing-extensions<5.0,>=4.0.0; python_version < \"3.9\"", ] files = [ {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, @@ -2605,7 +2653,7 @@ files = [ [[package]] name = "rioxarray" -version = "0.15.5" +version = "0.17.0" requires_python = ">=3.10" summary = "geospatial xarray extension powered by rasterio" groups = ["default"] @@ -2617,64 +2665,64 @@ dependencies = [ "xarray>=2022.3.0", ] files = [ - {file = "rioxarray-0.15.5-py3-none-any.whl", hash = "sha256:849979c3542cefb5ac452af474a0b50ff08b7435c6db1ad615ddb65b1da4bbf3"}, - {file = "rioxarray-0.15.5.tar.gz", hash = "sha256:433b169cd10346ed5fe0123e61fafca4dcaf5ce1b6e2f6cc1a9c0e0bf7d7c1d4"}, + {file = "rioxarray-0.17.0-py3-none-any.whl", hash = "sha256:cf31a0674b9e6abd0cc2f0b4d847869eb23065835827d0018d17bde8047d448c"}, + {file = "rioxarray-0.17.0.tar.gz", hash = "sha256:46c29938827fff268d497f7ae277077066fcfbac4e53132ed3d4e2b96455be62"}, ] [[package]] name = "rpds-py" -version = "0.18.1" +version = "0.19.0" requires_python = ">=3.8" summary = "Python bindings to Rust's persistent data structures (rpds)" groups = ["default", "dev"] files = [ - {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, - {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, - {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, - {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, + {file = "rpds_py-0.19.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5095a7c838a8647c32aa37c3a460d2c48debff7fc26e1136aee60100a8cd8f68"}, + {file = "rpds_py-0.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f2f78ef14077e08856e788fa482107aa602636c16c25bdf59c22ea525a785e9"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7cc6cb44f8636fbf4a934ca72f3e786ba3c9f9ba4f4d74611e7da80684e48d2"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf902878b4af334a09de7a45badbff0389e7cf8dc2e4dcf5f07125d0b7c2656d"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:688aa6b8aa724db1596514751ffb767766e02e5c4a87486ab36b8e1ebc1aedac"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57dbc9167d48e355e2569346b5aa4077f29bf86389c924df25c0a8b9124461fb"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4cf5a9497874822341c2ebe0d5850fed392034caadc0bad134ab6822c0925b"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8a790d235b9d39c70a466200d506bb33a98e2ee374a9b4eec7a8ac64c2c261fa"}, + {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1d16089dfa58719c98a1c06f2daceba6d8e3fb9b5d7931af4a990a3c486241cb"}, + {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bc9128e74fe94650367fe23f37074f121b9f796cabbd2f928f13e9661837296d"}, + {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c8f77e661ffd96ff104bebf7d0f3255b02aa5d5b28326f5408d6284c4a8b3248"}, + {file = "rpds_py-0.19.0-cp312-none-win32.whl", hash = "sha256:5f83689a38e76969327e9b682be5521d87a0c9e5a2e187d2bc6be4765f0d4600"}, + {file = "rpds_py-0.19.0-cp312-none-win_amd64.whl", hash = "sha256:06925c50f86da0596b9c3c64c3837b2481337b83ef3519e5db2701df695453a4"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:75969cf900d7be665ccb1622a9aba225cf386bbc9c3bcfeeab9f62b5048f4a07"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8445f23f13339da640d1be8e44e5baf4af97e396882ebbf1692aecd67f67c479"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5a7c1062ef8aea3eda149f08120f10795835fc1c8bc6ad948fb9652a113ca55"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:462b0c18fbb48fdbf980914a02ee38c423a25fcc4cf40f66bacc95a2d2d73bc8"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3208f9aea18991ac7f2b39721e947bbd752a1abbe79ad90d9b6a84a74d44409b"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3444fe52b82f122d8a99bf66777aed6b858d392b12f4c317da19f8234db4533"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88cb4bac7185a9f0168d38c01d7a00addece9822a52870eee26b8d5b61409213"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6b130bd4163c93798a6b9bb96be64a7c43e1cec81126ffa7ffaa106e1fc5cef5"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a707b158b4410aefb6b054715545bbb21aaa5d5d0080217290131c49c2124a6e"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dc9ac4659456bde7c567107556ab065801622396b435a3ff213daef27b495388"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:81ea573aa46d3b6b3d890cd3c0ad82105985e6058a4baed03cf92518081eec8c"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f148c3f47f7f29a79c38cc5d020edcb5ca780020fab94dbc21f9af95c463581"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0906357f90784a66e89ae3eadc2654f36c580a7d65cf63e6a616e4aec3a81be"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f629ecc2db6a4736b5ba95a8347b0089240d69ad14ac364f557d52ad68cf94b0"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6feacd1d178c30e5bc37184526e56740342fd2aa6371a28367bad7908d454fc"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae8b6068ee374fdfab63689be0963333aa83b0815ead5d8648389a8ded593378"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d57546bad81e0da13263e4c9ce30e96dcbe720dbff5ada08d2600a3502e526"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b6683a37338818646af718c9ca2a07f89787551057fae57c4ec0446dc6224b"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e8481b946792415adc07410420d6fc65a352b45d347b78fec45d8f8f0d7496f0"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bec35eb20792ea64c3c57891bc3ca0bedb2884fbac2c8249d9b731447ecde4fa"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:aa5476c3e3a402c37779e95f7b4048db2cb5b0ed0b9d006983965e93f40fe05a"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:19d02c45f2507b489fd4df7b827940f1420480b3e2e471e952af4d44a1ea8e34"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a3e2fd14c5d49ee1da322672375963f19f32b3d5953f0615b175ff7b9d38daed"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:93a91c2640645303e874eada51f4f33351b84b351a689d470f8108d0e0694210"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5b9fc03bf76a94065299d4a2ecd8dfbae4ae8e2e8098bbfa6ab6413ca267709"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a4b07cdf3f84310c08c1de2c12ddadbb7a77568bcb16e95489f9c81074322ed"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba0ed0dc6763d8bd6e5de5cf0d746d28e706a10b615ea382ac0ab17bb7388633"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:474bc83233abdcf2124ed3f66230a1c8435896046caa4b0b5ab6013c640803cc"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329c719d31362355a96b435f4653e3b4b061fcc9eba9f91dd40804ca637d914e"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef9101f3f7b59043a34f1dccbb385ca760467590951952d6701df0da9893ca0c"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:0121803b0f424ee2109d6e1f27db45b166ebaa4b32ff47d6aa225642636cd834"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8344127403dea42f5970adccf6c5957a71a47f522171fafaf4c6ddb41b61703a"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:443cec402ddd650bb2b885113e1dcedb22b1175c6be223b14246a714b61cd521"}, + {file = "rpds_py-0.19.0.tar.gz", hash = "sha256:4fdc9afadbeb393b4bbbad75481e0ea78e4469f2e1d713a90811700830b553a9"}, ] [[package]] @@ -2697,7 +2745,7 @@ version = "0.2.8" requires_python = ">=3.6" summary = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" groups = ["default"] -marker = "platform_python_implementation == \"CPython\" and python_version < \"3.13\"" +marker = "platform_python_implementation == \"CPython\"" files = [ {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, @@ -2712,21 +2760,23 @@ files = [ [[package]] name = "scipy" -version = "1.13.0" -requires_python = ">=3.9" +version = "1.14.0" +requires_python = ">=3.10" summary = "Fundamental algorithms for scientific computing in Python" groups = ["default"] dependencies = [ - "numpy<2.3,>=1.22.4", + "numpy<2.3,>=1.23.5", ] files = [ - {file = "scipy-1.13.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0de696f589681c2802f9090fff730c218f7c51ff49bf252b6a97ec4a5d19e8b"}, - {file = "scipy-1.13.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:b2a3ff461ec4756b7e8e42e1c681077349a038f0686132d623fa404c0bee2551"}, - {file = "scipy-1.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf9fe63e7a4bf01d3645b13ff2aa6dea023d38993f42aaac81a18b1bda7a82a"}, - {file = "scipy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e7626dfd91cdea5714f343ce1176b6c4745155d234f1033584154f60ef1ff42"}, - {file = "scipy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:109d391d720fcebf2fbe008621952b08e52907cf4c8c7efc7376822151820820"}, - {file = "scipy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:8930ae3ea371d6b91c203b1032b9600d69c568e537b7988a3073dfe4d4774f21"}, - {file = "scipy-1.13.0.tar.gz", hash = "sha256:58569af537ea29d3f78e5abd18398459f195546bb3be23d16677fb26616cc11e"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f"}, + {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209"}, + {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14"}, + {file = "scipy-1.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159"}, + {file = "scipy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20"}, + {file = "scipy-1.14.0.tar.gz", hash = "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b"}, ] [[package]] @@ -2774,18 +2824,18 @@ files = [ [[package]] name = "setuptools" -version = "69.5.1" +version = "71.0.4" requires_python = ">=3.8" summary = "Easily download, build, install, upgrade, and uninstall Python packages" -groups = ["default", "dev"] +groups = ["default"] files = [ - {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, - {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, + {file = "setuptools-71.0.4-py3-none-any.whl", hash = "sha256:ed2feca703be3bdbd94e6bb17365d91c6935c6b2a8d0bb09b66a2c435ba0b1a5"}, + {file = "setuptools-71.0.4.tar.gz", hash = "sha256:48297e5d393a62b7cb2a10b8f76c63a73af933bd809c9e0d0d6352a1a0135dd8"}, ] [[package]] name = "shapely" -version = "2.0.4" +version = "2.0.5" requires_python = ">=3.7" summary = "Manipulation and analysis of geometric objects" groups = ["default"] @@ -2793,14 +2843,13 @@ dependencies = [ "numpy<3,>=1.14", ] files = [ - {file = "shapely-2.0.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5bbd974193e2cc274312da16b189b38f5f128410f3377721cadb76b1e8ca5328"}, - {file = "shapely-2.0.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:41388321a73ba1a84edd90d86ecc8bfed55e6a1e51882eafb019f45895ec0f65"}, - {file = "shapely-2.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0776c92d584f72f1e584d2e43cfc5542c2f3dd19d53f70df0900fda643f4bae6"}, - {file = "shapely-2.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c75c98380b1ede1cae9a252c6dc247e6279403fae38c77060a5e6186c95073ac"}, - {file = "shapely-2.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3e700abf4a37b7b8b90532fa6ed5c38a9bfc777098bc9fbae5ec8e618ac8f30"}, - {file = "shapely-2.0.4-cp312-cp312-win32.whl", hash = "sha256:4f2ab0faf8188b9f99e6a273b24b97662194160cc8ca17cf9d1fb6f18d7fb93f"}, - {file = "shapely-2.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:03152442d311a5e85ac73b39680dd64a9892fa42bb08fd83b3bab4fe6999bfa0"}, - {file = "shapely-2.0.4.tar.gz", hash = "sha256:5dc736127fac70009b8d309a0eeb74f3e08979e530cf7017f2f507ef62e6cfb8"}, + {file = "shapely-2.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:03bd7b5fa5deb44795cc0a503999d10ae9d8a22df54ae8d4a4cd2e8a93466195"}, + {file = "shapely-2.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ff9521991ed9e201c2e923da014e766c1aa04771bc93e6fe97c27dcf0d40ace"}, + {file = "shapely-2.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b65365cfbf657604e50d15161ffcc68de5cdb22a601bbf7823540ab4918a98d"}, + {file = "shapely-2.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21f64e647a025b61b19585d2247137b3a38a35314ea68c66aaf507a1c03ef6fe"}, + {file = "shapely-2.0.5-cp312-cp312-win32.whl", hash = "sha256:3ac7dc1350700c139c956b03d9c3df49a5b34aaf91d024d1510a09717ea39199"}, + {file = "shapely-2.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:30e8737983c9d954cd17feb49eb169f02f1da49e24e5171122cf2c2b62d65c95"}, + {file = "shapely-2.0.5.tar.gz", hash = "sha256:bff2366bc786bfa6cb353d6b47d0443c570c32776612e527ee47b6df63fcfe32"}, ] [[package]] @@ -2885,8 +2934,8 @@ files = [ [[package]] name = "sphobjinv" -version = "2.3.1" -requires_python = ">=3.6" +version = "2.3.1.1" +requires_python = ">=3.8" summary = "Sphinx objects.inv Inspection/Manipulation Tool" groups = ["dev"] dependencies = [ @@ -2895,8 +2944,8 @@ dependencies = [ "jsonschema>=3.0", ] files = [ - {file = "sphobjinv-2.3.1-py3-none-any.whl", hash = "sha256:f3efe68bb0ba6e32cb50df064fe6349b8f94681589b400dea753a2860dd576b5"}, - {file = "sphobjinv-2.3.1.tar.gz", hash = "sha256:1442a47fc93587a0177be95346904e388ef85a8366f90a1835a7c3eeeb122eb7"}, + {file = "sphobjinv-2.3.1.1-py3-none-any.whl", hash = "sha256:d6b4c22d73c2f757794a76f6d32850804062fdc1b4530f35f6c53891fe5ec943"}, + {file = "sphobjinv-2.3.1.1.tar.gz", hash = "sha256:47c603fefd3150fd594b3c68feabfaa1d28f4a67b703494154cac8a7447aa483"}, ] [[package]] @@ -2993,13 +3042,13 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.5" -requires_python = ">=3.7" +version = "0.13.0" +requires_python = ">=3.8" summary = "Style preserving TOML library" groups = ["default"] files = [ - {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, - {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, + {file = "tomlkit-0.13.0-py3-none-any.whl", hash = "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264"}, + {file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"}, ] [[package]] @@ -3015,22 +3064,22 @@ files = [ [[package]] name = "tornado" -version = "6.4" -requires_python = ">= 3.8" +version = "6.4.1" +requires_python = ">=3.8" summary = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." groups = ["default"] files = [ - {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, - {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, - {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, - {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, - {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, ] [[package]] @@ -3064,7 +3113,6 @@ version = "0.9.1" requires_python = ">=3.10" summary = "Verify certificates using native system trust stores" groups = ["default"] -marker = "python_version >= \"3.10\"" files = [ {file = "truststore-0.9.1-py3-none-any.whl", hash = "sha256:7f5b447d68318d966428131fc1c00442cca3a2d581a3986143558f007efba0b4"}, {file = "truststore-0.9.1.tar.gz", hash = "sha256:8f7312d70cc33e9003b748a80a04ead1fcb2ed856a7c6c9ca5a02482901a90be"}, @@ -3100,13 +3148,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.2" requires_python = ">=3.8" summary = "Backported and Experimental Type Hints for Python 3.8+" groups = ["default", "dev"] files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -3122,7 +3170,7 @@ files = [ [[package]] name = "unearth" -version = "0.15.2" +version = "0.16.1" requires_python = ">=3.8" summary = "A utility to fetch and download python packages" groups = ["default"] @@ -3131,8 +3179,8 @@ dependencies = [ "packaging>=20", ] files = [ - {file = "unearth-0.15.2-py3-none-any.whl", hash = "sha256:e715be44174f47111b9e2b723a46efe21bfbe5f3b5f55c207a2c4ebc11b1ef8b"}, - {file = "unearth-0.15.2.tar.gz", hash = "sha256:381f3e6969db0b28d9fc2fbfb216860579bf341bd695472f2c62e2bcce9e6d3d"}, + {file = "unearth-0.16.1-py3-none-any.whl", hash = "sha256:5a598ac1a3f185144fadc9de47f1043bff805c36118ffc40f81ef98ff22e8e37"}, + {file = "unearth-0.16.1.tar.gz", hash = "sha256:988a43418fa0b78aeb628a15f6a3b02152c1787f63fe6d254c7f4e2ccf8db0a7"}, ] [[package]] @@ -3148,55 +3196,59 @@ files = [ [[package]] name = "urllib3" -version = "1.26.18" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +version = "1.26.19" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" summary = "HTTP library with thread-safe connection pooling, file post, and more." groups = ["default", "dev"] files = [ - {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, - {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, + {file = "urllib3-1.26.19-py2.py3-none-any.whl", hash = "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3"}, + {file = "urllib3-1.26.19.tar.gz", hash = "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429"}, ] [[package]] name = "virtualenv" -version = "20.26.2" +version = "20.26.3" requires_python = ">=3.7" summary = "Virtual Python Environment builder" groups = ["default", "dev"] dependencies = [ "distlib<1,>=0.3.7", "filelock<4,>=3.12.2", + "importlib-metadata>=6.6; python_version < \"3.8\"", "platformdirs<5,>=3.9.1", ] files = [ - {file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"}, - {file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"}, + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, ] [[package]] name = "watchdog" -version = "4.0.0" +version = "4.0.1" requires_python = ">=3.8" summary = "Filesystem events monitoring" groups = ["dev"] files = [ - {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, - {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, - {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, - {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, - {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, - {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, - {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, - {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"}, + {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7"}, + {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5"}, + {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193"}, + {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625"}, + {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd"}, + {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"}, + {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"}, + {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"}, + {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"}, + {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, ] [[package]] @@ -3204,6 +3256,9 @@ name = "wcwidth" version = "0.2.13" summary = "Measures the displayed width of unicode strings in a terminal" groups = ["default"] +dependencies = [ + "backports-functools-lru-cache>=1.2.1; python_version < \"3.2\"", +] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -3211,13 +3266,13 @@ files = [ [[package]] name = "webcolors" -version = "1.13" -requires_python = ">=3.7" +version = "24.6.0" +requires_python = ">=3.8" summary = "A library for working with the color formats defined by HTML and CSS." groups = ["default"] files = [ - {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, - {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"}, + {file = "webcolors-24.6.0-py3-none-any.whl", hash = "sha256:8cf5bc7e28defd1d48b9e83d5fc30741328305a8195c29a8e668fa45586568a1"}, + {file = "webcolors-24.6.0.tar.gz", hash = "sha256:1d160d1de46b3e81e58d0a280d0c78b467dc80f47294b91b1ad8029d2cedb55b"}, ] [[package]] @@ -3243,7 +3298,7 @@ files = [ [[package]] name = "xarray" -version = "2024.5.0" +version = "2024.6.0" requires_python = ">=3.9" summary = "N-D labeled arrays and datasets in Python" groups = ["default"] @@ -3253,39 +3308,17 @@ dependencies = [ "pandas>=2.0", ] files = [ - {file = "xarray-2024.5.0-py3-none-any.whl", hash = "sha256:7ddedfe2294a0ab00f02d0fbdcb9c6300ec589f3cf436a9c7b7b577a12cd9bcf"}, - {file = "xarray-2024.5.0.tar.gz", hash = "sha256:e0eb1cb265f265126795f388ed9591f3c752f2aca491f6c0576711fd15b708f2"}, + {file = "xarray-2024.6.0-py3-none-any.whl", hash = "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c"}, + {file = "xarray-2024.6.0.tar.gz", hash = "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7"}, ] [[package]] name = "zipp" -version = "3.18.2" +version = "3.19.2" requires_python = ">=3.8" summary = "Backport of pathlib-compatible object wrapper for zip files" groups = ["dev"] files = [ - {file = "zipp-3.18.2-py3-none-any.whl", hash = "sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e"}, - {file = "zipp-3.18.2.tar.gz", hash = "sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059"}, -] - -[[package]] -name = "zstandard" -version = "0.22.0" -requires_python = ">=3.8" -summary = "Zstandard bindings for Python" -groups = ["default"] -dependencies = [ - "cffi>=1.11; platform_python_implementation == \"PyPy\"", -] -files = [ - {file = "zstandard-0.22.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6c25b8eb733d4e741246151d895dd0308137532737f337411160ff69ca24f93a"}, - {file = "zstandard-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f9b2cde1cd1b2a10246dbc143ba49d942d14fb3d2b4bccf4618d475c65464912"}, - {file = "zstandard-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a88b7df61a292603e7cd662d92565d915796b094ffb3d206579aaebac6b85d5f"}, - {file = "zstandard-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466e6ad8caefb589ed281c076deb6f0cd330e8bc13c5035854ffb9c2014b118c"}, - {file = "zstandard-0.22.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1d67d0d53d2a138f9e29d8acdabe11310c185e36f0a848efa104d4e40b808e4"}, - {file = "zstandard-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:39b2853efc9403927f9065cc48c9980649462acbdf81cd4f0cb773af2fd734bc"}, - {file = "zstandard-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8a1b2effa96a5f019e72874969394edd393e2fbd6414a8208fea363a22803b45"}, - {file = "zstandard-0.22.0-cp312-cp312-win32.whl", hash = "sha256:88c5b4b47a8a138338a07fc94e2ba3b1535f69247670abfe422de4e0b344aae2"}, - {file = "zstandard-0.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:de20a212ef3d00d609d0b22eb7cc798d5a69035e81839f549b538eff4105d01c"}, - {file = "zstandard-0.22.0.tar.gz", hash = "sha256:8226a33c542bcb54cd6bd0a366067b610b41713b64c9abec1bc4533d69f51e70"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] diff --git a/python/pyproject.toml b/python/pyproject.toml index e008de5a..996dc986 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -38,6 +38,7 @@ dependencies = [ "typer>=0.12.3", "seaborn>=0.13.2", "dill>=0.3.8", + "numpy<2", ] [project.scripts] From cdbc9d7ed74857789a8cb63dc09bbfe631c293b3 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 21 Jul 2024 15:50:53 +0100 Subject: [PATCH 51/92] fix: add `libsqlite3-dev` for `docker` `jupyter` and `pre-commit` `--all` --- environment.yml | 1 + python/clim_recal/config.py | 2 - python/clim_recal/debiasing/debias_wrapper.py | 3 +- python/clim_recal/pipeline.py | 33 +++++----- python/clim_recal/resample.py | 3 - python/clim_recal/utils/gdal_formats.py | 12 ++-- python/clim_recal/utils/server.py | 10 +-- python/clim_recal/utils/xarray.py | 10 +-- python/conftest.py | 66 +++++++++---------- python/tests/test_debiasing.py | 1 + python/tests/test_resample.py | 12 ++-- python/tests/utils.py | 17 ++--- 12 files changed, 83 insertions(+), 87 deletions(-) diff --git a/environment.yml b/environment.yml index 67dbbaeb..88b32615 100644 --- a/environment.yml +++ b/environment.yml @@ -7,6 +7,7 @@ dependencies: # - r-quarto=1.4 - python=3.12 - gdal=3.8.5 + - libsqlite3-dev - parallel - rsync platforms: diff --git a/python/clim_recal/config.py b/python/clim_recal/config.py index ee95bffc..c0551edc 100644 --- a/python/clim_recal/config.py +++ b/python/clim_recal/config.py @@ -33,7 +33,6 @@ class ClimRecalRunsConfigType(TypedDict): - """Lists of parameters to generate `RunConfigType` instances.""" regions: Sequence[RegionOptions] | None @@ -47,7 +46,6 @@ class ClimRecalRunsConfigType(TypedDict): @dataclass class ClimRecalConfig(BaseRunConfig): - """Manage creating command line scripts to run `debiasing` `cli`. Attributes diff --git a/python/clim_recal/debiasing/debias_wrapper.py b/python/clim_recal/debiasing/debias_wrapper.py index 4f455ca4..98a0f970 100644 --- a/python/clim_recal/debiasing/debias_wrapper.py +++ b/python/clim_recal/debiasing/debias_wrapper.py @@ -1,4 +1,5 @@ """Wrapper for running `preprocess_data.py` and `run_cmethods.py`""" + from dataclasses import dataclass from datetime import date from os import PathLike @@ -63,7 +64,6 @@ class RunConfigType(TypedDict): @dataclass class BaseRunConfig: - """Manage creating command line scripts to run `debiasing` `cli`.""" command_dir: Path = COMMAND_DIR_DEFAULT @@ -91,7 +91,6 @@ class BaseRunConfig: @dataclass class RunConfig(BaseRunConfig): - """Manage creating command line scripts to run `debiasing` `cli`.""" variable: VariableOptions | str = VariableOptions.default() diff --git a/python/clim_recal/pipeline.py b/python/clim_recal/pipeline.py index 0fc4fd4c..1d0872b0 100644 --- a/python/clim_recal/pipeline.py +++ b/python/clim_recal/pipeline.py @@ -131,6 +131,7 @@ """ + from os import PathLike from pathlib import Path from typing import Final, Sequence @@ -273,20 +274,20 @@ def main( print("Skipping CPM Strandard Calendar projection.") else: print("Running CPM Standard Calendar projection...") - cpm_resamplers: tuple[ - CPMResampler, ... - ] = config.cpm_manager.execute_resample_configs( - multiprocess=multiprocess, cpus=cpus + cpm_resamplers: tuple[CPMResampler, ...] = ( + config.cpm_manager.execute_resample_configs( + multiprocess=multiprocess, cpus=cpus + ) ) print(cpm_resamplers[:print_range_length]) if skip_hads_spatial_2k_projection: print("Skipping HADs aggregation to 2.2km spatial units.") else: print("Running HADs aggregation to 2.2km spatial units...") - hads_resamplers: tuple[ - HADsResampler, ... - ] = config.hads_manager.execute_resample_configs( - multiprocess=multiprocess, cpus=cpus + hads_resamplers: tuple[HADsResampler, ...] = ( + config.hads_manager.execute_resample_configs( + multiprocess=multiprocess, cpus=cpus + ) ) print(hads_resamplers[:print_range_length]) if skip_cropping or (not crop_cpm and not crop_hads): @@ -296,10 +297,10 @@ def main( print("Skipping cropping CPM Standard Calendar projections.") else: print(f"Cropping CPMs to regions {config.regions}: ...") - cropped_cpm_resamplers: tuple[ - CPMResampler, ... - ] = config.cpm_manager.execute_crop_resamples( - multiprocess=multiprocess, cpus=cpus + cropped_cpm_resamplers: tuple[CPMResampler, ...] = ( + config.cpm_manager.execute_crop_resamples( + multiprocess=multiprocess, cpus=cpus + ) ) print(cropped_cpm_resamplers[:print_range_length]) if skip_cpm_standard_calendar_projection and not crop_hads: @@ -308,10 +309,10 @@ def main( print( f"Cropping HADS 2.2km projections to regions {config.regions}: ..." ) - cropped_hads_resamplers: tuple[ - CPMResampler, ... - ] = config.hands_manager.execute_crop_resamples( - multiprocess=multiprocess, cpus=cpus + cropped_hads_resamplers: tuple[CPMResampler, ...] = ( + config.hands_manager.execute_crop_resamples( + multiprocess=multiprocess, cpus=cpus + ) ) print(cropped_hads_resamplers[:print_range_length]) else: diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index b0efeda6..8c16375e 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -102,7 +102,6 @@ def reproject_2_2km_filename(path: Path) -> Path: @dataclass(kw_only=True) class ResamblerBase: - """Base class to inherit for `HADs` and `CPM`.""" input_path: PathLike | None = RAW_HADS_TASMAX_PATH @@ -641,7 +640,6 @@ def __getstate__(self): @dataclass(kw_only=True) class HADsResamplerManager: - """Class to manage processing HADs resampling. Attributes @@ -863,7 +861,6 @@ def execute_resample_configs( @dataclass(kw_only=True, repr=False) class CPMResamplerManager(HADsResamplerManager): - """Class to manage processing CPM resampling. Examples diff --git a/python/clim_recal/utils/gdal_formats.py b/python/clim_recal/utils/gdal_formats.py index b40b3ff7..faafc217 100644 --- a/python/clim_recal/utils/gdal_formats.py +++ b/python/clim_recal/utils/gdal_formats.py @@ -1,12 +1,12 @@ from typing import Final, Literal, get_args -CPM_RAW_PROJ4: Final[ - str -] = "+proj=ob_tran +o_proj=longlat +o_lon_p=0 +o_lat_p=37.5 +lon_0=357.5 +R=6371229 +no_defs=True" +CPM_RAW_PROJ4: Final[str] = ( + "+proj=ob_tran +o_proj=longlat +o_lon_p=0 +o_lat_p=37.5 +lon_0=357.5 +R=6371229 +no_defs=True" +) -HADS_RAW_PROJ4: Final[ - str -] = "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +a=6377563.396 +rf=299.324961266495 +units=m +no_defs=True" +HADS_RAW_PROJ4: Final[str] = ( + "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +a=6377563.396 +rf=299.324961266495 +units=m +no_defs=True" +) GDALFormatsType = Literal[ "VRT", diff --git a/python/clim_recal/utils/server.py b/python/clim_recal/utils/server.py index b8e15458..4220e323 100644 --- a/python/clim_recal/utils/server.py +++ b/python/clim_recal/utils/server.py @@ -1,4 +1,5 @@ """Utility functions.""" + import subprocess from copy import deepcopy from dataclasses import dataclass, field @@ -52,9 +53,11 @@ def kwargs_to_cli_str(space_prefix: bool = True, **kwargs) -> str: """ if kwargs: cmd_str: str = " ".join( - f"{'--' + key.replace('_', '-')} {val}" - if type(val) != bool - else f"{'--' + key if val else '--not-' + key}" + ( + f"{'--' + key.replace('_', '-')} {val}" + if type(val) != bool + else f"{'--' + key if val else '--not-' + key}" + ) for key, val in kwargs.items() ) return cmd_str if not space_prefix else " " + cmd_str @@ -97,7 +100,6 @@ def set_and_pop_attr_kwargs(instance: Any, **kwargs) -> dict[str, Any]: @dataclass class CondaLockFileManager: - """Run `conda_lock` `install` to generate `conda` `yml`. Attributes diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index b9483e43..651ed64d 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -119,10 +119,10 @@ def cpm_xarray_to_standard_calendar( cpm_to_std_calendar: T_Dataset = convert_xr_calendar( cpm_xr_time_series, interpolate_na=True, check_cftime_cols=("time_bnds",) ) - cpm_to_std_calendar[ - "month_number" - ] = cpm_to_std_calendar.month_number.interpolate_na( - "time", fill_value="extrapolate" + cpm_to_std_calendar["month_number"] = ( + cpm_to_std_calendar.month_number.interpolate_na( + "time", fill_value="extrapolate" + ) ) cpm_to_std_calendar["year"] = cpm_to_std_calendar.year.interpolate_na( "time", fill_value="extrapolate" @@ -521,7 +521,7 @@ def hads_resample_and_reproject( y_dim_name=y_dim_name, match_xr_time_series=cpm_to_match, match_xr_time_series_load_func=cpm_to_match_func, - resampling_method=VariableOptions.resampling_method(variable_name) + resampling_method=VariableOptions.resampling_method(variable_name), # match_xr_time_series_load_kwargs=dict(variable_name=variable_name), ) return epsg_277000_2_2km diff --git a/python/conftest.py b/python/conftest.py index effd5aa5..cf22f595 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -49,9 +49,9 @@ ) MOUNT_DOCTEST_SKIP_MESSAGE: Final[str] = "requires external data mounted" -MOUNT_OR_CACHE_DOCTEST_SKIP_MESSAGE: Final[ - str -] = "requires external data mounted or cached" +MOUNT_OR_CACHE_DOCTEST_SKIP_MESSAGE: Final[str] = ( + "requires external data mounted or cached" +) BADGE_PATH: Final[Path] = Path("docs") / "assets" / "coverage.svg" CLIMATE_DATA_MOUNT_PATH_LINUX: Final[Path] = Path("/mnt/vmfileshare/ClimateData") @@ -455,29 +455,29 @@ def doctest_auto_fixtures( clim_runner: ClimRecalConfig, ) -> None: """Elements to add to default `doctest` namespace.""" - doctest_namespace[ - "CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT" - ] = CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT - doctest_namespace[ - "CLI_PREPROCESS_DEFAULT_COMMAND_STR_CORRECT" - ] = CLI_PREPROCESS_DEFAULT_COMMAND_STR_CORRECT - doctest_namespace[ - "CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT" - ] = CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT + doctest_namespace["CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT"] = ( + CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT + ) + doctest_namespace["CLI_PREPROCESS_DEFAULT_COMMAND_STR_CORRECT"] = ( + CLI_PREPROCESS_DEFAULT_COMMAND_STR_CORRECT + ) + doctest_namespace["CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT"] = ( + CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT + ) doctest_namespace["MOD_FOLDER_FILES_COUNT_CORRECT"] = MOD_FOLDER_FILES_COUNT_CORRECT doctest_namespace["OBS_FOLDER_FILES_COUNT_CORRECT"] = OBS_FOLDER_FILES_COUNT_CORRECT - doctest_namespace[ - "PREPROCESS_OUT_FOLDER_FILES_COUNT_CORRECT" - ] = preprocess_out_folder_files_count_correct - doctest_namespace[ - "CLI_CMEHTODS_DEFAULT_COMMAND_TUPLE_STR_CORRECT" - ] = CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_STR_CORRECT - doctest_namespace[ - "CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT" - ] = CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT - doctest_namespace[ - "CLI_CMETHODS_DEFAULT_COMMAND_STR_CORRECT" - ] = CLI_CMETHODS_DEFAULT_COMMAND_STR_CORRECT + doctest_namespace["PREPROCESS_OUT_FOLDER_FILES_COUNT_CORRECT"] = ( + preprocess_out_folder_files_count_correct + ) + doctest_namespace["CLI_CMEHTODS_DEFAULT_COMMAND_TUPLE_STR_CORRECT"] = ( + CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_STR_CORRECT + ) + doctest_namespace["CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT"] = ( + CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT + ) + doctest_namespace["CLI_CMETHODS_DEFAULT_COMMAND_STR_CORRECT"] = ( + CLI_CMETHODS_DEFAULT_COMMAND_STR_CORRECT + ) doctest_namespace["TEST_AUTH_CSV_PATH"] = TEST_AUTH_CSV_FILE_NAME doctest_namespace["is_platform_darwin"] = is_platform_darwin() doctest_namespace["is_data_mounted"] = is_data_mounted @@ -485,9 +485,9 @@ def doctest_auto_fixtures( doctest_namespace["pprint"] = pprint doctest_namespace["pytest"] = pytest doctest_namespace["xarray_spatial_4_days"] = xarray_spatial_4_days - doctest_namespace[ - "xarray_spatial_6_days_2_skipped" - ] = xarray_spatial_6_days_2_skipped + doctest_namespace["xarray_spatial_6_days_2_skipped"] = ( + xarray_spatial_6_days_2_skipped + ) doctest_namespace["xarray_spatial_8_days"] = xarray_spatial_8_days doctest_namespace["xarray_spatial_4_years"] = xarray_spatial_4_years doctest_namespace["xarray_spatial_4_years_360_day"] = xarray_spatial_4_years_360_day @@ -500,12 +500,12 @@ def doctest_auto_fixtures( doctest_namespace["resample_test_hads_output_path"] = resample_test_hads_output_path doctest_namespace["resample_test_cpm_output_path"] = resample_test_cpm_output_path doctest_namespace["mount_doctest_skip_message"] = MOUNT_DOCTEST_SKIP_MESSAGE - doctest_namespace[ - "mount_or_cache_doctest_skip_message" - ] = MOUNT_OR_CACHE_DOCTEST_SKIP_MESSAGE - doctest_namespace[ - "glasgow_example_cropped_cpm_rainfall_path" - ] = glasgow_example_cropped_cpm_rainfall_path + doctest_namespace["mount_or_cache_doctest_skip_message"] = ( + MOUNT_OR_CACHE_DOCTEST_SKIP_MESSAGE + ) + doctest_namespace["glasgow_example_cropped_cpm_rainfall_path"] = ( + glasgow_example_cropped_cpm_rainfall_path + ) doctest_namespace["clim_runner"] = clim_runner diff --git a/python/tests/test_debiasing.py b/python/tests/test_debiasing.py index 6ca75642..6d46ec2b 100644 --- a/python/tests/test_debiasing.py +++ b/python/tests/test_debiasing.py @@ -2,6 +2,7 @@ Test generating and running `debiasing` scripts """ + import subprocess from os import chdir from pathlib import Path diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index c9d87554..3ee2c7b6 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -405,9 +405,9 @@ def test_cpm_xarray_to_standard_calendar( Indexing differs between `include_bnds_index` ``bool`. ``` """ - CORRECT_PROJ4: Final[ - str - ] = "+proj=ob_tran +o_proj=longlat +o_lon_p=0 +o_lat_p=37.5 +lon_0=357.5 +R=6371229 +no_defs=True" + CORRECT_PROJ4: Final[str] = ( + "+proj=ob_tran +o_proj=longlat +o_lon_p=0 +o_lat_p=37.5 +lon_0=357.5 +R=6371229 +no_defs=True" + ) test_converted = cpm_xarray_to_standard_calendar( tasmax_cpm_1980_raw, include_bnds_index=include_bnds_index ) @@ -810,9 +810,9 @@ def test_execute_resample_configs( output_paths=tmp_path, stop_index=1, ) - resamplers: tuple[ - HADsResampler | CPMResampler, ... - ] = test_config.execute_resample_configs(multiprocess=multiprocess) + resamplers: tuple[HADsResampler | CPMResampler, ...] = ( + test_config.execute_resample_configs(multiprocess=multiprocess) + ) export: T_Dataset = open_dataset(resamplers[0][0]) assert len(export.time) == 31 assert not np.isnan(export.tasmax[0][200:300].values).all() diff --git a/python/tests/utils.py b/python/tests/utils.py index 9f5eab50..c39ca9fc 100644 --- a/python/tests/utils.py +++ b/python/tests/utils.py @@ -136,9 +136,9 @@ VALID_DATES_STR_DEFAULT, ) -CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT: Final[ - tuple[str, ...] -] = iter_to_tuple_strs(CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT) +CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT: Final[tuple[str, ...]] = ( + iter_to_tuple_strs(CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT) +) CLI_PREPROCESS_DEFAULT_COMMAND_STR_CORRECT: Final[str] = " ".join( CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT @@ -164,9 +164,9 @@ PROCESSORS_DEFAULT, ) -CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_STR_CORRECT: Final[ - tuple[str, ...] -] = iter_to_tuple_strs(CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT) +CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_STR_CORRECT: Final[tuple[str, ...]] = ( + iter_to_tuple_strs(CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT) +) CLI_CMETHODS_DEFAULT_COMMAND_STR_CORRECT: Final[str] = " ".join( CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_STR_CORRECT @@ -177,8 +177,7 @@ PREPROCESS_OUT_FOLDER_FILES_COUNT_CORRECT: Final[int] = 4 -class StandardWith360DayError(Exception): - ... +class StandardWith360DayError(Exception): ... def year_days_count( @@ -325,7 +324,6 @@ def xarray_example( @dataclass class LocalCache: - """Manager for caching files locally. Attributes @@ -513,7 +511,6 @@ def read(self, cache_path: bool = True, run_sync: bool = False, **kwargs) -> Any @dataclass class LocalCachesManager(UserDict): - """Manager for a set of local caches. Attributes From 7632d915cc1af9e4d8dd0f4e9ac0791923bcf826 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 21 Jul 2024 16:08:26 +0100 Subject: [PATCH 52/92] fix: replace `libsqlite3-dev` -> `sqlite` --- .conda-linux-64.lock | 2 +- conda-lock.yml | 6 +++--- environment.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.conda-linux-64.lock b/.conda-linux-64.lock index c7207834..cce95fd3 100644 --- a/.conda-linux-64.lock +++ b/.conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 2b519e031a7313cf1177defbb5591df97a746f96bfb527d745b65470b3097ab4 +# input_hash: 572b53224d3c02aeae693e83d2bf48d2b7d707b585133e5d5f05f188b7b8085a @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://repo.anaconda.com/pkgs/main/linux-64/blas-1.0-openblas.conda#9ddfcaef10d79366c90128f5dc444be8 diff --git a/conda-lock.yml b/conda-lock.yml index 995a4601..995d6089 100644 --- a/conda-lock.yml +++ b/conda-lock.yml @@ -15,9 +15,9 @@ version: 1 metadata: content_hash: - osx-arm64: 5562ebbbde26d06224cb64f7d420208fab18e9445bc7bc30a7cb3f9c5c26a2a7 - linux-64: 2b519e031a7313cf1177defbb5591df97a746f96bfb527d745b65470b3097ab4 - linux-aarch64: 7de86e8d53c5d2e40886c674b7867d8799c24b61cebf2e747ddd68c961de0dc9 + osx-arm64: 8938b621f1f67d15e3b3edd26f65e84d592fd61cdbf38574c41b198a2ba595e1 + linux-64: 572b53224d3c02aeae693e83d2bf48d2b7d707b585133e5d5f05f188b7b8085a + linux-aarch64: 714ad061bda9afe74379b5fc4eb1f092645c3c75d6d3fabedf02122b5a46bcb4 channels: - url: r used_env_vars: [] diff --git a/environment.yml b/environment.yml index 88b32615..5803f681 100644 --- a/environment.yml +++ b/environment.yml @@ -7,7 +7,7 @@ dependencies: # - r-quarto=1.4 - python=3.12 - gdal=3.8.5 - - libsqlite3-dev + - sqlite - parallel - rsync platforms: From d03235cfa2acf73a4af767646d8d0196dbfdc330 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 21 Jul 2024 16:16:43 +0100 Subject: [PATCH 53/92] fix: remove `sqlite` --- .conda-linux-64.lock | 2 +- conda-lock.yml | 6 +++--- environment.yml | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.conda-linux-64.lock b/.conda-linux-64.lock index cce95fd3..c7207834 100644 --- a/.conda-linux-64.lock +++ b/.conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 572b53224d3c02aeae693e83d2bf48d2b7d707b585133e5d5f05f188b7b8085a +# input_hash: 2b519e031a7313cf1177defbb5591df97a746f96bfb527d745b65470b3097ab4 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://repo.anaconda.com/pkgs/main/linux-64/blas-1.0-openblas.conda#9ddfcaef10d79366c90128f5dc444be8 diff --git a/conda-lock.yml b/conda-lock.yml index 995d6089..995a4601 100644 --- a/conda-lock.yml +++ b/conda-lock.yml @@ -15,9 +15,9 @@ version: 1 metadata: content_hash: - osx-arm64: 8938b621f1f67d15e3b3edd26f65e84d592fd61cdbf38574c41b198a2ba595e1 - linux-64: 572b53224d3c02aeae693e83d2bf48d2b7d707b585133e5d5f05f188b7b8085a - linux-aarch64: 714ad061bda9afe74379b5fc4eb1f092645c3c75d6d3fabedf02122b5a46bcb4 + osx-arm64: 5562ebbbde26d06224cb64f7d420208fab18e9445bc7bc30a7cb3f9c5c26a2a7 + linux-64: 2b519e031a7313cf1177defbb5591df97a746f96bfb527d745b65470b3097ab4 + linux-aarch64: 7de86e8d53c5d2e40886c674b7867d8799c24b61cebf2e747ddd68c961de0dc9 channels: - url: r used_env_vars: [] diff --git a/environment.yml b/environment.yml index 5803f681..67dbbaeb 100644 --- a/environment.yml +++ b/environment.yml @@ -7,7 +7,6 @@ dependencies: # - r-quarto=1.4 - python=3.12 - gdal=3.8.5 - - sqlite - parallel - rsync platforms: From 8373878140f42357fc29e0284fc1679b8c0aed2d Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 21 Jul 2024 20:35:37 +0100 Subject: [PATCH 54/92] fix: `docker` `jupyter` config for server --- compose.yml | 7 +++++++ compose/jupyter/Dockerfile | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/compose.yml b/compose.yml index ba16309c..01d01c72 100644 --- a/compose.yml +++ b/compose.yml @@ -6,6 +6,13 @@ services: dockerfile: ./compose/jupyter/Dockerfile ports: - "8888:8888" + environment: + - NB_UID=1000 + - NB_GID=100 + - NB_GROUP=users + - CHOWN_HOME=yes + - CHOWN_HOME_OPTS=-R + - JUPYTER_ENABLE_LAB=yes volumes: - .:/home/jovyan:rw diff --git a/compose/jupyter/Dockerfile b/compose/jupyter/Dockerfile index 8e4c2ad3..a3004da7 100644 --- a/compose/jupyter/Dockerfile +++ b/compose/jupyter/Dockerfile @@ -27,6 +27,8 @@ RUN \ # Needed for write permission USER root +RUN sudo apt-get update && sudo apt-get install -y build-essential + # First line changes a startup hook, which will activate the custom environment RUN \ echo conda activate "${env_name}" >> /usr/local/bin/before-notebook.d/10activate-conda-env.sh && \ @@ -37,6 +39,10 @@ RUN chown -R ${NB_USER} /home/${NB_USER} USER ${NB_UID} + +RUN conda update -n ${env_name} -y --all && \ + conda install -n ${env_name} -y pysqlite3 + COPY . . # This makes the custom environment default in Jupyter Terminals for already existing NB_USER From 5948235c6408a1412db3155587e2732fe9bc2590 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 21 Jul 2024 20:56:03 +0100 Subject: [PATCH 55/92] fix: `tqdm.rich` -> `tqdm.tqdm` to fix running multiple `cpm` as groups --- python/clim_recal/utils/xarray.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 651ed64d..5f84db20 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -24,7 +24,7 @@ from osgeo.gdal import config_option as config_GDAL_option from pandas import DatetimeIndex, date_range from rasterio.enums import Resampling -from tqdm.rich import tqdm +from tqdm import tqdm from xarray import CFTimeIndex, DataArray, Dataset, cftime_range, open_dataset from xarray.coding.calendar_ops import convert_calendar from xarray.core.types import ( @@ -214,8 +214,8 @@ def cpm_reproject_with_standard_calendar( >>> tasmax_cpm_1980_365_day: T_Dataset = cpm_reproject_with_standard_calendar( ... cpm_xr_time_series=tasmax_cpm_1980_raw, ... variable_name="tasmax") - Warp: ...nc 100% ... - Translate: ...tif 100% ... + Warp: ...nc ...100%... + Translate: ...tif ...100%... >>> tasmax_cpm_1980_365_day Dimensions: (time: 365, x: 493, y: 607) From c830f4bc78c48e8c1eda006efc0090ec37f6b1a1 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 21 Jul 2024 21:01:03 +0100 Subject: [PATCH 56/92] fix(ci): add `root` permission on `jupyter` `compose.yml` --- compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/compose.yml b/compose.yml index 01d01c72..8373093a 100644 --- a/compose.yml +++ b/compose.yml @@ -6,6 +6,7 @@ services: dockerfile: ./compose/jupyter/Dockerfile ports: - "8888:8888" + user: root environment: - NB_UID=1000 - NB_GID=100 From eb16210e2918f494ba8e12d5c22a8a692549ebe0 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 23 Jul 2024 14:39:41 +0100 Subject: [PATCH 57/92] fix: `hads` `cpm` alignment and `conda` `jupyter` deploy --- check_calendar_log.txt | 1943 ---------------------------------------- 1 file changed, 1943 deletions(-) delete mode 100644 check_calendar_log.txt diff --git a/check_calendar_log.txt b/check_calendar_log.txt deleted file mode 100644 index 203d1b21..00000000 --- a/check_calendar_log.txt +++ /dev/null @@ -1,1943 +0,0 @@ -******************** Comparing raw data: /Volumes/vmfileshare/ClimateData/Raw/HadsUKgrid/tasmax/day ******************** -******************** to resampled data: /Volumes/vmfileshare/ClimateData/Processed/HadsUKgrid/resampled_2.2km/tasmax/day ******************** -File: tasmax_hadukgrid_uk_1km_day_19800101-19800131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1980-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19800301-19800331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1980-03-31'} -Dates in resampled not in raw: {'1980-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19800401-19800430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1980-04-30'} -Dates in resampled not in raw: {'1980-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19800501-19800531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1980-05-31'} -Dates in resampled not in raw: {'1980-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19800601-19800630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1980-06-30'} -Dates in resampled not in raw: {'1980-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19800701-19800731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1980-07-31'} -Dates in resampled not in raw: {'1980-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19800801-19800831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1980-08-31'} -Dates in resampled not in raw: {'1980-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19801001-19801031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1980-10-31'} -Dates in resampled not in raw: {'1980-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19801201-19801231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1980-12-31'} -Dates in resampled not in raw: {'1980-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19810101-19810131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1981-01-31'} -Dates in resampled not in raw: {'1981-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19810201-19810228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1981-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19810301-19810331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1981-03-31', '1981-03-30'} -Dates in resampled not in raw: {'1981-02-29', '1981-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19810401-19810430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1981-04-30', '1981-04-29'} -Dates in resampled not in raw: {'1981-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19810501-19810531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1981-05-31', '1981-05-30'} -Dates in resampled not in raw: {'1981-04-30', '1981-04-29'} -File: tasmax_hadukgrid_uk_1km_day_19810601-19810630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1981-06-30'} -Dates in resampled not in raw: {'1981-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19810701-19810731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1981-07-31', '1981-07-30'} -Dates in resampled not in raw: {'1981-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19810801-19810831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1981-08-31'} -Dates in resampled not in raw: {'1981-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19810901-19810930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1981-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19811001-19811031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1981-10-31'} -Dates in resampled not in raw: {'1981-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19811101-19811130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1981-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19811201-19811231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1981-12-31'} -Dates in resampled not in raw: {'1981-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19820101-19820131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1982-01-31'} -Dates in resampled not in raw: {'1982-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19820201-19820228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1982-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19820301-19820331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1982-03-31', '1982-03-30'} -Dates in resampled not in raw: {'1982-02-29', '1982-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19820401-19820430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1982-04-29', '1982-04-30'} -Dates in resampled not in raw: {'1982-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19820501-19820531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1982-05-31', '1982-05-30'} -Dates in resampled not in raw: {'1982-04-29', '1982-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19820601-19820630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1982-06-30'} -Dates in resampled not in raw: {'1982-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19820701-19820731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1982-07-30', '1982-07-31'} -Dates in resampled not in raw: {'1982-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19820801-19820831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1982-08-31'} -Dates in resampled not in raw: {'1982-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19820901-19820930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1982-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19821001-19821031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1982-10-31'} -Dates in resampled not in raw: {'1982-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19821101-19821130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1982-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19821201-19821231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1982-12-31'} -Dates in resampled not in raw: {'1982-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19830101-19830131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1983-01-31'} -Dates in resampled not in raw: {'1983-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19830201-19830228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1983-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19830301-19830331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1983-03-30', '1983-03-31'} -Dates in resampled not in raw: {'1983-02-30', '1983-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19830401-19830430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1983-04-29', '1983-04-30'} -Dates in resampled not in raw: {'1983-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19830501-19830531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1983-05-31', '1983-05-30'} -Dates in resampled not in raw: {'1983-04-29', '1983-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19830601-19830630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1983-06-30'} -Dates in resampled not in raw: {'1983-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19830701-19830731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1983-07-31', '1983-07-30'} -Dates in resampled not in raw: {'1983-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19830801-19830831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1983-08-31'} -Dates in resampled not in raw: {'1983-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19830901-19830930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1983-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19831001-19831031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1983-10-31'} -Dates in resampled not in raw: {'1983-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19831101-19831130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1983-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19831201-19831231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1983-12-31'} -Dates in resampled not in raw: {'1983-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19840101-19840131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1984-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19840301-19840331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1984-03-31'} -Dates in resampled not in raw: {'1984-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19840401-19840430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1984-04-30'} -Dates in resampled not in raw: {'1984-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19840501-19840531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1984-05-31'} -Dates in resampled not in raw: {'1984-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19840601-19840630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1984-06-30'} -Dates in resampled not in raw: {'1984-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19840701-19840731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1984-07-31'} -Dates in resampled not in raw: {'1984-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19840801-19840831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1984-08-31'} -Dates in resampled not in raw: {'1984-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19841001-19841031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1984-10-31'} -Dates in resampled not in raw: {'1984-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19841201-19841231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1984-12-31'} -Dates in resampled not in raw: {'1984-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19850101-19850131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1985-01-31'} -Dates in resampled not in raw: {'1985-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19850201-19850228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1985-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19850301-19850331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1985-03-31', '1985-03-30'} -Dates in resampled not in raw: {'1985-02-29', '1985-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19850401-19850430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1985-04-30', '1985-04-29'} -Dates in resampled not in raw: {'1985-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19850501-19850531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1985-05-31', '1985-05-30'} -Dates in resampled not in raw: {'1985-04-30', '1985-04-29'} -File: tasmax_hadukgrid_uk_1km_day_19850601-19850630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1985-06-30'} -Dates in resampled not in raw: {'1985-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19850701-19850731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1985-07-31', '1985-07-30'} -Dates in resampled not in raw: {'1985-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19850801-19850831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1985-08-31'} -Dates in resampled not in raw: {'1985-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19850901-19850930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1985-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19851001-19851031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1985-10-31'} -Dates in resampled not in raw: {'1985-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19851101-19851130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1985-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19851201-19851231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1985-12-31'} -Dates in resampled not in raw: {'1985-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19860101-19860131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1986-01-31'} -Dates in resampled not in raw: {'1986-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19860201-19860228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1986-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19860301-19860331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1986-03-31', '1986-03-30'} -Dates in resampled not in raw: {'1986-02-30', '1986-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19860401-19860430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1986-04-30', '1986-04-29'} -Dates in resampled not in raw: {'1986-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19860501-19860531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1986-05-30', '1986-05-31'} -Dates in resampled not in raw: {'1986-04-30', '1986-04-29'} -File: tasmax_hadukgrid_uk_1km_day_19860601-19860630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1986-06-30'} -Dates in resampled not in raw: {'1986-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19860701-19860731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1986-07-30', '1986-07-31'} -Dates in resampled not in raw: {'1986-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19860801-19860831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1986-08-31'} -Dates in resampled not in raw: {'1986-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19860901-19860930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1986-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19861001-19861031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1986-10-31'} -Dates in resampled not in raw: {'1986-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19861101-19861130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1986-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19861201-19861231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1986-12-31'} -Dates in resampled not in raw: {'1986-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19870101-19870131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1987-01-31'} -Dates in resampled not in raw: {'1987-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19870201-19870228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1987-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19870301-19870331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1987-03-30', '1987-03-31'} -Dates in resampled not in raw: {'1987-02-30', '1987-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19870401-19870430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1987-04-29', '1987-04-30'} -Dates in resampled not in raw: {'1987-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19870501-19870531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1987-05-31', '1987-05-30'} -Dates in resampled not in raw: {'1987-04-29', '1987-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19870601-19870630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1987-06-30'} -Dates in resampled not in raw: {'1987-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19870701-19870731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1987-07-31', '1987-07-30'} -Dates in resampled not in raw: {'1987-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19870801-19870831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1987-08-31'} -Dates in resampled not in raw: {'1987-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19870901-19870930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1987-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19871001-19871031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1987-10-31'} -Dates in resampled not in raw: {'1987-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19871101-19871130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1987-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19871201-19871231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1987-12-31'} -Dates in resampled not in raw: {'1987-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19880101-19880131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1988-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19880301-19880331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1988-03-31'} -Dates in resampled not in raw: {'1988-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19880401-19880430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1988-04-30'} -Dates in resampled not in raw: {'1988-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19880501-19880531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1988-05-31'} -Dates in resampled not in raw: {'1988-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19880601-19880630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1988-06-30'} -Dates in resampled not in raw: {'1988-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19880701-19880731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1988-07-31'} -Dates in resampled not in raw: {'1988-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19880801-19880831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1988-08-31'} -Dates in resampled not in raw: {'1988-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19881001-19881031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1988-10-31'} -Dates in resampled not in raw: {'1988-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19881201-19881231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1988-12-31'} -Dates in resampled not in raw: {'1988-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19890101-19890131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1989-01-31'} -Dates in resampled not in raw: {'1989-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19890201-19890228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1989-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19890301-19890331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1989-03-31', '1989-03-30'} -Dates in resampled not in raw: {'1989-02-29', '1989-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19890401-19890430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1989-04-29', '1989-04-30'} -Dates in resampled not in raw: {'1989-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19890501-19890531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1989-05-31', '1989-05-30'} -Dates in resampled not in raw: {'1989-04-29', '1989-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19890601-19890630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1989-06-30'} -Dates in resampled not in raw: {'1989-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19890701-19890731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1989-07-30', '1989-07-31'} -Dates in resampled not in raw: {'1989-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19890801-19890831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1989-08-31'} -Dates in resampled not in raw: {'1989-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19890901-19890930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1989-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19891001-19891031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1989-10-31'} -Dates in resampled not in raw: {'1989-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19891101-19891130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1989-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19891201-19891231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1989-12-31'} -Dates in resampled not in raw: {'1989-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19900101-19900131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1990-01-31'} -Dates in resampled not in raw: {'1990-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19900201-19900228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1990-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19900301-19900331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1990-03-30', '1990-03-31'} -Dates in resampled not in raw: {'1990-02-29', '1990-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19900401-19900430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1990-04-30', '1990-04-29'} -Dates in resampled not in raw: {'1990-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19900501-19900531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1990-05-30', '1990-05-31'} -Dates in resampled not in raw: {'1990-04-30', '1990-04-29'} -File: tasmax_hadukgrid_uk_1km_day_19900601-19900630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1990-06-30'} -Dates in resampled not in raw: {'1990-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19900701-19900731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1990-07-31', '1990-07-30'} -Dates in resampled not in raw: {'1990-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19900801-19900831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1990-08-31'} -Dates in resampled not in raw: {'1990-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19900901-19900930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1990-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19901001-19901031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1990-10-31'} -Dates in resampled not in raw: {'1990-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19901101-19901130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1990-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19901201-19901231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1990-12-31'} -Dates in resampled not in raw: {'1990-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19910101-19910131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1991-01-31'} -Dates in resampled not in raw: {'1991-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19910201-19910228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1991-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19910301-19910331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1991-03-30', '1991-03-31'} -Dates in resampled not in raw: {'1991-02-30', '1991-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19910401-19910430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1991-04-30', '1991-04-29'} -Dates in resampled not in raw: {'1991-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19910501-19910531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1991-05-30', '1991-05-31'} -Dates in resampled not in raw: {'1991-04-29', '1991-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19910601-19910630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1991-06-30'} -Dates in resampled not in raw: {'1991-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19910701-19910731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1991-07-31', '1991-07-30'} -Dates in resampled not in raw: {'1991-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19910801-19910831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1991-08-31'} -Dates in resampled not in raw: {'1991-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19910901-19910930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1991-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19911001-19911031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1991-10-31'} -Dates in resampled not in raw: {'1991-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19911101-19911130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1991-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19911201-19911231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1991-12-31'} -Dates in resampled not in raw: {'1991-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19920101-19920131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1992-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19920301-19920331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1992-03-31'} -Dates in resampled not in raw: {'1992-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19920401-19920430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1992-04-30'} -Dates in resampled not in raw: {'1992-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19920501-19920531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1992-05-31'} -Dates in resampled not in raw: {'1992-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19920601-19920630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1992-06-30'} -Dates in resampled not in raw: {'1992-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19920701-19920731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1992-07-31'} -Dates in resampled not in raw: {'1992-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19920801-19920831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1992-08-31'} -Dates in resampled not in raw: {'1992-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19921001-19921031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1992-10-31'} -Dates in resampled not in raw: {'1992-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19921201-19921231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1992-12-31'} -Dates in resampled not in raw: {'1992-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19930101-19930131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1993-01-31'} -Dates in resampled not in raw: {'1993-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19930201-19930228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1993-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19930301-19930331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1993-03-30', '1993-03-31'} -Dates in resampled not in raw: {'1993-02-30', '1993-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19930401-19930430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1993-04-29', '1993-04-30'} -Dates in resampled not in raw: {'1993-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19930501-19930531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1993-05-30', '1993-05-31'} -Dates in resampled not in raw: {'1993-04-29', '1993-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19930601-19930630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1993-06-30'} -Dates in resampled not in raw: {'1993-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19930701-19930731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1993-07-30', '1993-07-31'} -Dates in resampled not in raw: {'1993-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19930801-19930831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1993-08-31'} -Dates in resampled not in raw: {'1993-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19930901-19930930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1993-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19931001-19931031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1993-10-31'} -Dates in resampled not in raw: {'1993-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19931101-19931130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1993-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19931201-19931231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1993-12-31'} -Dates in resampled not in raw: {'1993-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19940101-19940131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1994-01-31'} -Dates in resampled not in raw: {'1994-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19940201-19940228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1994-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19940301-19940331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1994-03-31', '1994-03-30'} -Dates in resampled not in raw: {'1994-02-30', '1994-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19940401-19940430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1994-04-29', '1994-04-30'} -Dates in resampled not in raw: {'1994-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19940501-19940531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1994-05-30', '1994-05-31'} -Dates in resampled not in raw: {'1994-04-29', '1994-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19940601-19940630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1994-06-30'} -Dates in resampled not in raw: {'1994-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19940701-19940731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1994-07-31', '1994-07-30'} -Dates in resampled not in raw: {'1994-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19940801-19940831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1994-08-31'} -Dates in resampled not in raw: {'1994-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19940901-19940930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1994-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19941001-19941031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1994-10-31'} -Dates in resampled not in raw: {'1994-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19941101-19941130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1994-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19941201-19941231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1994-12-31'} -Dates in resampled not in raw: {'1994-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19950101-19950131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1995-01-31'} -Dates in resampled not in raw: {'1995-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19950201-19950228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1995-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19950301-19950331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1995-03-31', '1995-03-30'} -Dates in resampled not in raw: {'1995-02-30', '1995-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19950401-19950430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1995-04-29', '1995-04-30'} -Dates in resampled not in raw: {'1995-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19950501-19950531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1995-05-31', '1995-05-30'} -Dates in resampled not in raw: {'1995-04-29', '1995-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19950601-19950630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1995-06-30'} -Dates in resampled not in raw: {'1995-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19950701-19950731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1995-07-31', '1995-07-30'} -Dates in resampled not in raw: {'1995-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19950801-19950831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1995-08-31'} -Dates in resampled not in raw: {'1995-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19950901-19950930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1995-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19951001-19951031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1995-10-31'} -Dates in resampled not in raw: {'1995-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19951101-19951130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1995-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19951201-19951231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1995-12-31'} -Dates in resampled not in raw: {'1995-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19960101-19960131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1996-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19960301-19960331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1996-03-31'} -Dates in resampled not in raw: {'1996-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19960401-19960430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1996-04-30'} -Dates in resampled not in raw: {'1996-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19960501-19960531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1996-05-31'} -Dates in resampled not in raw: {'1996-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19960601-19960630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1996-06-30'} -Dates in resampled not in raw: {'1996-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19960701-19960731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1996-07-31'} -Dates in resampled not in raw: {'1996-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19960801-19960831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1996-08-31'} -Dates in resampled not in raw: {'1996-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19961001-19961031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1996-10-31'} -Dates in resampled not in raw: {'1996-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19961201-19961231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1996-12-31'} -Dates in resampled not in raw: {'1996-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19970101-19970131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1997-01-31'} -Dates in resampled not in raw: {'1997-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19970201-19970228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1997-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19970301-19970331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1997-03-31', '1997-03-30'} -Dates in resampled not in raw: {'1997-02-30', '1997-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19970401-19970430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1997-04-29', '1997-04-30'} -Dates in resampled not in raw: {'1997-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19970501-19970531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1997-05-30', '1997-05-31'} -Dates in resampled not in raw: {'1997-04-29', '1997-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19970601-19970630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1997-06-30'} -Dates in resampled not in raw: {'1997-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19970701-19970731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1997-07-31', '1997-07-30'} -Dates in resampled not in raw: {'1997-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19970801-19970831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1997-08-31'} -Dates in resampled not in raw: {'1997-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19970901-19970930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1997-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19971001-19971031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1997-10-31'} -Dates in resampled not in raw: {'1997-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19971101-19971130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1997-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19971201-19971231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1997-12-31'} -Dates in resampled not in raw: {'1997-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19980101-19980131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1998-01-31'} -Dates in resampled not in raw: {'1998-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19980201-19980228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1998-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19980301-19980331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1998-03-31', '1998-03-30'} -Dates in resampled not in raw: {'1998-02-30', '1998-02-29'} -File: tasmax_hadukgrid_uk_1km_day_19980401-19980430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1998-04-29', '1998-04-30'} -Dates in resampled not in raw: {'1998-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19980501-19980531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1998-05-31', '1998-05-30'} -Dates in resampled not in raw: {'1998-04-29', '1998-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19980601-19980630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1998-06-30'} -Dates in resampled not in raw: {'1998-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19980701-19980731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1998-07-31', '1998-07-30'} -Dates in resampled not in raw: {'1998-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19980801-19980831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1998-08-31'} -Dates in resampled not in raw: {'1998-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19980901-19980930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1998-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19981001-19981031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1998-10-31'} -Dates in resampled not in raw: {'1998-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19981101-19981130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1998-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19981201-19981231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1998-12-31'} -Dates in resampled not in raw: {'1998-11-30'} -File: tasmax_hadukgrid_uk_1km_day_19990101-19990131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1999-01-31'} -Dates in resampled not in raw: {'1999-02-01'} -File: tasmax_hadukgrid_uk_1km_day_19990201-19990228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'1999-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19990301-19990331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1999-03-31', '1999-03-30'} -Dates in resampled not in raw: {'1999-02-29', '1999-02-30'} -File: tasmax_hadukgrid_uk_1km_day_19990401-19990430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1999-04-29', '1999-04-30'} -Dates in resampled not in raw: {'1999-03-30'} -File: tasmax_hadukgrid_uk_1km_day_19990501-19990531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1999-05-31', '1999-05-30'} -Dates in resampled not in raw: {'1999-04-29', '1999-04-30'} -File: tasmax_hadukgrid_uk_1km_day_19990601-19990630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'1999-06-30'} -Dates in resampled not in raw: {'1999-05-30'} -File: tasmax_hadukgrid_uk_1km_day_19990701-19990731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'1999-07-30', '1999-07-31'} -Dates in resampled not in raw: {'1999-06-30'} -File: tasmax_hadukgrid_uk_1km_day_19990801-19990831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1999-08-31'} -Dates in resampled not in raw: {'1999-07-30'} -File: tasmax_hadukgrid_uk_1km_day_19990901-19990930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1999-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19991001-19991031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1999-10-31'} -Dates in resampled not in raw: {'1999-09-30'} -File: tasmax_hadukgrid_uk_1km_day_19991101-19991130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'1999-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_19991201-19991231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'1999-12-31'} -Dates in resampled not in raw: {'1999-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20000101-20000131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2000-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20000301-20000331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2000-03-31'} -Dates in resampled not in raw: {'2000-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20000401-20000430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2000-04-30'} -Dates in resampled not in raw: {'2000-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20000501-20000531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2000-05-31'} -Dates in resampled not in raw: {'2000-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20000601-20000630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2000-06-30'} -Dates in resampled not in raw: {'2000-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20000701-20000731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2000-07-31'} -Dates in resampled not in raw: {'2000-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20000801-20000831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2000-08-31'} -Dates in resampled not in raw: {'2000-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20001001-20001031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2000-10-31'} -Dates in resampled not in raw: {'2000-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20001201-20001231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2000-12-31'} -Dates in resampled not in raw: {'2000-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20010101-20010131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2001-01-31'} -Dates in resampled not in raw: {'2001-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20010201-20010228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2001-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20010301-20010331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2001-03-31', '2001-03-30'} -Dates in resampled not in raw: {'2001-02-30', '2001-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20010401-20010430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2001-04-29', '2001-04-30'} -Dates in resampled not in raw: {'2001-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20010501-20010531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2001-05-30', '2001-05-31'} -Dates in resampled not in raw: {'2001-04-29', '2001-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20010601-20010630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2001-06-30'} -Dates in resampled not in raw: {'2001-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20010701-20010731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2001-07-30', '2001-07-31'} -Dates in resampled not in raw: {'2001-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20010801-20010831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2001-08-31'} -Dates in resampled not in raw: {'2001-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20010901-20010930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2001-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20011001-20011031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2001-10-31'} -Dates in resampled not in raw: {'2001-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20011101-20011130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2001-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20011201-20011231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2001-12-31'} -Dates in resampled not in raw: {'2001-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20020101-20020131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2002-01-31'} -Dates in resampled not in raw: {'2002-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20020201-20020228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2002-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20020301-20020331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2002-03-30', '2002-03-31'} -Dates in resampled not in raw: {'2002-02-29', '2002-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20020401-20020430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2002-04-30', '2002-04-29'} -Dates in resampled not in raw: {'2002-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20020501-20020531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2002-05-31', '2002-05-30'} -Dates in resampled not in raw: {'2002-04-30', '2002-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20020601-20020630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2002-06-30'} -Dates in resampled not in raw: {'2002-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20020701-20020731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2002-07-30', '2002-07-31'} -Dates in resampled not in raw: {'2002-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20020801-20020831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2002-08-31'} -Dates in resampled not in raw: {'2002-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20020901-20020930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2002-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20021001-20021031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2002-10-31'} -Dates in resampled not in raw: {'2002-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20021101-20021130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2002-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20021201-20021231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2002-12-31'} -Dates in resampled not in raw: {'2002-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20030101-20030131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2003-01-31'} -Dates in resampled not in raw: {'2003-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20030201-20030228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2003-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20030301-20030331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2003-03-30', '2003-03-31'} -Dates in resampled not in raw: {'2003-02-29', '2003-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20030401-20030430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2003-04-30', '2003-04-29'} -Dates in resampled not in raw: {'2003-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20030501-20030531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2003-05-31', '2003-05-30'} -Dates in resampled not in raw: {'2003-04-30', '2003-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20030601-20030630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2003-06-30'} -Dates in resampled not in raw: {'2003-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20030701-20030731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2003-07-30', '2003-07-31'} -Dates in resampled not in raw: {'2003-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20030801-20030831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2003-08-31'} -Dates in resampled not in raw: {'2003-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20030901-20030930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2003-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20031001-20031031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2003-10-31'} -Dates in resampled not in raw: {'2003-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20031101-20031130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2003-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20031201-20031231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2003-12-31'} -Dates in resampled not in raw: {'2003-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20040101-20040131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2004-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20040301-20040331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2004-03-31'} -Dates in resampled not in raw: {'2004-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20040401-20040430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2004-04-30'} -Dates in resampled not in raw: {'2004-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20040501-20040531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2004-05-31'} -Dates in resampled not in raw: {'2004-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20040601-20040630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2004-06-30'} -Dates in resampled not in raw: {'2004-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20040701-20040731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2004-07-31'} -Dates in resampled not in raw: {'2004-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20040801-20040831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2004-08-31'} -Dates in resampled not in raw: {'2004-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20041001-20041031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2004-10-31'} -Dates in resampled not in raw: {'2004-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20041201-20041231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2004-12-31'} -Dates in resampled not in raw: {'2004-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20050101-20050131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2005-01-31'} -Dates in resampled not in raw: {'2005-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20050201-20050228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2005-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20050301-20050331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2005-03-31', '2005-03-30'} -Dates in resampled not in raw: {'2005-02-29', '2005-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20050401-20050430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2005-04-30', '2005-04-29'} -Dates in resampled not in raw: {'2005-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20050501-20050531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2005-05-31', '2005-05-30'} -Dates in resampled not in raw: {'2005-04-30', '2005-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20050601-20050630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2005-06-30'} -Dates in resampled not in raw: {'2005-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20050701-20050731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2005-07-31', '2005-07-30'} -Dates in resampled not in raw: {'2005-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20050801-20050831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2005-08-31'} -Dates in resampled not in raw: {'2005-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20050901-20050930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2005-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20051001-20051031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2005-10-31'} -Dates in resampled not in raw: {'2005-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20051101-20051130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2005-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20051201-20051231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2005-12-31'} -Dates in resampled not in raw: {'2005-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20060101-20060131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2006-01-31'} -Dates in resampled not in raw: {'2006-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20060201-20060228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2006-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20060301-20060331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2006-03-30', '2006-03-31'} -Dates in resampled not in raw: {'2006-02-29', '2006-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20060401-20060430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2006-04-29', '2006-04-30'} -Dates in resampled not in raw: {'2006-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20060501-20060531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2006-05-30', '2006-05-31'} -Dates in resampled not in raw: {'2006-04-29', '2006-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20060601-20060630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2006-06-30'} -Dates in resampled not in raw: {'2006-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20060701-20060731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2006-07-30', '2006-07-31'} -Dates in resampled not in raw: {'2006-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20060801-20060831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2006-08-31'} -Dates in resampled not in raw: {'2006-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20060901-20060930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2006-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20061001-20061031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2006-10-31'} -Dates in resampled not in raw: {'2006-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20061101-20061130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2006-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20061201-20061231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2006-12-31'} -Dates in resampled not in raw: {'2006-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20070101-20070131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2007-01-31'} -Dates in resampled not in raw: {'2007-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20070201-20070228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2007-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20070301-20070331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2007-03-30', '2007-03-31'} -Dates in resampled not in raw: {'2007-02-29', '2007-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20070401-20070430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2007-04-30', '2007-04-29'} -Dates in resampled not in raw: {'2007-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20070501-20070531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2007-05-31', '2007-05-30'} -Dates in resampled not in raw: {'2007-04-30', '2007-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20070601-20070630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2007-06-30'} -Dates in resampled not in raw: {'2007-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20070701-20070731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2007-07-30', '2007-07-31'} -Dates in resampled not in raw: {'2007-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20070801-20070831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2007-08-31'} -Dates in resampled not in raw: {'2007-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20070901-20070930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2007-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20071001-20071031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2007-10-31'} -Dates in resampled not in raw: {'2007-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20071101-20071130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2007-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20071201-20071231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2007-12-31'} -Dates in resampled not in raw: {'2007-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20080101-20080131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2008-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20080301-20080331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2008-03-31'} -Dates in resampled not in raw: {'2008-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20080401-20080430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2008-04-30'} -Dates in resampled not in raw: {'2008-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20080501-20080531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2008-05-31'} -Dates in resampled not in raw: {'2008-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20080601-20080630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2008-06-30'} -Dates in resampled not in raw: {'2008-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20080701-20080731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2008-07-31'} -Dates in resampled not in raw: {'2008-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20080801-20080831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2008-08-31'} -Dates in resampled not in raw: {'2008-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20081001-20081031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2008-10-31'} -Dates in resampled not in raw: {'2008-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20081201-20081231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2008-12-31'} -Dates in resampled not in raw: {'2008-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20090101-20090131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2009-01-31'} -Dates in resampled not in raw: {'2009-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20090201-20090228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2009-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20090301-20090331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2009-03-30', '2009-03-31'} -Dates in resampled not in raw: {'2009-02-30', '2009-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20090401-20090430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2009-04-29', '2009-04-30'} -Dates in resampled not in raw: {'2009-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20090501-20090531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2009-05-30', '2009-05-31'} -Dates in resampled not in raw: {'2009-04-29', '2009-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20090601-20090630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2009-06-30'} -Dates in resampled not in raw: {'2009-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20090701-20090731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2009-07-30', '2009-07-31'} -Dates in resampled not in raw: {'2009-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20090801-20090831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2009-08-31'} -Dates in resampled not in raw: {'2009-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20090901-20090930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2009-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20091001-20091031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2009-10-31'} -Dates in resampled not in raw: {'2009-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20091101-20091130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2009-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20091201-20091231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2009-12-31'} -Dates in resampled not in raw: {'2009-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20100101-20100131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2010-01-31'} -Dates in resampled not in raw: {'2010-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20100201-20100228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2010-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20100301-20100331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2010-03-30', '2010-03-31'} -Dates in resampled not in raw: {'2010-02-29', '2010-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20100401-20100430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2010-04-29', '2010-04-30'} -Dates in resampled not in raw: {'2010-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20100501-20100531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2010-05-30', '2010-05-31'} -Dates in resampled not in raw: {'2010-04-29', '2010-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20100601-20100630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2010-06-30'} -Dates in resampled not in raw: {'2010-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20100701-20100731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2010-07-30', '2010-07-31'} -Dates in resampled not in raw: {'2010-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20100801-20100831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2010-08-31'} -Dates in resampled not in raw: {'2010-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20100901-20100930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2010-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20101001-20101031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2010-10-31'} -Dates in resampled not in raw: {'2010-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20101101-20101130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2010-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20101201-20101231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2010-12-31'} -Dates in resampled not in raw: {'2010-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20110101-20110131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2011-01-31'} -Dates in resampled not in raw: {'2011-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20110201-20110228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2011-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20110301-20110331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2011-03-31', '2011-03-30'} -Dates in resampled not in raw: {'2011-02-29', '2011-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20110401-20110430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2011-04-29', '2011-04-30'} -Dates in resampled not in raw: {'2011-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20110501-20110531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2011-05-30', '2011-05-31'} -Dates in resampled not in raw: {'2011-04-29', '2011-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20110601-20110630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2011-06-30'} -Dates in resampled not in raw: {'2011-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20110701-20110731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2011-07-30', '2011-07-31'} -Dates in resampled not in raw: {'2011-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20110801-20110831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2011-08-31'} -Dates in resampled not in raw: {'2011-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20110901-20110930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2011-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20111001-20111031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2011-10-31'} -Dates in resampled not in raw: {'2011-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20111101-20111130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2011-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20111201-20111231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2011-12-31'} -Dates in resampled not in raw: {'2011-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20120101-20120131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2012-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20120301-20120331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2012-03-31'} -Dates in resampled not in raw: {'2012-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20120401-20120430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2012-04-30'} -Dates in resampled not in raw: {'2012-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20120501-20120531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2012-05-31'} -Dates in resampled not in raw: {'2012-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20120601-20120630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2012-06-30'} -Dates in resampled not in raw: {'2012-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20120701-20120731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2012-07-31'} -Dates in resampled not in raw: {'2012-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20120801-20120831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2012-08-31'} -Dates in resampled not in raw: {'2012-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20121001-20121031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2012-10-31'} -Dates in resampled not in raw: {'2012-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20121201-20121231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2012-12-31'} -Dates in resampled not in raw: {'2012-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20130101-20130131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2013-01-31'} -Dates in resampled not in raw: {'2013-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20130201-20130228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2013-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20130301-20130331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2013-03-30', '2013-03-31'} -Dates in resampled not in raw: {'2013-02-29', '2013-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20130401-20130430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2013-04-29', '2013-04-30'} -Dates in resampled not in raw: {'2013-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20130501-20130531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2013-05-30', '2013-05-31'} -Dates in resampled not in raw: {'2013-04-29', '2013-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20130601-20130630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2013-06-30'} -Dates in resampled not in raw: {'2013-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20130701-20130731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2013-07-30', '2013-07-31'} -Dates in resampled not in raw: {'2013-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20130801-20130831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2013-08-31'} -Dates in resampled not in raw: {'2013-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20130901-20130930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2013-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20131001-20131031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2013-10-31'} -Dates in resampled not in raw: {'2013-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20131101-20131130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2013-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20131201-20131231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2013-12-31'} -Dates in resampled not in raw: {'2013-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20140101-20140131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2014-01-31'} -Dates in resampled not in raw: {'2014-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20140201-20140228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2014-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20140301-20140331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2014-03-31', '2014-03-30'} -Dates in resampled not in raw: {'2014-02-30', '2014-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20140401-20140430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2014-04-29', '2014-04-30'} -Dates in resampled not in raw: {'2014-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20140501-20140531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2014-05-31', '2014-05-30'} -Dates in resampled not in raw: {'2014-04-29', '2014-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20140601-20140630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2014-06-30'} -Dates in resampled not in raw: {'2014-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20140701-20140731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2014-07-30', '2014-07-31'} -Dates in resampled not in raw: {'2014-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20140801-20140831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2014-08-31'} -Dates in resampled not in raw: {'2014-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20140901-20140930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2014-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20141001-20141031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2014-10-31'} -Dates in resampled not in raw: {'2014-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20141101-20141130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2014-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20141201-20141231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2014-12-31'} -Dates in resampled not in raw: {'2014-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20150101-20150131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2015-01-31'} -Dates in resampled not in raw: {'2015-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20150201-20150228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2015-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20150301-20150331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2015-03-30', '2015-03-31'} -Dates in resampled not in raw: {'2015-02-30', '2015-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20150401-20150430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2015-04-30', '2015-04-29'} -Dates in resampled not in raw: {'2015-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20150501-20150531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2015-05-30', '2015-05-31'} -Dates in resampled not in raw: {'2015-04-30', '2015-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20150601-20150630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2015-06-30'} -Dates in resampled not in raw: {'2015-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20150701-20150731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2015-07-30', '2015-07-31'} -Dates in resampled not in raw: {'2015-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20150801-20150831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2015-08-31'} -Dates in resampled not in raw: {'2015-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20150901-20150930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2015-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20151001-20151031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2015-10-31'} -Dates in resampled not in raw: {'2015-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20151101-20151130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2015-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20151201-20151231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2015-12-31'} -Dates in resampled not in raw: {'2015-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20160101-20160131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2016-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20160301-20160331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2016-03-31'} -Dates in resampled not in raw: {'2016-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20160401-20160430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2016-04-30'} -Dates in resampled not in raw: {'2016-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20160501-20160531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2016-05-31'} -Dates in resampled not in raw: {'2016-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20160601-20160630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2016-06-30'} -Dates in resampled not in raw: {'2016-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20160701-20160731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2016-07-31'} -Dates in resampled not in raw: {'2016-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20160801-20160831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2016-08-31'} -Dates in resampled not in raw: {'2016-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20161001-20161031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2016-10-31'} -Dates in resampled not in raw: {'2016-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20161201-20161231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2016-12-31'} -Dates in resampled not in raw: {'2016-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20170101-20170131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2017-01-31'} -Dates in resampled not in raw: {'2017-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20170201-20170228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2017-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20170301-20170331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2017-03-31', '2017-03-30'} -Dates in resampled not in raw: {'2017-02-29', '2017-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20170401-20170430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2017-04-30', '2017-04-29'} -Dates in resampled not in raw: {'2017-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20170501-20170531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2017-05-30', '2017-05-31'} -Dates in resampled not in raw: {'2017-04-30', '2017-04-29'} -File: tasmax_hadukgrid_uk_1km_day_20170601-20170630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2017-06-30'} -Dates in resampled not in raw: {'2017-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20170701-20170731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2017-07-30', '2017-07-31'} -Dates in resampled not in raw: {'2017-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20170801-20170831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2017-08-31'} -Dates in resampled not in raw: {'2017-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20170901-20170930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2017-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20171001-20171031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2017-10-31'} -Dates in resampled not in raw: {'2017-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20171101-20171130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2017-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20171201-20171231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2017-12-31'} -Dates in resampled not in raw: {'2017-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20180101-20180131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2018-01-31'} -Dates in resampled not in raw: {'2018-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20180201-20180228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2018-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20180301-20180331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2018-03-30', '2018-03-31'} -Dates in resampled not in raw: {'2018-02-29', '2018-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20180401-20180430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2018-04-29', '2018-04-30'} -Dates in resampled not in raw: {'2018-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20180501-20180531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2018-05-30', '2018-05-31'} -Dates in resampled not in raw: {'2018-04-29', '2018-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20180601-20180630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2018-06-30'} -Dates in resampled not in raw: {'2018-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20180701-20180731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2018-07-31', '2018-07-30'} -Dates in resampled not in raw: {'2018-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20180801-20180831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2018-08-31'} -Dates in resampled not in raw: {'2018-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20180901-20180930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2018-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20181001-20181031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2018-10-31'} -Dates in resampled not in raw: {'2018-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20181101-20181130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2018-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20181201-20181231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2018-12-31'} -Dates in resampled not in raw: {'2018-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20190101-20190131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2019-01-31'} -Dates in resampled not in raw: {'2019-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20190201-20190228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2019-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20190301-20190331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2019-03-30', '2019-03-31'} -Dates in resampled not in raw: {'2019-02-30', '2019-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20190401-20190430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2019-04-29', '2019-04-30'} -Dates in resampled not in raw: {'2019-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20190501-20190531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2019-05-30', '2019-05-31'} -Dates in resampled not in raw: {'2019-04-29', '2019-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20190601-20190630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2019-06-30'} -Dates in resampled not in raw: {'2019-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20190701-20190731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2019-07-31', '2019-07-30'} -Dates in resampled not in raw: {'2019-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20190801-20190831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2019-08-31'} -Dates in resampled not in raw: {'2019-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20190901-20190930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2019-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20191001-20191031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2019-10-31'} -Dates in resampled not in raw: {'2019-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20191101-20191130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2019-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20191201-20191231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2019-12-31'} -Dates in resampled not in raw: {'2019-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20200101-20200131.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2020-01-31'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20200301-20200331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2020-03-31'} -Dates in resampled not in raw: {'2020-02-30'} -File: tasmax_hadukgrid_uk_1km_day_20200401-20200430.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2020-04-30'} -Dates in resampled not in raw: {'2020-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20200501-20200531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2020-05-31'} -Dates in resampled not in raw: {'2020-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20200601-20200630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2020-06-30'} -Dates in resampled not in raw: {'2020-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20200701-20200731.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2020-07-31'} -Dates in resampled not in raw: {'2020-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20200801-20200831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2020-08-31'} -Dates in resampled not in raw: {'2020-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20201001-20201031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2020-10-31'} -Dates in resampled not in raw: {'2020-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20201201-20201231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2020-12-31'} -Dates in resampled not in raw: {'2020-11-30'} -File: tasmax_hadukgrid_uk_1km_day_20210101-20210131.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2021-01-31'} -Dates in resampled not in raw: {'2021-02-01'} -File: tasmax_hadukgrid_uk_1km_day_20210201-20210228.nc produced errors: -raw # days: 28 - resampled # days: 27 -Dates in raw not in resampled: {'2021-02-01'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20210301-20210331.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2021-03-31', '2021-03-30'} -Dates in resampled not in raw: {'2021-02-30', '2021-02-29'} -File: tasmax_hadukgrid_uk_1km_day_20210401-20210430.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2021-04-29', '2021-04-30'} -Dates in resampled not in raw: {'2021-03-30'} -File: tasmax_hadukgrid_uk_1km_day_20210501-20210531.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2021-05-31', '2021-05-30'} -Dates in resampled not in raw: {'2021-04-29', '2021-04-30'} -File: tasmax_hadukgrid_uk_1km_day_20210601-20210630.nc produced errors: -raw # days: 30 - resampled # days: 30 -Dates in raw not in resampled: {'2021-06-30'} -Dates in resampled not in raw: {'2021-05-30'} -File: tasmax_hadukgrid_uk_1km_day_20210701-20210731.nc produced errors: -raw # days: 31 - resampled # days: 30 -Dates in raw not in resampled: {'2021-07-30', '2021-07-31'} -Dates in resampled not in raw: {'2021-06-30'} -File: tasmax_hadukgrid_uk_1km_day_20210801-20210831.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2021-08-31'} -Dates in resampled not in raw: {'2021-07-30'} -File: tasmax_hadukgrid_uk_1km_day_20210901-20210930.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2021-09-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20211001-20211031.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2021-10-31'} -Dates in resampled not in raw: {'2021-09-30'} -File: tasmax_hadukgrid_uk_1km_day_20211101-20211130.nc produced errors: -raw # days: 30 - resampled # days: 29 -Dates in raw not in resampled: {'2021-11-30'} -Dates in resampled not in raw: set() -File: tasmax_hadukgrid_uk_1km_day_20211201-20211231.nc produced errors: -raw # days: 31 - resampled # days: 31 -Dates in raw not in resampled: {'2021-12-31'} -Dates in resampled not in raw: {'2021-11-30'} -______________________________ -missing dates: 0 -date '1980-03-30' appears 2 times. -date '1980-05-30' appears 2 times. -date '1980-07-30' appears 2 times. -date '1980-09-30' appears 2 times. -date '1980-11-30' appears 2 times. -date '1984-03-30' appears 2 times. -date '1984-05-30' appears 2 times. -date '1984-07-30' appears 2 times. -date '1984-09-30' appears 2 times. -date '1984-11-30' appears 2 times. -date '1988-03-30' appears 2 times. -date '1988-05-30' appears 2 times. -date '1988-07-30' appears 2 times. -date '1988-09-30' appears 2 times. -date '1988-11-30' appears 2 times. -date '1992-03-30' appears 2 times. -date '1992-05-30' appears 2 times. -date '1992-07-30' appears 2 times. -date '1992-09-30' appears 2 times. -date '1992-11-30' appears 2 times. -date '1996-03-30' appears 2 times. -date '1996-05-30' appears 2 times. -date '1996-07-30' appears 2 times. -date '1996-09-30' appears 2 times. -date '1996-11-30' appears 2 times. -date '2000-03-30' appears 2 times. -date '2000-05-30' appears 2 times. -date '2000-07-30' appears 2 times. -date '2000-09-30' appears 2 times. -date '2000-11-30' appears 2 times. -date '2004-03-30' appears 2 times. -date '2004-05-30' appears 2 times. -date '2004-07-30' appears 2 times. -date '2004-09-30' appears 2 times. -date '2004-11-30' appears 2 times. -date '2008-03-30' appears 2 times. -date '2008-05-30' appears 2 times. -date '2008-07-30' appears 2 times. -date '2008-09-30' appears 2 times. -date '2008-11-30' appears 2 times. -date '2012-03-30' appears 2 times. -date '2012-05-30' appears 2 times. -date '2012-07-30' appears 2 times. -date '2012-09-30' appears 2 times. -date '2012-11-30' appears 2 times. -date '2016-03-30' appears 2 times. -date '2016-05-30' appears 2 times. -date '2016-07-30' appears 2 times. -date '2016-09-30' appears 2 times. -date '2016-11-30' appears 2 times. -date '2020-03-30' appears 2 times. -date '2020-05-30' appears 2 times. -date '2020-07-30' appears 2 times. -date '2020-09-30' appears 2 times. -date '2020-11-30' appears 2 times. From 0813b87cad082ea50592310a449be93f927ff8ac Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 23 Jul 2024 14:41:25 +0100 Subject: [PATCH 58/92] fix: `hads` `cpm` alignment and `conda` `jupyter` deploy --- compose.yml | 4 +-- compose/jupyter/Dockerfile | 9 +++-- python/clim_recal/utils/data.py | 2 +- python/clim_recal/utils/xarray.py | 21 ++++++++--- python/tests/test_resample.py | 60 +++++++++++++++++++------------ 5 files changed, 64 insertions(+), 32 deletions(-) diff --git a/compose.yml b/compose.yml index 8373093a..30bc6d93 100644 --- a/compose.yml +++ b/compose.yml @@ -12,8 +12,8 @@ services: - NB_GID=100 - NB_GROUP=users - CHOWN_HOME=yes - - CHOWN_HOME_OPTS=-R - - JUPYTER_ENABLE_LAB=yes + # - CHOWN_HOME_OPTS=-R + # - JUPYTER_ENABLE_LAB=yes volumes: - .:/home/jovyan:rw diff --git a/compose/jupyter/Dockerfile b/compose/jupyter/Dockerfile index a3004da7..a878125b 100644 --- a/compose/jupyter/Dockerfile +++ b/compose/jupyter/Dockerfile @@ -27,6 +27,7 @@ RUN \ # Needed for write permission USER root +# build-essential is needed for pysqlite3 and gdal RUN sudo apt-get update && sudo apt-get install -y build-essential # First line changes a startup hook, which will activate the custom environment @@ -35,15 +36,19 @@ RUN \ echo conda activate "${env_name}" >> /etc/skel/.bashrc # Above line makes the custom environment default in Jupyter Terminals for all users which might be created later +COPY . . + RUN chown -R ${NB_USER} /home/${NB_USER} USER ${NB_UID} - +# pysqlite3 may no longer be included in the jupyter stack +# adding to fix, worth checking if necessary in future RUN conda update -n ${env_name} -y --all && \ conda install -n ${env_name} -y pysqlite3 -COPY . . +# Automate installing `pdm` dependencies +# RUN cd python && conda run -n ${env_name} pdm install # This makes the custom environment default in Jupyter Terminals for already existing NB_USER # Note this *doesn't* apply if simply using sh -c diff --git a/python/clim_recal/utils/data.py b/python/clim_recal/utils/data.py index de9a38f7..c67590de 100644 --- a/python/clim_recal/utils/data.py +++ b/python/clim_recal/utils/data.py @@ -147,7 +147,7 @@ def _method_dict(cls) -> dict[str, Resampling]: """Return the preferred aggregation method for each option.""" return { cls.TASMAX: Resampling.max, - cls.RAINFALL: Resampling.bilinear, + cls.RAINFALL: Resampling.average, cls.TASMIN: Resampling.min, } diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 5f84db20..285efd4c 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -73,6 +73,7 @@ GLASGOW_GEOM_ABSOLUTE_PATH: Final[Path] = ( climate_data_mount_path() / GLASGOW_GEOM_LOCAL_PATH ) +HADS_MIN_NULL: float = -1000000 # MONTH_DAY_DROP: DropDayType = {(1, 31), (4, 1), (6, 1), (8, 1), (10, 1), (12, 1)} # """A `set` of tuples of month and day numbers for `enforce_date_changes`.""" @@ -285,6 +286,7 @@ def xr_reproject_crs( match_xr_time_series_load_func: Callable | None = None, match_xr_time_series_load_kwargs: dict[str, Any] | None = None, resampling_method: Resampling = DEFAULT_RESAMPLING_METHOD, + nodata: float = np.nan, **kwargs, ) -> T_Dataset: """Reproject `source_xr` to `target_xr` coordinate structure. @@ -371,7 +373,7 @@ def xr_reproject_crs( ) if {"x", "y"} < match_xr_time_series.dims.keys(): logger.debug( - "Renaming dims: '{x_dim_name}' -> 'x', '{y_dim_name}' -> 'y'" + f"Renaming dims: '{x_dim_name}' -> 'x', '{y_dim_name}' -> 'y'" ) without_attributes = without_attributes.rename( {x_dim_name: "x", y_dim_name: "y"} @@ -379,11 +381,11 @@ def xr_reproject_crs( else: raise ValueError("Can't match dim names.") without_attributes_reprojected = without_attributes.rio.reproject_match( - match_xr_time_series, resampling=resampling_method.name, **kwargs + match_xr_time_series, resampling=resampling_method, nodata=nodata, **kwargs ) else: without_attributes_reprojected: T_DataArray = without_attributes.rio.reproject( - final_crs, resampling=resampling_method.name, **kwargs + final_crs, resampling=resampling_method, nodata=nodata, **kwargs ) return Dataset({variable_name: without_attributes_reprojected}) @@ -511,7 +513,6 @@ def hads_resample_and_reproject( y_dim_name: str = HADS_RAW_Y_COLUMN_NAME, ) -> T_Dataset: """Resample `HADs` `xarray` time series to 2.2km.""" - if isinstance(cpm_to_match, Dataset) and {"x", "y"} < cpm_to_match.dims.keys(): cpm_to_match_func = None epsg_277000_2_2km: T_Dataset = xr_reproject_crs( @@ -524,7 +525,17 @@ def hads_resample_and_reproject( resampling_method=VariableOptions.resampling_method(variable_name), # match_xr_time_series_load_kwargs=dict(variable_name=variable_name), ) - return epsg_277000_2_2km + + # Check if the minimum values should be NULL + min_value: float = epsg_277000_2_2km[variable_name].min() + if min_value < HADS_MIN_NULL: + logger.info(f"Setting '{variable_name}' values less than {min_value} as `nan`") + return epsg_277000_2_2km.where(epsg_277000_2_2km[variable_name] > min_value) + else: + logger.debug( + f"'{variable_name}' values less than {min_value} kept. 'HADS_MIN_NULL': {HADS_MIN_NULL}" + ) + return epsg_277000_2_2km def plot_xarray( diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 3ee2c7b6..76ee4335 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -92,28 +92,43 @@ ) -FINAL_HADS_JAN_10_430_X_230_250_Y: Final[NDArray] = np.array( +# FINAL_HADS_JAN_10_430_X_230_250_Y: Final[NDArray] = np.array( +# ( +# np.nan, +# np.nan, +# np.nan, +# np.nan, +# np.nan, +# np.nan, +# np.nan, +# np.nan, +# np.nan, +# np.nan, +# np.nan, +# 3.61614943, +# 3.22494448, +# 2.87045363, +# 2.62269053, +# 2.79705005, +# 2.73883926, +# 2.48555346, +# 2.46462528, +# 2.61303118, +# ) +# ) + +FINAL_HADS_JAN_10_430_X_200_210_Y: Final[NDArray] = np.array( ( np.nan, np.nan, np.nan, np.nan, - np.nan, - np.nan, - np.nan, - np.nan, - np.nan, - np.nan, - np.nan, - 3.61614943, - 3.22494448, - 2.87045363, - 2.62269053, - 2.79705005, - 2.73883926, - 2.48555346, - 2.46462528, - 2.61303118, + 7.57977839, + 7.47138044, + 7.27587694, + 7.27587694, + 7.07294578, + 7.04533059, ) ) @@ -688,8 +703,8 @@ def test_interpolate_coords( ) assert reprojected_xr_time_series.dims["time"] == 31 assert_allclose( - reprojected_xr_time_series.tasmax[10][430][230:250], - FINAL_HADS_JAN_10_430_X_230_250_Y, + reprojected_xr_time_series.tasmax[10][430][200:210], + FINAL_HADS_JAN_10_430_X_200_210_Y, ) if use_reference_grid: assert reprojected_xr_time_series.rio.crs == BRITISH_NATIONAL_GRID_EPSG @@ -717,6 +732,7 @@ def test_interpolate_coords( assert reprojected_xr_time_series.dims[y_col_name] == 651 +@pytest.mark.slow @pytest.mark.localcache @pytest.mark.mount def test_hads_resample_and_reproject( @@ -754,7 +770,7 @@ def test_hads_resample_and_reproject( time_stamp=True, ) assert_allclose( - read_from_export.tasmax[10][430][230:250], FINAL_HADS_JAN_10_430_X_230_250_Y + read_from_export.tasmax[10][430][200:210], FINAL_HADS_JAN_10_430_X_200_210_Y ) assert read_from_export.dims["time"] == 31 assert ( @@ -768,8 +784,8 @@ def test_hads_resample_and_reproject( assert all(cpm_to_match.x == read_from_export.x) assert all(cpm_to_match.y == read_from_export.y) assert ( - read_from_export.spatial_ref.attrs["GeoTransform"] - == cpm_to_match.spatial_ref.attrs["GeoTransform"] + read_from_export.spatial_ref.attrs["spatial_ref"] + == cpm_to_match.spatial_ref.attrs["spatial_ref"] ) From b6e9b951b06338fd04a91e57d60ab6a1f0f55574 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Wed, 24 Jul 2024 09:32:26 +0100 Subject: [PATCH 59/92] fix: set `--skip-cropping` `cli` to `False` --- python/clim_recal/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/clim_recal/cli.py b/python/clim_recal/cli.py index 856476c7..8769e1cf 100644 --- a/python/clim_recal/cli.py +++ b/python/clim_recal/cli.py @@ -50,7 +50,7 @@ def pipeline( skip_hads_projection: Annotated[ bool, typer.Option("--skip-hads-projection") ] = False, - skip_cropping: Annotated[bool, typer.Option("--skip-cropping")] = True, + skip_cropping: Annotated[bool, typer.Option("--skip-cropping")] = False, execute: Annotated[bool, typer.Option("--execute")] = False, start_index: Annotated[int, typer.Option("--start-index", "-s", min=0)] = 0, total: Annotated[int, typer.Option("--total-from-index", "-t", min=0)] = 0, From 5c608a06de6cc7b8c467319307d536e984040361 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Wed, 24 Jul 2024 09:40:20 +0100 Subject: [PATCH 60/92] fix: set `use_tqdm_progress_bar=False` for `CPM` --- python/clim_recal/utils/xarray.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 285efd4c..7eb5af73 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -249,12 +249,14 @@ def cpm_reproject_with_standard_calendar( cpm_xr_time_series, output_path=Path(temp_tif.name), format=GDALGeoTiffFormatStr, + use_tqdm_progress_bar=False, # Leaving this if further projection is needed # resampling_method=VariableOptions.resampling_method(variable=variable_name).name, ) gdal_translate_wrapper( input_path=Path(temp_tif.name), output_path=Path(temp_translated_ncf.name), + use_tqdm_progress_bar=False, # Leaving this if further projection is needed # resampling_method=VariableOptions.resampling_method(variable=variable_name).name, ) From 5877500f88b65cc008b50cff7b4e79bc6578a8e0 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Wed, 24 Jul 2024 12:59:53 +0100 Subject: [PATCH 61/92] feat: add `crop_cpm` and `crop_hads` options to `cli` --- python/clim_recal/cli.py | 4 ++++ python/clim_recal/pipeline.py | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/python/clim_recal/cli.py b/python/clim_recal/cli.py index 8769e1cf..05e18dfc 100644 --- a/python/clim_recal/cli.py +++ b/python/clim_recal/cli.py @@ -51,6 +51,8 @@ def pipeline( bool, typer.Option("--skip-hads-projection") ] = False, skip_cropping: Annotated[bool, typer.Option("--skip-cropping")] = False, + crop_cpm: Annotated[bool, typer.Option("--crop-cpm")] = True, + crop_hads: Annotated[bool, typer.Option("--crop-hads")] = True, execute: Annotated[bool, typer.Option("--execute")] = False, start_index: Annotated[int, typer.Option("--start-index", "-s", min=0)] = 0, total: Annotated[int, typer.Option("--total-from-index", "-t", min=0)] = 0, @@ -66,6 +68,8 @@ def pipeline( regions=region, methods=method, output_path=output_path, + crop_cpm=crop_cpm, + crop_hads=crop_hads, cpus=cpus, execute=execute, skip_cpm_standard_calendar_projection=skip_cpm_projection, diff --git a/python/clim_recal/pipeline.py b/python/clim_recal/pipeline.py index 1d0872b0..6c611fe1 100644 --- a/python/clim_recal/pipeline.py +++ b/python/clim_recal/pipeline.py @@ -168,8 +168,8 @@ def main( skip_cpm_standard_calendar_projection: bool = False, skip_hads_spatial_2k_projection: bool = False, skip_cropping: bool = True, - crop_cpm: bool = False, - crop_hads: bool = False, + crop_cpm: bool = True, + crop_hads: bool = True, cpus: int | None = None, multiprocess: bool = False, start_index: int = 0, @@ -290,7 +290,7 @@ def main( ) ) print(hads_resamplers[:print_range_length]) - if skip_cropping or (not crop_cpm and not crop_hads): + if skip_cropping or not crop_cpm or not crop_hads: print("Skipping cropping.") else: if skip_cpm_standard_calendar_projection and not crop_cpm: From ef069d5ac5ec6b62f90ab2310089c28de90cac97 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Wed, 24 Jul 2024 17:28:00 +0100 Subject: [PATCH 62/92] fix: use `range_crop_projection` in `pipeline.py` --- python/clim_recal/pipeline.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/clim_recal/pipeline.py b/python/clim_recal/pipeline.py index 6c611fe1..8dc973c1 100644 --- a/python/clim_recal/pipeline.py +++ b/python/clim_recal/pipeline.py @@ -298,8 +298,8 @@ def main( else: print(f"Cropping CPMs to regions {config.regions}: ...") cropped_cpm_resamplers: tuple[CPMResampler, ...] = ( - config.cpm_manager.execute_crop_resamples( - multiprocess=multiprocess, cpus=cpus + config.cpm_manager.range_crop_projection( + # multiprocess=multiprocess, cpus=cpus ) ) print(cropped_cpm_resamplers[:print_range_length]) @@ -310,8 +310,8 @@ def main( f"Cropping HADS 2.2km projections to regions {config.regions}: ..." ) cropped_hads_resamplers: tuple[CPMResampler, ...] = ( - config.hands_manager.execute_crop_resamples( - multiprocess=multiprocess, cpus=cpus + config.hads_manager.range_crop_projection( + # multiprocess=multiprocess, cpus=cpus ) ) print(cropped_hads_resamplers[:print_range_length]) From 885d8db593c18a66c2dd3e6eeb635189c44d93f4 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Mon, 2 Sep 2024 15:45:43 +0100 Subject: [PATCH 63/92] refactor: fix hads crs and crop configs --- compose.yml | 6 +- compose/jupyter/Dockerfile | 7 +- environment.yml | 1 + python/clim_recal/cli.py | 35 ++++- python/clim_recal/config.py | 91 +++++++++--- python/clim_recal/pipeline.py | 51 ++++--- python/clim_recal/resample.py | 236 ++++++++++++++++++++++++++---- python/clim_recal/utils/data.py | 6 +- python/clim_recal/utils/xarray.py | 20 ++- python/conftest.py | 23 ++- python/tests/test_pipeline.py | 11 +- python/tests/test_resample.py | 7 + 12 files changed, 387 insertions(+), 107 deletions(-) diff --git a/compose.yml b/compose.yml index 30bc6d93..3df8628b 100644 --- a/compose.yml +++ b/compose.yml @@ -6,14 +6,14 @@ services: dockerfile: ./compose/jupyter/Dockerfile ports: - "8888:8888" - user: root + # user: root environment: - NB_UID=1000 - NB_GID=100 - NB_GROUP=users - CHOWN_HOME=yes - # - CHOWN_HOME_OPTS=-R - # - JUPYTER_ENABLE_LAB=yes + - CHOWN_HOME_OPTS=-R + - JUPYTER_ENABLE_LAB=yes volumes: - .:/home/jovyan:rw diff --git a/compose/jupyter/Dockerfile b/compose/jupyter/Dockerfile index a878125b..e788ce5c 100644 --- a/compose/jupyter/Dockerfile +++ b/compose/jupyter/Dockerfile @@ -44,11 +44,8 @@ USER ${NB_UID} # pysqlite3 may no longer be included in the jupyter stack # adding to fix, worth checking if necessary in future -RUN conda update -n ${env_name} -y --all && \ - conda install -n ${env_name} -y pysqlite3 - -# Automate installing `pdm` dependencies -# RUN cd python && conda run -n ${env_name} pdm install +# RUN conda update -n ${env_name} -y --all && \ +# conda install -n ${env_name} -y pysqlite3 # This makes the custom environment default in Jupyter Terminals for already existing NB_USER # Note this *doesn't* apply if simply using sh -c diff --git a/environment.yml b/environment.yml index 67dbbaeb..c1ca6900 100644 --- a/environment.yml +++ b/environment.yml @@ -7,6 +7,7 @@ dependencies: # - r-quarto=1.4 - python=3.12 - gdal=3.8.5 + - pdm - parallel - rsync platforms: diff --git a/python/clim_recal/cli.py b/python/clim_recal/cli.py index 05e18dfc..8dfc7891 100644 --- a/python/clim_recal/cli.py +++ b/python/clim_recal/cli.py @@ -14,6 +14,7 @@ VariableOptions, ) from .pipeline import main +from .resample import RAW_CPM_PATH, RAW_HADS_PATH clim_recal = typer.Typer() @@ -23,6 +24,24 @@ @clim_recal.command() def pipeline( + hads_input_path: Annotated[ + Path, + typer.Option( + "--hads-input-path", + "-d", + file_okay=True, + dir_okay=True, + ), + ] = Path(RAW_HADS_PATH), + cpm_input_path: Annotated[ + Path, + typer.Option( + "--cpm-input-path", + "-o", + file_okay=True, + dir_okay=True, + ), + ] = Path(RAW_CPM_PATH), output_path: Annotated[ Path, typer.Option( @@ -32,7 +51,7 @@ def pipeline( variable: Annotated[list[VariableOptions], typer.Option("--variable", "-v")] = [ VariableOptions.default() ], - region: Annotated[list[RegionOptions], typer.Option("--region", "-c")] = [ + region: Annotated[list[RegionOptions], typer.Option("--region", "-a")] = [ RegionOptions.default() ], run: Annotated[list[RunOptions], typer.Option("--run", "-r")] = [ @@ -51,25 +70,25 @@ def pipeline( bool, typer.Option("--skip-hads-projection") ] = False, skip_cropping: Annotated[bool, typer.Option("--skip-cropping")] = False, - crop_cpm: Annotated[bool, typer.Option("--crop-cpm")] = True, - crop_hads: Annotated[bool, typer.Option("--crop-hads")] = True, + cpm_regions: Annotated[bool, typer.Option("--crop-cpm")] = True, + hads_regions: Annotated[bool, typer.Option("--crop-hads")] = True, execute: Annotated[bool, typer.Option("--execute")] = False, start_index: Annotated[int, typer.Option("--start-index", "-s", min=0)] = 0, total: Annotated[int, typer.Option("--total-from-index", "-t", min=0)] = 0, - cpus: Annotated[ - int, typer.Option("--cpus", "-p", min=1, max=MAX_CPUS) - ] = DEFAULT_CPUS, + cpus: Annotated[int, typer.Option("--cpus", min=1, max=MAX_CPUS)] = DEFAULT_CPUS, multiprocess: Annotated[bool, typer.Option("--use-multiprocessing")] = False, ) -> ClimRecalRunResultsType: """Run all or portions of UK climate projection debiasing methods.""" results: ClimRecalRunResultsType = main( + hads_input_path=hads_input_path, + cpm_input_path=cpm_input_path, variables=variable, runs=run, regions=region, methods=method, output_path=output_path, - crop_cpm=crop_cpm, - crop_hads=crop_hads, + cpm_regions=cpm_regions, + hads_regions=hads_regions, cpus=cpus, execute=execute, skip_cpm_standard_calendar_projection=skip_cpm_projection, diff --git a/python/clim_recal/config.py b/python/clim_recal/config.py index c0551edc..f6d625c7 100644 --- a/python/clim_recal/config.py +++ b/python/clim_recal/config.py @@ -7,15 +7,12 @@ from tqdm import TqdmExperimentalWarning, tqdm -from .debiasing.debias_wrapper import ( - BaseRunConfig, - RunConfig, - RunConfigType, - climate_data_mount_path, -) +from .debiasing.debias_wrapper import BaseRunConfig, RunConfig, RunConfigType from .resample import ( CPM_OUTPUT_LOCAL_PATH, HADS_OUTPUT_LOCAL_PATH, + RAW_CPM_PATH, + RAW_HADS_PATH, CPMResamplerManager, HADsResamplerManager, ) @@ -24,11 +21,12 @@ warnings.filterwarnings("ignore", category=TqdmExperimentalWarning) -DATA_PATH_DEFAULT: Final[Path] = climate_data_mount_path() +# DATA_PATH_DEFAULT: Final[Path] = climate_data_mount_path() DEFAULT_OUTPUT_PATH: Final[Path] = Path("clim-recal-runs") DEFAULT_RESAMPLE_FOLDER: Final[Path] = Path("resample") +DEFAULT_CROPS_FOLDER: Final[Path] = Path("crops") DEFAULT_CPUS: Final[int] = 2 @@ -55,7 +53,7 @@ class ClimRecalConfig(BaseRunConfig): runs Which model runs to include, eg. "01", "08", "11". regions - Which regions to crop data to. Future plans facilitate skipping to run for entire UK. + Which regions to crop both HADs and CPM data to. methods Which debiasing methods to apply. multiprocess @@ -66,10 +64,12 @@ class ClimRecalConfig(BaseRunConfig): `Path` to save all intermediate and final results to. resample_folder `Path` to append to `output_path` for resampling result files. - hads_folder - `Path` to append to `output_path` / `resample_folder` for resampling `HADs` files. - cpm_folder - `Path` to append to `output_path` / `resample_folder` for resampling `CPM` files. + crops_folder + `Path` to append to `output_path` for cropped resample files. + hads_output_folder + `Path` to append to `output_path` / `resample_folder` for resampling `HADs` files and to `output_path` / `crop_folder` for crops. + cpm_output_folder + `Path` to append to `output_path` / `resample_folder` for resampling `CPM` files and to `output_path` / `crop_folder` for crops. cpm_kwargs A `dict` of parameters to pass to a `CPMResamplerManager`. hads_kwargs @@ -96,22 +96,32 @@ class ClimRecalConfig(BaseRunConfig): methods: Sequence[MethodOptions] = (MethodOptions.default(),) multiprocess: bool = False cpus: int | None = DEFAULT_CPUS + hads_input_path: PathLike = RAW_HADS_PATH + cpm_input_path: PathLike = RAW_CPM_PATH output_path: PathLike = DEFAULT_OUTPUT_PATH resample_folder: PathLike = DEFAULT_RESAMPLE_FOLDER - hads_folder: PathLike = HADS_OUTPUT_LOCAL_PATH - cpm_folder: PathLike = CPM_OUTPUT_LOCAL_PATH + crops_folder: PathLike = DEFAULT_CROPS_FOLDER + hads_output_folder: PathLike = HADS_OUTPUT_LOCAL_PATH + cpm_output_folder: PathLike = CPM_OUTPUT_LOCAL_PATH cpm_kwargs: dict = field(default_factory=dict) hads_kwargs: dict = field(default_factory=dict) start_index: int = 0 stop_index: int | None = None add_local_dated_results_path: bool = True + add_local_dated_crops_path: bool = True local_dated_results_path_prefix: str = "run" + local_dated_crops_path_prefix: str = "crop" @property def resample_path(self) -> Path: """The resample_path property.""" return Path(self.exec_path) / self.resample_folder + @property + def crops_path(self) -> Path: + """The resample_path property.""" + return Path(self.exec_path) / self.crops_folder + @property def exec_path(self) -> Path: """Path to save preparation and intermediate files. @@ -119,10 +129,12 @@ def exec_path(self) -> Path: Examples -------- >>> print(clim_runner.exec_path) - clim-recal-runs/run... + + ...test-run-results.../run... >>> clim_runner.add_local_dated_results_path = False >>> print(clim_runner.exec_path) - clim-recal-runs + + ...test-run-results... """ if self.add_local_dated_results_path: assert self.dated_results_path @@ -137,7 +149,8 @@ def dated_results_path(self) -> Path | None: Examples -------- >>> print(clim_runner.dated_results_path) - clim-recal-runs/run... + + ...test-run-results.../run... >>> clim_runner.add_local_dated_results_path = False >>> print(clim_runner.dated_results_path) None @@ -149,15 +162,45 @@ def dated_results_path(self) -> Path | None: else: return None + @property + def dated_crops_path(self) -> Path | None: + """Return a time stamped path if `add_local_dated_crops_path` is `True`. + + Examples + -------- + >>> print(clim_runner.dated_crops_path) + + ...test-run-results.../crop... + >>> clim_runner.add_local_dated_crops_path = False + >>> print(clim_runner.dated_crops_path) + None + """ + if self.add_local_dated_crops_path: + return self.output_path / results_path( + self.local_dated_crops_path_prefix, mkdir=True + ) + else: + return None + @property def resample_hads_path(self) -> Path: """The resample_hads_path property.""" - return self.resample_path / self.hads_folder + return self.resample_path / self.hads_output_folder @property def resample_cpm_path(self) -> Path: """The resample_hads_path property.""" - return self.resample_path / self.cpm_folder + return self.resample_path / self.cpm_output_folder + + @property + def cropped_hads_path(self) -> Path: + """The resample_hads_path property.""" + return self.crops_path / self.hads_output_folder + + @property + def cropped_cpm_path(self) -> Path: + """The resample_cpm_path property.""" + return self.crops_path / self.cpm_output_folder def __post_init__(self) -> None: """Initiate related `HADs` and `CPM` managers. @@ -166,19 +209,23 @@ def __post_init__(self) -> None: ----- The variagles passed to `CPMResamplerManager` do not apply `VariableOptions.cpm_values()`, that occurs within `CPMResamplerManager` - for ease of coparability with HADs. + for ease of comparability with HADs. """ self.cpm_manager = CPMResamplerManager( + input_paths=self.cpm_input_path, variables=self.variables, runs=self.runs, - output_paths=self.resample_cpm_path, + resample_paths=self.resample_cpm_path, + crop_paths=self.crops_path, start_index=self.start_index, stop_index=self.stop_index, **self.cpm_kwargs, ) self.hads_manager = HADsResamplerManager( + input_paths=self.hads_input_path, variables=self.variables, - output_paths=self.resample_hads_path, + resample_paths=self.resample_hads_path, + crop_paths=self.crops_path, start_index=self.start_index, stop_index=self.stop_index, **self.hads_kwargs, diff --git a/python/clim_recal/pipeline.py b/python/clim_recal/pipeline.py index 8dc973c1..db043f14 100644 --- a/python/clim_recal/pipeline.py +++ b/python/clim_recal/pipeline.py @@ -147,7 +147,7 @@ RunOptions, VariableOptions, ) -from .resample import CPMResampler, HADsResampler +from .resample import RAW_CPM_PATH, RAW_HADS_PATH, CPMResampler, HADsResampler REPROJECTION_SHELL_SCRIPT: Final[Path] = Path("../bash/reproject_one.sh") REPROJECTION_WRAPPER_SHELL_SCRIPT: Final[Path] = Path("../bash/reproject_all.sh") @@ -155,6 +155,8 @@ def main( execute: bool = False, + hads_input_path: PathLike = RAW_HADS_PATH, + cpm_input_path: PathLike = RAW_CPM_PATH, output_path: PathLike = DEFAULT_OUTPUT_PATH, variables: Sequence[VariableOptions | str] = (VariableOptions.default(),), regions: Sequence[RegionOptions | str] | None = (RegionOptions.default(),), @@ -165,11 +167,10 @@ def main( default_runs: bool = False, all_runs: bool = False, all_methods: bool = False, - skip_cpm_standard_calendar_projection: bool = False, - skip_hads_spatial_2k_projection: bool = False, - skip_cropping: bool = True, - crop_cpm: bool = True, + hads_projection: bool = False, + cpm_projection: bool = False, crop_hads: bool = True, + crop_cpm: bool = True, cpus: int | None = None, multiprocess: bool = False, start_index: int = 0, @@ -177,7 +178,7 @@ def main( total: int | None = None, print_range_length: int | None = 5, **kwargs, -) -> ClimRecalRunResultsType: +) -> ClimRecalRunResultsType | None: """Run all elements of the pipeline. Parameters @@ -210,7 +211,6 @@ def main( The default parameters here are meant to reflect the entire workflow process to ease reproducibility. - Examples -------- @@ -243,8 +243,9 @@ def main( f"'stop_index': {stop_index} set from 'total': {total} and 'start_index': {start_index}." ) variables = VariableOptions.all() if all_variables else tuple(variables) - assert regions # In future there will be support for skipping region cropping - regions = RegionOptions.all() if all_regions else tuple(regions) + regions = ( + RegionOptions.all() if all_regions else tuple(regions) if regions else None + ) methods = MethodOptions.all() if all_methods else tuple(methods) if all_runs: runs = RunOptions.all() @@ -254,6 +255,8 @@ def main( runs = tuple(runs) config: ClimRecalConfig = ClimRecalConfig( + cpm_input_path=cpm_input_path, + hads_input_path=hads_input_path, output_path=output_path, variables=variables, regions=regions, @@ -270,7 +273,7 @@ def main( print(config.cpm_manager) print(config.hads_manager) if execute: - if skip_cpm_standard_calendar_projection: + if not cpm_projection: print("Skipping CPM Strandard Calendar projection.") else: print("Running CPM Standard Calendar projection...") @@ -280,7 +283,9 @@ def main( ) ) print(cpm_resamplers[:print_range_length]) - if skip_hads_spatial_2k_projection: + # Leaving assert to remind ease for debugging in future + # assert False + if not hads_projection: print("Skipping HADs aggregation to 2.2km spatial units.") else: print("Running HADs aggregation to 2.2km spatial units...") @@ -290,31 +295,31 @@ def main( ) ) print(hads_resamplers[:print_range_length]) - if skip_cropping or not crop_cpm or not crop_hads: - print("Skipping cropping.") + if not crop_hads and not crop_cpm: + print("Skipping region cropping.") else: - if skip_cpm_standard_calendar_projection and not crop_cpm: + if not crop_cpm: print("Skipping cropping CPM Standard Calendar projections.") else: print(f"Cropping CPMs to regions {config.regions}: ...") - cropped_cpm_resamplers: tuple[CPMResampler, ...] = ( - config.cpm_manager.range_crop_projection( - # multiprocess=multiprocess, cpus=cpus + region_cropped_cpm_resamples: tuple[CPMResampler, ...] = ( + config.cpm_manager.execute_region_crop_configs( + multiprocess=multiprocess, cpus=cpus ) ) - print(cropped_cpm_resamplers[:print_range_length]) - if skip_cpm_standard_calendar_projection and not crop_hads: + print(region_cropped_cpm_resamples[:print_range_length]) + if not hads_regions: print("Skipping cropping HADS 2.2km projections.") else: print( f"Cropping HADS 2.2km projections to regions {config.regions}: ..." ) - cropped_hads_resamplers: tuple[CPMResampler, ...] = ( - config.hads_manager.range_crop_projection( - # multiprocess=multiprocess, cpus=cpus + region_cropped_hads_resamples: tuple[CPMResampler, ...] = ( + config.hads_manager.execute_region_crop_configs( + multiprocess=multiprocess, cpus=cpus ) ) - print(cropped_hads_resamplers[:print_range_length]) + print(region_cropped_hads_resamples[:print_range_length]) else: print("No steps run. Add '--execute' to run steps.") diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index 8c16375e..64938f93 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -52,12 +52,17 @@ CFCalendarSTANDARD: Final[str] = "standard" RESAMPLING_OUTPUT_PATH: Final[PathLike] = ( - CLIMATE_DATA_MOUNT_PATH / "Raw/python_refactor/" + CLIMATE_DATA_MOUNT_PATH / "CPM-365/andys-two-gdal-step-approach/resample" +) +CROP_OUTPUT_PATH: Final[PathLike] = ( + CLIMATE_DATA_MOUNT_PATH / "CPM-365/andys-two-gdal-step-approach/crop" ) RAW_HADS_PATH: Final[PathLike] = CLIMATE_DATA_MOUNT_PATH / "Raw/HadsUKgrid" RAW_CPM_PATH: Final[PathLike] = CLIMATE_DATA_MOUNT_PATH / "Raw/UKCP2.2" RAW_HADS_TASMAX_PATH: Final[PathLike] = RAW_HADS_PATH / "tasmax/day" RAW_CPM_TASMAX_PATH: Final[PathLike] = RAW_CPM_PATH / "tasmax/01/latest" + +# TODO: remove REPROJECTED_CPM_TASMAX_05_LATEST_INPUT_PATH REPROJECTED_CPM_TASMAX_05_LATEST_INPUT_PATH: Final[PathLike] = Path( CLIMATE_DATA_MOUNT_PATH / "Reprojected_infill/UKCP2.2/tasmax/05/latest" ) @@ -301,6 +306,10 @@ def execute(self, skip_spatial: bool = False, **kwargs) -> list[Path] | None: """Run all steps for processing""" return self.range_to_reprojection(**kwargs) if not skip_spatial else None + def execute_crops(self, skip_crop: bool = False, **kwargs) -> list[Path] | None: + """Run all specified crops.""" + return self.range_crop_projection(**kwargs) if not skip_crop else None + def _sync_reprojected_paths( self, overwrite_output_path: PathLike | None = None ) -> None: @@ -646,7 +655,7 @@ class HADsResamplerManager: ---------- input_paths `Path` or `Paths` to `CPM` files to process. If `Path`, will be propegated with files matching - output_paths + resample_paths `Path` or `Paths` to to save processed `CPM` files to. If `Path` will be propagated to match `input_paths`. variables Which `VariableOptions` to include. @@ -661,17 +670,19 @@ class HADsResamplerManager: ... pytest.skip(mount_doctest_skip_message) >>> hads_resampler_manager: HADsResamplerManager = HADsResamplerManager( ... variables=VariableOptions.all(), - ... output_paths=resample_test_hads_output_path, + ... resample_paths=resample_test_hads_output_path, ... ) >>> hads_resampler_manager """ input_paths: PathLike | Sequence[PathLike] = RAW_HADS_PATH - output_paths: PathLike | Sequence[PathLike] = ( + resample_paths: PathLike | Sequence[PathLike] = ( RESAMPLING_OUTPUT_PATH / HADS_OUTPUT_LOCAL_PATH ) variables: Sequence[VariableOptions | str] = (VariableOptions.default(),) + crop_regions: tuple[RegionOptions | str, ...] | None = RegionOptions.all() + crop_paths: PathLike = RESAMPLING_OUTPUT_PATH / HADS_CROP_OUTPUT_LOCAL_PATH sub_path: Path = Path("day") start_index: int = 0 stop_index: int | None = None @@ -681,7 +692,11 @@ class HADsResamplerManager: config_default_kwargs: dict[str, Any] = field(default_factory=dict) resampler_class: type[HADsResampler] = HADsResampler cpus: int | None = None - _var_path_dict: dict[VariableOptions | str, Sequence[Path]] = field( + _var_path_dict: dict[PathLike, VariableOptions | str] = field(default_factory=dict) + _var_resampled_path_dict: dict[PathLike, VariableOptions | str] = field( + default_factory=dict + ) + _var_cropped_path_dict: dict[PathLike, VariableOptions | str] = field( default_factory=dict ) _strict_fail_if_var_in_input_path: bool = True @@ -708,13 +723,21 @@ def input_folder(self) -> Path | None: return None @property - def output_folder(self) -> Path | None: - """Return `self._output_path` set by `set_output_paths()`.""" + def resample_folder(self) -> Path | None: + """Return `self._output_path` set by `set_resample_paths()`.""" if hasattr(self, "_input_path"): return Path(self._input_path) else: return None + @property + def crop_folder(self) -> Path | None: + """Return `self._output_path` set by `set_resample_paths()`.""" + if hasattr(self, "_crop_path"): + return Path(self._crop_path) + else: + return None + def __repr__(self) -> str: """Summary of `self` configuration as a `str`.""" return ( @@ -723,10 +746,12 @@ def __repr__(self) -> str: f"input_paths_count={len(self.input_paths) if isinstance(self.input_paths, Sequence) else 1})>" ) - def _gen_folder_paths( - self, path: PathLike, append_var_path_dict: bool = False + def _gen_input_folder_paths( + self, + path: PathLike, + append_var_path_dict: bool = False, ) -> Iterator[Path]: - """Return a Generator of paths of `self.variables` and `self.runs`.""" + """Yield input paths of `self.variables` and `self.runs`.""" var_path: Path for var in self.variables: var_path = Path(path) / var / self.sub_path @@ -734,15 +759,57 @@ def _gen_folder_paths( self._var_path_dict[var_path] = var yield var_path - def check_paths(self, run_set_data_paths: bool = True): + def _gen_resample_folder_paths( + self, + path: PathLike, + append_resampled_path_dict: bool = False, + ) -> Iterator[Path]: + """Yield paths of resampled `self.variables` and `self.runs`.""" + var_path: Path + for var in self.variables: + var_path = Path(path) / var + # Originally used to managed input_data paths like "latest" + # Likely unneeded since _gen_input_folder_paths added + # if input_sub_path: + # var_path /= self.sub_path + if append_resampled_path_dict: + self._var_resampled_path_dict[var_path] = var + yield var_path + + def _gen_crop_folder_paths( + self, path: PathLike, append_var_cropped_path_dict: bool = False + ) -> Iterator[Path]: + """Return a Generator of paths of `self.variables` and `self.crops`.""" + var_path: Path + for var in self.variables: + for region in self.crop_regions: + var_path = Path(path) / var / region + if append_var_cropped_path_dict: + self._var_cropped_path_dict[var_path] = var + # Todo: remove below when crop testing complete + # self._var_cropped_path_dict[var].append(var_path) + yield var_path + + def check_paths( + self, run_set_data_paths: bool = True, run_set_crop_paths: bool = True + ): """Check if all `self.input_paths` exist.""" if run_set_data_paths: self.set_input_paths() - self.set_output_paths() + self.set_resample_paths() + if run_set_crop_paths: + self.set_crop_paths() assert isinstance(self.input_paths, Iterable) - assert isinstance(self.output_paths, Iterable) - assert len(self.input_paths) == len(self.output_paths) + assert isinstance(self.resample_paths, Iterable) + if self.crop_paths: + try: + assert isinstance(self.crop_paths, Iterable) + except AssertionError: + raise ValueError( + f"'crop_paths' not iterable for {self}. Hint: try setting 'run_set_crop_paths' to 'True'." + ) + assert len(self.input_paths) == len(self.resample_paths) for path in self.input_paths: try: assert Path(path).exists() @@ -767,7 +834,9 @@ def set_input_paths(self): if isinstance(self.input_paths, PathLike): self._input_path = self.input_paths self.input_paths = tuple( - self._gen_folder_paths(self.input_paths, append_var_path_dict=True) + self._gen_input_folder_paths( + self.input_paths, append_var_path_dict=True + ) ) if self._strict_fail_if_var_in_input_path: for var in self.variables: @@ -780,21 +849,56 @@ def set_input_paths(self): f"set '_strict_fail_if_var_in_input_path' to 'False'." ) - def set_output_paths(self): - """Propagate `self.output_paths` if needed.""" - if isinstance(self.output_paths, PathLike): - self._output_path = self.output_paths - self.output_paths = tuple(self._gen_folder_paths(self.output_paths)) + def set_resample_paths(self): + """Propagate `self.resample_paths` if needed.""" + if isinstance(self.resample_paths, PathLike): + self._output_path = self.resample_paths + self.resample_paths = tuple( + self._gen_resample_folder_paths( + self.resample_paths, append_resampled_path_dict=True + ) + ) + + def set_crop_paths(self): + """Propagate `self.resample_paths` if needed.""" + if isinstance(self.crop_paths, PathLike): + self._crop_path = self.crop_paths + self.crop_paths = tuple( + self._gen_crop_folder_paths( + self.crop_paths, append_var_cropped_path_dict=True + ) + ) def yield_configs(self) -> Iterable[HADsResampler]: """Generate a `CPMResampler` or `HADsResampler` for `self.input_paths`.""" self.check_paths() assert isinstance(self.input_paths, Iterable) - assert isinstance(self.output_paths, Iterable) + assert isinstance(self.resample_paths, Iterable) + for index, var_path in enumerate(self._var_path_dict.items()): + for crop_path, region in self._var_cropped_path_dict.items(): + yield self.resampler_class( + input_path=var_path[0], + output_path=self.resample_paths[index], + variable_name=var_path[1], + start_index=self.start_index, + stop_index=self.stop_index, + crop_path=crop_path, + # Todo: remove below if single crop configs iterate over all + # crop_regions=self.crop_regions, + crop_regions=(region,), + **self.config_default_kwargs, + ) + + # + def yield_crop_configs(self) -> Iterable[HADsResampler]: + """Generate a `CPMResampler` or `HADsResampler` for `self.input_paths`.""" + self.check_paths() + assert isinstance(self.resample_paths, Iterable) + assert isinstance(self.crop_path, Iterable) for index, var_path in enumerate(self._var_path_dict.items()): yield self.resampler_class( input_path=var_path[0], - output_path=self.output_paths[index], + output_path=self.resample_paths[index], variable_name=var_path[1], start_index=self.start_index, stop_index=self.stop_index, @@ -858,6 +962,37 @@ def execute_resample_configs( results.append(resampler.execute()) return resamplers + def execute_crop_configs( + self, multiprocess: bool = False, cpus: int | None = None + ) -> tuple[CPMResampler | HADsResampler, ...]: + """Run all resampler configurations + + Parameters + ---------- + multiprocess + If `True` run parameters in `resample_configs` with `multiprocess_execute`. + cpus + Number of `cpus` to pass to `multiprocess_execute`. + """ + croppers: tuple[CPMResampler | HADsResampler, ...] = tuple( + self.yield_configs( + input_path=self.resample_paths, output_path=self.crop_path + ) + ) + results: list[list[Path] | None] = [] + if multiprocess: + cpus = cpus or self.cpus + if self.total_cpus and cpus: + cpus = min(cpus, self.total_cpus - 1) + results = multiprocess_execute( + croppers, method_name="execute_crops", cpus=cpus + ) + else: + for cropper in croppers: + print(cropper) + results.append(cropper.execute_crops()) + return croppers + @dataclass(kw_only=True, repr=False) class CPMResamplerManager(HADsResamplerManager): @@ -868,8 +1003,8 @@ class CPMResamplerManager(HADsResamplerManager): >>> if not is_data_mounted: ... pytest.skip(mount_doctest_skip_message) >>> cpm_resampler_manager: CPMResamplerManager = CPMResamplerManager( - ... stop_index=10, - ... output_paths=resample_test_cpm_output_path, + ... stop_index=9, + ... resample_paths=resample_test_cpm_output_path, ... ) >>> cpm_resampler_manager str: f"input_paths_count={len(self.input_paths) if isinstance(self.input_paths, Sequence) else 1})>" ) - def _gen_folder_paths( + def _gen_input_folder_paths( self, path: PathLike, append_var_path_dict: bool = False, cpm_paths: bool = True ) -> Iterator[Path]: - """Return a Generator of paths of `self.variables` and `self.runs`.""" + """Yield input paths of `self.variables` and `self.runs`.""" var_path: Path for var in self.variables: for run_type in self.runs: @@ -936,4 +1072,50 @@ def _gen_folder_paths( var_path: Path = Path(path) / var / run_type / self.sub_path if append_var_path_dict: self._var_path_dict[var_path] = var + # Todo: remove below once testing confirms _var_path_dict works + # self._var_path_dict[var].append(var_path) yield var_path + + def _gen_resample_folder_paths( + self, + path: PathLike, + append_resampled_path_dict: bool = False, + cpm_paths: bool = True, + ) -> Iterator[Path]: + """Return a Generator of paths of `self.variables` and `self.runs`.""" + var_path: Path + for var in self.variables: + for run_type in self.runs: + if cpm_paths: + var_path: Path = ( + Path(path) / VariableOptions.cpm_value(var) / run_type + ) + else: + var_path: Path = Path(path) / var / run_type + if append_resampled_path_dict: + self._var_resampled_path_dict[var_path] = var + yield var_path + + def _gen_crop_folder_paths( + self, + path: PathLike, + append_var_cropped_path_dict: bool = False, + cpm_paths: bool = True, + ) -> Iterator[Path]: + """Return a Generator of paths of `self.variables` and `self.crops`.""" + var_path: Path + for var in self.variables: + for region in self.crop_regions: + for run_type in self.runs: + if cpm_paths: + var_path: Path = ( + Path(path) + / VariableOptions.cpm_value(var) + / region + / run_type + ) + else: + var_path: Path = Path(path) / var / region / run_type + if append_var_cropped_path_dict: + self._var_cropped_path_dict[var_path] = var + yield var_path diff --git a/python/clim_recal/utils/data.py b/python/clim_recal/utils/data.py index c67590de..b5bed3e5 100644 --- a/python/clim_recal/utils/data.py +++ b/python/clim_recal/utils/data.py @@ -14,7 +14,7 @@ BRITISH_NATION_GRID_COORDS_NUMBER: Final[int] = 27700 BRITISH_NATIONAL_GRID_EPSG: Final[str] = f"EPSG:{BRITISH_NATION_GRID_COORDS_NUMBER}" -DEFAULT_RESAMPLING_METHOD: Final[Resampling] = Resampling.bilinear +DEFAULT_RESAMPLING_METHOD: Final[Resampling] = Resampling.average AuthorshipType = Union[ str | tuple[str, ...], dict[str, str] | @@ -169,11 +169,11 @@ def resampling_method(cls, variable: str | None) -> Resampling: Examples -------- >>> VariableOptions.resampling_method('rainfall') - + >>> VariableOptions.resampling_method('tasmin') >>> VariableOptions.resampling_method(None) - + """ return cls._method_dict()[variable.lower()] if variable else cls.default_resample_method() diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 7eb5af73..5ef28af9 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -389,7 +389,8 @@ def xr_reproject_crs( without_attributes_reprojected: T_DataArray = without_attributes.rio.reproject( final_crs, resampling=resampling_method, nodata=nodata, **kwargs ) - return Dataset({variable_name: without_attributes_reprojected}) + final_dataset: T_Dataset = Dataset({variable_name: without_attributes_reprojected}) + return final_dataset.rio.write_crs(BRITISH_NATIONAL_GRID_EPSG) def _ensure_resample_method_name( @@ -525,19 +526,26 @@ def hads_resample_and_reproject( match_xr_time_series=cpm_to_match, match_xr_time_series_load_func=cpm_to_match_func, resampling_method=VariableOptions.resampling_method(variable_name), + # Check if the following line is needed # match_xr_time_series_load_kwargs=dict(variable_name=variable_name), ) + final_epsg_277000_2_2km: T_Dataset + # Check if the minimum values should be NULL min_value: float = epsg_277000_2_2km[variable_name].min() + if min_value < HADS_MIN_NULL: logger.info(f"Setting '{variable_name}' values less than {min_value} as `nan`") - return epsg_277000_2_2km.where(epsg_277000_2_2km[variable_name] > min_value) + final_epsg_277000_2_2km = epsg_277000_2_2km.where( + epsg_277000_2_2km[variable_name] > min_value + ) else: logger.debug( - f"'{variable_name}' values less than {min_value} kept. 'HADS_MIN_NULL': {HADS_MIN_NULL}" + f"Keeping '{variable_name}' values less than {min_value}. 'HADS_MIN_NULL': {HADS_MIN_NULL}" ) - return epsg_277000_2_2km + final_epsg_277000_2_2km = epsg_277000_2_2km + return final_epsg_277000_2_2km.rio.write_crs(BRITISH_NATIONAL_GRID_EPSG) def plot_xarray( @@ -1203,10 +1211,6 @@ def generate_360_to_standard(array_to_expand: T_DataArray) -> T_DataArray: """Return `array_to_expand` 360 days expanded to 365 or 366 days. This may be dropped if `cpm_reproject_with_standard_calendar` is successful. - - Examples - -------- - >>> """ initial_days: int = len(array_to_expand) assert initial_days == 360 diff --git a/python/conftest.py b/python/conftest.py index cf22f595..c3c207c0 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -1,5 +1,6 @@ import asyncio from argparse import BooleanOptionalAction +from os import PathLike from pathlib import Path from pprint import pprint from shutil import copytree, rmtree @@ -381,21 +382,33 @@ def clim_runner( tmp_path: Path, local_cache: bool, local_cache_fixtures: LocalCachesManager, + test_runs_output_path: PathLike, + local_hads_cache_path: PathLike, + local_cpm_cache_path: PathLike, ) -> ClimRecalConfig: """Return default `ClimRecalConfig`.""" assert local_cache_fixtures.default_local_cache_path assert local_cache_fixtures.check_default_cache_path() + regions: tuple[RegionOptions, RegionOptions] = ( + RegionOptions.GLASGOW, + RegionOptions.MANCHESTER, + ) try: + # Todo: refactor to more easily specify `local_cache` + assert not local_cache return ClimRecalConfig( preprocess_out_folder=tmp_path, - regions=(RegionOptions.GLASGOW, RegionOptions.MANCHESTER), + regions=regions, + output_path=test_runs_output_path, ) - except FileExistsError: + except (FileExistsError, AssertionError): return ClimRecalConfig( preprocess_out_folder=tmp_path, - regions=(RegionOptions.GLASGOW, RegionOptions.MANCHESTER), - hads_folder=local_cache_fixtures.default_local_cache_path, - cpm_folder=local_cache_fixtures.default_local_cache_path, + regions=regions, + output_path=test_runs_output_path, + hads_input_path=local_hads_cache_path, + cpm_input_path=local_cpm_cache_path, + # Todo: refactor to use caching to speed up runs cpm_kwargs=dict(_allow_check_fail=True), hads_kwargs=dict(_allow_check_fail=True), ) diff --git a/python/tests/test_pipeline.py b/python/tests/test_pipeline.py index 4cdecbe8..e9398cfe 100644 --- a/python/tests/test_pipeline.py +++ b/python/tests/test_pipeline.py @@ -35,15 +35,19 @@ def test_climate_data_mount_path() -> None: ) @pytest.mark.parametrize("multiprocess", (True, False)) @pytest.mark.parametrize("variables", (("rainfall",), ("rainfall", "tasmax"))) +@pytest.mark.parametrize("regions", ("Glasgow", None)) def test_main( execute: bool, variables: tuple[str], test_runs_output_path: Path, multiprocess: bool, + regions: str | tuple[str] | None, capsys, ) -> None: """Test running pipeline configurations.""" - run_folder_name: str = f"{'-'.join(variables)}-multi-{multiprocess}" + run_folder_name: str = ( + f"{'-'.join(variables)}" f"-multi-{multiprocess}" f"-crop-regions-{regions}" + ) if execute: run_folder_name = "executed-" + run_folder_name output_path: Path = test_runs_output_path / run_folder_name @@ -52,8 +56,9 @@ def test_main( execute=execute, variables=variables, output_path=output_path, - skip_hads_spatial_2k_projection=True, - skip_cpm_standard_calendar_projection=False, + hads_projection=True, + cpm_projection=False, + regions=regions, stop_index=1, cpus=2, multiprocess=multiprocess, diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 76ee4335..d6d1586b 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -742,6 +742,7 @@ def test_hads_resample_and_reproject( variable_name: str = "tasmax" output_path: Path = Path("tests/runs/reample-hads") # First index is for month, in this case January 1980 + # The following could be replaced by a cached fixture cpm_to_match: T_Dataset = cpm_reproject_with_standard_calendar(tasmax_cpm_1980_raw) plot_xarray( tasmax_hads_1980_raw.tasmax[0], @@ -781,6 +782,12 @@ def test_hads_resample_and_reproject( ) # replaces projection_y_coordinate assert reprojected.rio.crs == read_from_export.rio.crs == BRITISH_NATIONAL_GRID_EPSG # Check projection coordinates match for CPM and HADs + assert ( + reprojected.tasmax.rio.crs + == read_from_export.tasmax.rio.crs + == BRITISH_NATIONAL_GRID_EPSG + ) + # Check projection coordinates are set at the variable level assert all(cpm_to_match.x == read_from_export.x) assert all(cpm_to_match.y == read_from_export.y) assert ( From d8e94aae7f9d04762445612cd5ee14e5b79f8922 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 3 Sep 2024 15:03:10 +0100 Subject: [PATCH 64/92] doc: add downloads landing page --- docs/download.qmd | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 docs/download.qmd diff --git a/docs/download.qmd b/docs/download.qmd new file mode 100644 index 00000000..b91f0ded --- /dev/null +++ b/docs/download.qmd @@ -0,0 +1,10 @@ +--- +title: "Dataset Links" +format: html +--- + +Thanks for your interest in `clim-recal` data and metrics. We plan to release a set of combined observation and simulation datasets for three cities in the UK and invite authors of bias correction methods to benchmark their methods for those cities. + +We are still completing this work. As soon as the data are ready for publication, we will update this page with information on how to access them - check back soon. + +In the meantime, please check [our blog article](https://urban-analytics-technology-platform.github.io/blog/platform_v2_release/) describing this work. From 1296aa915d98d58d9dc1c9ee84be20a94f310524 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 3 Sep 2024 15:04:54 +0100 Subject: [PATCH 65/92] fix: `docker` `jupyter` config, `cli` options and setup doc --- compose/jupyter/Dockerfile | 13 +++++++------ python/clim_recal/cli.py | 26 +++++++++++--------------- setup-instructions.md | 20 ++++++++++++++++++-- 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/compose/jupyter/Dockerfile b/compose/jupyter/Dockerfile index e788ce5c..775adaa9 100644 --- a/compose/jupyter/Dockerfile +++ b/compose/jupyter/Dockerfile @@ -28,17 +28,14 @@ RUN \ USER root # build-essential is needed for pysqlite3 and gdal -RUN sudo apt-get update && sudo apt-get install -y build-essential +# RUN sudo apt-get update && sudo apt-get install -y build-essential # First line changes a startup hook, which will activate the custom environment -RUN \ - echo conda activate "${env_name}" >> /usr/local/bin/before-notebook.d/10activate-conda-env.sh && \ - echo conda activate "${env_name}" >> /etc/skel/.bashrc -# Above line makes the custom environment default in Jupyter Terminals for all users which might be created later +# RUN echo conda activate "${env_name}" >> /usr/local/bin/before-notebook.d/10activate-conda-env.sh COPY . . -RUN chown -R ${NB_USER} /home/${NB_USER} +RUN chown -R ${NB_USER}:${NB_GID} /home/${NB_USER} USER ${NB_UID} @@ -46,7 +43,11 @@ USER ${NB_UID} # adding to fix, worth checking if necessary in future # RUN conda update -n ${env_name} -y --all && \ # conda install -n ${env_name} -y pysqlite3 +# RUN conda install -n ${env_name} -y pysqlite3 # This makes the custom environment default in Jupyter Terminals for already existing NB_USER # Note this *doesn't* apply if simply using sh -c RUN echo conda activate "${env_name}" >> "/home/${NB_USER}/.bashrc" +# RUN echo export activate "${env_name}" >> "/home/${NB_USER}/.bashrc" +# RUN export _PYPROJECT_HOOKS_BUILD_BACKEND=/home/${NB_USER}/.local/bin/pdm +# RUN cd python && conda run -n ${env_name} pdm install -v diff --git a/python/clim_recal/cli.py b/python/clim_recal/cli.py index 8dfc7891..99bb551e 100644 --- a/python/clim_recal/cli.py +++ b/python/clim_recal/cli.py @@ -65,21 +65,18 @@ def pipeline( all_runs: Annotated[bool, typer.Option("--all-runs")] = False, default_runs: Annotated[bool, typer.Option("--default-runs")] = False, all_methods: Annotated[bool, typer.Option("--all-methods")] = False, - skip_cpm_projection: Annotated[bool, typer.Option("--skip-cpm-projection")] = False, - skip_hads_projection: Annotated[ - bool, typer.Option("--skip-hads-projection") - ] = False, - skip_cropping: Annotated[bool, typer.Option("--skip-cropping")] = False, - cpm_regions: Annotated[bool, typer.Option("--crop-cpm")] = True, - hads_regions: Annotated[bool, typer.Option("--crop-hads")] = True, + cpm_projection: Annotated[bool, typer.Option("--project-cpm")] = True, + hads_projection: Annotated[bool, typer.Option("--project-hads")] = True, + crop_hads: Annotated[bool, typer.Option("--crop-cpm")] = True, + crop_cpm: Annotated[bool, typer.Option("--crop-hads")] = True, execute: Annotated[bool, typer.Option("--execute")] = False, start_index: Annotated[int, typer.Option("--start-index", "-s", min=0)] = 0, total: Annotated[int, typer.Option("--total-from-index", "-t", min=0)] = 0, cpus: Annotated[int, typer.Option("--cpus", min=1, max=MAX_CPUS)] = DEFAULT_CPUS, multiprocess: Annotated[bool, typer.Option("--use-multiprocessing")] = False, -) -> ClimRecalRunResultsType: - """Run all or portions of UK climate projection debiasing methods.""" - results: ClimRecalRunResultsType = main( +) -> ClimRecalRunResultsType | None: + """Crop and align UK climate projections and test debias methods.""" + results: ClimRecalRunResultsType | None = main( hads_input_path=hads_input_path, cpm_input_path=cpm_input_path, variables=variable, @@ -87,13 +84,12 @@ def pipeline( regions=region, methods=method, output_path=output_path, - cpm_regions=cpm_regions, - hads_regions=hads_regions, cpus=cpus, execute=execute, - skip_cpm_standard_calendar_projection=skip_cpm_projection, - skip_hads_spatial_2k_projection=skip_hads_projection, - skip_cropping=skip_cropping, + cpm_projection=cpm_projection, + hads_projection=hads_projection, + crop_hads=crop_hads, + crop_cpm=crop_cpm, start_index=start_index, total=total, multiprocess=multiprocess, diff --git a/setup-instructions.md b/setup-instructions.md index e8bb27eb..c45e2bfa 100644 --- a/setup-instructions.md +++ b/setup-instructions.md @@ -13,6 +13,10 @@ git clone https://github.com/alan-turing-institute/clim-recal cd clim-recal pip install conda-lock conda-lock install --name clim-recal conda-lock.yml +conda activate clim-recal +cd python +pdm install +clim-recal --help ``` For `docker`: @@ -20,9 +24,21 @@ For `docker`: ```bash git clone https://github.com/alan-turing-institute/clim-recal cd clim-recal -docker compose up -``` +docker compose build jupyter +docker compose up jupyter +docker compose run jupyter bash +cd python +pdm install +pdm run clim-recal --help +``` +::: {.callout-warning} +There are cases where `pdm install` raises a `KeyError: '_PYPROJECT_HOOKS_BUILD_BACKEND'`. Thus far, running `pdm install` again works. +::: + +```console +clim-recal --help +``` # Python From 355ee3c79dfd05879151e1a96f304b3b82b549f6 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 3 Sep 2024 15:53:36 +0100 Subject: [PATCH 66/92] chore: update `python` dependencies --- .conda-linux-64.lock | 148 +-- compose/jupyter/Dockerfile | 2 +- conda-lock.yml | 2307 +++++++++++++++++++----------------- python/pdm.lock | 411 ++++--- python/pyproject.toml | 4 +- 5 files changed, 1528 insertions(+), 1344 deletions(-) diff --git a/.conda-linux-64.lock b/.conda-linux-64.lock index c7207834..62f25392 100644 --- a/.conda-linux-64.lock +++ b/.conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 2b519e031a7313cf1177defbb5591df97a746f96bfb527d745b65470b3097ab4 +# input_hash: 4a2428c5c83e47fb6ff0683f7af0d035adbc72e34d039ee85c713a05698e94c8 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://repo.anaconda.com/pkgs/main/linux-64/blas-1.0-openblas.conda#9ddfcaef10d79366c90128f5dc444be8 @@ -10,18 +10,22 @@ https://repo.anaconda.com/pkgs/main/noarch/font-ttf-inconsolata-2.001-hcb22688_0 https://repo.anaconda.com/pkgs/main/noarch/font-ttf-source-code-pro-2.030-hd3eb1b0_0.conda#eb091595cff4c5452f2f409c667aef55 https://repo.anaconda.com/pkgs/main/noarch/font-ttf-ubuntu-0.83-h8b1ccd4_0.conda#a5870ffd24048c1f10af06dd5d0bbe37 https://repo.anaconda.com/pkgs/main/linux-64/ld_impl_linux-64-2.38-h1181459_1.conda#68eedfd9c06f2b0e6888d8db345b7f5b +https://repo.anaconda.com/pkgs/main/linux-64/libgfortran-ng-8.2.0-hdf63c60_1.conda#29c0ef7e284d741937c7c26ae3250bbd https://repo.anaconda.com/pkgs/main/linux-64/poppler-data-0.4.11-h06a4308_1.conda#fd6d432aa8fcef7896c9fbe683fea831 https://repo.anaconda.com/pkgs/main/noarch/pybind11-abi-5-hd3eb1b0_0.conda#7f0df6639fdf60ccd3045ee6faedd32f -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda#dccc2d142812964fcc6abdc97b672dff +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 https://repo.anaconda.com/pkgs/main/noarch/tzdata-2024a-h04d1e81_0.conda#452af53adae0a5b06eb5d05c707b2f25 https://repo.anaconda.com/pkgs/main/noarch/fonts-anaconda-1-h8fa9717_0.conda#a5efad43de0590ada98f8bcf02ecbfe8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://repo.anaconda.com/pkgs/main/noarch/fonts-conda-ecosystem-1-hd3eb1b0_0.conda#76790b62a799de73c4364f7cdc445583 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.23-h4ab18f5_0.conda#94d61ae2b2b701008a9d52ce6bbead27 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.27-h4bc722e_0.conda#817119e8a21a45d325f65d0d54710052 https://repo.anaconda.com/pkgs/main/linux-64/bzip2-1.0.8-h5eee18b_6.conda#f21a3ff51c1b271977f53ce956a69297 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda#8024af1ee7078e37fa3101c0a0296af2 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h1220068_1.conda#f8f0f0c4338bad5c34a4e9e11460481d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -29,19 +33,18 @@ https://repo.anaconda.com/pkgs/main/linux-64/libbrotlicommon-1.0.9-h5eee18b_8.co https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://repo.anaconda.com/pkgs/main/linux-64/libev-4.33-h7f8727e_1.conda#5065620db4393fb549f30114a33897d1 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://repo.anaconda.com/pkgs/main/linux-64/libjpeg-turbo-3.0.3-h5eee18b_0.conda#b02b7690fc803457de68a9829799d874 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://repo.anaconda.com/pkgs/main/linux-64/libsodium-1.0.18-h7b6447c_0.conda#c8783b20f0e14bc1d701352c26c264d5 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda#1cb187a157136398ddbaae90713e2498 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://repo.anaconda.com/pkgs/main/linux-64/lzo-2.10-h7b6447c_2.conda#65722a7644f424de73fea6e87edd7653 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda#e1b454497f9f7c1147fdde4b53f1b512 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a https://repo.anaconda.com/pkgs/main/linux-64/pthread-stubs-0.3-h0ce48e5_1.conda#973a642312d2a28927aaf5b477c67250 https://conda.anaconda.org/conda-forge/linux-64/tzcode-2024a-h3f72095_0.conda#32146e34aaec3745a08b6f49af3f41b0 https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -54,12 +57,12 @@ https://repo.anaconda.com/pkgs/main/linux-64/xorg-xproto-7.0.31-h27cfd23_1007.co https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://repo.anaconda.com/pkgs/main/linux-64/xz-5.4.6-h5eee18b_1.conda#1562802f843297ee776a50b9329597ed https://repo.anaconda.com/pkgs/main/linux-64/yaml-0.2.5-h7b6447c_0.conda#39fdbf4db769e494ffb06d95680c83d8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.1-h87b94db_1.conda#2d76d2cfdcfe2d5c3883d33d8be919e7 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-he027950_7.conda#11e5cb0b426772974f6416545baee0ce -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-he027950_3.conda#adbf0c44ca88a3cded175cd809a106b6 -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-he027950_7.conda#95611b325a9728ed68b8f7eef2dd3feb +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-h2abdd08_0.conda#006ee3bee3d0428e1b43b47ef1cffbc6 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-haa50ccc_0.conda#00c38c49d0befb632f686cf67ee8c9f5 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-h038f3f9_2.conda#6861cab6cddb5d713cb3db95c838d30f +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-h038f3f9_10.conda#4bf9c8fcf2bb6793c55e5c5758b9b011 https://repo.anaconda.com/pkgs/main/linux-64/expat-2.6.2-h6a678d5_0.conda#55049db2772dae035f6b8a95f72b5970 -https://conda.anaconda.org/conda-forge/linux-64/fmt-10.2.1-h00ab1b0_0.conda#35ef8bc24bd34074ebae3c943d551728 +https://conda.anaconda.org/conda-forge/linux-64/fmt-11.0.2-h434a139_0.conda#995f7e13598497691c1dc476d889bc04 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 @@ -71,46 +74,45 @@ https://repo.anaconda.com/pkgs/main/linux-64/libbrotlienc-1.0.9-h5eee18b_8.conda https://repo.anaconda.com/pkgs/main/linux-64/libcrc32c-1.1.2-h6a678d5_0.conda#daf778296b4ada0649ecad5e5e320cd0 https://repo.anaconda.com/pkgs/main/linux-64/libedit-3.1.20230828-h5eee18b_0.conda#850eb5a9d2d7d3c66cce12e84406ca08 https://repo.anaconda.com/pkgs/main/linux-64/libffi-3.4.4-h6a678d5_1.conda#70646cc713f0c43926cfdcfe9b695fe0 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a +https://repo.anaconda.com/pkgs/main/linux-64/libopenblas-0.3.21-h043d6bf_0.conda#7f7324dcc3c4761a14f3e4ac443235a7 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hd590300_0.conda#151cba22b85a989c2d6ef9633ffee1e4 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://repo.anaconda.com/pkgs/main/linux-64/lz4-c-1.9.4-h6a678d5_1.conda#2ee58861f2b92b868ce761abb831819d https://repo.anaconda.com/pkgs/main/linux-64/nspr-4.35-h6a678d5_0.conda#208fff5d60133bcff6998a70c9f5203b -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-h0f59acf_0.conda#3914f7ac1761dce57102c72ca7c35d01 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 -https://conda.anaconda.org/conda-forge/linux-64/popt-1.16-h0b475e3_2002.tar.bz2#78388f97473c02e5ac8a3742eee4c959 +https://repo.anaconda.com/pkgs/main/linux-64/popt-1.19-h5eee18b_0.conda#57d57eb3c3f82633cd5fe8c3e230e544 https://repo.anaconda.com/pkgs/main/linux-64/readline-8.2-h5eee18b_0.conda#be42180685cce6e6b0329201d9f48efb -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.17-he19d79f_0.conda#e25ac9bf10f8e6aa67727b1cdbe762ef -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.1-h3400bea_0.conda#bf136eb7f8e15fcf8915c1a04b0aec6f +https://repo.anaconda.com/pkgs/main/linux-64/snappy-1.2.1-h6a678d5_0.conda#e8c664fa38ba48b095d8c7bb1d755c10 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 https://repo.anaconda.com/pkgs/main/linux-64/zeromq-4.3.5-h6a678d5_0.conda#354c934a4a5500f4c455c630f2702dbc https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.10-h826b7d6_1.conda#6961646dded770513a781de4cd5c1fe1 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h49c7fd3_7.conda#536d25f5bdf2badc197cef350161593a https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 https://repo.anaconda.com/pkgs/main/linux-64/brotli-bin-1.0.9-h5eee18b_8.conda#9820670bfb9cae1e93a2646676bc1b7b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://repo.anaconda.com/pkgs/main/linux-64/gdbm-1.18-hd4cb3f1_4.conda#1c82981848be10bfc91000a0afcefee3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h8a4344b_1.conda#6ea440297aacee4893f02ad759e6ffbc -https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hbbc8833_1020.conda#6d76c5822cb38bc1ab5a06565c6cf626 -https://repo.anaconda.com/pkgs/main/linux-64/libopenblas-0.3.21-h043d6bf_0.conda#7f7324dcc3c4761a14f3e4ac443235a7 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h315aac3_2.conda#b0143a3e98136a680b728fdf9b42a258 +https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hf539b9f_1021.conda#e8c7620cc49de0c6a2349b6dd6e39beb https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h8917695_15.conda#20c3c14bc491f30daecaa6f73e2223ae https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.102-h593d115_0.conda#40e5e48c55a45621c4399ca9236406b7 -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.4-h194c7f8_0_cpython.conda#d73490214f536cccb5819e9873048c92 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.104-hd34e28f_0.conda#0664e59f6937a660eba9f3d2f9123fa8 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda#9c56c4df45f6571b13111d8df2448692 https://conda.anaconda.org/conda-forge/linux-64/rsync-3.3.0-he6cb5fe_0.conda#27da3fb7abe92e3ef592eda5321a0230 -https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.13.0-hd2e6256_0.conda#18f9348f064632785d54dbd1db9344bb +https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.14.1-hed91bc2_1.conda#909188c8979846bac8e586908cf1ca6a https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.31.1-h7b6447c_0.conda#c2cae59a837775a03aed11469994981c https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://repo.anaconda.com/pkgs/main/noarch/affine-2.3.0-pyhd3eb1b0_0.conda#b8d56e39137c75029f2a2b21943dc5c8 @@ -118,8 +120,8 @@ https://repo.anaconda.com/pkgs/main/linux-64/annotated-types-0.6.0-py312h06a4308 https://repo.anaconda.com/pkgs/main/noarch/appdirs-1.4.4-pyhd3eb1b0_0.conda#5673d98d06171cb6eed03a6736845c4d https://repo.anaconda.com/pkgs/main/linux-64/async-lru-2.0.4-py312h06a4308_0.conda#2806b5842bb2478e127c99feb82a6a88 https://repo.anaconda.com/pkgs/main/linux-64/attrs-23.1.0-py312h06a4308_0.conda#e8016c6839c63842d4a32bace7359ad8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-h7671281_15.conda#3b45b0da170f515de8be68155e14955a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.2-he17ee6b_6.conda#4e3d1bb2ade85619ac2163e695c2cc1b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h570d160_0.conda#1c121949295cac86798be8f369768d7c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.8-h9b61739_1.conda#cce4559ceae32920b4625594323841b4 https://conda.anaconda.org/conda-forge/noarch/beartype-0.18.5-pyhd8ed1ab_0.conda#28786996506a2f2dd7819b5f3705f4e4 https://repo.anaconda.com/pkgs/main/linux-64/blinker-1.6.2-py312h06a4308_0.conda#a308ff4a4e682fe7375bea66fec0f818 https://repo.anaconda.com/pkgs/main/linux-64/brotli-1.0.9-h5eee18b_8.conda#b5d5a0d366e8dc1b21c75b8703aaa96a @@ -129,7 +131,7 @@ https://repo.anaconda.com/pkgs/main/noarch/cachy-0.3.0-pyhd3eb1b0_0.conda#fcb19b https://repo.anaconda.com/pkgs/main/linux-64/certifi-2024.7.4-py312h06a4308_0.conda#f37039b8ad015d7c025624c7d9264a4e https://repo.anaconda.com/pkgs/main/linux-64/cfgv-3.4.0-py312h06a4308_0.conda#765ea9eb7e1f5cd3791fcbae54fc6a8f https://repo.anaconda.com/pkgs/main/linux-64/chardet-4.0.0-py312h06a4308_1003.conda#7dd0b18381d4e95f723afbde9171b3cf -https://repo.anaconda.com/pkgs/main/noarch/charset-normalizer-2.0.4-pyhd3eb1b0_0.conda#e7a441d94234b2b5fafee06e25dbf076 +https://repo.anaconda.com/pkgs/main/noarch/charset-normalizer-3.3.2-pyhd3eb1b0_0.conda#c6fea3691e85cf7f568b0618ec29fc4f https://repo.anaconda.com/pkgs/main/linux-64/click-8.1.7-py312h06a4308_0.conda#a0d97fc547780b4ddefc91139e633e02 https://repo.anaconda.com/pkgs/main/linux-64/colorama-0.4.6-py312h06a4308_0.conda#6175699c700cc4e4bf18ffc86778e488 https://repo.anaconda.com/pkgs/main/linux-64/coverage-7.2.2-py312h5eee18b_0.conda#571d208e6623d64fa2280698ee3fc6ea @@ -146,7 +148,7 @@ https://repo.anaconda.com/pkgs/main/noarch/executing-0.8.3-pyhd3eb1b0_0.conda#7b https://repo.anaconda.com/pkgs/main/linux-64/filelock-3.13.1-py312h06a4308_0.conda#6a0b440821945eda176c2bd78fd64a56 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://repo.anaconda.com/pkgs/main/linux-64/freexl-2.0.0-hf309648_0.conda#09960bea3a0c12d03b8288e943e799bb -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.3-h73ef956_1.conda#99701cdc9a25a333d15265d1d243b2dc +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.3-h8fdd7da_2.conda#9958a1f8faba35260e6b68e3a7bc88d6 https://repo.anaconda.com/pkgs/main/linux-64/h11-0.14.0-py312h06a4308_0.conda#6e32d4e1d4c9409293e63ecf19755482 https://repo.anaconda.com/pkgs/main/linux-64/idna-3.7-py312h06a4308_0.conda#03cc59cdabff44c47be0fadffcef003c https://repo.anaconda.com/pkgs/main/linux-64/importlib_resources-6.4.0-py312h06a4308_0.conda#eba0787f42c16ce32c303817d17907a9 @@ -157,8 +159,8 @@ https://repo.anaconda.com/pkgs/main/noarch/json5-0.9.6-pyhd3eb1b0_0.conda#4e721e https://repo.anaconda.com/pkgs/main/linux-64/kiwisolver-1.4.4-py312h6a678d5_0.conda#47e12eaa774b108e6e17011b1d727650 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.4-h2d7952a_1.conda#7e3173fd1299939a02ebf9ec32aa77c4 https://repo.anaconda.com/pkgs/main/linux-64/markupsafe-2.1.3-py312h5eee18b_0.conda#b5d2615c33773326f8207f7b58df1e2b https://repo.anaconda.com/pkgs/main/linux-64/mdurl-0.1.0-py312h06a4308_0.conda#6bea6d09fe58ac995a64ab45e75cb5e9 https://repo.anaconda.com/pkgs/main/linux-64/mistune-2.0.4-py312h06a4308_0.conda#ebad83b0f2acc0defac5485ea5e71994 @@ -167,13 +169,13 @@ https://repo.anaconda.com/pkgs/main/linux-64/msgpack-python-1.0.3-py312hdb19cb5_ https://repo.anaconda.com/pkgs/main/linux-64/nest-asyncio-1.6.0-py312h06a4308_0.conda#54db123c667472579092ce402f242702 https://repo.anaconda.com/pkgs/main/linux-64/networkx-3.3-py312h06a4308_0.conda#3d6fe63c7b13df13c529e2aace012d80 https://repo.anaconda.com/pkgs/main/linux-64/numpy-base-1.26.4-py312he1a6c75_0.conda#b4f72512033cab6fffe7d72f4585da29 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 +https://repo.anaconda.com/pkgs/main/linux-64/openjpeg-2.5.2-he7f1fd0_0.conda#a399fe14e40b0ed66a2b1b6c1da4eae1 https://repo.anaconda.com/pkgs/main/linux-64/overrides-7.4.0-py312h06a4308_0.conda#b294a9b6e5b7654cc7012f3690a7c57f https://repo.anaconda.com/pkgs/main/linux-64/packaging-24.1-py312h06a4308_0.conda#756ec42d4f934b642b8476689af2781f https://repo.anaconda.com/pkgs/main/noarch/pandocfilters-1.5.0-pyhd3eb1b0_0.conda#5547ced9e3bb4c513405998957b52c7b https://repo.anaconda.com/pkgs/main/noarch/parso-0.8.3-pyhd3eb1b0_0.conda#c6f0f6219bf5ce2b510ef4b75cbc3e01 https://repo.anaconda.com/pkgs/main/noarch/pastel-0.2.1-py_0.conda#81a0d5c930710445569d9a2f5137d6a2 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2024.4.24-pyhd8ed1ab_0.conda#4647442ace74db3dd235968a18b090eb +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2024.8.14-pyhd8ed1ab_0.conda#eb5c3a23894f29824e380f3d1d754a67 https://repo.anaconda.com/pkgs/main/linux-64/perl-5.34.0-h5eee18b_2.conda#2362442477bfdd0ff1ce8d8cc753e7e8 https://repo.anaconda.com/pkgs/main/linux-64/pkginfo-1.10.0-py312h06a4308_0.conda#2a32de7c1bccd483668b26d4cf589488 https://repo.anaconda.com/pkgs/main/linux-64/platformdirs-3.10.0-py312h06a4308_0.conda#39dc9eb538e73250dadcdec7a8ed6595 @@ -201,7 +203,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/rfc3986-validator-0.1.1-py312h06a43 https://repo.anaconda.com/pkgs/main/linux-64/rpds-py-0.10.6-py312hb02cf49_0.conda#f014511c9cf2b20297e4cba31fa9a47d https://repo.anaconda.com/pkgs/main/linux-64/ruamel.yaml-0.17.21-py312h5eee18b_0.conda#8731b592bb8feb6f50aaeb3173b02ce8 https://repo.anaconda.com/pkgs/main/linux-64/send2trash-1.8.2-py312h06a4308_0.conda#6de7b7d88a0ad8549d30cb9bf1676c7e -https://repo.anaconda.com/pkgs/main/linux-64/setuptools-69.5.1-py312h06a4308_0.conda#ce85d9a864a73e0b12d31a97733c9fca +https://repo.anaconda.com/pkgs/main/linux-64/setuptools-72.1.0-py312h06a4308_0.conda#bab64ac5186aa07014788baf1fbe3ca9 https://repo.anaconda.com/pkgs/main/linux-64/shellingham-1.5.0-py312h06a4308_0.conda#ace058023ae6b44784c6addb57b2cf40 https://repo.anaconda.com/pkgs/main/noarch/six-1.16.0-pyhd3eb1b0_1.conda#34586824d411d36af2fa40e799c172d0 https://repo.anaconda.com/pkgs/main/noarch/smmap-4.0.0-pyhd3eb1b0_0.conda#ea22ec22100b09799aa81f3e3ef9fa87 @@ -216,7 +218,7 @@ https://repo.anaconda.com/pkgs/main/linux-64/tomli-2.0.1-py312h06a4308_1.conda#8 https://repo.anaconda.com/pkgs/main/linux-64/tomlkit-0.11.1-py312h06a4308_0.conda#b2061d65b70adf68a4f96dc4fb4ec939 https://repo.anaconda.com/pkgs/main/linux-64/toolz-0.12.0-py312h06a4308_0.conda#8340b47fa0f92e87a9416929dd52a102 https://repo.anaconda.com/pkgs/main/linux-64/tornado-6.4.1-py312h5eee18b_0.conda#f4e2217ac077eff9684df8162125acc0 -https://repo.anaconda.com/pkgs/main/linux-64/tqdm-4.66.4-py312he106c6f_0.conda#11d1cee87830bbb013896a43f47eafa9 +https://repo.anaconda.com/pkgs/main/linux-64/tqdm-4.66.5-py312he106c6f_0.conda#099959333950bef1a3d7d12133cbfafc https://repo.anaconda.com/pkgs/main/linux-64/traitlets-5.14.3-py312h06a4308_0.conda#e597b4bbf8d30abd7ae5ac5d4a436176 https://repo.anaconda.com/pkgs/main/linux-64/typing_extensions-4.11.0-py312h06a4308_0.conda#3045aa097a86bc6a13702fc3c287b5a4 https://repo.anaconda.com/pkgs/main/linux-64/unicodedata2-15.1.0-py312h5eee18b_0.conda#b4759c926ac7543d4c845d7f984250e3 @@ -230,9 +232,9 @@ https://repo.anaconda.com/pkgs/main/linux-64/zipp-3.17.0-py312h06a4308_0.conda#0 https://repo.anaconda.com/pkgs/main/linux-64/anyio-4.2.0-py312h06a4308_0.conda#d992c4775da6f3ccb1223d71abe67de9 https://repo.anaconda.com/pkgs/main/noarch/asttokens-2.0.5-pyhd3eb1b0_0.conda#140486e2ce4f3931b44aa5f7ff8d88da https://repo.anaconda.com/pkgs/main/noarch/astunparse-1.6.3-py_0.conda#250bc9eafb39eff7fff001dae10e2d3c -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.22-hbd3ac97_10.conda#7ca4abcc98c7521c02f4e8809bbe40df -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-hcd6a914_8.conda#b81c45867558446640306507498b2c6b -https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.12.0-h830ed8b_0.conda#320d066f9cad598854f4af32c7c82931 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.26-hc36b679_2.conda#41bbccf460a688430fbd20a30a0af009 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-h5c8269d_18.conda#ae2b300e78008afad1fef638ed0ee09f +https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.13.0-h935415a_0.conda#debd1677c2fea41eb2233a260f48a298 https://repo.anaconda.com/pkgs/main/linux-64/babel-2.11.0-py312h06a4308_0.conda#677b01819ada8c2e555e55342b1d5433 https://repo.anaconda.com/pkgs/main/linux-64/beautifulsoup4-4.12.3-py312h06a4308_0.conda#79afccbd2199c75b590ecac6228716f2 https://repo.anaconda.com/pkgs/main/noarch/bleach-4.1.0-pyhd3eb1b0_0.conda#256eb7e384e35f993ef8ccd6c4f45e58 @@ -244,12 +246,12 @@ https://repo.anaconda.com/pkgs/main/noarch/click-plugins-1.1.1-pyhd3eb1b0_0.cond https://repo.anaconda.com/pkgs/main/noarch/cligj-0.7.2-pyhd3eb1b0_0.conda#a304c2ad08c7d498e7dc9eadc6b36e22 https://conda.anaconda.org/conda-forge/noarch/clikit-0.6.2-pyhd8ed1ab_2.conda#02abb7b66b02e8b9f5a9b05454400087 https://repo.anaconda.com/pkgs/main/linux-64/comm-0.2.1-py312h06a4308_0.conda#7d7b827eee78fd7b62292dc6a44314f2 -https://conda.anaconda.org/conda-forge/noarch/coverage-badge-1.1.1-pyhd8ed1ab_0.conda#2b9d71adc9cae0b0eff77cae36f75cf6 -https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.3-pyhd8ed1ab_0.conda#396864473cf7cf2dcbc17bb3bdcef665 +https://conda.anaconda.org/conda-forge/noarch/coverage-badge-1.1.2-pyhd8ed1ab_0.conda#fd300c940116b873560b60e8a224ccdc +https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.4-pyhd8ed1ab_0.conda#865296b62a810e46e49a4de36bd66be4 https://conda.anaconda.org/conda-forge/noarch/findpython-0.6.1-pyhd8ed1ab_0.conda#c3562fb8edde4111bd5a11ea30cbc6a7 https://repo.anaconda.com/pkgs/main/linux-64/fonttools-4.51.0-py312h5eee18b_0.conda#592d996d4b654ac2d0b071461f5165d4 https://repo.anaconda.com/pkgs/main/noarch/gitdb-4.0.7-pyhd3eb1b0_0.conda#bdd15a7149734880c003d98110c56b5b -https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.3-h8a4344b_1.conda#a3acc4920c9ca19cb6b295028d606477 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.3-h315aac3_2.conda#00e0da7e4fceb5449f3ddd2bf6b2c351 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://repo.anaconda.com/pkgs/main/noarch/html5lib-1.1-pyhd3eb1b0_0.conda#24c4f675dfc77f9d1ae6cd3c33731c3c https://repo.anaconda.com/pkgs/main/linux-64/httpcore-1.0.2-py312h06a4308_0.conda#a4e4dd3bd4cec11e72ffb690bafcce90 @@ -265,11 +267,11 @@ https://repo.anaconda.com/pkgs/main/linux-64/markdown-it-py-2.2.0-py312h06a4308_ https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-inline-0.1.6-py312h06a4308_0.conda#a8e99eeb494e5945aa7e60a660670643 https://repo.anaconda.com/pkgs/main/linux-64/nodeenv-1.7.0-py312h06a4308_0.conda#23c0441e6b4e88642027f364e62f8566 https://repo.anaconda.com/pkgs/main/linux-64/numpy-1.26.4-py312h2809609_0.conda#a4282fd8d475c35059c92025ddf0b8a5 -https://repo.anaconda.com/pkgs/main/linux-64/openpyxl-3.1.2-py312h5eee18b_0.conda#7b0e99dc4855ed3f946fdf20d312f806 +https://repo.anaconda.com/pkgs/main/linux-64/openpyxl-3.1.5-py312h5eee18b_0.conda#e6be29538cd413bd4fa55311b7ba1daf https://conda.anaconda.org/conda-forge/linux-64/parallel-20240722-ha770c72_0.conda#acad361a391f190dc2fa629a2814fdcf https://repo.anaconda.com/pkgs/main/noarch/pexpect-4.8.0-pyhd3eb1b0_3.conda#765b2562d6cdd14bb6d44fc170a04331 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py312h287a98d_0.conda#59ea71eed98aee0bebbbdd3b118167c7 -https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.3-h8e811e2_0.conda#e4d52462da124ed3792472f95a36fc2a +https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.4-hb2eb5c0_1.conda#1aaec5dbae29b3f0a2c20eeb84e9e38a https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-hb784bbd_2.conda#b0683c229de4c4c676450d24ff87538c https://repo.anaconda.com/pkgs/main/linux-64/prompt-toolkit-3.0.43-py312h06a4308_0.conda#1ccee6d6456c5a4c71d52a97e8292432 https://repo.anaconda.com/pkgs/main/linux-64/pytest-7.4.4-py312h06a4308_0.conda#297cebe31aed2b64f54ea716a61733c0 @@ -280,37 +282,37 @@ https://repo.anaconda.com/pkgs/main/linux-64/rfc3339-validator-0.1.4-py312h06a43 https://conda.anaconda.org/conda-forge/noarch/sysrsync-1.1.1-pyhd8ed1ab_0.conda#61b3102a992ef2c82a51c5e386f9aaef https://repo.anaconda.com/pkgs/main/linux-64/terminado-0.17.1-py312h06a4308_0.conda#4bc05c7f0c2e64b82882f774752a0263 https://repo.anaconda.com/pkgs/main/linux-64/tinycss2-1.2.1-py312h06a4308_0.conda#53422e62ac2d242aa12575ba12c2d430 -https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda#cf2c3a89f89644c53cadbfeb124914e9 +https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.5-pyhd8ed1ab_0.conda#a46aa56c0ca7cc2bd38baffc2686f0a6 https://repo.anaconda.com/pkgs/main/linux-64/typing-extensions-4.11.0-py312h06a4308_0.conda#181af932ad0824456dc3e6173c38b5c6 https://repo.anaconda.com/pkgs/main/linux-64/virtualenv-20.26.1-py312h06a4308_0.conda#9a27149f4f1db4ada607be0fb5494f1b https://repo.anaconda.com/pkgs/main/linux-64/watchdog-4.0.1-py312h06a4308_0.conda#7cd659167e2c8149985b2d6b14479b11 https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-h666cd97_1.conda#97e8ef960a53cf08f2c4ceec8cf9e10d https://repo.anaconda.com/pkgs/main/linux-64/argon2-cffi-bindings-21.2.0-py312h5eee18b_0.conda#ed4180dcd3e7c19a9c06a86510ad1ae7 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.0-h365ddd8_2.conda#22339cf124753bafda336167f80e7860 -https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.8.0-hdb0d106_1.conda#a297ffb4b505f51d0f58352c5c13971b -https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.6.0-he3f277c_1.conda#8a10bb068b138dd473300b5fe34a1865 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.4-h77088c0_11.conda#2e66fedeed7616b1e568a7c3d4562b74 +https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.8.0-hd126650_2.conda#36df3cf05459de5d0a41c77c4329634b +https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.7.0-h10ac4d7_1.conda#ab6d507ad16dbe2157920451d662e4a1 https://repo.anaconda.com/pkgs/main/linux-64/bottleneck-1.3.7-py312ha883a20_0.conda#51bb23c66f00f6cc89dd0dee32815e67 https://repo.anaconda.com/pkgs/main/linux-64/branca-0.6.0-py312h06a4308_0.conda#0b93373891471306c3d9173cac8d1129 https://repo.anaconda.com/pkgs/main/linux-64/cftime-1.6.2-py312ha883a20_1.conda#dbde55741cb4e19ab3adfa8a223717b0 https://repo.anaconda.com/pkgs/main/linux-64/contourpy-1.2.0-py312hdb19cb5_0.conda#45c70b5ee7202df3c86a586c2736bce7 -https://repo.anaconda.com/pkgs/main/linux-64/cryptography-42.0.5-py312hdda0065_1.conda#f224acb5b9a99ce1b715152d1ef7a67e +https://repo.anaconda.com/pkgs/main/linux-64/cryptography-43.0.0-py312hdda0065_0.conda#76ab63809027e6311b6aa8b4f922ddcf https://repo.anaconda.com/pkgs/main/linux-64/dbus-1.13.18-hb2f20db_0.conda#6a6a6f1391f807847404344489ef6cf4 https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.3-hf7fa9e8_1.conda#8ff4fa3ab0b63dc5b214a68839499e41 https://repo.anaconda.com/pkgs/main/linux-64/gitpython-3.1.43-py312h06a4308_0.conda#a5bb051e5739c6701297408439f7b1fc -https://conda.anaconda.org/conda-forge/noarch/griffe-0.48.0-pyhd8ed1ab_0.conda#73aafef908b0b8948d739e11ebf92d32 -https://repo.anaconda.com/pkgs/main/linux-64/httpx-0.26.0-py312h06a4308_0.conda#1773f853d16a8002ac9c8f056acbd5ed +https://conda.anaconda.org/conda-forge/noarch/griffe-1.2.0-pyhd8ed1ab_0.conda#b208b4da76de98a770c6ff3a0f8d1ce5 +https://repo.anaconda.com/pkgs/main/linux-64/httpx-0.27.0-py312h06a4308_0.conda#2364f07b85b5cc9f4a62106c823f10c8 https://repo.anaconda.com/pkgs/main/noarch/importlib_metadata-7.0.1-hd3eb1b0_0.conda#f764ec5ca8c8f808464764c83be0ead4 https://repo.anaconda.com/pkgs/main/linux-64/jsonschema-specifications-2023.7.1-py312h06a4308_0.conda#4a3e8dd4b08a13007db2038e6d0ee144 https://repo.anaconda.com/pkgs/main/linux-64/jupyter_client-8.6.0-py312h06a4308_0.conda#fa5c4806fb8923dd99bd6e4117394681 https://repo.anaconda.com/pkgs/main/linux-64/jupyter_server_terminals-0.4.4-py312h06a4308_1.conda#38397ad2c8ba35b0c34082d230f49bd8 https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hee9dde6_1.conda#c5b7b29e2b66107553d0366538257a51 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.26.0-h26d7fe4_0.conda#7b9d4c93870fb2d644168071d4d76afb +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.28.0-h26d7fe4_0.conda#2c51703b4d775f8943c08a361788131b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h6fbd9c4_7.conda#e39bdbe437c74e43b534e21290ca3897 https://repo.anaconda.com/pkgs/main/linux-64/numexpr-2.8.7-py312he7dcb8a_0.conda#abeab7edb95c5f2adcd741401a2e07dc https://conda.anaconda.org/conda-forge/linux-64/poppler-24.04.0-hb6cd0d7_0.conda#d19eed746748f1d44b575662f2bcfe95 https://repo.anaconda.com/pkgs/main/noarch/prompt_toolkit-3.0.43-hd3eb1b0_0.conda#244c80adf85e37e2a4158d0f0c199566 -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.20.1-py312hf008fa9_0.conda#8cc8f335b7e355558854236d86b2bea4 +https://repo.anaconda.com/pkgs/main/linux-64/pydantic-core-2.20.1-py312hb02cf49_0.conda#8879e1838f0fce5900cb23db1aa5e68d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h5d05ceb_7.conda#b53ddc25da04839cc62b0b158a7ecb38 https://repo.anaconda.com/pkgs/main/linux-64/pytest-cov-4.1.0-py312h06a4308_1.conda#527d99f42aeea2545011a0bb6c7d38b8 https://conda.anaconda.org/conda-forge/noarch/pytest-sugar-1.0.0-pyhd8ed1ab_0.conda#95911286c4f6bcea2bea50b2739c7f8e @@ -321,51 +323,51 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312ha5b4d35_1.co https://repo.anaconda.com/pkgs/main/noarch/snuggs-1.4.7-pyhd3eb1b0_0.conda#f84b8372cc7b4b7ff2be0c34b26378ae https://repo.anaconda.com/pkgs/main/noarch/stack_data-0.2.0-pyhd3eb1b0_0.conda#6212968e73726f6da42e5ffcd2bea92d https://repo.anaconda.com/pkgs/main/linux-64/ukkonen-1.0.1-py312hdb19cb5_0.conda#12f014642b080b0635c43e4e0d27e690 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h3483029_0.conda#eab52e88c858d87cf5a069f79d10bb50 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 https://repo.anaconda.com/pkgs/main/noarch/argon2-cffi-21.3.0-pyhd3eb1b0_0.conda#f00b851bc61b4c313903d31c7daecb09 -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.27.3-hda66527_2.conda#734875312c8196feecc91f89856da612 -https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.11.0-ha67cba7_1.conda#f03bba57b85a5b3ac443a871787fc429 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.2-hf262114_0.conda#a4c771ce00074635f2a67eb35cf311db +https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.12.0-hd2e3451_0.conda#61f1c193452f0daa582f39634627ea33 https://conda.anaconda.org/conda-forge/noarch/hishel-0.0.30-pyhd8ed1ab_0.conda#d6dea11fccceebd0f67c6f472d66c32e https://repo.anaconda.com/pkgs/main/linux-64/identify-2.5.5-py312h06a4308_0.conda#f41d506d423ed77f2fd4ae67020ae659 https://repo.anaconda.com/pkgs/main/linux-64/ipython-8.25.0-py312h06a4308_0.conda#2c767a19ad2dee3fffccf0dc57c51c42 https://repo.anaconda.com/pkgs/main/linux-64/jsonschema-4.19.2-py312h06a4308_0.conda#5f74dfc66bdbe28a628b982f2ee0c345 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.26.0-ha262f82_0.conda#89b53708fd67762b26c38c8ecc5d323d +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.28.0-ha262f82_0.conda#9e7960f0b9ab3895ef73d92477c47dae https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-base-3.8.4-py312h526ad5a_0.conda#82aa62c40bd375ed45589ba536312895 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h1ef7fb6_101.conda#c67cc8e3a34c5cb8920c79918112e96f https://repo.anaconda.com/pkgs/main/linux-64/pandas-2.2.2-py312h526ad5a_0.conda#931585545b1801a72013bf30186fb51a https://conda.anaconda.org/conda-forge/noarch/plum-dispatch-2.5.2-pyhd8ed1ab_0.conda#f8d38e43e2b367976d7135e602b5c9b6 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda#539a038a24a959662df1fcaa2cfc5c3e -https://repo.anaconda.com/pkgs/main/linux-64/pyopenssl-24.0.0-py312h06a4308_0.conda#f93a6ad622b84e53aed3d899b5b36f6a -https://repo.anaconda.com/pkgs/main/linux-64/scikit-learn-1.4.2-py312h526ad5a_1.conda#7f8e8d231b3df92ca1821f2062c76306 +https://repo.anaconda.com/pkgs/main/linux-64/pydantic-2.8.2-py312h06a4308_0.conda#ed17e2e2ab47f308aaf95ef56da439cd +https://repo.anaconda.com/pkgs/main/linux-64/pyopenssl-24.2.1-py312h06a4308_0.conda#2fc7519121e3f24552cc9b0547c332ad +https://repo.anaconda.com/pkgs/main/linux-64/scikit-learn-1.5.1-py312h526ad5a_0.conda#a6942bc5ab992ab2bb65ec33d2a18e10 https://repo.anaconda.com/pkgs/main/linux-64/secretstorage-3.3.1-py312h06a4308_1.conda#790c1839ee84767859d244875a26ad97 -https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.3-hd8ed1ab_0.conda#8e56b98837d17e6ace4dc455d905709a -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-h46c3b66_9.conda#c840f07ec58dc0b06041e7f36550a539 +https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.5-hd8ed1ab_0.conda#2dc1ee4046de0692077e9aa9ba351d36 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.379-hc1bef60_8.conda#f52817ff334879e3dbdc7392e8248508 https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.0.1-pyha770c72_0.conda#1b7d46173c29e14dde41f97cf5aa61df https://repo.anaconda.com/pkgs/main/linux-64/ipykernel-6.28.0-py312h06a4308_0.conda#b488eb4fadcff89d5a2cf097a5c7a91b https://repo.anaconda.com/pkgs/main/linux-64/jupyter_events-0.10.0-py312h06a4308_0.conda#e9def891af369b1d816e08345a42838a https://repo.anaconda.com/pkgs/main/linux-64/keyring-24.3.1-py312h06a4308_0.conda#fff26aca6afa1adcb1cd61d8763639e3 https://repo.anaconda.com/pkgs/main/linux-64/mapclassify-2.5.0-py312h06a4308_0.conda#f4a3cedfd24c1533fd3a0a54a62a62b8 https://repo.anaconda.com/pkgs/main/linux-64/nbformat-5.9.2-py312h06a4308_0.conda#17aa138ac1d11e5a75f9c0c0377b7885 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda#b713b116feaf98acdba93ad4d7f90ca1 https://conda.anaconda.org/conda-forge/noarch/sphobjinv-2.3.1.1-pyhd8ed1ab_0.conda#3503896d50f4e463bb86c77bab85ce07 -https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda#10efd02b22c39c0a46312ef7cb16d237 +https://conda.anaconda.org/conda-forge/noarch/typer-0.12.5-pyhd8ed1ab_0.conda#be70216cc1a5fe502c849676baabf498 https://repo.anaconda.com/pkgs/main/linux-64/urllib3-1.26.19-py312h06a4308_0.conda#3e736286f516aa2334bed47bdc0c5a1d https://repo.anaconda.com/pkgs/main/linux-64/xarray-2023.6.0-py312h06a4308_0.conda#b43bba50ad0baabcb3cb1b70d3e6916a https://repo.anaconda.com/pkgs/main/linux-64/nbclient-0.8.0-py312h06a4308_0.conda#27e95ee551e2a710fe0d96da0ca141fe -https://repo.anaconda.com/pkgs/main/linux-64/requests-2.32.2-py312h06a4308_0.conda#8149ef9ed40945df19d2aff5ffd5bae0 -https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.24.2-hc55ee95_2.conda#bc6b3a6693d53e33dea28c89e02745dd +https://repo.anaconda.com/pkgs/main/linux-64/requests-2.32.3-py312h06a4308_0.conda#a321cefcf9b6681a45418d5adf647d80 +https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.24.2-h86fa3b2_12.conda#75f778f4614ef8fa9ea528c9fdf6cf4f https://repo.anaconda.com/pkgs/main/linux-64/cachecontrol-0.14.0-py312h06a4308_1.conda#bf57de67bcf746306cd3e026e6d1cccc https://repo.anaconda.com/pkgs/main/linux-64/ensureconda-1.4.4-py312h06a4308_1.conda#c667ee44114bd2b67633a7cb4dfc02f2 https://repo.anaconda.com/pkgs/main/linux-64/folium-0.14.0-py312h06a4308_0.conda#2f16a00500b1165a9c9a938690ba19ac https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.8.5-he176cbe_11.conda#bf74c88ae705acddbbfc6f1e3f7f0e24 https://repo.anaconda.com/pkgs/main/linux-64/nbconvert-7.10.0-py312h06a4308_0.conda#e913ecbb1401f765ed8631ed511d6788 -https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.5-pyhd8ed1ab_0.conda#e792d8c21d24dbb2b880c07430328536 -https://conda.anaconda.org/conda-forge/noarch/unearth-0.16.1-pyhd8ed1ab_0.conda#7c9b2ea6bbf1fa0018c808763d11721b +https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.6-pyhd8ed1ab_0.conda#02da3ef68978e1d6d61ded2338b2ee8b +https://conda.anaconda.org/conda-forge/noarch/unearth-0.17.2-pyhd8ed1ab_0.conda#6ad8b4b640a6a87993639ca084ced8b2 https://repo.anaconda.com/pkgs/main/linux-64/cachecontrol-with-filecache-0.14.0-py312h06a4308_1.conda#e3f673966a8bfbab947ceceb285f72d0 https://conda.anaconda.org/conda-forge/linux-64/gdal-3.8.5-py312h86af8fa_11.conda#5440cac70586e8653b26aa5f2860c101 https://repo.anaconda.com/pkgs/main/linux-64/jupyter_server-2.14.1-py312h06a4308_0.conda#6ee18118c92c40b045ae6a99d5025da4 -https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.1-pyhd8ed1ab_0.conda#3da349945f818b5ef7591fa13742d2d9 +https://conda.anaconda.org/conda-forge/noarch/pdm-2.18.1-pyhd8ed1ab_0.conda#06d5d5feb6307c67785a8f0951f61b77 https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.3.10-py312hd6340be_2.conda#9cee69a489f3b7c6de37bd7021d505cb https://repo.anaconda.com/pkgs/main/linux-64/conda-lock-2.5.6-py312h06a4308_0.conda#1f85a7f30fbd7e1a1061c05ba059e11f https://repo.anaconda.com/pkgs/main/linux-64/jupyter-lsp-2.2.0-py312h06a4308_0.conda#5ec44afafeffea8c68eb56af4da94dc5 @@ -374,4 +376,4 @@ https://repo.anaconda.com/pkgs/main/linux-64/notebook-shim-0.2.3-py312h06a4308_0 https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.8.0-py312hbedb91a_1.conda#3840cffc5d6c64e179fc54f02714956d https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.17.0-pyhd8ed1ab_0.conda#160464c6f979eb68e9a9ea31dd6b5aa6 https://conda.anaconda.org/conda-forge/noarch/geopandas-1.0.1-pyhd8ed1ab_0.conda#efef4ce75a678216d510d08222845c7f -https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.4-pyhd8ed1ab_0.conda#28f3334e97c39de2b7ac15743b041784 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.5-pyhd8ed1ab_0.conda#594762eddc55b82feac6097165a88e3c diff --git a/compose/jupyter/Dockerfile b/compose/jupyter/Dockerfile index 775adaa9..2f6e565d 100644 --- a/compose/jupyter/Dockerfile +++ b/compose/jupyter/Dockerfile @@ -28,7 +28,7 @@ RUN \ USER root # build-essential is needed for pysqlite3 and gdal -# RUN sudo apt-get update && sudo apt-get install -y build-essential +RUN sudo apt-get update && sudo apt-get install -y build-essential # First line changes a startup hook, which will activate the custom environment # RUN echo conda activate "${env_name}" >> /usr/local/bin/before-notebook.d/10activate-conda-env.sh diff --git a/conda-lock.yml b/conda-lock.yml index 995a4601..6a74b2b9 100644 --- a/conda-lock.yml +++ b/conda-lock.yml @@ -15,9 +15,9 @@ version: 1 metadata: content_hash: - osx-arm64: 5562ebbbde26d06224cb64f7d420208fab18e9445bc7bc30a7cb3f9c5c26a2a7 - linux-64: 2b519e031a7313cf1177defbb5591df97a746f96bfb527d745b65470b3097ab4 - linux-aarch64: 7de86e8d53c5d2e40886c674b7867d8799c24b61cebf2e747ddd68c961de0dc9 + osx-arm64: 9eec45e9ceaff9c69d9a3210f0d7b8e04987a55455c606e26e26b14d524cb256 + linux-64: 4a2428c5c83e47fb6ff0683f7af0d035adbc72e34d039ee85c713a05698e94c8 + linux-aarch64: 69749da94d7915bf4e1efe353591ad61baa58b9a07f48a3e2e7192a4cc037b07 channels: - url: r used_env_vars: [] @@ -477,316 +477,318 @@ package: category: main optional: false - name: aws-c-auth - version: 0.7.22 + version: 0.7.26 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-http: '>=0.8.2,<0.8.3.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' - aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.22-hbd3ac97_10.conda + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-http: '>=0.8.8,<0.8.9.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' + aws-c-sdkutils: '>=0.1.19,<0.1.20.0a0' + libgcc-ng: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.26-hc36b679_2.conda hash: - md5: 7ca4abcc98c7521c02f4e8809bbe40df - sha256: c8bf9f9901a56a56b18ab044d67ecde69ee1289881267924dd81670ac34591fe + md5: 41bbccf460a688430fbd20a30a0af009 + sha256: 4cdd967f0a8197991ee730fd270f8b2e12bde85b4c794e4c76039291772c3bf0 category: main optional: false - name: aws-c-auth - version: 0.7.22 + version: 0.7.26 manager: conda platform: linux-aarch64 dependencies: - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-http: '>=0.8.2,<0.8.3.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' - aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.22-hf9a33fd_10.conda + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-http: '>=0.8.8,<0.8.9.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' + aws-c-sdkutils: '>=0.1.19,<0.1.20.0a0' + libgcc-ng: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.7.26-h8b3868a_2.conda hash: - md5: 62b79a7b24bc23fe55257f84ff62d2d0 - sha256: a07a992c975f50e313304625d35304f347da859f2d76c70b054a871eb3bd8fa4 + md5: 3cbbe0605696ac7525de139ac6a8b787 + sha256: 09986c94e5f45128f63a9bfebd64a9c8b49285515e22877edbbbb035b3cbf215 category: main optional: false - name: aws-c-auth - version: 0.7.22 + version: 0.7.26 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-http: '>=0.8.2,<0.8.3.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' - aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.22-h8a62e84_10.conda + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-http: '>=0.8.8,<0.8.9.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' + aws-c-sdkutils: '>=0.1.19,<0.1.20.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.7.26-h1e647a1_2.conda hash: - md5: 7a43a23a02f7c952f48d154454336c8c - sha256: 933c77d0c6eb77bc99b2184f3332b8254f3d82624627bdce9885aa7a32186b48 + md5: f7d87b7031e363cf10cf244c03614ef2 + sha256: 71bc3b9f4e2267f06b84ffa7aae1d234b8729aeda25b5e0eed1c077a6edfc218 category: main optional: false - name: aws-c-cal - version: 0.7.1 + version: 0.7.4 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - libgcc-ng: '>=12' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + libgcc-ng: '>=13' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.1-h87b94db_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.4-h2abdd08_0.conda hash: - md5: 2d76d2cfdcfe2d5c3883d33d8be919e7 - sha256: f445f38a4170f0ae02cdf13e1bc23cbb826a4b45f39402f02fe5737b0a8ed3a9 + md5: 006ee3bee3d0428e1b43b47ef1cffbc6 + sha256: 7f8d27167ca67a3bdf8ab2de9f5c17c88d85a02c1f14485f67857ab745a18d95 category: main optional: false - name: aws-c-cal - version: 0.7.1 + version: 0.7.4 manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.23,<0.9.24.0a0' - libgcc-ng: '>=12' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + libgcc-ng: '>=13' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.1-h1194e0d_1.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.7.4-h90eab9b_0.conda hash: - md5: 3e52b9c84581b52333fbde981f2804a6 - sha256: 2b20411297c770100265ab55be2ac6973f26d3deb1a2af9e8779d561c9be01d0 + md5: ded013e814779cfacdb85c3585eeb6b4 + sha256: 16a4dafc8fb11a21656c5f56455926cfcdada0af18400bddad842a081d16048d category: main optional: false - name: aws-c-cal - version: 0.7.1 + version: 0.7.4 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.1-h94d0942_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.7.4-h41e72e7_0.conda hash: - md5: d70f882eefb9cabf3e18a2f3957936de - sha256: b36692df6896084ecbf370c5a58590ebd0c7e1b9e0a0f27f2de2b81c8e1dca11 + md5: e48f1946d72265f688574057ce762ee8 + sha256: 511af4c04a13ca96b22f870364699619223727604ff696e669cda4eaeab95b4c category: main optional: false - name: aws-c-common - version: 0.9.23 + version: 0.9.27 manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.23-h4ab18f5_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.27-h4bc722e_0.conda hash: - md5: 94d61ae2b2b701008a9d52ce6bbead27 - sha256: f3eab0ec3f01ddc3ebdc235d4ae1b3b803d83e40f2cd2389bf8c65ab96e90f02 + md5: 817119e8a21a45d325f65d0d54710052 + sha256: b1725a5ec43bcf606d6bdb248312aa51386b30339dd83a1f16edf620fe03d941 category: main optional: false - name: aws-c-common - version: 0.9.23 + version: 0.9.27 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.23-h68df207_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.9.27-h68df207_0.conda hash: - md5: 36159c9ecdcdbf7bf2676510110d7fda - sha256: fa4ca3c29c64c96cf8b208fb5466e425ac2f8998a0022f5404a885253bca4667 + md5: fde4839338cd5ea729c561785320b23e + sha256: 89cff2e9d9afe287dbd0a9e213f82233b0007cb98f6863072d860dcf3bc43504 category: main optional: false - name: aws-c-common - version: 0.9.23 + version: 0.9.27 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.23-h99b78c6_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.9.27-h99b78c6_0.conda hash: - md5: d9f2adf47d2078d44a23480140e76550 - sha256: 15e965a0d1c37927e23d46691e632cf8b39afee5c9ba735f2d535fdb7b58b19e + md5: b92f3870b54249178462862413137ca1 + sha256: 6c5a03e6e8436b307c6e36a257ceb24a95338e5d82de48c7462ceb921adadb35 category: main optional: false - name: aws-c-compression - version: 0.2.18 + version: 0.2.19 manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.23,<0.9.24.0a0' - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-he027950_7.conda + __glibc: '>=2.17,<3.0.a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + libgcc-ng: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.19-haa50ccc_0.conda hash: - md5: 11e5cb0b426772974f6416545baee0ce - sha256: d4c70b8716e19fe56a563ab858ab7440f41c2dd927687357a44e69f23001126d + md5: 00c38c49d0befb632f686cf67ee8c9f5 + sha256: d7cca92ff47e5de9e53ce6ea90186d578883b35d4c665b166ada2754d7786d05 category: main optional: false - name: aws-c-compression - version: 0.2.18 + version: 0.2.19 manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.23,<0.9.24.0a0' - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.18-h3ff8e8a_7.conda + aws-c-common: '>=0.9.27,<0.9.28.0a0' + libgcc-ng: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.2.19-h6cafaa5_0.conda hash: - md5: 134bb356c25e94209744ee664ba8a89a - sha256: 2f7958b624e48424e8e484842cbce323f812adfb22f431889e7e25899907032c + md5: 46860335fafb47b132ba8d8bc4c76ce9 + sha256: 1817f05ea19cba8aea18f0819b0b8cc59be43956ec172779f113b6d4373a6144 category: main optional: false - name: aws-c-compression - version: 0.2.18 + version: 0.2.19 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.18-h94d0942_7.conda + aws-c-common: '>=0.9.27,<0.9.28.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.2.19-h41e72e7_0.conda hash: - md5: c9a37f68bef48f48782746404f4050a2 - sha256: d0244c7638853f8f8feb4a3107844fc6be23c6e29312fc5eda9221df5817b8a7 + md5: c0fa07c8ba0434260ee3e6a05d4ddfa4 + sha256: e61ee499ca9db361bca4d8c8f9bf3db439dfc25bd71f1405d6ec97e74699ef3f category: main optional: false - name: aws-c-event-stream - version: 0.4.2 + version: 0.4.3 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-h7671281_15.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.3-h570d160_0.conda hash: - md5: 3b45b0da170f515de8be68155e14955a - sha256: b9546f0637c66d4086a169f4210bf0d569140f41c13f0c1c6826355f51f82494 + md5: 1c121949295cac86798be8f369768d7c + sha256: 608225f14f0befcc351860c2961ae9734f7bf097b3ffb88aea69727c65843689 category: main optional: false - name: aws-c-event-stream - version: 0.4.2 + version: 0.4.3 manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.4.2-h9d161b3_15.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.4.3-h3cf9a1f_0.conda hash: - md5: ff2a2cb1a667ce44ddccf87a3858bede - sha256: 80305a933ee51a808c57e6f7a76dec05c02a999b2d5388fd1c906b8475658b8c + md5: 11f18951b2a5c9eecb078f6779bb7315 + sha256: 2feb797b1736dc52277edb17c0f695b38a2ae1546dd42ffebf2cf215d2e8864d category: main optional: false - name: aws-c-event-stream - version: 0.4.2 + version: 0.4.3 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' libcxx: '>=16' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.4.2-hb74cd8f_15.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.4.3-h79ff00d_0.conda hash: - md5: e12aae765ef60c989a43f042a4141ab7 - sha256: a28581c0fa33d5bf8f71ca18dc632b997ba83d4442a3c2955e40927708ce8b0b + md5: 05dc0c49ea75ee73735416e2b3612c56 + sha256: bc45ee6a05f45b0ba2a8f014b2ac67e1aa33b98ec2f95286482bd9af37025fc7 category: main optional: false - name: aws-c-http - version: 0.8.2 + version: 0.8.8 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-compression: '>=0.2.18,<0.2.19.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.2-he17ee6b_6.conda + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-compression: '>=0.2.19,<0.2.20.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' + libgcc-ng: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.8-h9b61739_1.conda hash: - md5: 4e3d1bb2ade85619ac2163e695c2cc1b - sha256: c2a9501d5e361051457b0afc3ce77496a73c2cf90ad859010812130d512e9271 + md5: cce4559ceae32920b4625594323841b4 + sha256: 45e17e24d5af97a4cd1d66ff0011fd3a6635712056826f77464c56592b5cea06 category: main optional: false - name: aws-c-http - version: 0.8.2 + version: 0.8.8 manager: conda platform: linux-aarch64 dependencies: - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-compression: '>=0.2.18,<0.2.19.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.2-h782069e_6.conda + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-compression: '>=0.2.19,<0.2.20.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' + libgcc-ng: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.8.8-h738f7d9_1.conda hash: - md5: 1477d77ade38be837f1be9fc5702244c - sha256: 4fc9052d4090f13ecc7d5e2de4fa7f82081fe57e0c365e231364ec06b86ead91 + md5: 8e814bd366034a5cdf3b48f334b2fbe0 + sha256: 76d4c8a2ea7e1ca4b4cf015415d9dada64f49544184af96f804ef64ce18ea932 category: main optional: false - name: aws-c-http - version: 0.8.2 + version: 0.8.8 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-compression: '>=0.2.18,<0.2.19.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.2-had1507a_6.conda + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-compression: '>=0.2.19,<0.2.20.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.8.8-h69517e7_1.conda hash: - md5: d6a478f39b7ee977690d7dfc4115adfc - sha256: 42a85dee175d2a8a832157ab3fd8c052955f90f65d40f1076d066b486c64d1ed + md5: e6916a654d06547263078f5344ce9242 + sha256: b78122bbde3d3509fe1c44c0c984e16b2e973e0ee365e2fcad168a57ce0b4435 category: main optional: false - name: aws-c-io - version: 0.14.10 + version: 0.14.18 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - libgcc-ng: '>=12' - s2n: '>=1.4.17,<1.4.18.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.10-h826b7d6_1.conda + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + libgcc-ng: '>=13' + s2n: '>=1.5.1,<1.5.2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.18-h49c7fd3_7.conda hash: - md5: 6961646dded770513a781de4cd5c1fe1 - sha256: 68cb6f708e5e1cf50d98f3c896c7a72ab68e71ce9a69be4eea5dbde5c04bebdc + md5: 536d25f5bdf2badc197cef350161593a + sha256: 5cd0753e4cbabe243270b7587e78ac8fc25b4ca36dc6dbe680ae2a8ab014725f category: main optional: false - name: aws-c-io - version: 0.14.10 + version: 0.14.18 manager: conda platform: linux-aarch64 dependencies: - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - libgcc-ng: '>=12' - s2n: '>=1.4.17,<1.4.18.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.10-he43bb46_1.conda + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + libgcc-ng: '>=13' + s2n: '>=1.5.1,<1.5.2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.14.18-h72c02b9_7.conda hash: - md5: 8cb7305d490469354369e796186d67b5 - sha256: 9d1a34618e380b994bf00b99a75807c3a9cada7e5814f4cf673359251b01d517 + md5: 617100a7bc1813d5e1b259aabb800b28 + sha256: 7ef32300401bed3db61daa7633a0fd212d4dc72808d13b17b26daae55a332aff category: main optional: false - name: aws-c-io - version: 0.14.10 + version: 0.14.18 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.10-hcdb10ff_1.conda + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.14.18-h20e6805_7.conda hash: - md5: e7d85effc69338579c0b928eabe27d67 - sha256: 3b5fcdb83ab4af4b669c753f5ee167502e821180347f2d624bbaf77f9b082eb1 + md5: 43fd2b48c5069aed0c0395eea1382398 + sha256: b1b0c96f6731766835439698ee6132913f9bad8baddac9b3f3155b997bb1bfee category: main optional: false - name: aws-c-mqtt @@ -795,14 +797,14 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-http: '>=0.8.2,<0.8.3.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-hcd6a914_8.conda + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-http: '>=0.8.8,<0.8.9.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' + libgcc-ng: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-h5c8269d_18.conda hash: - md5: b81c45867558446640306507498b2c6b - sha256: aa6100ed16b1b6eabccca1ee5e36039862e37a7ee91c852de8d4ca0082dcd54e + md5: ae2b300e78008afad1fef638ed0ee09f + sha256: 405c68044e3181888dbb4d7abf6c3c29a7c93af02472259d40846957f25d1b4d category: main optional: false - name: aws-c-mqtt @@ -810,14 +812,14 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-http: '>=0.8.2,<0.8.3.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.4-h6cc0bdf_8.conda + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-http: '>=0.8.8,<0.8.9.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' + libgcc-ng: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.10.4-h1d106f6_18.conda hash: - md5: eb2b09202bb3ef71e542b76f55c60de5 - sha256: 2ea19007651bfb32767568c044cbbd833630735f25ad348f29c224afdfefeea2 + md5: 170faed3e909c5a350b31b80c00957ba + sha256: 85eca30ee5cda2a3a246105371807100e489eaafab497c7e8cc733eff4793f08 category: main optional: false - name: aws-c-mqtt @@ -826,109 +828,110 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-http: '>=0.8.2,<0.8.3.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.4-h856d8ab_8.conda + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-http: '>=0.8.8,<0.8.9.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.10.4-h3e8bf47_18.conda hash: - md5: 7a49b5ed4c1676b6aefbd6d7c92d976f - sha256: c2096334214c00905c71a527e330757e9a419c1e290ba515c6a54531f2b975b9 + md5: 5816f2232e2aa59d4b43e5cca8365604 + sha256: ec159192ab0f69ff79cbc3730a4096b5ff44716ef6a5197f5a438f89c32be400 category: main optional: false - name: aws-c-s3 - version: 0.6.0 + version: 0.6.4 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - aws-c-auth: '>=0.7.22,<0.7.23.0a0' - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-http: '>=0.8.2,<0.8.3.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' + aws-c-auth: '>=0.7.26,<0.7.27.0a0' + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-http: '>=0.8.8,<0.8.9.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' - libgcc-ng: '>=12' + libgcc-ng: '>=13' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.0-h365ddd8_2.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.4-h77088c0_11.conda hash: - md5: 22339cf124753bafda336167f80e7860 - sha256: 5f82835411b3db3ae9d5db575386d83a8cc6f5f61b414afa6155879b2071c2f6 + md5: 2e66fedeed7616b1e568a7c3d4562b74 + sha256: d9e6486a6fe9b0fa238de2b4a200d5478d8743facde4fd05494bea91a6abd30b category: main optional: false - name: aws-c-s3 - version: 0.6.0 + version: 0.6.4 manager: conda platform: linux-aarch64 dependencies: - aws-c-auth: '>=0.7.22,<0.7.23.0a0' - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-http: '>=0.8.2,<0.8.3.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' + aws-c-auth: '>=0.7.26,<0.7.27.0a0' + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-http: '>=0.8.8,<0.8.9.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' - libgcc-ng: '>=12' + libgcc-ng: '>=13' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.6.0-h9b659bc_2.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.6.4-h406eec3_11.conda hash: - md5: 089a61ca4d46ed9fe6613435815e36b2 - sha256: 572c1a14b06a8af5cad56856b555a1b0dc498f6f58f517861e1fa2b2fb7e977f + md5: c57da83996981648d5af5604d636b327 + sha256: 383aa4fda09ca54b149ae6d960494da1680c8352a49bceda8ff7b1fff27f295a category: main optional: false - name: aws-c-s3 - version: 0.6.0 + version: 0.6.4 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-auth: '>=0.7.22,<0.7.23.0a0' - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-http: '>=0.8.2,<0.8.3.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' + aws-c-auth: '>=0.7.26,<0.7.27.0a0' + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-http: '>=0.8.8,<0.8.9.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.6.0-ha9fd6de_2.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.6.4-he4d1bc2_11.conda hash: - md5: a326f688d66aa81fc403a2227e93a327 - sha256: 1c3c682ec25a3b3842f9dc14bcdb01705acf828e37c291cf244032299ae22416 + md5: 65b479198219a6ba066ae7b807183fdd + sha256: ac0b12f00cc3e163475bbbaff614b083d01962b1a91a16cc7724867cfbf9c873 category: main optional: false - name: aws-c-sdkutils - version: 0.1.16 + version: 0.1.19 manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.23,<0.9.24.0a0' + __glibc: '>=2.17,<3.0.a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-he027950_3.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.19-h038f3f9_2.conda hash: - md5: adbf0c44ca88a3cded175cd809a106b6 - sha256: 0f957d8cebe9c9b4041c858ca9a20619eb3fa866c71b21478a02d51f219d59cb + md5: 6861cab6cddb5d713cb3db95c838d30f + sha256: 5612c9cad56662db50a1bcc2d8dca1fe273f7abad6f670fef328e4044beabc75 category: main optional: false - name: aws-c-sdkutils - version: 0.1.16 + version: 0.1.19 manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.16-h3ff8e8a_3.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.1.19-hc4ff714_2.conda hash: - md5: 17b4343013540f7cfb0cffb66f1f18fa - sha256: b848559e5e7dafd4c58b16ee1eb6c829d69c20fe089bc6fdf5b8fcdeff1f4d47 + md5: 37283267dc5260e9897b8ab95362c735 + sha256: 9376efcfcb82e8d94bebd76d1aab10fad2dd34810784410ef3dbcf6187b20345 category: main optional: false - name: aws-c-sdkutils - version: 0.1.16 + version: 0.1.19 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.16-h94d0942_3.conda + aws-c-common: '>=0.9.27,<0.9.28.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.1.19-h85401af_2.conda hash: - md5: 1f9dd57e79cf2191ed139491aa460e24 - sha256: 4303f310b156abeca86ea8a4b4c8be5cfb96dd4214c2ebcfeef1bec3fa1dc793 + md5: 23183f9ce785058346cbb89c4327b02b + sha256: faf9f32a7b3f312f370e77cf52e6afe512c6cce4cd9709fe039ff08acd877f5a category: main optional: false - name: aws-checksums @@ -936,12 +939,13 @@ package: manager: conda platform: linux-64 dependencies: - aws-c-common: '>=0.9.23,<0.9.24.0a0' + __glibc: '>=2.17,<3.0.a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-he027950_7.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-h038f3f9_10.conda hash: - md5: 95611b325a9728ed68b8f7eef2dd3feb - sha256: 094cff556dbf8fdd60505c8285b0a873de101374f568200275d8fd7fb77ad5e9 + md5: 4bf9c8fcf2bb6793c55e5c5758b9b011 + sha256: a94547ff766fb420c368bb8d4fd1c8d99b13088d176c43ad7bb7458ef47e45bc category: main optional: false - name: aws-checksums @@ -949,12 +953,12 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.23,<0.9.24.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.18-h3ff8e8a_7.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.1.18-hc4ff714_10.conda hash: - md5: 069ec92cf4097befba1ab4b3f1e9e832 - sha256: c62b6f36f81927f95371f208683d0168cc92fa4cada62a9db197c3932a4750ba + md5: f0bd0175a0e244ea6bb5b90a0af0ed7e + sha256: 64e7b17632750d7f74a1e47664d9297b77a620aa24da5129f6677463e0225759 category: main optional: false - name: aws-checksums @@ -963,184 +967,185 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.18-h94d0942_7.conda + aws-c-common: '>=0.9.27,<0.9.28.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.1.18-h85401af_10.conda hash: - md5: fbd0be30bdd84b6735dfa3d6c5916b2e - sha256: cdd08a5b6b4ebadf05087238987681dc370bd0336ed410d0047171020f160187 + md5: 446c0b024a1cbf4b769d271da2bfdce2 + sha256: aeafa3581c3b82d5ac9b13a041795706c3cb0efe3764ee6825f0042a7f52041e category: main optional: false - name: aws-crt-cpp - version: 0.27.3 + version: 0.28.2 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - aws-c-auth: '>=0.7.22,<0.7.23.0a0' - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' - aws-c-http: '>=0.8.2,<0.8.3.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' + aws-c-auth: '>=0.7.26,<0.7.27.0a0' + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-event-stream: '>=0.4.3,<0.4.4.0a0' + aws-c-http: '>=0.8.8,<0.8.9.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' aws-c-mqtt: '>=0.10.4,<0.10.5.0a0' - aws-c-s3: '>=0.6.0,<0.6.1.0a0' - aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.27.3-hda66527_2.conda + aws-c-s3: '>=0.6.4,<0.6.5.0a0' + aws-c-sdkutils: '>=0.1.19,<0.1.20.0a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.28.2-hf262114_0.conda hash: - md5: 734875312c8196feecc91f89856da612 - sha256: 3149277f03a55d7dcffdbe489863cacc36a831dbf38b9725bdc653a8c5de134f + md5: a4c771ce00074635f2a67eb35cf311db + sha256: 2deaf4db49319caa59d1731a4f72cbe13010c9ca5954ba4afd94b102b287256b category: main optional: false - name: aws-crt-cpp - version: 0.27.3 + version: 0.28.2 manager: conda platform: linux-aarch64 dependencies: - aws-c-auth: '>=0.7.22,<0.7.23.0a0' - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' - aws-c-http: '>=0.8.2,<0.8.3.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' + aws-c-auth: '>=0.7.26,<0.7.27.0a0' + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-event-stream: '>=0.4.3,<0.4.4.0a0' + aws-c-http: '>=0.8.8,<0.8.9.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' aws-c-mqtt: '>=0.10.4,<0.10.5.0a0' - aws-c-s3: '>=0.6.0,<0.6.1.0a0' - aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.27.3-h9b188e2_2.conda + aws-c-s3: '>=0.6.4,<0.6.5.0a0' + aws-c-sdkutils: '>=0.1.19,<0.1.20.0a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.28.2-he86e375_0.conda hash: - md5: 58796590793f302e9f982dfb891c94eb - sha256: 4fc5ebb5c299946576fc4e2a4fd2dfc5f5a0988d0561c844de25fda28c364617 + md5: 1a8b0df7d60fffc3b28c3e0379fd4019 + sha256: 7b3a558179b9bcce8ea4b35a5111c52858c2735451a78933f2a4f8268cd822ab category: main optional: false - name: aws-crt-cpp - version: 0.27.3 + version: 0.28.2 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-auth: '>=0.7.22,<0.7.23.0a0' - aws-c-cal: '>=0.7.1,<0.7.2.0a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' - aws-c-http: '>=0.8.2,<0.8.3.0a0' - aws-c-io: '>=0.14.10,<0.14.11.0a0' + aws-c-auth: '>=0.7.26,<0.7.27.0a0' + aws-c-cal: '>=0.7.4,<0.7.5.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-event-stream: '>=0.4.3,<0.4.4.0a0' + aws-c-http: '>=0.8.8,<0.8.9.0a0' + aws-c-io: '>=0.14.18,<0.14.19.0a0' aws-c-mqtt: '>=0.10.4,<0.10.5.0a0' - aws-c-s3: '>=0.6.0,<0.6.1.0a0' - aws-c-sdkutils: '>=0.1.16,<0.1.17.0a0' - libcxx: '>=16' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.27.3-h9d3339c_2.conda + aws-c-s3: '>=0.6.4,<0.6.5.0a0' + aws-c-sdkutils: '>=0.1.19,<0.1.20.0a0' + libcxx: '>=17' + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.28.2-h46cb957_0.conda hash: - md5: bca678a227f7083dffc3d4c0dbd9f2de - sha256: d863e05f421e23a7a7dc1bf545b409857bddac99231290af442a448d26143eb3 + md5: bba4aa30481f47d9f0c8c6fb6e2c2eba + sha256: 932ed98cb8c76d2c30ef5ce4d076b041d997d917805539cb306ce6e3ffda291f category: main optional: false - name: aws-sdk-cpp - version: 1.11.329 + version: 1.11.379 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-event-stream: '>=0.4.3,<0.4.4.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' - aws-crt-cpp: '>=0.27.3,<0.27.4.0a0' - libcurl: '>=8.8.0,<9.0a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' + aws-crt-cpp: '>=0.28.2,<0.28.3.0a0' + libcurl: '>=8.9.1,<9.0a0' + libgcc: '>=13' + libstdcxx: '>=13' libzlib: '>=1.3.1,<2.0a0' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-h46c3b66_9.conda + url: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.379-hc1bef60_8.conda hash: - md5: c840f07ec58dc0b06041e7f36550a539 - sha256: 983f6977cc6b25c8bc785b20859970009242b3812e6b4de592ceb17caf93acb6 + md5: f52817ff334879e3dbdc7392e8248508 + sha256: f720d4092b6aecbc22b602038485f5558e000b315a712d57fd34a9bcc98ae6d0 category: main optional: false - name: aws-sdk-cpp - version: 1.11.329 + version: 1.11.379 manager: conda platform: linux-aarch64 dependencies: - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-event-stream: '>=0.4.3,<0.4.4.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' - aws-crt-cpp: '>=0.27.3,<0.27.4.0a0' - libcurl: '>=8.8.0,<9.0a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' + aws-crt-cpp: '>=0.28.2,<0.28.3.0a0' + libcurl: '>=8.9.1,<9.0a0' + libgcc: '>=13' + libstdcxx: '>=13' libzlib: '>=1.3.1,<2.0a0' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.329-hecfb68f_9.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.379-h301129d_8.conda hash: - md5: 074782015c32b2870350b084935fcbe7 - sha256: 806e894bc94e9a9efe437337205ea43c4258f5cb77b1213004a203eb25d6b239 + md5: 0bb1c9ed8b65c788c74b39ae96964d01 + sha256: 5f40989974c3db6439e81a4f5040e8721e99f30ebdee1d6f173a0861f2c9aaed category: main optional: false - name: aws-sdk-cpp - version: 1.11.329 + version: 1.11.379 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-c-common: '>=0.9.23,<0.9.24.0a0' - aws-c-event-stream: '>=0.4.2,<0.4.3.0a0' + aws-c-common: '>=0.9.27,<0.9.28.0a0' + aws-c-event-stream: '>=0.4.3,<0.4.4.0a0' aws-checksums: '>=0.1.18,<0.1.19.0a0' - aws-crt-cpp: '>=0.27.3,<0.27.4.0a0' - libcurl: '>=8.8.0,<9.0a0' - libcxx: '>=16' + aws-crt-cpp: '>=0.28.2,<0.28.3.0a0' + libcurl: '>=8.9.1,<9.0a0' + libcxx: '>=17' libzlib: '>=1.3.1,<2.0a0' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.329-he6360a2_9.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.379-h8d911dc_8.conda hash: - md5: df8458d1bc6ec9616f8e88a0eadb05c7 - sha256: 46e6e18df4c9a8f8cd34ef0a1952dd2d96bf5fe78a1237d4bdeac212de2eb97d + md5: b35b5661373ccbb19a09bcd3230cdc56 + sha256: 0d43c38c7018a3b0b709b5e5cdb9e098aa97fe45de15eb7fe78e836dea0da1f2 category: main optional: false - name: azure-core-cpp - version: 1.12.0 + version: 1.13.0 manager: conda platform: linux-64 dependencies: - libcurl: '>=8.7.1,<9.0a0' + __glibc: '>=2.17,<3.0.a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.12.0-h830ed8b_0.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.13.0-h935415a_0.conda hash: - md5: 320d066f9cad598854f4af32c7c82931 - sha256: f76438c1f2a2c6142b344652c9fb93304cf1bb1534521f94c9c30fb9b238f0f5 + md5: debd1677c2fea41eb2233a260f48a298 + sha256: b7e0a22295db2e1955f89c69cefc32810309b3af66df986d9fb75d89f98a80f7 category: main optional: false - name: azure-core-cpp - version: 1.12.0 + version: 1.13.0 manager: conda platform: linux-aarch64 dependencies: - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.12.0-h60f91e5_0.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.13.0-h60f91e5_0.conda hash: - md5: efce605a7904816e95b1af4becdc1aac - sha256: 6279337ad9d15c01a6044b93d4074d70c56a5309c48c8dd70a3cc4c46af76870 + md5: fc41d5a9f2c98fd37324c20f47b0124b + sha256: b3aecc4e01db67a18891e6e9517ec9b628577bbd2e1b6616d147c7c5f2f28a2b category: main optional: false - name: azure-core-cpp - version: 1.12.0 + version: 1.13.0 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - libcurl: '>=8.7.1,<9.0a0' + libcurl: '>=8.8.0,<9.0a0' libcxx: '>=16' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.12.0-hd01fc5c_0.conda + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.13.0-hd01fc5c_0.conda hash: - md5: 2accb43f3af2ebf2dbd127978242c10a - sha256: 046435d3502da0f13c13ee6d92d57684624bf18aefc0d84b99d3ed39d034b078 + md5: 2083f6313e623079db6ee67af00e6b27 + sha256: aff4af38416cf7a81c79e5a3b071ce5aa13ec48da28db0312bc1ebe62cf7273d category: main optional: false - name: azure-identity-cpp @@ -1148,14 +1153,15 @@ package: manager: conda platform: linux-64 dependencies: - azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + __glibc: '>=2.17,<3.0.a0' + azure-core-cpp: '>=1.13.0,<1.13.1.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.8.0-hdb0d106_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.8.0-hd126650_2.conda hash: - md5: a297ffb4b505f51d0f58352c5c13971b - sha256: 87420c137ae4d3e139cace9d9da8d63e6888d206f4eea0082975352d4ee65b14 + md5: 36df3cf05459de5d0a41c77c4329634b + sha256: f85452eca3ae0e156b1d1a321a1a9f4f58d44ff45236c0d8602ab96aaad3c6ba category: main optional: false - name: azure-identity-cpp @@ -1163,14 +1169,14 @@ package: manager: conda platform: linux-aarch64 dependencies: - azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + azure-core-cpp: '>=1.13.0,<1.13.1.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.8.0-he93b4e3_1.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.8.0-hf0f394c_2.conda hash: - md5: 97ce0ee943c701a57d3e752f477c6d9e - sha256: 7116cb52da12db9acd1c2528ccac1ef26ccffda69ed4f8c10c4bfb2f1b5a8054 + md5: 3e74c83218d71b01f988e6bada2f4e22 + sha256: ac143df6b8596eeee2f770f02013e384f06ac09ecee042ee7f8c5a65f7958330 category: main optional: false - name: azure-identity-cpp @@ -1179,106 +1185,108 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + azure-core-cpp: '>=1.13.0,<1.13.1.0a0' libcxx: '>=16' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.8.0-h0a11218_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.8.0-h13ea094_2.conda hash: - md5: ed8853eaa0ea62cee06025902a46ff17 - sha256: 2e54b5d0bd189f43d93e5d3f93534d360c071a4fa4c9f1c9e17301cb29943d43 + md5: 383b72f2ee009992b21f4db08a708510 + sha256: 11b01715cae19390890f29ebb56d36d895feafd787ba929aa10b6ce712f3f4b9 category: main optional: false - name: azure-storage-blobs-cpp - version: 12.11.0 + version: 12.12.0 manager: conda platform: linux-64 dependencies: - azure-core-cpp: '>=1.12.0,<1.12.1.0a0' - azure-storage-common-cpp: '>=12.6.0,<12.6.1.0a0' + __glibc: '>=2.17,<3.0.a0' + azure-core-cpp: '>=1.13.0,<1.13.1.0a0' + azure-storage-common-cpp: '>=12.7.0,<12.7.1.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.11.0-ha67cba7_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.12.0-hd2e3451_0.conda hash: - md5: f03bba57b85a5b3ac443a871787fc429 - sha256: 1dc694bcecdead2dbd871bb3abe5470c4473a7e46cfa39885aec70c230d3c16e + md5: 61f1c193452f0daa582f39634627ea33 + sha256: 69a0f5c2a08a1a40524b343060debb8d92295e2cc5805c3db56dad7a41246a93 category: main optional: false - name: azure-storage-blobs-cpp - version: 12.11.0 + version: 12.12.0 manager: conda platform: linux-aarch64 dependencies: - azure-core-cpp: '>=1.12.0,<1.12.1.0a0' - azure-storage-common-cpp: '>=12.6.0,<12.6.1.0a0' + azure-core-cpp: '>=1.13.0,<1.13.1.0a0' + azure-storage-common-cpp: '>=12.7.0,<12.7.1.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.11.0-h41c6e6e_1.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.12.0-h17ca4bd_0.conda hash: - md5: 82d0b0535f080f7469a54f6a1c457623 - sha256: fee09cb912b40304cdbe87de3ae110bda2e15239b7e6fbe7e74944a9ccf1a82c + md5: 9a26fea6b69f4f02689893366961be49 + sha256: 4955de4131a1b4a16ac1f63d3e6f325904b997e1adb0f3fadf5a3b112eee6803 category: main optional: false - name: azure-storage-blobs-cpp - version: 12.11.0 + version: 12.12.0 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - azure-core-cpp: '>=1.12.0,<1.12.1.0a0' - azure-storage-common-cpp: '>=12.6.0,<12.6.1.0a0' + azure-core-cpp: '>=1.13.0,<1.13.1.0a0' + azure-storage-common-cpp: '>=12.7.0,<12.7.1.0a0' libcxx: '>=16' - url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.11.0-h77cc766_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.12.0-hfde595f_0.conda hash: - md5: 817fa040e0458866a658a471abc74c64 - sha256: 390ada2bad5c76b33ef3d2e9e03ee54f7245060a34d6b199117e956301101449 + md5: f2c935764fdacd0fafc05f975fd347e0 + sha256: f733f4acedd8bf1705c780e0828f0b83242ae7e72963aef60d12a7c5b3a8640d category: main optional: false - name: azure-storage-common-cpp - version: 12.6.0 + version: 12.7.0 manager: conda platform: linux-64 dependencies: - azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + __glibc: '>=2.17,<3.0.a0' + azure-core-cpp: '>=1.13.0,<1.13.1.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' libxml2: '>=2.12.7,<3.0a0' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.6.0-he3f277c_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.7.0-h10ac4d7_1.conda hash: - md5: 8a10bb068b138dd473300b5fe34a1865 - sha256: 464c687ed110befb4099be88ea69d2d2fd039a428ab6d9575ac9bf88e932dd55 + md5: ab6d507ad16dbe2157920451d662e4a1 + sha256: 1030fa54497a73eb78c509d451f25701e2e781dc182e7647f55719f1e1f9bee8 category: main optional: false - name: azure-storage-common-cpp - version: 12.6.0 + version: 12.7.0 manager: conda platform: linux-aarch64 dependencies: - azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + azure-core-cpp: '>=1.13.0,<1.13.1.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' libxml2: '>=2.12.7,<3.0a0' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.6.0-hc9a6983_1.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.7.0-h68dbd84_1.conda hash: - md5: 592f0fcadd51dbaccba5e671cdd9bb11 - sha256: c3c372b24ba86aeb685dddc31d8ae39abf473494186bd5e89db7eade426cd3d5 + md5: 368c9e33d8cc763bf883ca12c163b93c + sha256: a4e0afd65ffed6cc788f13068b452d253e4bfa61d8ca0ebaa80e26fe62fed5f7 category: main optional: false - name: azure-storage-common-cpp - version: 12.6.0 + version: 12.7.0 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + azure-core-cpp: '>=1.13.0,<1.13.1.0a0' libcxx: '>=16' libxml2: '>=2.12.7,<3.0a0' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.6.0-h7024f69_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.7.0-hcf3b6fd_1.conda hash: - md5: e796ec0c1c7486270353910f0683de86 - sha256: fbf126aad4d98627a32334cdff8e8f0626120a641f424e08d741595d8b6dc8de + md5: df7e01bcf8f3a9bfb0ab06778f915f29 + sha256: 3fdf9c0337c48706cffe2e4c761cdea4132fb6dbd1f144d969c28afd903cf256 category: main optional: false - name: babel @@ -1802,40 +1810,41 @@ package: category: main optional: false - name: c-ares - version: 1.32.2 + version: 1.33.1 manager: conda platform: linux-64 dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda + __glibc: '>=2.28,<3.0.a0' + libgcc-ng: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda hash: - md5: 8024af1ee7078e37fa3101c0a0296af2 - sha256: d1b01f9e3d10b97fd09e19fda0caf9bfad3c884a6b19fb3f654a9aed02a70b58 + md5: 0d3c60291342c0c025db231353376dfb + sha256: 2cb24f613eaf2850b1a08f28f967b10d8bd44ef623efa0154dc45eb718776be6 category: main optional: false - name: c-ares - version: 1.32.2 + version: 1.33.1 manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.32.2-h68df207_0.conda + __glibc: '>=2.28,<3.0.a0' + libgcc-ng: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.33.1-ha64f414_0.conda hash: - md5: dbb3ce53f75a17cf0da8c856b616b5d7 - sha256: 765ae3240d0e14b458ffa2f6c87652549100c32197ef141dfeb0a8bdf8b6cbb8 + md5: 2165b9057be5ecaa90f2efd192f1155e + sha256: c9eddea9beb6ba629cb922082fcf144936cd47cc9ed7625e98106f314d237e0f category: main optional: false - name: c-ares - version: 1.32.2 + version: 1.33.1 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.32.2-h99b78c6_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.33.1-hd74edd7_0.conda hash: - md5: b0bcd3b8a19fb530d6106467dc681bb4 - sha256: c9cb861e4cc5458df7e9277dd16623efc69491d1d74a85d826c121e2d831415c + md5: 5b69c16ee900aeffcf0103268d708518 + sha256: ad29a9cffa0504cb4bf7605963816feff3c7833f36b050e1e71912d09c38e3f6 category: main optional: false - name: ca-certificates @@ -2351,39 +2360,39 @@ package: category: main optional: false - name: charset-normalizer - version: 2.0.4 + version: 3.3.2 manager: conda platform: linux-64 dependencies: - python: '>=3.5' - url: https://repo.anaconda.com/pkgs/main/noarch/charset-normalizer-2.0.4-pyhd3eb1b0_0.conda + python: '>=3.7' + url: https://repo.anaconda.com/pkgs/main/noarch/charset-normalizer-3.3.2-pyhd3eb1b0_0.conda hash: - md5: e7a441d94234b2b5fafee06e25dbf076 - sha256: b39aea12bf02654cdd0094c79bfa6edbc8d054787f6e2d0b96d403cd4ba4cc0d + md5: c6fea3691e85cf7f568b0618ec29fc4f + sha256: 1cdc690b822b7518ab3b73c06115f6b95037ff111378e6d2e6508c4602df558e category: main optional: false - name: charset-normalizer - version: 2.0.4 + version: 3.3.2 manager: conda platform: linux-aarch64 dependencies: - python: '>=3.5' - url: https://repo.anaconda.com/pkgs/main/noarch/charset-normalizer-2.0.4-pyhd3eb1b0_0.conda + python: '>=3.7' + url: https://repo.anaconda.com/pkgs/main/noarch/charset-normalizer-3.3.2-pyhd3eb1b0_0.conda hash: - md5: e7a441d94234b2b5fafee06e25dbf076 - sha256: b39aea12bf02654cdd0094c79bfa6edbc8d054787f6e2d0b96d403cd4ba4cc0d + md5: c6fea3691e85cf7f568b0618ec29fc4f + sha256: 1cdc690b822b7518ab3b73c06115f6b95037ff111378e6d2e6508c4602df558e category: main optional: false - name: charset-normalizer - version: 2.0.4 + version: 3.3.2 manager: conda platform: osx-arm64 dependencies: - python: '>=3.5' - url: https://repo.anaconda.com/pkgs/main/noarch/charset-normalizer-2.0.4-pyhd3eb1b0_0.conda + python: '>=3.7' + url: https://repo.anaconda.com/pkgs/main/noarch/charset-normalizer-3.3.2-pyhd3eb1b0_0.conda hash: - md5: e7a441d94234b2b5fafee06e25dbf076 - sha256: b39aea12bf02654cdd0094c79bfa6edbc8d054787f6e2d0b96d403cd4ba4cc0d + md5: c6fea3691e85cf7f568b0618ec29fc4f + sha256: 1cdc690b822b7518ab3b73c06115f6b95037ff111378e6d2e6508c4602df558e category: main optional: false - name: click @@ -2841,45 +2850,45 @@ package: category: dev optional: true - name: coverage-badge - version: 1.1.1 + version: 1.1.2 manager: conda platform: linux-64 dependencies: coverage: '' python: '>=3.6' setuptools: '' - url: https://conda.anaconda.org/conda-forge/noarch/coverage-badge-1.1.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/coverage-badge-1.1.2-pyhd8ed1ab_0.conda hash: - md5: 2b9d71adc9cae0b0eff77cae36f75cf6 - sha256: f3a2609982b7c2678db26dbe9aa540a37baccde8c3f9757ab19fd551414dc7e0 + md5: fd300c940116b873560b60e8a224ccdc + sha256: 0042562b3839cd9e5e072482350c83c70e6899501c65d4632b8bd8cf14e869af category: dev optional: true - name: coverage-badge - version: 1.1.1 + version: 1.1.2 manager: conda platform: linux-aarch64 dependencies: coverage: '' python: '>=3.6' setuptools: '' - url: https://conda.anaconda.org/conda-forge/noarch/coverage-badge-1.1.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/coverage-badge-1.1.2-pyhd8ed1ab_0.conda hash: - md5: 2b9d71adc9cae0b0eff77cae36f75cf6 - sha256: f3a2609982b7c2678db26dbe9aa540a37baccde8c3f9757ab19fd551414dc7e0 + md5: fd300c940116b873560b60e8a224ccdc + sha256: 0042562b3839cd9e5e072482350c83c70e6899501c65d4632b8bd8cf14e869af category: dev optional: true - name: coverage-badge - version: 1.1.1 + version: 1.1.2 manager: conda platform: osx-arm64 dependencies: coverage: '' python: '>=3.6' setuptools: '' - url: https://conda.anaconda.org/conda-forge/noarch/coverage-badge-1.1.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/coverage-badge-1.1.2-pyhd8ed1ab_0.conda hash: - md5: 2b9d71adc9cae0b0eff77cae36f75cf6 - sha256: f3a2609982b7c2678db26dbe9aa540a37baccde8c3f9757ab19fd551414dc7e0 + md5: fd300c940116b873560b60e8a224ccdc + sha256: 0042562b3839cd9e5e072482350c83c70e6899501c65d4632b8bd8cf14e869af category: dev optional: true - name: crashtest @@ -2919,47 +2928,47 @@ package: category: main optional: false - name: cryptography - version: 42.0.5 + version: 43.0.0 manager: conda platform: linux-64 dependencies: cffi: '>=1.12' libgcc-ng: '' - openssl: '>=3.0.13,<4.0a0' + openssl: '>=3.0.14,<4.0a0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/cryptography-42.0.5-py312hdda0065_1.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/cryptography-43.0.0-py312hdda0065_0.conda hash: - md5: f224acb5b9a99ce1b715152d1ef7a67e - sha256: 7afdcec1116be6cc5ea455fcc9b1b386e510e58e3d6af783f1215515f840afdc + md5: 76ab63809027e6311b6aa8b4f922ddcf + sha256: 1b57d906f5af138c2e459e2e6a25d956f9fd9af06b13d1d84c8afebe35dcf9a8 category: main optional: false - name: cryptography - version: 42.0.5 + version: 43.0.0 manager: conda platform: linux-aarch64 dependencies: cffi: '>=1.12' libgcc-ng: '' - openssl: '>=3.0.13,<4.0a0' + openssl: '>=3.0.14,<4.0a0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/cryptography-42.0.5-py312h5077475_1.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/cryptography-43.0.0-py312h5077475_0.conda hash: - md5: 89273a814757b478d02aececec63105d - sha256: 9121455c0caa3eabe258acd101802d1cb5075aa23604c2072d20d7d0ab1edb06 + md5: 21d043aa735f93bc501f2e8b9d2a32d2 + sha256: c70469597bc648639e852a8be621bd7f6a03437e5d70aedf6daf49f8c2752cb4 category: main optional: false - name: cryptography - version: 42.0.5 + version: 43.0.0 manager: conda platform: osx-arm64 dependencies: cffi: '>=1.12' - openssl: '>=3.0.13,<4.0a0' + openssl: '>=3.0.14,<4.0a0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/cryptography-42.0.5-py312hd4332d6_1.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/cryptography-43.0.0-py312hd4332d6_0.conda hash: - md5: 3e09a30db97efbb746f753267b8eef3b - sha256: d0703214342ba81adad77de1f616185f60ed67ecd18df7654a0ca05d9a821c3d + md5: 93d9761f091071b3cb24f5ccb3c18f46 + sha256: ec6257001c4a08556ca5f7c0409c71d828f07a5f03a13f922eb0b5c33f1ccd9f category: main optional: false - name: cycler @@ -3140,42 +3149,42 @@ package: category: main optional: false - name: dep-logic - version: 0.4.3 + version: 0.4.4 manager: conda platform: linux-64 dependencies: packaging: '>=22' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.4-pyhd8ed1ab_0.conda hash: - md5: 396864473cf7cf2dcbc17bb3bdcef665 - sha256: c02a4a4f721f6c4ad6b95bb22457fda11d6b3b687630f3e4878bd7a27d720e8b + md5: 865296b62a810e46e49a4de36bd66be4 + sha256: 888a375f632aaa8ccbe888e8229092a7d894fd9c534ca3a0039cd291f4ac57bf category: main optional: false - name: dep-logic - version: 0.4.3 + version: 0.4.4 manager: conda platform: linux-aarch64 dependencies: packaging: '>=22' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.4-pyhd8ed1ab_0.conda hash: - md5: 396864473cf7cf2dcbc17bb3bdcef665 - sha256: c02a4a4f721f6c4ad6b95bb22457fda11d6b3b687630f3e4878bd7a27d720e8b + md5: 865296b62a810e46e49a4de36bd66be4 + sha256: 888a375f632aaa8ccbe888e8229092a7d894fd9c534ca3a0039cd291f4ac57bf category: main optional: false - name: dep-logic - version: 0.4.3 + version: 0.4.4 manager: conda platform: osx-arm64 dependencies: packaging: '>=22' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/dep-logic-0.4.4-pyhd8ed1ab_0.conda hash: - md5: 396864473cf7cf2dcbc17bb3bdcef665 - sha256: c02a4a4f721f6c4ad6b95bb22457fda11d6b3b687630f3e4878bd7a27d720e8b + md5: 865296b62a810e46e49a4de36bd66be4 + sha256: 888a375f632aaa8ccbe888e8229092a7d894fd9c534ca3a0039cd291f4ac57bf category: main optional: false - name: dill @@ -3523,41 +3532,43 @@ package: category: main optional: false - name: fmt - version: 10.2.1 + version: 11.0.2 manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/fmt-10.2.1-h00ab1b0_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/fmt-11.0.2-h434a139_0.conda hash: - md5: 35ef8bc24bd34074ebae3c943d551728 - sha256: 7b9ba098a3661e023c3555e01554354ac4891af8f8998e85f0fcbfdac79fc0d4 + md5: 995f7e13598497691c1dc476d889bc04 + sha256: c620e2ab084948985ae9b8848d841f603e8055655513340e04b6cf129099b5ca category: main optional: false - name: fmt - version: 10.2.1 + version: 11.0.2 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/fmt-10.2.1-h2a328a1_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/fmt-11.0.2-h70be974_0.conda hash: - md5: 540b6320d3c929e012fae0d08f43224d - sha256: 8a8ef05b626033999bb7607df8072cc5aabc839a0004743e8257a6c0628e2176 + md5: 32feda3daf08ff832cf9d55bab2432d6 + sha256: dd47f343981c8e3e0b033ba2511f20400e9cc7ee1206ea1bed01f73798a0c03c category: main optional: false - name: fmt - version: 10.2.1 + version: 11.0.2 manager: conda platform: osx-arm64 dependencies: - libcxx: '>=15' - url: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-10.2.1-h2ffa867_0.conda + __osx: '>=11.0' + libcxx: '>=16' + url: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-11.0.2-h420ef59_0.conda hash: - md5: 8cccde6755bdd787f9840f38a34b4e7d - sha256: 8570ae6fb7cd1179c646e2c48105e91b3ed8ba15855f12965cc5c9719753c06f + md5: 0e44849fd4764e9f85ed8caa9f24c118 + sha256: 62e6508d5bbde4aa36f7b7658ce2d8fdd0e509c0d1661735c1bd1bed00e070c4 category: main optional: false - name: folium @@ -3567,7 +3578,7 @@ package: dependencies: branca: '>=0.6.0' jinja2: '>=2.9' - numpy: '' + numpy: <2.0a0 python: '>=3.12,<3.13.0a0' requests: '' url: https://repo.anaconda.com/pkgs/main/linux-64/folium-0.14.0-py312h06a4308_0.conda @@ -3583,7 +3594,7 @@ package: dependencies: branca: '>=0.6.0' jinja2: '>=2.9' - numpy: '' + numpy: <2.0a0 python: '>=3.12,<3.13.0a0' requests: '' url: https://repo.anaconda.com/pkgs/main/linux-aarch64/folium-0.14.0-py312hd43f75c_0.conda @@ -3599,7 +3610,7 @@ package: dependencies: branca: '>=0.6.0' jinja2: '>=2.9' - numpy: '' + numpy: <2.0a0 python: '>=3.12,<3.13.0a0' requests: '' url: https://repo.anaconda.com/pkgs/main/osx-arm64/folium-0.14.0-py312hca03da5_0.conda @@ -4412,15 +4423,17 @@ package: manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' glib-tools: 2.80.3 libffi: '>=3.4,<4.0a0' libgcc-ng: '>=12' libglib: 2.80.3 + packaging: '' python: '*' - url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.3-h8a4344b_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.3-h315aac3_2.conda hash: - md5: a3acc4920c9ca19cb6b295028d606477 - sha256: 51db16c42f0f07aa9d4f922a629d8f68fe3b2590917b8282b7e8ab5ced45c0f6 + md5: 00e0da7e4fceb5449f3ddd2bf6b2c351 + sha256: 20e138ea8d5e59cb62f06b2ddadbfaf155125b64ea2d3a959e119ffc0be245f1 category: main optional: false - name: glib @@ -4432,11 +4445,12 @@ package: libffi: '>=3.4,<4.0a0' libgcc-ng: '>=12' libglib: 2.80.3 + packaging: '' python: '*' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/glib-2.80.3-haee52c6_1.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/glib-2.80.3-haee52c6_2.conda hash: - md5: d8e86dad46eb1b1b2748d7b7c2c52517 - sha256: 639f62d8baaff5b273dfc53d0ca0bceed549ef38feaa2a6b0c23da2bfdc6568b + md5: 44e1cfbe75333adf7ab53cac4eee0011 + sha256: eda580c427fcd1b1fca1f0d5d22e7cfffe672746b2a8d374036387d6b01e5ac0 category: main optional: false - name: glib-tools @@ -4444,12 +4458,13 @@ package: manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' libgcc-ng: '>=12' libglib: 2.80.3 - url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.3-h73ef956_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.3-h8fdd7da_2.conda hash: - md5: 99701cdc9a25a333d15265d1d243b2dc - sha256: 1cbaa71af8ed506c158e345e3f951b4f36506f96e957b9486dea5eaca86252b2 + md5: 9958a1f8faba35260e6b68e3a7bc88d6 + sha256: 073fd2b01bf7ee4197016a3507fc3dae75628277f2a21f295cdccbd9c1e3e9de category: main optional: false - name: glib-tools @@ -4459,52 +4474,52 @@ package: dependencies: libgcc-ng: '>=12' libglib: 2.80.3 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/glib-tools-2.80.3-hdaf7ded_1.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/glib-tools-2.80.3-hdaf7ded_2.conda hash: - md5: 458c4df163eb4d4eb2fa557b87a84170 - sha256: 5fc61a57d90786742fd23e53e5ff32f276d7e9409b4b42aaf37a20c975c82ccd + md5: 7cf7321c1fc7611046db2eee5317719d + sha256: 477325cfe02cb217c9c9681f089344d34fd0992d36dc588326b82dceca72c672 category: main optional: false - name: griffe - version: 0.48.0 + version: 1.2.0 manager: conda platform: linux-64 dependencies: astunparse: '>=1.6' colorama: '>=0.4' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.48.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/griffe-1.2.0-pyhd8ed1ab_0.conda hash: - md5: 73aafef908b0b8948d739e11ebf92d32 - sha256: 528411c09a2a7bd0a6590601f89ca9a21fe9fb908a67e87d889d2a86205dd850 + md5: b208b4da76de98a770c6ff3a0f8d1ce5 + sha256: 1adb939ffcf1541b8ef0871c9c3e53828049087941015e7728c75b5ff8de613a category: dev optional: true - name: griffe - version: 0.48.0 + version: 1.2.0 manager: conda platform: linux-aarch64 dependencies: astunparse: '>=1.6' colorama: '>=0.4' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.48.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/griffe-1.2.0-pyhd8ed1ab_0.conda hash: - md5: 73aafef908b0b8948d739e11ebf92d32 - sha256: 528411c09a2a7bd0a6590601f89ca9a21fe9fb908a67e87d889d2a86205dd850 + md5: b208b4da76de98a770c6ff3a0f8d1ce5 + sha256: 1adb939ffcf1541b8ef0871c9c3e53828049087941015e7728c75b5ff8de613a category: dev optional: true - name: griffe - version: 0.48.0 + version: 1.2.0 manager: conda platform: osx-arm64 dependencies: astunparse: '>=1.6' colorama: '>=0.4' python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/griffe-0.48.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/griffe-1.2.0-pyhd8ed1ab_0.conda hash: - md5: 73aafef908b0b8948d739e11ebf92d32 - sha256: 528411c09a2a7bd0a6590601f89ca9a21fe9fb908a67e87d889d2a86205dd850 + md5: b208b4da76de98a770c6ff3a0f8d1ce5 + sha256: 1adb939ffcf1541b8ef0871c9c3e53828049087941015e7728c75b5ff8de613a category: dev optional: true - name: h11 @@ -4771,54 +4786,54 @@ package: category: main optional: false - name: httpx - version: 0.26.0 + version: 0.27.0 manager: conda platform: linux-64 dependencies: anyio: '' certifi: '' - httpcore: '>=1,<2' + httpcore: '>=1.0.0,<2.0.0a0' idna: '' python: '>=3.12,<3.13.0a0' sniffio: '' - url: https://repo.anaconda.com/pkgs/main/linux-64/httpx-0.26.0-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/httpx-0.27.0-py312h06a4308_0.conda hash: - md5: 1773f853d16a8002ac9c8f056acbd5ed - sha256: 2f7e5f4edc3e990954e6dbb44a6d2950cf5133e4f66b2837373a913cb2724c06 + md5: 2364f07b85b5cc9f4a62106c823f10c8 + sha256: 122ea9612888bbbbeac4a379843bf10e901ab7dbce79e5b41b7c1761b61a97b2 category: main optional: false - name: httpx - version: 0.26.0 + version: 0.27.0 manager: conda platform: linux-aarch64 dependencies: anyio: '' certifi: '' - httpcore: '>=1,<2' + httpcore: '>=1.0.0,<2.0.0a0' idna: '' python: '>=3.12,<3.13.0a0' sniffio: '' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/httpx-0.26.0-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/httpx-0.27.0-py312hd43f75c_0.conda hash: - md5: 9d30fee9af9768191c1ec648d4b44084 - sha256: bc24e47f272389751ae973faf154c39b5ea6ffe4ae55600eb71a5f10cf050393 + md5: 78c06ecfcae7625b752ef8dac1d94d49 + sha256: 2787d28bf1c80c8bbf2f571a7490762f0033b7189cb4038d212f5cf5f30c5e4c category: main optional: false - name: httpx - version: 0.26.0 + version: 0.27.0 manager: conda platform: osx-arm64 dependencies: anyio: '' certifi: '' - httpcore: '>=1,<2' + httpcore: '>=1.0.0,<2.0.0a0' idna: '' python: '>=3.12,<3.13.0a0' sniffio: '' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/httpx-0.26.0-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/httpx-0.27.0-py312hca03da5_0.conda hash: - md5: 1787639676e65da9f07bf09f2814215f - sha256: 16b68ca76e7c8843c881b090ece713eeeea06d378fa5a3e1390242d70541c27e + md5: 520b2e062a38ea0c5a1985355870a70a + sha256: b31dca4c0470d5a1eb4e401cc1b40d19802d76bd70c39e29aed2ab68bb34689a category: main optional: false - name: icu @@ -5910,7 +5925,7 @@ package: category: main optional: false - name: jupyterlab - version: 4.2.4 + version: 4.2.5 manager: conda platform: linux-64 dependencies: @@ -5931,14 +5946,14 @@ package: tomli: '>=1.2.2' tornado: '>=6.2.0' traitlets: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.5-pyhd8ed1ab_0.conda hash: - md5: 28f3334e97c39de2b7ac15743b041784 - sha256: e3b585b55634da48871ed3082c429652a62bf0cf7733641b1382b9c314f1c901 + md5: 594762eddc55b82feac6097165a88e3c + sha256: db08036a6fd846c178ebdce7327be1130bda10ac96113c17b04bce2bc4d67dda category: main optional: false - name: jupyterlab - version: 4.2.4 + version: 4.2.5 manager: conda platform: linux-aarch64 dependencies: @@ -5959,14 +5974,14 @@ package: tomli: '>=1.2.2' tornado: '>=6.2.0' traitlets: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.5-pyhd8ed1ab_0.conda hash: - md5: 28f3334e97c39de2b7ac15743b041784 - sha256: e3b585b55634da48871ed3082c429652a62bf0cf7733641b1382b9c314f1c901 + md5: 594762eddc55b82feac6097165a88e3c + sha256: db08036a6fd846c178ebdce7327be1130bda10ac96113c17b04bce2bc4d67dda category: main optional: false - name: jupyterlab - version: 4.2.4 + version: 4.2.5 manager: conda platform: osx-arm64 dependencies: @@ -5987,10 +6002,10 @@ package: tomli: '>=1.2.2' tornado: '>=6.2.0' traitlets: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.4-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.2.5-pyhd8ed1ab_0.conda hash: - md5: 28f3334e97c39de2b7ac15743b041784 - sha256: e3b585b55634da48871ed3082c429652a62bf0cf7733641b1382b9c314f1c901 + md5: 594762eddc55b82feac6097165a88e3c + sha256: db08036a6fd846c178ebdce7327be1130bda10ac96113c17b04bce2bc4d67dda category: main optional: false - name: jupyterlab_pygments @@ -6677,7 +6692,7 @@ package: category: main optional: false - name: libcurl - version: 8.8.0 + version: 8.9.1 manager: conda platform: linux-64 dependencies: @@ -6685,17 +6700,17 @@ package: libgcc-ng: '>=12' libnghttp2: '>=1.58.0,<2.0a0' libssh2: '>=1.11.0,<2.0a0' - libzlib: '>=1.2.13,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' openssl: '>=3.3.1,<4.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda hash: - md5: b8afb3e3cb3423cc445cf611ab95fdb0 - sha256: 6b5b64cdcdb643368ebe236de07eedee99b025bb95129bbe317c46e5bdc693f3 + md5: 7da1d242ca3591e174a3c7d82230d3c0 + sha256: 0ba60f83709068e9ec1ab543af998cb5a201c8379c871205447684a34b5abfd8 category: main optional: false - name: libcurl - version: 8.8.0 + version: 8.9.1 manager: conda platform: linux-aarch64 dependencies: @@ -6703,30 +6718,30 @@ package: libgcc-ng: '>=12' libnghttp2: '>=1.58.0,<2.0a0' libssh2: '>=1.11.0,<2.0a0' - libzlib: '>=1.2.13,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' openssl: '>=3.3.1,<4.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.8.0-h4e8248e_1.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.9.1-hfa30633_0.conda hash: - md5: d3629660719854a4fc487c6a3dcd66b3 - sha256: 26e97d16d80beea469b85706f954978ff224e8b18c2b5e8f093bfb0406ba927f + md5: efeb999ea2b519696001823b8e49cdbd + sha256: ded3a7ce889fc45926a49be14801ed334f2e40ca52380edabbcf5484ec7a889b category: main optional: false - name: libcurl - version: 8.8.0 + version: 8.9.1 manager: conda platform: osx-arm64 dependencies: krb5: '>=1.21.3,<1.22.0a0' libnghttp2: '>=1.58.0,<2.0a0' libssh2: '>=1.11.0,<2.0a0' - libzlib: '>=1.2.13,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' openssl: '>=3.3.1,<4.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.8.0-h7b6f9a7_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.9.1-hfd8ffcc_0.conda hash: - md5: e9580b0bb247a2ccf937b16161478f19 - sha256: 9da82a9bd72e9872941da32be54543076c92dbeb2aba688a1c24adbc1c699e64 + md5: be0f46c6362775504d8894bd788a45b2 + sha256: 4d6006c866844a39fb835436a48407f54f2310111a6f1d3e89efb16cf5c4d81b category: main optional: false - name: libcxx @@ -6735,10 +6750,10 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-18.1.8-h167917d_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-18.1.8-h3ed4263_6.conda hash: - md5: c891c2eeabd7d67fbc38e012cc6045d6 - sha256: a598062f2d1522fc3727c16620fbc2bc913c1069342671428a92fcf4eb02ec12 + md5: 9fefa1597c93b710cc9bce87bffb0428 + sha256: 6e267698e575bb02c8ed86184fad6d6d3504643dcfa10dad0306d3d25a3d22e3 category: main optional: false - name: libdeflate @@ -6921,29 +6936,53 @@ package: sha256: 800216cb554d0beaf970fe7c3efeee7974bb76576c1c5e0ae070c57fca2bba93 category: main optional: false -- name: libgcc-ng +- name: libgcc version: 14.1.0 manager: conda platform: linux-64 dependencies: _libgcc_mutex: '0.1' _openmp_mutex: '>=4.5' - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda hash: - md5: ca0fad6a41ddaef54a153b78eccb5037 - sha256: b8e869ac96591cda2704bf7e77a301025e405227791a0bddf14a3dac65125538 + md5: 002ef4463dd1e2b44a94a4ace468f5d2 + sha256: 10fa74b69266a2be7b96db881e18fa62cfa03082b65231e8d652e897c4b335a3 category: main optional: false -- name: libgcc-ng +- name: libgcc version: 14.1.0 manager: conda platform: linux-aarch64 dependencies: _openmp_mutex: '>=4.5' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.1.0-he277a41_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.1.0-he277a41_1.conda hash: - md5: 47ecd1292a3fd78b616640b35dd9632c - sha256: b9ca03216bc089c0c46f008bc6f447bc0df8dc826d9801fb4283e49fa89c877e + md5: 2cb475709e327bb76f74645784582e6a + sha256: 0affee19a50081827a9b7d5a43a1d241d295209342f5c6b8d1da21e950547680 + category: main + optional: false +- name: libgcc-ng + version: 14.1.0 + manager: conda + platform: linux-64 + dependencies: + libgcc: 14.1.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda + hash: + md5: 1efc0ad219877a73ef977af7dbb51f17 + sha256: b91f7021e14c3d5c840fbf0dc75370d6e1f7c7ff4482220940eaafb9c64613b7 + category: main + optional: false +- name: libgcc-ng + version: 14.1.0 + manager: conda + platform: linux-aarch64 + dependencies: + libgcc: 14.1.0 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.1.0-he9431aa_1.conda + hash: + md5: 842a1a0cf6f995091734a723e5d291ef + sha256: 44e76a6c1fad613d92035c69e475ccb7da2f554b2fdfabceff8dc4bc570f3622 category: main optional: false - name: libgdal @@ -7105,6 +7144,18 @@ package: sha256: 5b55d6755f5b6a36eb4d1a6c2c38dac68334bd97dfea06009f59154f7744aad2 category: main optional: false +- name: libgfortran + version: 14.1.0 + manager: conda + platform: linux-aarch64 + dependencies: + libgfortran5: 14.1.0 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.1.0-he9431aa_1.conda + hash: + md5: c0b5e52811ae0997f9df25a99846eb9e + sha256: 8632662e780c32b7eda20be8d56bb605fa5a4f7851ba5b86d1cdf17125327664 + category: main + optional: false - name: libgfortran version: 5.0.0 manager: conda @@ -7118,15 +7169,14 @@ package: category: main optional: false - name: libgfortran-ng - version: 14.1.0 + version: 8.2.0 manager: conda platform: linux-64 - dependencies: - libgfortran5: 14.1.0 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda + dependencies: {} + url: https://repo.anaconda.com/pkgs/main/linux-64/libgfortran-ng-8.2.0-hdf63c60_1.conda hash: - md5: f4ca84fbd6d06b0a052fb2d5b96dde41 - sha256: ef624dacacf97b2b0af39110b36e2fd3e39e358a1a6b7b21b85c9ac22d8ffed9 + md5: 29c0ef7e284d741937c7c26ae3250bbd + sha256: d3eb0564dcb9696089bfa66008001a9c5f01e369b3dfa64c35c6c438b58e7825 category: main optional: false - name: libgfortran-ng @@ -7134,11 +7184,11 @@ package: manager: conda platform: linux-aarch64 dependencies: - libgfortran5: 14.1.0 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-14.1.0-he9431aa_0.conda + libgfortran: 14.1.0 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-14.1.0-he9431aa_1.conda hash: - md5: a50ae662c1e7f26f0f2c99e31d1bf614 - sha256: 72d7aa3d0b20b9d64a2f1c72f016c5a8a19594bb56857267e9fc7c1fc0f13223 + md5: 494514d173c7a4eb00957dc203b4d784 + sha256: b0e32c07e8a2965f12950a793dece8ca08db83ecf88c76e0d0d2466cc35a8956 category: main optional: false - name: libgfortran5 @@ -7146,11 +7196,11 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=14.1.0' - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda + libgcc: '>=14.1.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda hash: - md5: 6456c2620c990cd8dde2428a27ba0bc5 - sha256: a67d66b1e60a8a9a9e4440cee627c959acb4810cb182e089a4b0729bfdfbdf90 + md5: 10a0cef64b784d6ab6da50ebca4e984d + sha256: c40d7db760296bf9c776de12597d2f379f30e890b9ae70c1de962ff2aa1999f6 category: main optional: false - name: libgfortran5 @@ -7158,11 +7208,11 @@ package: manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=14.1.0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.1.0-h9420597_0.conda + libgcc: '>=14.1.0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.1.0-h9420597_1.conda hash: - md5: b907b29b964b8ebd7be215e47a659179 - sha256: 34a339c50c0fd2944ea31a013336b500f91f2e00ccfa0607f1bcc5d0a3378373 + md5: f30cf31e474062ea51481d4181ee15df + sha256: 1c455a32c1f5aaf9befd03894cc053271f0aea3fb4211bb91dd0055138dc09e4 category: main optional: false - name: libgfortran5 @@ -7182,15 +7232,16 @@ package: manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' libffi: '>=3.4,<4.0a0' libgcc-ng: '>=12' libiconv: '>=1.17,<2.0a0' libzlib: '>=1.3.1,<2.0a0' pcre2: '>=10.44,<10.45.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h8a4344b_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h315aac3_2.conda hash: - md5: 6ea440297aacee4893f02ad759e6ffbc - sha256: 5f5854a7cee117d115009d8f22a70d5f9e28f09cb6e453e8f1dd712e354ecec9 + md5: b0143a3e98136a680b728fdf9b42a258 + sha256: 7470e664b780b91708bed356cc634874dfc3d6f17cbf884a1d6f5d6d59c09f91 category: main optional: false - name: libglib @@ -7203,10 +7254,10 @@ package: libiconv: '>=1.17,<2.0a0' libzlib: '>=1.3.1,<2.0a0' pcre2: '>=10.44,<10.45.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.80.3-haee52c6_1.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.80.3-haee52c6_2.conda hash: - md5: 50ed8a077706cfe3da719deb71001f2c - sha256: 8e9a0d14118d99d56f6bd8fb52655362a89bea773d83a7b0c6ec2fbca458ce8c + md5: 937a787ab5789a1e0c818b9545b6deb9 + sha256: c32705e0cec1edb6c43fd32cb230e03f882c3dce7921dab3a361ce84b7cacb21 category: main optional: false - name: libglib @@ -7220,10 +7271,10 @@ package: libintl: '>=0.22.5,<1.0a0' libzlib: '>=1.3.1,<2.0a0' pcre2: '>=10.44,<10.45.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.3-h59d46d9_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.3-h59d46d9_2.conda hash: - md5: 2fd194003b4e69ab690f18994a71fd70 - sha256: 92f9ca586a0d8070ae2c8924cbc7cc4fd79d47ff9cce58336984c86a197ab181 + md5: 17ac2bac18ec707efc8575fae2f09990 + sha256: 15cc86d7d91fb78a76e3e2b965e5d6e8b7c79cc4f4ec3322d48fb712d792eff6 category: main optional: false - name: libgomp @@ -7232,10 +7283,10 @@ package: platform: linux-64 dependencies: _libgcc_mutex: '0.1' - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda hash: - md5: ae061a5ed5f05818acdf9adab72c146d - sha256: 7699df61a1f6c644b3576a40f54791561f2845983120477a16116b951c9cdb05 + md5: 23c255b008c4f2ae008f81edcabaca89 + sha256: c96724c8ae4ee61af7674c5d9e5a3fbcf6cd887a40ad5a52c99aa36f1d4f9680 category: main optional: false - name: libgomp @@ -7243,69 +7294,69 @@ package: manager: conda platform: linux-aarch64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.1.0-he277a41_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.1.0-he277a41_1.conda hash: - md5: 434ccc943b843117e4cebc97265f2504 - sha256: 11f326e49e0fb92c2a52e870c029fc26b4b6d3eb9414fa4374cb8496b231a730 + md5: 59d463d51eda114031e52667843f9665 + sha256: a257997cc35b97a58b4b3be1b108791619736d90af8d30dab717d0f0dd835ab5 category: main optional: false - name: libgoogle-cloud - version: 2.26.0 + version: 2.28.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libabseil: '>=20240116.2,<20240117.0a0' - libcurl: '>=8.8.0,<9.0a0' + libcurl: '>=8.9.1,<9.0a0' libgcc-ng: '>=12' libgrpc: '>=1.62.2,<1.63.0a0' libprotobuf: '>=4.25.3,<4.25.4.0a0' libstdcxx-ng: '>=12' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.26.0-h26d7fe4_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.28.0-h26d7fe4_0.conda hash: - md5: 7b9d4c93870fb2d644168071d4d76afb - sha256: c6caa2d4c375c6c5718e6223bb20ccf6305313c0fef2a66499b4f6cdaa299635 + md5: 2c51703b4d775f8943c08a361788131b + sha256: d87b83d91a9fed749b80dea915452320598035949804db3be616b8c3d694c743 category: main optional: false - name: libgoogle-cloud - version: 2.26.0 + version: 2.28.0 manager: conda platform: linux-aarch64 dependencies: libabseil: '>=20240116.2,<20240117.0a0' - libcurl: '>=8.8.0,<9.0a0' + libcurl: '>=8.9.1,<9.0a0' libgcc-ng: '>=12' libgrpc: '>=1.62.2,<1.63.0a0' libprotobuf: '>=4.25.3,<4.25.4.0a0' libstdcxx-ng: '>=12' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.26.0-hc02380a_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.28.0-hc02380a_0.conda hash: - md5: 64eb6bf3c63accd7ca9d171ba630128b - sha256: bf8f9f0c8065a910da1438e6b898950bc10527cf245667ed8b3cfb9966b6203c + md5: 914cdbb446aaf85bcb46e86f466fcd8c + sha256: 8d48b073d94fcb18893d7c731ccaafd332590e38c4baf1cea3d76e6c4b792135 category: main optional: false - name: libgoogle-cloud - version: 2.26.0 + version: 2.28.0 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' libabseil: '>=20240116.2,<20240117.0a0' - libcurl: '>=8.8.0,<9.0a0' + libcurl: '>=8.9.1,<9.0a0' libcxx: '>=16' libgrpc: '>=1.62.2,<1.63.0a0' libprotobuf: '>=4.25.3,<4.25.4.0a0' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.26.0-hfe08963_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.28.0-hfe08963_0.conda hash: - md5: db7ab92239aeb06c3c52de90cc1e6f7a - sha256: 6753beade8465987399e85ca47c94814e8e24c58cf0ff5591545e6cbe7172ec5 + md5: 68fb9b247b79e8ac3be37c2923a0cf8a + sha256: 8ac585e360937aaf9f323e7414c710bf00eec6cf742c15b521fd502e6e3abf2b category: main optional: false - name: libgoogle-cloud-storage - version: 2.26.0 + version: 2.28.0 manager: conda platform: linux-64 dependencies: @@ -7314,18 +7365,18 @@ package: libcrc32c: '>=1.1.2,<1.2.0a0' libcurl: '' libgcc-ng: '>=12' - libgoogle-cloud: 2.26.0 + libgoogle-cloud: 2.28.0 libstdcxx-ng: '>=12' libzlib: '>=1.3.1,<2.0a0' openssl: '' - url: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.26.0-ha262f82_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.28.0-ha262f82_0.conda hash: - md5: 89b53708fd67762b26c38c8ecc5d323d - sha256: 7c16bf2e5aa6b5e42450c218fdfa7d5ff1da952c5a5c821c001ab3fd940c2aed + md5: 9e7960f0b9ab3895ef73d92477c47dae + sha256: 3237bc1ee88dab8d8fea0a1886e12a0262ff5e471944a234c314aa1da411588e category: main optional: false - name: libgoogle-cloud-storage - version: 2.26.0 + version: 2.28.0 manager: conda platform: linux-aarch64 dependencies: @@ -7333,18 +7384,18 @@ package: libcrc32c: '>=1.1.2,<1.2.0a0' libcurl: '' libgcc-ng: '>=12' - libgoogle-cloud: 2.26.0 + libgoogle-cloud: 2.28.0 libstdcxx-ng: '>=12' libzlib: '>=1.3.1,<2.0a0' openssl: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.26.0-hd572f31_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.28.0-hd572f31_0.conda hash: - md5: c3416132d0d0b173f4ce4561dd02664c - sha256: 548d737fdee350b31061423d63367093cb8c213377787b823af15381bd1d6eb9 + md5: 9e300aff69cda20c40a747f8cf014892 + sha256: 84a4c6d61ab8d0ef7dfe375ae63f0c9bc95a2f556b89b46c346d002bac24ae0a category: main optional: false - name: libgoogle-cloud-storage - version: 2.26.0 + version: 2.28.0 manager: conda platform: osx-arm64 dependencies: @@ -7353,13 +7404,13 @@ package: libcrc32c: '>=1.1.2,<1.2.0a0' libcurl: '' libcxx: '>=16' - libgoogle-cloud: 2.26.0 + libgoogle-cloud: 2.28.0 libzlib: '>=1.3.1,<2.0a0' openssl: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.26.0-h1466eeb_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.28.0-h1466eeb_0.conda hash: - md5: 385940a9a022e911e88f4e9ea45e47b3 - sha256: b4c37ebd74a1453ee1cf561e40354544866d1816fa12637b7076377d0ef205ae + md5: 16874ac519f64d2199fab04fd9bd821d + sha256: c62d08339e98fd56d65390df1184d8c2929de2713d431a910c3bb59750daccac category: main optional: false - name: libgrpc @@ -7461,11 +7512,12 @@ package: manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' libiconv: '>=1.17,<2.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8fbad5d_2.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8414b35_3.conda hash: - md5: 3d216d0add050129007de3342be7b8c5 - sha256: 21bc79bdf34ffd20cb84d2a8bd82d7d0e2a1b94b9e72773f0fb207e5b4f1ff63 + md5: 3b98ec32e91b3b59ad53dbb9c96dd334 + sha256: 7c1d238d4333af385e594c89ebcb520caad7ed83a735c901099ec0970a87a891 category: main optional: false - name: libjpeg-turbo @@ -7510,14 +7562,14 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libexpat: '>=2.6.2,<3.0a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' + libgcc-ng: '>=13' + libstdcxx-ng: '>=13' libzlib: '>=1.3.1,<2.0a0' uriparser: '>=0.9.8,<1.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hbbc8833_1020.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hf539b9f_1021.conda hash: - md5: 6d76c5822cb38bc1ab5a06565c6cf626 - sha256: 5bd19933cb3790ec8632c11fa67c25d82654bea6c2bc4f51f8bcd8b122ae96c8 + md5: e8c7620cc49de0c6a2349b6dd6e39beb + sha256: 721c3916d41e052ffd8b60e77f2da6ee47ff0d18babfca48ccf93606f1e0656a category: main optional: false - name: libkml @@ -7526,14 +7578,14 @@ package: platform: linux-aarch64 dependencies: libexpat: '>=2.6.2,<3.0a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' + libgcc-ng: '>=13' + libstdcxx-ng: '>=13' libzlib: '>=1.3.1,<2.0a0' uriparser: '>=0.9.8,<1.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libkml-1.3.0-hcbe7090_1020.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libkml-1.3.0-h62bc5a7_1021.conda hash: - md5: b19b2f671f59e22b82fc735679b5e2a4 - sha256: 95af37fa9263f9f075291456b51382c35ac79427647aa1476fa91e3062c615de + md5: dfa83014442562a942f78942a259d07e + sha256: a6de6940f220bbfb3af7396635b90f09d6ea49a489f478ee563b7b7263ceb961 category: main optional: false - name: libkml @@ -7542,14 +7594,14 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - libcxx: '>=16' + libcxx: '>=17' libexpat: '>=2.6.2,<3.0a0' libzlib: '>=1.3.1,<2.0a0' uriparser: '>=0.9.8,<1.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libkml-1.3.0-h00ed6cc_1020.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libkml-1.3.0-he250239_1021.conda hash: - md5: 628dcff1d0a6bb93fc114bf09dd65470 - sha256: 254156e86db817d7f312441837ebf3835b01d83e939e1ce54664dd160b6ad716 + md5: 891bb2a18eaef684f37bd4fb942cd8b2 + sha256: e578ba448489465b8fea743e214272a9fcfccb0d152ba1ff57657aaa76a0cd7d category: main optional: false - name: libnetcdf @@ -7785,45 +7837,46 @@ package: category: main optional: false - name: libpq - version: '16.3' + version: '16.4' manager: conda platform: linux-64 dependencies: - krb5: '>=1.21.2,<1.22.0a0' - libgcc-ng: '>=12' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda + __glibc: '>=2.17,<3.0.a0' + krb5: '>=1.21.3,<1.22.0a0' + libgcc: '>=13' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libpq-16.4-h2d7952a_1.conda hash: - md5: bac737ae28b79cfbafd515258d97d29e - sha256: 117ba1e11f07b1ca0671641bd6d1f2e7fc6e27db1c317a0cdb4799ffa69f47db + md5: 7e3173fd1299939a02ebf9ec32aa77c4 + sha256: f7a425b8bc94a541f9c43120734305705ffaa3054470e49fbdea0f166fc3f371 category: main optional: false - name: libpq - version: '16.3' + version: '16.4' manager: conda platform: linux-aarch64 dependencies: - krb5: '>=1.21.2,<1.22.0a0' - libgcc-ng: '>=12' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-16.3-hcf0348d_0.conda + krb5: '>=1.21.3,<1.22.0a0' + libgcc: '>=13' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-16.4-hb7c570e_1.conda hash: - md5: 7dd46e914b037824b9a9629ca6586fc3 - sha256: 8f4f0be9e86cce1a51423ccb9bfe559fb3778e2c2d62176ee52c31a029cc8d6d + md5: 89e92105d664ac0fdb9720b9c3f24179 + sha256: e71e6e2fbef3fbac3ab7be4d9b83acec2b7aa0b08719cd220a0b5e4bb983fc94 category: main optional: false - name: libpq - version: '16.3' + version: '16.4' manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - krb5: '>=1.21.2,<1.22.0a0' - openssl: '>=3.3.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libpq-16.3-h7afe498_0.conda + krb5: '>=1.21.3,<1.22.0a0' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libpq-16.4-h671472c_1.conda hash: - md5: b0f5315a3f630ade192cb9b569ce54ba - sha256: ef7c3bca8ee224e7bb282d85fa573180a8ef4eab943c313cb5b799ce506651bf + md5: 282e93e7e25860375ee64b5875e33f9c + sha256: 4b5b614bcef95b48dc7af5f442b19572822d8d10df856ffbbcdce7a58197be20 category: main optional: false - name: libprotobuf @@ -8056,42 +8109,43 @@ package: category: main optional: false - name: libsqlite - version: 3.46.0 + version: 3.46.1 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=12' - libzlib: '>=1.2.13,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda hash: - md5: 18aa975d2094c34aef978060ae7da7d8 - sha256: daee3f68786231dad457d0dfde3f7f1f9a7f2018adabdbb864226775101341a8 + md5: 36f79405ab16bf271edb55b213836dac + sha256: 9851c049abafed3ee329d6c7c2033407e2fc269d33a75c071110ab52300002b0 category: main optional: false - name: libsqlite - version: 3.46.0 + version: 3.46.1 manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=12' - libzlib: '>=1.2.13,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.0-hf51ef55_0.conda + libgcc: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.46.1-hc4a20ef_0.conda hash: - md5: a8ae63fd6fb7d007f74ef3df95e5edf3 - sha256: 7b48d006be6cd089105687fb524a2c93c4218bfc398d0611340cafec55249977 + md5: cd559337c1bd9545ecbeaad017e7d878 + sha256: b4ee96d292fea6bdfceb34dff5e5f0e4b21a0a3dab0559a21fc4a35dc217764e category: main optional: false - name: libsqlite - version: 3.46.0 + version: 3.46.1 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - libzlib: '>=1.2.13,<2.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.0-hfb93653_0.conda + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.1-hc14010f_0.conda hash: - md5: 12300188028c9bc02da965128b91b517 - sha256: 73048f9cb8647d3d3bfe6021c0b7d663e12cffbe9b4f31bd081e713b0a9ad8f9 + md5: 58050ec1724e58668d0126a1615553fa + sha256: 3725f962f490c5d44dae326d5f5b2e3c97f71a6322d914ccc85b5ddc2e50d120 category: main optional: false - name: libssh2 @@ -8135,16 +8189,40 @@ package: sha256: bb57d0c53289721fff1eeb3103a1c6a988178e88d8a8f4345b0b91a35f0e0015 category: main optional: false +- name: libstdcxx + version: 14.1.0 + manager: conda + platform: linux-64 + dependencies: + libgcc: 14.1.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda + hash: + md5: 9dbb9699ea467983ba8a4ba89b08b066 + sha256: 44decb3d23abacf1c6dd59f3c152a7101b7ca565b4ef8872804ceaedcc53a9cd + category: main + optional: false +- name: libstdcxx + version: 14.1.0 + manager: conda + platform: linux-aarch64 + dependencies: + libgcc: 14.1.0 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.1.0-h3f4de04_1.conda + hash: + md5: 6c2afef2109372440a90c566bcb6391c + sha256: 430e7c36ca9736d06fd669eb1771acb9a8bcaac578ae76b093fa06391798a0ae + category: main + optional: false - name: libstdcxx-ng version: 14.1.0 manager: conda platform: linux-64 dependencies: - libgcc-ng: 14.1.0 - url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda + libstdcxx: 14.1.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda hash: - md5: 1cb187a157136398ddbaae90713e2498 - sha256: 88c42b388202ffe16adaa337e36cf5022c63cf09b0405cf06fc6aeacccbe6146 + md5: bd2598399a70bb86d8218e95548d735e + sha256: a2dc44f97290740cc187bfe94ce543e6eb3c2ea8964d99f189a1d8c97b419b8c category: main optional: false - name: libstdcxx-ng @@ -8152,11 +8230,11 @@ package: manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: 14.1.0 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.1.0-h3f4de04_0.conda + libstdcxx: 14.1.0 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.1.0-hf1166c9_1.conda hash: - md5: 2f84852b723ac4389eb188db695526bb - sha256: 4f2f35b78258d1a1e56b1b0e61091862c10ec76bf67ca1b0ff99dd5e07e76271 + md5: 51f54efdd1d2ed5d7e9c67381b75fdb1 + sha256: d7aa6fa26735317ea5cc18e4c2f3316ce29dcc283d65b72b3b99b2d88386aaf4 category: main optional: false - name: libtiff @@ -8282,14 +8360,15 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=12' + __glibc: '>=2.17,<3.0.a0' + libgcc-ng: '>=13' pthread-stubs: '' xorg-libxau: '>=1.0.11,<2.0a0' xorg-libxdmcp: '' - url: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hd590300_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda hash: - md5: 151cba22b85a989c2d6ef9633ffee1e4 - sha256: 7180375f37fd264bb50672a63da94536d4abd81ccec059e932728ae056324b3a + md5: 3601598f0db0470af28985e3e7ad0158 + sha256: 33aa5fc997468b07ab3020b142eacc5479e4e2c2169f467b20ab220f33dd08de category: main optional: false - name: libxcb @@ -8297,14 +8376,14 @@ package: manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=12' + libgcc-ng: '>=13' pthread-stubs: '' xorg-libxau: '>=1.0.11,<2.0a0' xorg-libxdmcp: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.16-h7935292_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.16-h57736b2_1.conda hash: - md5: 93c0136e9cba96657339dfe25fba4da7 - sha256: 5e4fec0243dca4af29cce38182b5a1b109a32f064421389f1a44aa883de79a1b + md5: 8d502f235bf4f3ce1f288cb1ff3a90b6 + sha256: 7871c08ade98ba2dea61d0bae0ba9b2a4cd02512b993005c9a7a8fd3100cdfc8 category: main optional: false - name: libxcb @@ -8312,13 +8391,14 @@ package: manager: conda platform: osx-arm64 dependencies: + __osx: '>=11.0' pthread-stubs: '' xorg-libxau: '>=1.0.11,<2.0a0' xorg-libxdmcp: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.16-hf2054a2_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.16-hc9fafa5_1.conda hash: - md5: 55b5ed79062edde70459943d2d430d99 - sha256: ebf4b797f18de4280548520c97ca1528bcb5a8bc721e3bb133a4e3c930a5320f + md5: c40807bb9ee47958bf815406c87cbc5b + sha256: 6b38c4bceddde26d7d5bf1bec19bd302536a5e51993c2b0fc671fbb015a05643 category: main optional: false - name: libxcrypt @@ -8564,7 +8644,7 @@ package: platform: linux-64 dependencies: networkx: '' - numpy: '>=1.3' + numpy: '>=1.3,<2.0a0' pandas: '>=1.0' python: '>=3.12,<3.13.0a0' scikit-learn: '' @@ -8581,7 +8661,7 @@ package: platform: linux-aarch64 dependencies: networkx: '' - numpy: '>=1.3' + numpy: '>=1.3,<2.0a0' pandas: '>=1.0' python: '>=3.12,<3.13.0a0' scikit-learn: '' @@ -8598,7 +8678,7 @@ package: platform: osx-arm64 dependencies: networkx: '' - numpy: '>=1.3' + numpy: '>=1.3,<2.0a0' pandas: '>=1.0' python: '>=3.12,<3.13.0a0' scikit-learn: '' @@ -9184,11 +9264,12 @@ package: manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda hash: - md5: fcea371545eda051b6deafb24889fc69 - sha256: 4fc3b384f4072b68853a0013ea83bdfd3d66b0126e2238e1d6e1560747aa7586 + md5: 70caf8bb6cf39a0b6b7efc885f51c0fe + sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a category: main optional: false - name: ncurses @@ -9197,21 +9278,22 @@ package: platform: linux-aarch64 dependencies: libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-hcccb83c_1.conda hash: - md5: 38362af7bfac0efef69675acee564458 - sha256: f8002feaa9e0eb929cd123f1275d8c0b3c6ffb7fd9269b192927009df19dc89e + md5: 91d49c85cacd92caa40cf375ef72a25d + sha256: acad4cf1f57b12ee1e42995e6fac646fa06aa026529f05eb8c07eb0a84a47a84 category: main optional: false - name: ncurses version: '6.5' manager: conda platform: osx-arm64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda + dependencies: + __osx: '>=11.0' + url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda hash: - md5: b13ad5724ac9ae98b6b4fd87e4500ba4 - sha256: 87d7cf716d9d930dab682cb57b3b8d3a61940b47d6703f3529a155c938a6990a + md5: cb2b0ea909b97b3d70cd3921d1445e1a + sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc category: main optional: false - name: nest-asyncio @@ -9466,52 +9548,52 @@ package: category: main optional: false - name: nss - version: '3.102' + version: '3.104' manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc-ng: '>=12' + libgcc: '>=13' libsqlite: '>=3.46.0,<4.0a0' - libstdcxx-ng: '>=12' + libstdcxx: '>=13' libzlib: '>=1.3.1,<2.0a0' nspr: '>=4.35,<5.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/nss-3.102-h593d115_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/nss-3.104-hd34e28f_0.conda hash: - md5: 40e5e48c55a45621c4399ca9236406b7 - sha256: 5e5dbae2f5bc55646a9d70601432ea71b867ce06bccd174e479ac36abf5d0807 + md5: 0664e59f6937a660eba9f3d2f9123fa8 + sha256: 0beb64ae310a34537c41e43110ebc24352c4319e6348cebe3d8a89b02382212c category: main optional: false - name: nss - version: '3.102' + version: '3.104' manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=12' + libgcc: '>=13' libsqlite: '>=3.46.0,<4.0a0' - libstdcxx-ng: '>=12' + libstdcxx: '>=13' libzlib: '>=1.3.1,<2.0a0' nspr: '>=4.35,<5.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.102-hfe4779c_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.104-hbe714ee_0.conda hash: - md5: bde53c4591a8b703bb8f6cb7b08333e6 - sha256: fad4fba3eca660819a7424f09248e8fe9dca2745b3539a8d8c984819531693ab + md5: 8988326ad9b01523849117b1eef6d9e2 + sha256: 0d7c1e619d991a1a1d3738367ad7b759a2b42e4a1298024cfc39ba999b36b756 category: main optional: false - name: nss - version: '3.102' + version: '3.104' manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - libcxx: '>=16' + libcxx: '>=17' libsqlite: '>=3.46.0,<4.0a0' libzlib: '>=1.3.1,<2.0a0' nspr: '>=4.35,<5.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.102-hc42bcbf_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.104-hd1ce637_0.conda hash: - md5: 8e6786925188583c0c18920545bb0d72 - sha256: 15f521cae90a27ff42b5de3f40cf76f574e0e703c51aa4c882a3590eef284edf + md5: ef0614ddfd13d9329b08c82230d4c6f1 + sha256: 119a8d314b4005843746b624aa1c8bb6f086ade9661b6474d6987b2de4f364ff category: main optional: false - name: numexpr @@ -9662,15 +9744,14 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=12' - libpng: '>=1.6.43,<1.7.0a0' - libstdcxx-ng: '>=12' - libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda + libgcc-ng: '>=11.2.0' + libpng: '>=1.6.39,<1.7.0a0' + libstdcxx-ng: '>=11.2.0' + libtiff: '>=4.5.0,<5.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-64/openjpeg-2.5.2-he7f1fd0_0.conda hash: - md5: 7f2e286780f072ed750df46dc2631138 - sha256: 5600a0b82df042bd27d01e4e687187411561dfc11cc05143a08ce29b64bf2af2 + md5: a399fe14e40b0ed66a2b1b6c1da4eae1 + sha256: 47c07c3faf9bf47e3cabf05a4e3987dcc3f84e2b04f9aa4165daad3b78cddd6e category: main optional: false - name: openjpeg @@ -9678,15 +9759,14 @@ package: manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=12' - libpng: '>=1.6.43,<1.7.0a0' - libstdcxx-ng: '>=12' - libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.2-h0d9d63b_0.conda + libgcc-ng: '>=11.2.0' + libpng: '>=1.6.39,<1.7.0a0' + libstdcxx-ng: '>=11.2.0' + libtiff: '>=4.5.0,<5.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/openjpeg-2.5.2-ha2c532c_0.conda hash: - md5: fd2898519e839d5ceb778343f39a3176 - sha256: d83375856601bc67c11295b537548a937a6896ede9d0a51d78bf5e921ab07c6f + md5: 51e5085800a7a9599bab15d7eb9f4fec + sha256: 59cf95207baecdc851b88c1e4360cdd9e3385bffd2cfa9d568b233ab34537c0b category: main optional: false - name: openjpeg @@ -9694,55 +9774,54 @@ package: manager: conda platform: osx-arm64 dependencies: - libcxx: '>=16' - libpng: '>=1.6.43,<1.7.0a0' - libtiff: '>=4.6.0,<4.7.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda + libcxx: '>=14.0.6' + libpng: '>=1.6.39,<1.7.0a0' + libtiff: '>=4.5.0,<5.0a0' + url: https://repo.anaconda.com/pkgs/main/osx-arm64/openjpeg-2.5.2-h54b8e55_0.conda hash: - md5: 5029846003f0bc14414b9128a1f7c84b - sha256: 472d6eaffc1996e6af35ec8e91c967f472a536a470079bfa56383cc0dbf4d463 + md5: 5f56474851b21a726e907414caef9693 + sha256: 746e3dacd366d83fa4ab850202b52b2bca186b95127ac153e01f7c9487e2e90f category: main optional: false - name: openpyxl - version: 3.1.2 + version: 3.1.5 manager: conda platform: linux-64 dependencies: et_xmlfile: '' libgcc-ng: '>=11.2.0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/openpyxl-3.1.2-py312h5eee18b_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/openpyxl-3.1.5-py312h5eee18b_0.conda hash: - md5: 7b0e99dc4855ed3f946fdf20d312f806 - sha256: 87e0162f9b64747cdb743f8802b285cbc9c4f46d085e1eac8e2c64bbcf55d6c0 + md5: e6be29538cd413bd4fa55311b7ba1daf + sha256: b6f69342fb39f23812c2f184e6daa45686c9224eb4ff982fc069ca58c056d653 category: main optional: false - name: openpyxl - version: 3.1.2 + version: 3.1.5 manager: conda platform: linux-aarch64 dependencies: et_xmlfile: '' libgcc-ng: '>=11.2.0' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/openpyxl-3.1.2-py312h998d150_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/openpyxl-3.1.5-py312h998d150_0.conda hash: - md5: 61c66a1fef98b8020dcdb00c10ab8f5f - sha256: d7dd5f3a1a5cadb6ae13272fde70690ce86def505b2063428f083890883b1043 + md5: 670a730323c8fdf29e7349872d42a66c + sha256: c38d769560341869e6a074d8dfd9cb6ea97408a38083431dadefb3f6c5a05e9b category: main optional: false - name: openpyxl - version: 3.1.2 + version: 3.1.5 manager: conda platform: osx-arm64 dependencies: et_xmlfile: '' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/openpyxl-3.1.2-py312h80987f9_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/openpyxl-3.1.5-py312h80987f9_0.conda hash: - md5: 7240b7efc5472f3a23f60b89c77859eb - sha256: 4494b03964d192accc75deb8dd79dfbef3e67e1cba8f51abfb1903d53d790b37 + md5: 431149c3fadb53de552054936063fd5a + sha256: 89398294b5755315b567c82b049ca16239c0810cffd32524ca3d33eb885d5c8c category: main optional: false - name: openssl @@ -9752,11 +9831,11 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' ca-certificates: '' - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda + libgcc-ng: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda hash: - md5: e1b454497f9f7c1147fdde4b53f1b512 - sha256: b294b3cc706ad1048cdb514f0db3da9f37ae3fcc0c53a7104083dd0918adb200 + md5: 6c566a46baae794daf34775d41eb180a + sha256: 9e27441b273a7cf9071f6e88ba9ad565d926d8083b154c64a74b99fba167b137 category: main optional: false - name: openssl @@ -9765,11 +9844,11 @@ package: platform: linux-aarch64 dependencies: ca-certificates: '' - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.1-h68df207_2.conda + libgcc-ng: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.1-h86ecc28_3.conda hash: - md5: e53f74e640d477466e04bae394b0d163 - sha256: 6c15fd3e6c1dd92b17533fe307cb758be88e85e32e1b988507708905357acb60 + md5: 7f591390401ad65781372240424ab7fc + sha256: 5489a7c02329844703934b46258b7a61a36d2449eba04f9df81f7eb208bf631d category: main optional: false - name: openssl @@ -9779,10 +9858,10 @@ package: dependencies: __osx: '>=11.0' ca-certificates: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.1-hfb2fe0b_2.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.1-h8359307_3.conda hash: - md5: 9b551a504c1cc8f8b7b22c01814da8ba - sha256: dd7d988636f74473ebdfe15e05c5aabdb53a1d2a846c839d62289b0c37f81548 + md5: 644904d696d83c0ac78d594e0cf09f66 + sha256: 9dd1ee7a8c21ff4fcbb98e9d0be0e83e5daf8a555c73589ad9e3046966b72e5e category: main optional: false - name: overrides @@ -10061,39 +10140,39 @@ package: category: main optional: false - name: pbs-installer - version: 2024.4.24 + version: 2024.8.14 manager: conda platform: linux-64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2024.4.24-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2024.8.14-pyhd8ed1ab_0.conda hash: - md5: 4647442ace74db3dd235968a18b090eb - sha256: e20dfd49362a571774a587671d79f5b1af30444f6bd92001a621bd529da58385 + md5: eb5c3a23894f29824e380f3d1d754a67 + sha256: d6cf6f071bd0204c1692e8b9ed8c14893d88c466c750da8f1ffa18f8a257805a category: main optional: false - name: pbs-installer - version: 2024.4.24 + version: 2024.8.14 manager: conda platform: linux-aarch64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2024.4.24-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2024.8.14-pyhd8ed1ab_0.conda hash: - md5: 4647442ace74db3dd235968a18b090eb - sha256: e20dfd49362a571774a587671d79f5b1af30444f6bd92001a621bd529da58385 + md5: eb5c3a23894f29824e380f3d1d754a67 + sha256: d6cf6f071bd0204c1692e8b9ed8c14893d88c466c750da8f1ffa18f8a257805a category: main optional: false - name: pbs-installer - version: 2024.4.24 + version: 2024.8.14 manager: conda platform: osx-arm64 dependencies: python: '>=3.8' - url: https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2024.4.24-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2024.8.14-pyhd8ed1ab_0.conda hash: - md5: 4647442ace74db3dd235968a18b090eb - sha256: e20dfd49362a571774a587671d79f5b1af30444f6bd92001a621bd529da58385 + md5: eb5c3a23894f29824e380f3d1d754a67 + sha256: d6cf6f071bd0204c1692e8b9ed8c14893d88c466c750da8f1ffa18f8a257805a category: main optional: false - name: pcre2 @@ -10101,13 +10180,14 @@ package: manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' bzip2: '>=1.0.8,<2.0a0' libgcc-ng: '>=12' libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-h0f59acf_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda hash: - md5: 3914f7ac1761dce57102c72ca7c35d01 - sha256: 90646ad0d8f9d0fd896170c4f3d754e88c4ba0eaf856c24d00842016f644baab + md5: df359c09c41cd186fffb93a2d87aa6f5 + sha256: 1087716b399dab91cc9511d6499036ccdc53eb29a288bebcb19cf465c51d7c0d category: main optional: false - name: pcre2 @@ -10118,10 +10198,10 @@ package: bzip2: '>=1.0.8,<2.0a0' libgcc-ng: '>=12' libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda hash: - md5: e5c5c5acdd1f52508f5e9938b454ae5d - sha256: 5d3c562785526fc4d2f0f4eff7edf94d3afbef92a6290e8bc0bff88fa664fba0 + md5: 94022de9682cb1a0bb18a99cbc3541b3 + sha256: e9f4b912e48514771d477f2ee955f59d4ff4ef799c3d4d16e4d0f335ce91df67 category: main optional: false - name: pcre2 @@ -10132,20 +10212,20 @@ package: __osx: '>=11.0' bzip2: '>=1.0.8,<2.0a0' libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.44-h297a79d_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.44-h297a79d_2.conda hash: - md5: 62f8d7e2ef03b0aae64185b0f38316eb - sha256: 23ddc5022a1025027ac1957dc1947c70d93a78414fbb183026457a537e8b3770 + md5: 147c83e5e44780c7492998acbacddf52 + sha256: 83153c7d8fd99cab33c92ce820aa7bfed0f1c94fc57010cf227b6e3c50cb7796 category: main optional: false - name: pdm - version: 2.17.1 + version: 2.18.1 manager: conda platform: linux-64 dependencies: blinker: '' chardet: '' - dep-logic: '>=0.4.3' + dep-logic: '>=0.4.4' filelock: '>=3.13' findpython: '>=0.6.0,<1.0.0a0' hishel: '>=0.0.24,<0.1.0' @@ -10168,23 +10248,23 @@ package: socksio: '>=1,<2' tomli: '>=1.1.0' tomlkit: '>=0.11.1,<1' - unearth: '>=0.16.0' + unearth: '>=0.17.0' virtualenv: '>=20' zstandard: '>=0.21.0' - url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.18.1-pyhd8ed1ab_0.conda hash: - md5: 3da349945f818b5ef7591fa13742d2d9 - sha256: 0e361e083e62ee24c1e1e269e3e34bb78cd70f4130d52325b69174d2e989f8e2 + md5: 06d5d5feb6307c67785a8f0951f61b77 + sha256: c4352a60df259732b6732e1a678bbbfb3339ce75de021d6ffd27fcea654a98bf category: main optional: false - name: pdm - version: 2.17.1 + version: 2.18.1 manager: conda platform: linux-aarch64 dependencies: blinker: '' chardet: '' - dep-logic: '>=0.4.3' + dep-logic: '>=0.4.4' filelock: '>=3.13' findpython: '>=0.6.0,<1.0.0a0' hishel: '>=0.0.24,<0.1.0' @@ -10207,23 +10287,23 @@ package: socksio: '>=1,<2' tomli: '>=1.1.0' tomlkit: '>=0.11.1,<1' - unearth: '>=0.16.0' + unearth: '>=0.17.0' virtualenv: '>=20' zstandard: '>=0.21.0' - url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.18.1-pyhd8ed1ab_0.conda hash: - md5: 3da349945f818b5ef7591fa13742d2d9 - sha256: 0e361e083e62ee24c1e1e269e3e34bb78cd70f4130d52325b69174d2e989f8e2 + md5: 06d5d5feb6307c67785a8f0951f61b77 + sha256: c4352a60df259732b6732e1a678bbbfb3339ce75de021d6ffd27fcea654a98bf category: main optional: false - name: pdm - version: 2.17.1 + version: 2.18.1 manager: conda platform: osx-arm64 dependencies: blinker: '' chardet: '' - dep-logic: '>=0.4.3' + dep-logic: '>=0.4.4' filelock: '>=3.13' findpython: '>=0.6.0,<1.0.0a0' hishel: '>=0.0.24,<0.1.0' @@ -10246,13 +10326,13 @@ package: socksio: '>=1,<2' tomli: '>=1.1.0' tomlkit: '>=0.11.1,<1' - unearth: '>=0.16.0' + unearth: '>=0.17.0' virtualenv: '>=20' zstandard: '>=0.21.0' - url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.17.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pdm-2.18.1-pyhd8ed1ab_0.conda hash: - md5: 3da349945f818b5ef7591fa13742d2d9 - sha256: 0e361e083e62ee24c1e1e269e3e34bb78cd70f4130d52325b69174d2e989f8e2 + md5: 06d5d5feb6307c67785a8f0951f61b77 + sha256: c4352a60df259732b6732e1a678bbbfb3339ce75de021d6ffd27fcea654a98bf category: main optional: false - name: perl @@ -10710,105 +10790,106 @@ package: category: main optional: false - name: popt - version: '1.16' + version: '1.19' manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=7.5.0' - libiconv: '' - url: https://conda.anaconda.org/conda-forge/linux-64/popt-1.16-h0b475e3_2002.tar.bz2 + libgcc-ng: '>=11.2.0' + libiconv: '>=1.16,<2.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-64/popt-1.19-h5eee18b_0.conda hash: - md5: 78388f97473c02e5ac8a3742eee4c959 - sha256: 2868865a437515136840dbb7d901adea798128427f32f984cfa4cc56989f90ce + md5: 57d57eb3c3f82633cd5fe8c3e230e544 + sha256: a6edfcef19fcb949467b5e9a8d0488665ad196a8fc132c0e4055cb3f76c317e0 category: main optional: false - name: popt - version: '1.16' + version: '1.19' manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=7.5.0' - libiconv: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/popt-1.16-h57fc80e_2002.tar.bz2 + libgcc-ng: '>=11.2.0' + libiconv: '>=1.16,<2.0a0' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/popt-1.19-h998d150_0.conda hash: - md5: 12d1bf3f929ef6b789a0050c9dbf250b - sha256: 306b1bf6a337af6b0efa171e6fd86d33c3f6febdbb0ce097ee6e3bbb51fea06c + md5: f4b8cfcff2c15e6acdfb0774daf7908d + sha256: 46c843494666cca52322719a95bb21b579a65f9ed2a3f1f48625e48f44958bd3 category: main optional: false - name: popt - version: '1.16' + version: '1.19' manager: conda platform: osx-arm64 dependencies: - libiconv: '>=1.16,<2.0.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/popt-1.16-h61edf1b_2002.tar.bz2 + libiconv: '>=1.16,<2.0a0' + url: https://repo.anaconda.com/pkgs/main/osx-arm64/popt-1.19-h80987f9_0.conda hash: - md5: 46a89e1cbd7f8dcca8bdd2b5a1bfb1f4 - sha256: b3ccf8160039214e684f19a81212126cdb5c8f19f3601a2491365f0ff0f83672 + md5: f1bc82e808fead710fdc01f578835dc5 + sha256: 5f2278731e09f289f18f5aa13d8b3d0ddc79ddbfc0b10e36660adebef6c34d7d category: main optional: false - name: postgresql - version: '16.3' + version: '16.4' manager: conda platform: linux-64 dependencies: - krb5: '>=1.21.2,<1.22.0a0' - libgcc-ng: '>=12' - libpq: '16.3' - libxml2: '>=2.12.6,<3.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - openssl: '>=3.3.0,<4.0a0' + __glibc: '>=2.17,<3.0.a0' + krb5: '>=1.21.3,<1.22.0a0' + libgcc: '>=13' + libpq: '16.4' + libxml2: '>=2.12.7,<3.0a0' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.3.1,<4.0a0' readline: '>=8.2,<9.0a0' tzcode: '' tzdata: '' - url: https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.3-h8e811e2_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.4-hb2eb5c0_1.conda hash: - md5: e4d52462da124ed3792472f95a36fc2a - sha256: 4cd39edd84011657978e35abdc880cf3e49785e8a86f1c99a34029a3e4998abe + md5: 1aaec5dbae29b3f0a2c20eeb84e9e38a + sha256: 7b6c307722ff7acaa26f04a19c124b5548e16a8097576709d911ef7123e2fbaf category: main optional: false - name: postgresql - version: '16.3' + version: '16.4' manager: conda platform: linux-aarch64 dependencies: - krb5: '>=1.21.2,<1.22.0a0' - libgcc-ng: '>=12' - libpq: '16.3' - libxml2: '>=2.12.6,<3.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - openssl: '>=3.3.0,<4.0a0' + krb5: '>=1.21.3,<1.22.0a0' + libgcc: '>=13' + libpq: '16.4' + libxml2: '>=2.12.7,<3.0a0' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.3.1,<4.0a0' readline: '>=8.2,<9.0a0' tzcode: '' tzdata: '' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/postgresql-16.3-h2294c5c_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/postgresql-16.4-h001cd3f_1.conda hash: - md5: 834fc612c678f3ea652e8688655a3da0 - sha256: eb93f818f28cd206ea0b020fd33c6007961a78589763cc034490d947cad42b97 + md5: d73af1eba65c3da89e388a30a8c79b39 + sha256: 52d4d91cd232028d70aca6f76d79989cc9e21224563b5f21ae1a4f205e431956 category: main optional: false - name: postgresql - version: '16.3' + version: '16.4' manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - krb5: '>=1.21.2,<1.22.0a0' - libpq: '16.3' - libxml2: '>=2.12.6,<3.0a0' - libzlib: '>=1.2.13,<2.0.0a0' - openssl: '>=3.3.0,<4.0a0' + krb5: '>=1.21.3,<1.22.0a0' + libpq: '16.4' + libxml2: '>=2.12.7,<3.0a0' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.3.1,<4.0a0' readline: '>=8.2,<9.0a0' tzcode: '' tzdata: '' - url: https://conda.anaconda.org/conda-forge/osx-arm64/postgresql-16.3-hdfa2ec6_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/postgresql-16.4-ha29bbc8_1.conda hash: - md5: caaf4b5ea6b6abebcbf6ac18522b5875 - sha256: 50bb32b3c8f827a07b29cec09df578fa4f4f7b41770ca6686cccdb5e3bf91431 + md5: 985be1abc0771017682ca288223d0de3 + sha256: d71b0310d125fc85e9165cbc6e21a25af34315332b672bde466b8f9a77acf667 category: main optional: false - name: pre-commit - version: 3.7.1 + version: 3.8.0 manager: conda platform: linux-64 dependencies: @@ -10818,14 +10899,14 @@ package: python: '>=3.9' pyyaml: '>=5.1' virtualenv: '>=20.10.0' - url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda hash: - md5: 724bc4489c1174fc8e3233b0624fa51f - sha256: 689c169ce6ed5d516d8524cc1e6ef2687dff19747c1ed1ee9b347a71f47ff12d + md5: 1822e87a5d357f79c6aab871d86fb062 + sha256: 2363c8706ca3b2a3385b09e33f639f6b66e4fa8d00a21c3dea4d934472a96e85 category: dev optional: true - name: pre-commit - version: 3.7.1 + version: 3.8.0 manager: conda platform: linux-aarch64 dependencies: @@ -10835,14 +10916,14 @@ package: python: '>=3.9' pyyaml: '>=5.1' virtualenv: '>=20.10.0' - url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda hash: - md5: 724bc4489c1174fc8e3233b0624fa51f - sha256: 689c169ce6ed5d516d8524cc1e6ef2687dff19747c1ed1ee9b347a71f47ff12d + md5: 1822e87a5d357f79c6aab871d86fb062 + sha256: 2363c8706ca3b2a3385b09e33f639f6b66e4fa8d00a21c3dea4d934472a96e85 category: dev optional: true - name: pre-commit - version: 3.7.1 + version: 3.8.0 manager: conda platform: osx-arm64 dependencies: @@ -10852,10 +10933,10 @@ package: python: '>=3.9' pyyaml: '>=5.1' virtualenv: '>=20.10.0' - url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda hash: - md5: 724bc4489c1174fc8e3233b0624fa51f - sha256: 689c169ce6ed5d516d8524cc1e6ef2687dff19747c1ed1ee9b347a71f47ff12d + md5: 1822e87a5d357f79c6aab871d86fb062 + sha256: 2363c8706ca3b2a3385b09e33f639f6b66e4fa8d00a21c3dea4d934472a96e85 category: dev optional: true - name: proj @@ -11241,12 +11322,12 @@ package: dependencies: annotated-types: '>=0.4.0' pydantic-core: 2.20.1 - python: '>=3.7' + python: '>=3.12,<3.13.0a0' typing-extensions: '>=4.6.1' - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/pydantic-2.8.2-py312h06a4308_0.conda hash: - md5: 539a038a24a959662df1fcaa2cfc5c3e - sha256: 5a877153f7eaaab9724db5b64366a35e346007c9c104c1d6a6042f83b2f4f0df + md5: ed17e2e2ab47f308aaf95ef56da439cd + sha256: 490902fa7aba11b0a2614b225a9a602c4519f1f5e8d87db61e586f597f1773e9 category: dev optional: true - name: pydantic @@ -11256,12 +11337,12 @@ package: dependencies: annotated-types: '>=0.4.0' pydantic-core: 2.20.1 - python: '>=3.7' + python: '>=3.12,<3.13.0a0' typing-extensions: '>=4.6.1' - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/pydantic-2.8.2-py312hd43f75c_0.conda hash: - md5: 539a038a24a959662df1fcaa2cfc5c3e - sha256: 5a877153f7eaaab9724db5b64366a35e346007c9c104c1d6a6042f83b2f4f0df + md5: b79ea8b39b2f82e8bcbf46d43d65a81d + sha256: 563099b77e83677d45dbb1c305ba45101dd35eb1767a86db11f87404289a7da8 category: dev optional: true - name: pydantic @@ -11271,12 +11352,12 @@ package: dependencies: annotated-types: '>=0.4.0' pydantic-core: 2.20.1 - python: '>=3.7' + python: '>=3.12,<3.13.0a0' typing-extensions: '>=4.6.1' - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.8.2-pyhd8ed1ab_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/pydantic-2.8.2-py312hca03da5_0.conda hash: - md5: 539a038a24a959662df1fcaa2cfc5c3e - sha256: 5a877153f7eaaab9724db5b64366a35e346007c9c104c1d6a6042f83b2f4f0df + md5: 4758e2f44dbe8395fe03ca36969c950e + sha256: 37848db7054d2015d4adf0f091a29f53830de37719fb8e91d992f2f64b6a316b category: dev optional: true - name: pydantic-core @@ -11284,15 +11365,13 @@ package: manager: conda platform: linux-64 dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc-ng: '>=12' + libgcc-ng: '>=11.2.0' python: '>=3.12,<3.13.0a0' - python_abi: 3.12.* typing-extensions: '>=4.6.0,!=4.7.0' - url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.20.1-py312hf008fa9_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/pydantic-core-2.20.1-py312hb02cf49_0.conda hash: - md5: 8cc8f335b7e355558854236d86b2bea4 - sha256: adf117d3289c8dd97ffdb3076bc488217fedd02f3d96d35cc971f4de33460602 + md5: 8879e1838f0fce5900cb23db1aa5e68d + sha256: 6c4d0f699ff0aaadaf8b9b14bac18126ff062a4bf15cefc8a9b0ce8510ff5405 category: main optional: false - name: pydantic-core @@ -11300,14 +11379,13 @@ package: manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=12' + libgcc-ng: '>=11.2.0' python: '>=3.12,<3.13.0a0' - python_abi: 3.12.* typing-extensions: '>=4.6.0,!=4.7.0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.20.1-py312h3dd116e_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/pydantic-core-2.20.1-py312h7f3cb11_0.conda hash: - md5: db340c73d8a147ae99fb521634e8b638 - sha256: 15d7b422ce912775ccc4c48a73fe011dbcb78554b4b29cad888701fe1d2f4a65 + md5: 232b026f3a376bc3f72d140b60d295ae + sha256: 11f93070fdb34ec6dda30a3e37f9edc87e7eea6e2c2aa58821f13e87acac6532 category: main optional: false - name: pydantic-core @@ -11315,14 +11393,12 @@ package: manager: conda platform: osx-arm64 dependencies: - __osx: '>=11.0' python: '>=3.12,<3.13.0a0' - python_abi: 3.12.* typing-extensions: '>=4.6.0,!=4.7.0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.20.1-py312h552d48e_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/pydantic-core-2.20.1-py312hf0e4da2_0.conda hash: - md5: b0b8cd2d2e6aa1620dfea907706f94b4 - sha256: 5a6381ce4a5ecaeffe92f6c05fc4a70290140364e56c715a9de9c939c2bf46de + md5: 4c910eccbbb16b60afcdee793a6db20b + sha256: c6bcd1fab6cc58b84ed2e84184bbf0c916e2314f5528277625531a5320d0af56 category: main optional: false - name: pygments @@ -11455,42 +11531,42 @@ package: category: main optional: false - name: pyopenssl - version: 24.0.0 + version: 24.2.1 manager: conda platform: linux-64 dependencies: - cryptography: '>=41.0.5,<43' + cryptography: '>=41.0.5,<44' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/pyopenssl-24.0.0-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/pyopenssl-24.2.1-py312h06a4308_0.conda hash: - md5: f93a6ad622b84e53aed3d899b5b36f6a - sha256: d3c90904508208cc491fe641a810aaa6dfc49ee0766a033d895972413b93f46f + md5: 2fc7519121e3f24552cc9b0547c332ad + sha256: 919f40bb28dd92d0c565c1085a095fdc55521fa8bf933fbbfa1b9e93244807f8 category: main optional: false - name: pyopenssl - version: 24.0.0 + version: 24.2.1 manager: conda platform: linux-aarch64 dependencies: - cryptography: '>=41.0.5,<43' + cryptography: '>=41.0.5,<44' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/pyopenssl-24.0.0-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/pyopenssl-24.2.1-py312hd43f75c_0.conda hash: - md5: 7d82970e656b5bf0d856016395da78a2 - sha256: 67d9d979a5ef741883560257ab596ea8ea9c0bbe7d24a65140bf13a974174c10 + md5: 114bdfcfc4394db01e2256efae1c826f + sha256: 19f2f6b7213f63f6d605b2387e0fb15ef95ab02018aff95ab9203ccd0061b20f category: main optional: false - name: pyopenssl - version: 24.0.0 + version: 24.2.1 manager: conda platform: osx-arm64 dependencies: - cryptography: '>=41.0.5,<43' + cryptography: '>=41.0.5,<44' python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/pyopenssl-24.0.0-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/pyopenssl-24.2.1-py312hca03da5_0.conda hash: - md5: d9792474dcf295ad1e567cb39a0d5099 - sha256: 9fb80e0b9bfb2836ce308873ecbdb5c1d5b1e132417019a208ffd848baea37bd + md5: bba98d7aedfb4118df1b6d67f0121f2c + sha256: 7bb75c63c32d90acb407cb2532104a8ef55d78dff33d7536272b2c1b1ba8b781 category: main optional: false - name: pyparsing @@ -11827,10 +11903,11 @@ package: category: dev optional: true - name: python - version: 3.12.4 + version: 3.12.5 manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' bzip2: '>=1.0.8,<2.0a0' ld_impl_linux-64: '>=2.36.1' libexpat: '>=2.6.2,<3.0a0' @@ -11847,14 +11924,14 @@ 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.4-h194c7f8_0_cpython.conda + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda hash: - md5: d73490214f536cccb5819e9873048c92 - sha256: 97a78631e6c928bf7ad78d52f7f070fcf3bd37619fa48dc4394c21cf3058cdee + md5: 9c56c4df45f6571b13111d8df2448692 + sha256: e2aad83838988725d4ffba4e9717b9328054fd18a668cff3377e0c50f109e8bd category: main optional: false - name: python - version: 3.12.4 + version: 3.12.5 manager: conda platform: linux-aarch64 dependencies: @@ -11874,14 +11951,14 @@ package: tk: '>=8.6.13,<8.7.0a0' tzdata: '' xz: '>=5.2.6,<6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.4-h829453d_0_cpython.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.5-hb188aa9_0_cpython.conda hash: - md5: 48c28e5926b7c8ffe58f77991a43ca23 - sha256: 21a308f92f6988e1a8169a8d46b43fbd1a6b638d0964d015a4444d7af05f00e1 + md5: 29d0b64c0b5e812fe96a42dcb471a7da + sha256: dbab5e16487bf7276e98ca4dbcbd412be7ab3c674f8ecc0c6f2199bc5f01d554 category: main optional: false - name: python - version: 3.12.4 + version: 3.12.5 manager: conda platform: osx-arm64 dependencies: @@ -11897,10 +11974,10 @@ 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.4-h30c5eda_0_cpython.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.5-h30c5eda_0_cpython.conda hash: - md5: e3e44e0e72aed46dcb810fa3e96784be - sha256: 107824b584eb5e43f71df8cb2741019f5c377c734f8309899aa2a6ed53b79a47 + md5: 5e315581e2948dfe3bcac306540e9803 + sha256: 1319e918fb54c9491832a9731cad00235a76f61c6f9b23fc0f70cdfb74c950ea category: main optional: false - name: python-dateutil @@ -12130,10 +12207,10 @@ package: manager: conda platform: linux-64 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.12-5_cp312.conda hash: - md5: dccc2d142812964fcc6abdc97b672dff - sha256: 182a329de10a4165f6e8a3804caf751f918f6ea6176dd4e5abcdae1ed3095bf6 + md5: 0424ae29b104430108f5218a66db7260 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 category: main optional: false - name: python_abi @@ -12141,10 +12218,10 @@ package: manager: conda platform: linux-aarch64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-4_cp312.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda hash: - md5: 6c09f8e580146d88f649780cebed01de - sha256: 4f4c3389b722cac9bf39183221332ab69e468351030ec5359042b50c5d975a15 + md5: 62b20f305498284a07dc6c45fd0e5c87 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 category: main optional: false - name: python_abi @@ -12152,10 +12229,10 @@ package: manager: conda platform: osx-arm64 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.12-5_cp312.conda hash: - md5: bbb3a02c78b2d8219d7213f76d644a2a - sha256: db25428e4f24f8693ffa39f3ff6dfbb8fd53bc298764b775b57edab1c697560f + md5: b76f9b1c862128e56ac7aa8cd2333de9 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 category: main optional: false - name: pytz @@ -12280,7 +12357,7 @@ package: category: main optional: false - name: quartodoc - version: 0.7.5 + version: 0.7.6 manager: conda platform: linux-64 dependencies: @@ -12297,14 +12374,14 @@ package: tabulate: '>=0.9.0' typing-extensions: '>=4.4.0' watchdog: '>=3.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.6-pyhd8ed1ab_0.conda hash: - md5: e792d8c21d24dbb2b880c07430328536 - sha256: b274b1715455b4cc629fff973fa74cf7c712072d25c24fc1c01396778d3be567 + md5: 02da3ef68978e1d6d61ded2338b2ee8b + sha256: aa8b66a33d88ad834956ab4ec5993f0858ecbd243156cc45f6b1ab7443378617 category: dev optional: true - name: quartodoc - version: 0.7.5 + version: 0.7.6 manager: conda platform: linux-aarch64 dependencies: @@ -12321,14 +12398,14 @@ package: tabulate: '>=0.9.0' typing-extensions: '>=4.4.0' watchdog: '>=3.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.6-pyhd8ed1ab_0.conda hash: - md5: e792d8c21d24dbb2b880c07430328536 - sha256: b274b1715455b4cc629fff973fa74cf7c712072d25c24fc1c01396778d3be567 + md5: 02da3ef68978e1d6d61ded2338b2ee8b + sha256: aa8b66a33d88ad834956ab4ec5993f0858ecbd243156cc45f6b1ab7443378617 category: dev optional: true - name: quartodoc - version: 0.7.5 + version: 0.7.6 manager: conda platform: osx-arm64 dependencies: @@ -12345,10 +12422,10 @@ package: tabulate: '>=0.9.0' typing-extensions: '>=4.4.0' watchdog: '>=3.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.7.6-pyhd8ed1ab_0.conda hash: - md5: e792d8c21d24dbb2b880c07430328536 - sha256: b274b1715455b4cc629fff973fa74cf7c712072d25c24fc1c01396778d3be567 + md5: 02da3ef68978e1d6d61ded2338b2ee8b + sha256: aa8b66a33d88ad834956ab4ec5993f0858ecbd243156cc45f6b1ab7443378617 category: dev optional: true - name: rasterio @@ -12546,7 +12623,7 @@ package: category: main optional: false - name: requests - version: 2.32.2 + version: 2.32.3 manager: conda platform: linux-64 dependencies: @@ -12555,14 +12632,14 @@ package: idna: '>=2.5,<4' python: '>=3.12,<3.13.0a0' urllib3: '>=1.21.1,<3' - url: https://repo.anaconda.com/pkgs/main/linux-64/requests-2.32.2-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/requests-2.32.3-py312h06a4308_0.conda hash: - md5: 8149ef9ed40945df19d2aff5ffd5bae0 - sha256: b3c962e97b14a8f517560742d3f3e2b40b9431ed48d259387c8af3c8346295a0 + md5: a321cefcf9b6681a45418d5adf647d80 + sha256: b6f3bcfaea72424be3d9e182b3302906b7522b78ddf212f5499200f2035b8239 category: main optional: false - name: requests - version: 2.32.2 + version: 2.32.3 manager: conda platform: linux-aarch64 dependencies: @@ -12571,14 +12648,14 @@ package: idna: '>=2.5,<4' python: '>=3.12,<3.13.0a0' urllib3: '>=1.21.1,<3' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/requests-2.32.2-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/requests-2.32.3-py312hd43f75c_0.conda hash: - md5: 3d0419fbc7fb28b6ff0c6360d99f8087 - sha256: a6d46bc55e07487a6aace8ca843e2630844901adabbb5175a3eaa9596bb7b9d0 + md5: cbc0ecc021837860091559b529adbdc1 + sha256: 7da0422484b9c40fd8b650e41554341b2933d64256eafec073f45e712918b38c category: main optional: false - name: requests - version: 2.32.2 + version: 2.32.3 manager: conda platform: osx-arm64 dependencies: @@ -12587,10 +12664,10 @@ package: idna: '>=2.5,<4' python: '>=3.12,<3.13.0a0' urllib3: '>=1.21.1,<3' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/requests-2.32.2-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/requests-2.32.3-py312hca03da5_0.conda hash: - md5: f7d4036797fff7d029b029375aca6e88 - sha256: ed30695fd8eea42d282930d59f434dd1652e07e58d3bd409680dcd1d6795aa17 + md5: bec4411c8b9c9b58ffb4e91ac85317fd + sha256: 4f6584efcfead712ff7bdca00ec7451dd8284f4ec5df1498abdb4a75e2ed307d category: main optional: false - name: resolvelib @@ -12934,33 +13011,34 @@ package: category: main optional: false - name: s2n - version: 1.4.17 + version: 1.5.1 manager: conda platform: linux-64 dependencies: + __glibc: '>=2.17,<3.0.a0' libgcc-ng: '>=12' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.17-he19d79f_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.1-h3400bea_0.conda hash: - md5: e25ac9bf10f8e6aa67727b1cdbe762ef - sha256: 6d1aa582964771a6cf47d120e2c5cdc700fe3744101cd5660af1eb81d47d689a + md5: bf136eb7f8e15fcf8915c1a04b0aec6f + sha256: 2717b0fa534aee9aca152ae980731f3d201542d12c19403563aaa07194021041 category: main optional: false - name: s2n - version: 1.4.17 + version: 1.5.1 manager: conda platform: linux-aarch64 dependencies: libgcc-ng: '>=12' openssl: '>=3.3.1,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.4.17-h52a6840_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.1-h52a6840_0.conda hash: - md5: d43af76177a3d24cf735b92496417759 - sha256: 22019588bdd02a6a6956762c0f43be44444cf50fcc005e2758d7612ec5610f9f + md5: ac5334dccded86c13200926dd6f51345 + sha256: 1a03e85934d37915eb8f8292afaa3b8d9eaf388cdeca95aae5dab2181bf36822 category: main optional: false - name: scikit-learn - version: 1.4.2 + version: 1.5.1 manager: conda platform: linux-64 dependencies: @@ -12971,15 +13049,15 @@ package: numpy: '>=1.26.4,<2.0a0' python: '>=3.12,<3.13.0a0' scipy: '>=1.6.0' - threadpoolctl: '>=2.0.0' - url: https://repo.anaconda.com/pkgs/main/linux-64/scikit-learn-1.4.2-py312h526ad5a_1.conda + threadpoolctl: '>=3.1.0' + url: https://repo.anaconda.com/pkgs/main/linux-64/scikit-learn-1.5.1-py312h526ad5a_0.conda hash: - md5: 7f8e8d231b3df92ca1821f2062c76306 - sha256: d70f028cc5419b097e0bdf1686a025f380d22e744e49d3f3d2179318e203a777 + md5: a6942bc5ab992ab2bb65ec33d2a18e10 + sha256: da5fd6390f929d53119bba5d49a08f5fc2740cf9cf2bdd0374d238abb9fbda41 category: main optional: false - name: scikit-learn - version: 1.4.2 + version: 1.5.1 manager: conda platform: linux-aarch64 dependencies: @@ -12990,15 +13068,15 @@ package: numpy: '>=1.26.4,<2.0a0' python: '>=3.12,<3.13.0a0' scipy: '>=1.6.0' - threadpoolctl: '>=2.0.0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/scikit-learn-1.4.2-py312h0f5fa8b_1.conda + threadpoolctl: '>=3.1.0' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/scikit-learn-1.5.1-py312h0f5fa8b_0.conda hash: - md5: 244a4db7bed410895d01c5830f29fa8b - sha256: 4e1b7585a0763cc62f4e55b084da86b6b24d1177978982065d8d84e2462d0679 + md5: edbab434c407709fa098bcf6b16e8c47 + sha256: 2827a96b7576662a3570eb7ec96351c3dfc0a14ccc626cd6f117e25a09bd6a49 category: main optional: false - name: scikit-learn - version: 1.4.2 + version: 1.5.1 manager: conda platform: osx-arm64 dependencies: @@ -13008,11 +13086,11 @@ package: numpy: '>=1.26.4,<2.0a0' python: '>=3.12,<3.13.0a0' scipy: '>=1.6.0' - threadpoolctl: '>=2.0.0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/scikit-learn-1.4.2-py312hd77ebd4_1.conda + threadpoolctl: '>=3.1.0' + url: https://repo.anaconda.com/pkgs/main/osx-arm64/scikit-learn-1.5.1-py312hd77ebd4_0.conda hash: - md5: 25a4d634cd38e21d4c5b1d18341f2b4d - sha256: 2cb3da4b7bfa6c2752c9da6fd461997fa842d76a54f381164f3830507ba82d2f + md5: eccb8f5c0b433c7bc1fd26d28986df30 + sha256: d534554fa1dea3a88a5abb49e5f3079a14bb9ae40f3465eeb04b7168f6d7b755 category: main optional: false - name: scipy @@ -13189,39 +13267,39 @@ package: category: main optional: false - name: setuptools - version: 69.5.1 + version: 72.1.0 manager: conda platform: linux-64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/setuptools-69.5.1-py312h06a4308_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/setuptools-72.1.0-py312h06a4308_0.conda hash: - md5: ce85d9a864a73e0b12d31a97733c9fca - sha256: 0b808239e1e2ad8d76a1e39b2fdd7cc0ecce3f75858e367b08d5806af0f55eb8 + md5: bab64ac5186aa07014788baf1fbe3ca9 + sha256: 5a20dde6998bfabc37ada45b6ff90db61dec2d17dae3652de2a75b88635fb146 category: main optional: false - name: setuptools - version: 69.5.1 + version: 72.1.0 manager: conda platform: linux-aarch64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/setuptools-69.5.1-py312hd43f75c_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/setuptools-72.1.0-py312hd43f75c_0.conda hash: - md5: a9c1382a8de57f946111dcdd2792d2d6 - sha256: ca736277209e3cfce7a7aab498ac2e1ff49f039d72780a95e98f8da3c50de34d + md5: 99dec9dcf22274a1b04426a9911eb59a + sha256: aeaacd046d6c643de28c6f3a53ea34bcb68d49d0815e138cbcbc7bc1462afd42 category: main optional: false - name: setuptools - version: 69.5.1 + version: 72.1.0 manager: conda platform: osx-arm64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/setuptools-69.5.1-py312hca03da5_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/setuptools-72.1.0-py312hca03da5_0.conda hash: - md5: 30b1d16188ab0a92bcc1d9d902c6c360 - sha256: 2d5faec82a2f6192fb6c01985c879ce226cf9a2767be80cd015d04e1a0b17ea7 + md5: 53c22c422221ad50987083db969f7ac8 + sha256: d7cc2a9419bdc3696de93c95b5fd37a7fb299f50491b1f866367dbae3d3ee719 category: main optional: false - name: shapely @@ -13385,12 +13463,12 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda + libgcc-ng: '>=11.2.0' + libstdcxx-ng: '>=11.2.0' + url: https://repo.anaconda.com/pkgs/main/linux-64/snappy-1.2.1-h6a678d5_0.conda hash: - md5: 6b7dcc7349efd123d493d2dbe85a045f - sha256: dc7c8e0e8c3e8702aae81c52d940bfaabe756953ee51b1f1757e891bab62cf7f + md5: e8c664fa38ba48b095d8c7bb1d755c10 + sha256: 1ad780698213f6c21f739176e762de1ca78da60a834ff548461cdc1d923ae2eb category: main optional: false - name: snappy @@ -13398,12 +13476,12 @@ package: manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-h1088aeb_0.conda + libgcc-ng: '>=11.2.0' + libstdcxx-ng: '>=11.2.0' + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/snappy-1.2.1-h419075a_0.conda hash: - md5: e4ed5b015f525b56f95c26d85a4ea208 - sha256: 79f5d0a9098acf2ed16e6ecc4c11472b50ccf59feea37a7d585fd43888d7e41f + md5: 4a0aba76c25bb9f994574d9dba362735 + sha256: 71630651164630ef9384c508c9e4cf7cb394d981271dc1ccf940c4d8094962b4 category: main optional: false - name: snappy @@ -13411,12 +13489,11 @@ package: manager: conda platform: osx-arm64 dependencies: - __osx: '>=11.0' - libcxx: '>=16' - url: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-hd02b534_0.conda + libcxx: '>=14.0.6' + url: https://repo.anaconda.com/pkgs/main/osx-arm64/snappy-1.2.1-h313beb8_0.conda hash: - md5: 69d0f9694f3294418ee935da3d5f7272 - sha256: cb7a9440241c6092e0f1c795fdca149c4767023e783eaf9cfebc501f906b4897 + md5: ac3d5430c8827ef7ad2e58e205f58bc7 + sha256: 9a62881dda9f1e6632e3a701262d56b9ef44b2da97af5dcbe654716d5cdb79de category: main optional: false - name: sniffio @@ -13570,44 +13647,46 @@ package: category: main optional: false - name: spdlog - version: 1.13.0 + version: 1.14.1 manager: conda platform: linux-64 dependencies: - fmt: '>=10.2.1,<11.0a0' + __glibc: '>=2.17,<3.0.a0' + fmt: '>=11.0.1,<12.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.13.0-hd2e6256_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.14.1-hed91bc2_1.conda hash: - md5: 18f9348f064632785d54dbd1db9344bb - sha256: 2027b971e83a9c9d292c12880269fe08e782fe9b15b93b5a3ddc8697116e6750 + md5: 909188c8979846bac8e586908cf1ca6a + sha256: 0c604fe3f78ddb2b612841722bd9b5db24d0484e30ced89fac78c0a3f524dfd6 category: main optional: false - name: spdlog - version: 1.13.0 + version: 1.14.1 manager: conda platform: linux-aarch64 dependencies: - fmt: '>=10.2.1,<11.0a0' + fmt: '>=11.0.1,<12.0a0' libgcc-ng: '>=12' libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/spdlog-1.13.0-h6b8df57_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/spdlog-1.14.1-h9d9cc24_1.conda hash: - md5: 4c86219bb12731b269538e829c37d029 - sha256: 1fc98e54f648009efae1a00f14c3ae0b8ce3d22ba5af1dc92ca939fac8afb9bb + md5: 771630cc938de801e261c3a069d22a68 + sha256: bcec80ee6145e30c1aaec1e6b4632318c9165b1fc08def6a090982de16bf299d category: main optional: false - name: spdlog - version: 1.13.0 + version: 1.14.1 manager: conda platform: osx-arm64 dependencies: - fmt: '>=10.2.1,<11.0a0' + __osx: '>=11.0' + fmt: '>=11.0.1,<12.0a0' libcxx: '>=16' - url: https://conda.anaconda.org/conda-forge/osx-arm64/spdlog-1.13.0-h5fcca99_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/spdlog-1.14.1-h6d8af72_1.conda hash: - md5: 1907a70a6494b95f3961417e7a9564d2 - sha256: 161ad4bb6de140ca00024dd5004b4ab99189767df7f83362d6c252c03213e29a + md5: 4af518b01539da8e4af17aee5fb92639 + sha256: f981d4f3555125cb913be49397892f43c6b747705c0d72cba3676f7d98709f92 category: main optional: false - name: sphobjinv @@ -13669,35 +13748,35 @@ package: category: main optional: false - name: sqlite - version: 3.46.0 + version: 3.46.1 manager: conda platform: linux-aarch64 dependencies: - libgcc-ng: '>=12' - libsqlite: 3.46.0 - libzlib: '>=1.2.13,<2.0a0' + libgcc: '>=13' + libsqlite: 3.46.1 + libzlib: '>=1.3.1,<2.0a0' ncurses: '>=6.5,<7.0a0' readline: '>=8.2,<9.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.46.0-hdc7ab3c_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.46.1-h578a6b9_0.conda hash: - md5: e0e3a71d3b7092af7cb9e0696f6d0869 - sha256: d6425bffe24f02a0a2e4e4f228aeca16bde76074b9bce311a976c948f802aebe + md5: 6eed5c8ca8a58cd77a6f515997a4173a + sha256: ae45a7f2aefff9570f9330c0c167085228dadc7754c634a949358b7ef6f4a723 category: main optional: false - name: sqlite - version: 3.46.0 + version: 3.46.1 manager: conda platform: osx-arm64 dependencies: __osx: '>=11.0' - libsqlite: 3.46.0 - libzlib: '>=1.2.13,<2.0a0' + libsqlite: 3.46.1 + libzlib: '>=1.3.1,<2.0a0' ncurses: '>=6.5,<7.0a0' readline: '>=8.2,<9.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.46.0-h5838104_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.46.1-h3b4c4e4_0.conda hash: - md5: 05c5dc8cd793dcfc5849d0569da9b175 - sha256: e13b719f70b3a20f40b59f814d32483ae8cd95fef83224127b10091828026f7d + md5: 78996531776f6a277cac5a14cf590b6a + sha256: 91c8becaddc4593adba50eb27c4e47deafd879cfc3a569cc6db767b5ee6d8146 category: main optional: false - name: stack_data @@ -13940,30 +14019,30 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - aws-crt-cpp: '>=0.27.3,<0.27.4.0a0' - aws-sdk-cpp: '>=1.11.329,<1.11.330.0a0' - azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + aws-crt-cpp: '>=0.28.2,<0.28.3.0a0' + aws-sdk-cpp: '>=1.11.379,<1.11.380.0a0' + azure-core-cpp: '>=1.13.0,<1.13.1.0a0' azure-identity-cpp: '>=1.8.0,<1.8.1.0a0' - azure-storage-blobs-cpp: '>=12.11.0,<12.11.1.0a0' - azure-storage-common-cpp: '>=12.6.0,<12.6.1.0a0' + azure-storage-blobs-cpp: '>=12.12.0,<12.12.1.0a0' + azure-storage-common-cpp: '>=12.7.0,<12.7.1.0a0' bzip2: '>=1.0.8,<2.0a0' - fmt: '>=10.2.1,<11.0a0' + fmt: '>=11.0.2,<12.0a0' libabseil: '>=20240116.2,<20240117.0a0' - libcurl: '>=8.8.0,<9.0a0' - libgcc-ng: '>=12' - libgoogle-cloud: '>=2.26.0,<2.27.0a0' - libgoogle-cloud-storage: '>=2.26.0,<2.27.0a0' - libstdcxx-ng: '>=12' + libcurl: '>=8.9.1,<9.0a0' + libgcc: '>=13' + libgoogle-cloud: '>=2.28.0,<2.29.0a0' + libgoogle-cloud-storage: '>=2.28.0,<2.29.0a0' + libstdcxx: '>=13' libwebp-base: '>=1.4.0,<2.0a0' libzlib: '>=1.3.1,<2.0a0' lz4-c: '>=1.9.3,<1.10.0a0' openssl: '>=3.3.1,<4.0a0' - spdlog: '>=1.13.0,<1.14.0a0' + spdlog: '>=1.14.1,<1.15.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.24.2-hc55ee95_2.conda + url: https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.24.2-h86fa3b2_12.conda hash: - md5: bc6b3a6693d53e33dea28c89e02745dd - sha256: 9a84b39d158d72ff96143b6b532fe93001f1b1171ddbbf9b42ac12a22252d739 + md5: 75f778f4614ef8fa9ea528c9fdf6cf4f + sha256: 87d15957c46bc38ef850f6d4f405342fabc4426ac88e606ab44d0cc59071e655 category: main optional: false - name: tiledb @@ -13971,30 +14050,30 @@ package: manager: conda platform: linux-aarch64 dependencies: - aws-crt-cpp: '>=0.27.3,<0.27.4.0a0' - aws-sdk-cpp: '>=1.11.329,<1.11.330.0a0' - azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + aws-crt-cpp: '>=0.28.2,<0.28.3.0a0' + aws-sdk-cpp: '>=1.11.379,<1.11.380.0a0' + azure-core-cpp: '>=1.13.0,<1.13.1.0a0' azure-identity-cpp: '>=1.8.0,<1.8.1.0a0' - azure-storage-blobs-cpp: '>=12.11.0,<12.11.1.0a0' - azure-storage-common-cpp: '>=12.6.0,<12.6.1.0a0' + azure-storage-blobs-cpp: '>=12.12.0,<12.12.1.0a0' + azure-storage-common-cpp: '>=12.7.0,<12.7.1.0a0' bzip2: '>=1.0.8,<2.0a0' - fmt: '>=10.2.1,<11.0a0' + fmt: '>=11.0.2,<12.0a0' libabseil: '>=20240116.2,<20240117.0a0' - libcurl: '>=8.8.0,<9.0a0' - libgcc-ng: '>=12' - libgoogle-cloud: '>=2.26.0,<2.27.0a0' - libgoogle-cloud-storage: '>=2.26.0,<2.27.0a0' - libstdcxx-ng: '>=12' + libcurl: '>=8.9.1,<9.0a0' + libgcc: '>=13' + libgoogle-cloud: '>=2.28.0,<2.29.0a0' + libgoogle-cloud-storage: '>=2.28.0,<2.29.0a0' + libstdcxx: '>=13' libwebp-base: '>=1.4.0,<2.0a0' libzlib: '>=1.3.1,<2.0a0' lz4-c: '>=1.9.3,<1.10.0a0' openssl: '>=3.3.1,<4.0a0' - spdlog: '>=1.13.0,<1.14.0a0' + spdlog: '>=1.14.1,<1.15.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/tiledb-2.24.2-h5af2130_2.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/tiledb-2.24.2-hf4853f3_12.conda hash: - md5: 7c39717dec8b7ce7f0b1b372a5cdf6a9 - sha256: 568e14f980b935284054e1e2544510efee60a1235b4f96100fbd7c89b3e0a886 + md5: eda183d179a640ded6145323a591876d + sha256: e1a1bf5b23114934576c80f840637f6aa5859d988f6ee249e5f5550ab115cdf1 category: main optional: false - name: tiledb @@ -14003,29 +14082,29 @@ package: platform: osx-arm64 dependencies: __osx: '>=11.0' - aws-crt-cpp: '>=0.27.3,<0.27.4.0a0' - aws-sdk-cpp: '>=1.11.329,<1.11.330.0a0' - azure-core-cpp: '>=1.12.0,<1.12.1.0a0' + aws-crt-cpp: '>=0.28.2,<0.28.3.0a0' + aws-sdk-cpp: '>=1.11.379,<1.11.380.0a0' + azure-core-cpp: '>=1.13.0,<1.13.1.0a0' azure-identity-cpp: '>=1.8.0,<1.8.1.0a0' - azure-storage-blobs-cpp: '>=12.11.0,<12.11.1.0a0' - azure-storage-common-cpp: '>=12.6.0,<12.6.1.0a0' + azure-storage-blobs-cpp: '>=12.12.0,<12.12.1.0a0' + azure-storage-common-cpp: '>=12.7.0,<12.7.1.0a0' bzip2: '>=1.0.8,<2.0a0' - fmt: '>=10.2.1,<11.0a0' + fmt: '>=11.0.2,<12.0a0' libabseil: '>=20240116.2,<20240117.0a0' - libcurl: '>=8.8.0,<9.0a0' - libcxx: '>=16' - libgoogle-cloud: '>=2.26.0,<2.27.0a0' - libgoogle-cloud-storage: '>=2.26.0,<2.27.0a0' + libcurl: '>=8.9.1,<9.0a0' + libcxx: '>=17' + libgoogle-cloud: '>=2.28.0,<2.29.0a0' + libgoogle-cloud-storage: '>=2.28.0,<2.29.0a0' libwebp-base: '>=1.4.0,<2.0a0' libzlib: '>=1.3.1,<2.0a0' lz4-c: '>=1.9.3,<1.10.0a0' openssl: '>=3.3.1,<4.0a0' - spdlog: '>=1.13.0,<1.14.0a0' + spdlog: '>=1.14.1,<1.15.0a0' zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/tiledb-2.24.2-h5def871_2.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/tiledb-2.24.2-h3c94177_12.conda hash: - md5: 324ed9291d2eba902557876197cec529 - sha256: 66c9f8d45ff614af969ded3dc271354bc1885c97fae946bad361a471ae0d629e + md5: a56b46c702b903aea344d82254b472f2 + sha256: 42a78ad03990fe01e12ddb57a2002f8831d2dff15e6edae9c73d985d0b0e251f category: main optional: false - name: tinycss2 @@ -14288,39 +14367,39 @@ package: category: main optional: false - name: tqdm - version: 4.66.4 + version: 4.66.5 manager: conda platform: linux-64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-64/tqdm-4.66.4-py312he106c6f_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-64/tqdm-4.66.5-py312he106c6f_0.conda hash: - md5: 11d1cee87830bbb013896a43f47eafa9 - sha256: 068de63ad220413d320022cc5bce27c643d7c7e5a3a2086efc7251008bf2fbc3 + md5: 099959333950bef1a3d7d12133cbfafc + sha256: b8515778077133db9d088210ddd2276dd6521cffaa242a239ef92870a6190970 category: main optional: false - name: tqdm - version: 4.66.4 + version: 4.66.5 manager: conda platform: linux-aarch64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/linux-aarch64/tqdm-4.66.4-py312h42ac6d5_0.conda + url: https://repo.anaconda.com/pkgs/main/linux-aarch64/tqdm-4.66.5-py312h42ac6d5_0.conda hash: - md5: 0473bb81fdf24f8fca59e8ac4c444336 - sha256: fcec28bb105e985fd8977df1c132f535d2654572b6b9f315d6877e103529d461 + md5: a9543ab62d1942e73eae6f8ef2703a7a + sha256: 418c83db6ecc8d2d083a9806c5e3859d4739281dcd1a699ce8017efbb63f2611 category: main optional: false - name: tqdm - version: 4.66.4 + version: 4.66.5 manager: conda platform: osx-arm64 dependencies: python: '>=3.12,<3.13.0a0' - url: https://repo.anaconda.com/pkgs/main/osx-arm64/tqdm-4.66.4-py312h989b03a_0.conda + url: https://repo.anaconda.com/pkgs/main/osx-arm64/tqdm-4.66.5-py312h989b03a_0.conda hash: - md5: 05c65c61a76907878d041b83f5f2bc70 - sha256: 876a20ba3b50ee2ec41fc62ff9eb7f812299e70680700835a73aa53a394501ac + md5: 9b2b9de3b3d58a22c6fd834293e14eed + sha256: 9ac41400d432a373782fc14f658997b709e7fc946e46aed03c28001c11a47418 category: main optional: false - name: traitlets @@ -14360,126 +14439,126 @@ package: category: main optional: false - name: typer - version: 0.12.3 + version: 0.12.5 manager: conda platform: linux-64 dependencies: python: '>=3.7' - typer-slim-standard: 0.12.3 - url: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda + typer-slim-standard: 0.12.5 + url: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.5-pyhd8ed1ab_0.conda hash: - md5: 10efd02b22c39c0a46312ef7cb16d237 - sha256: b8b182303858c512fa04f38a3123c892958f708d2ae90afd35246da7c4829485 + md5: be70216cc1a5fe502c849676baabf498 + sha256: da9ff9e27c5fa8268c2d5898335485a897d9496eef3b5b446cd9387a89d168de category: main optional: false - name: typer - version: 0.12.3 + version: 0.12.5 manager: conda platform: linux-aarch64 dependencies: python: '>=3.7' - typer-slim-standard: 0.12.3 - url: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda + typer-slim-standard: 0.12.5 + url: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.5-pyhd8ed1ab_0.conda hash: - md5: 10efd02b22c39c0a46312ef7cb16d237 - sha256: b8b182303858c512fa04f38a3123c892958f708d2ae90afd35246da7c4829485 + md5: be70216cc1a5fe502c849676baabf498 + sha256: da9ff9e27c5fa8268c2d5898335485a897d9496eef3b5b446cd9387a89d168de category: main optional: false - name: typer - version: 0.12.3 + version: 0.12.5 manager: conda platform: osx-arm64 dependencies: python: '>=3.7' - typer-slim-standard: 0.12.3 - url: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda + typer-slim-standard: 0.12.5 + url: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.5-pyhd8ed1ab_0.conda hash: - md5: 10efd02b22c39c0a46312ef7cb16d237 - sha256: b8b182303858c512fa04f38a3123c892958f708d2ae90afd35246da7c4829485 + md5: be70216cc1a5fe502c849676baabf498 + sha256: da9ff9e27c5fa8268c2d5898335485a897d9496eef3b5b446cd9387a89d168de category: main optional: false - name: typer-slim - version: 0.12.3 + version: 0.12.5 manager: conda platform: linux-64 dependencies: click: '>=8.0.0' python: '>=3.7' typing_extensions: '>=3.7.4.3' - url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.5-pyhd8ed1ab_0.conda hash: - md5: cf2c3a89f89644c53cadbfeb124914e9 - sha256: 01dcb54375c8eae54d13374ed3d5823635401c552340b87e67fdbbb507760596 + md5: a46aa56c0ca7cc2bd38baffc2686f0a6 + sha256: 7be1876627495047f3f07c52c93ddc2ae2017b93affe58110a5474e5ebcb2662 category: main optional: false - name: typer-slim - version: 0.12.3 + version: 0.12.5 manager: conda platform: linux-aarch64 dependencies: click: '>=8.0.0' python: '>=3.7' typing_extensions: '>=3.7.4.3' - url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.5-pyhd8ed1ab_0.conda hash: - md5: cf2c3a89f89644c53cadbfeb124914e9 - sha256: 01dcb54375c8eae54d13374ed3d5823635401c552340b87e67fdbbb507760596 + md5: a46aa56c0ca7cc2bd38baffc2686f0a6 + sha256: 7be1876627495047f3f07c52c93ddc2ae2017b93affe58110a5474e5ebcb2662 category: main optional: false - name: typer-slim - version: 0.12.3 + version: 0.12.5 manager: conda platform: osx-arm64 dependencies: click: '>=8.0.0' python: '>=3.7' typing_extensions: '>=3.7.4.3' - url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.5-pyhd8ed1ab_0.conda hash: - md5: cf2c3a89f89644c53cadbfeb124914e9 - sha256: 01dcb54375c8eae54d13374ed3d5823635401c552340b87e67fdbbb507760596 + md5: a46aa56c0ca7cc2bd38baffc2686f0a6 + sha256: 7be1876627495047f3f07c52c93ddc2ae2017b93affe58110a5474e5ebcb2662 category: main optional: false - name: typer-slim-standard - version: 0.12.3 + version: 0.12.5 manager: conda platform: linux-64 dependencies: rich: '' shellingham: '' - typer-slim: 0.12.3 - url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.3-hd8ed1ab_0.conda + typer-slim: 0.12.5 + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.5-hd8ed1ab_0.conda hash: - md5: 8e56b98837d17e6ace4dc455d905709a - sha256: 06e2f8ca7e3f7168a39d3d2cc62ee1e220928e1e5a4370f4ade2566342c4a459 + md5: 2dc1ee4046de0692077e9aa9ba351d36 + sha256: bb298b116159ec1085f6b29eaeb982006651a0997eda08de8b70cfb6177297f3 category: main optional: false - name: typer-slim-standard - version: 0.12.3 + version: 0.12.5 manager: conda platform: linux-aarch64 dependencies: rich: '' shellingham: '' - typer-slim: 0.12.3 - url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.3-hd8ed1ab_0.conda + typer-slim: 0.12.5 + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.5-hd8ed1ab_0.conda hash: - md5: 8e56b98837d17e6ace4dc455d905709a - sha256: 06e2f8ca7e3f7168a39d3d2cc62ee1e220928e1e5a4370f4ade2566342c4a459 + md5: 2dc1ee4046de0692077e9aa9ba351d36 + sha256: bb298b116159ec1085f6b29eaeb982006651a0997eda08de8b70cfb6177297f3 category: main optional: false - name: typer-slim-standard - version: 0.12.3 + version: 0.12.5 manager: conda platform: osx-arm64 dependencies: rich: '' shellingham: '' - typer-slim: 0.12.3 - url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.3-hd8ed1ab_0.conda + typer-slim: 0.12.5 + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.5-hd8ed1ab_0.conda hash: - md5: 8e56b98837d17e6ace4dc455d905709a - sha256: 06e2f8ca7e3f7168a39d3d2cc62ee1e220928e1e5a4370f4ade2566342c4a459 + md5: 2dc1ee4046de0692077e9aa9ba351d36 + sha256: bb298b116159ec1085f6b29eaeb982006651a0997eda08de8b70cfb6177297f3 category: main optional: false - name: typing-extensions @@ -14671,7 +14750,7 @@ package: category: dev optional: true - name: unearth - version: 0.16.1 + version: 0.17.2 manager: conda platform: linux-64 dependencies: @@ -14680,14 +14759,14 @@ package: packaging: '>=20' python: '>=3.7' requests: '>=2.25' - url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.16.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.17.2-pyhd8ed1ab_0.conda hash: - md5: 7c9b2ea6bbf1fa0018c808763d11721b - sha256: 7701c9999e313089c2f34d3a6200115e3956462cd4571bcd0423f19deb6e3276 + md5: 6ad8b4b640a6a87993639ca084ced8b2 + sha256: baff83d25b9b06e2773eea0424138a0c46ccef971ef2747464bf9645ce2ef2e1 category: main optional: false - name: unearth - version: 0.16.1 + version: 0.17.2 manager: conda platform: linux-aarch64 dependencies: @@ -14696,14 +14775,14 @@ package: packaging: '>=20' python: '>=3.7' requests: '>=2.25' - url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.16.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.17.2-pyhd8ed1ab_0.conda hash: - md5: 7c9b2ea6bbf1fa0018c808763d11721b - sha256: 7701c9999e313089c2f34d3a6200115e3956462cd4571bcd0423f19deb6e3276 + md5: 6ad8b4b640a6a87993639ca084ced8b2 + sha256: baff83d25b9b06e2773eea0424138a0c46ccef971ef2747464bf9645ce2ef2e1 category: main optional: false - name: unearth - version: 0.16.1 + version: 0.17.2 manager: conda platform: osx-arm64 dependencies: @@ -14712,10 +14791,10 @@ package: packaging: '>=20' python: '>=3.7' requests: '>=2.25' - url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.16.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/unearth-0.17.2-pyhd8ed1ab_0.conda hash: - md5: 7c9b2ea6bbf1fa0018c808763d11721b - sha256: 7701c9999e313089c2f34d3a6200115e3956462cd4571bcd0423f19deb6e3276 + md5: 6ad8b4b640a6a87993639ca084ced8b2 + sha256: baff83d25b9b06e2773eea0424138a0c46ccef971ef2747464bf9645ce2ef2e1 category: main optional: false - name: unicodedata2 @@ -15046,7 +15125,7 @@ package: manager: conda platform: linux-64 dependencies: - numpy: '>=1.21' + numpy: '>=1.21,<2.0a0' packaging: '>=21.3' pandas: '>=1.4' python: '>=3.12,<3.13.0a0' @@ -15061,7 +15140,7 @@ package: manager: conda platform: linux-aarch64 dependencies: - numpy: '>=1.21' + numpy: '>=1.21,<2.0a0' packaging: '>=21.3' pandas: '>=1.4' python: '>=3.12,<3.13.0a0' @@ -15076,7 +15155,7 @@ package: manager: conda platform: osx-arm64 dependencies: - numpy: '>=1.21' + numpy: '>=1.21,<2.0a0' packaging: '>=21.3' pandas: '>=1.4' python: '>=3.12,<3.13.0a0' @@ -15704,14 +15783,14 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' cffi: '>=1.11' - libgcc-ng: '>=12' + libgcc: '>=13' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h3483029_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda hash: - md5: eab52e88c858d87cf5a069f79d10bb50 - sha256: 7e1e105ea7eab2af591faebf743ff2493f53c313079e316419577925e4492b03 + md5: 8b7069e9792ee4e5b4919a7a306d2e67 + sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b category: main optional: false - name: zstandard @@ -15720,14 +15799,14 @@ package: platform: linux-aarch64 dependencies: cffi: '>=1.11' - libgcc-ng: '>=12' + libgcc: '>=13' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312h9fc3309_0.conda + url: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda hash: - md5: 1903935398241d9772c260a4d0ee5bc3 - sha256: 65c201c2f3e120c57e2c2eae8fb30254fbe249adb2df0a3073ce4b30fd3004ca + md5: ffcb8e97e62af42075e0e5f46bb9856e + sha256: 2681c2a249752bdc7978e59ee2f34fcdfcbfda80029b84b8e5fec8dbc9e3af25 category: main optional: false - name: zstandard @@ -15740,10 +15819,10 @@ package: python: '>=3.12,<3.13.0a0' python_abi: 3.12.* zstd: '>=1.5.6,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h721a963_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda hash: - md5: caf7f5b85615a132c0fa586b82bd59e6 - sha256: 6fc0d2f7a0a49a7c1453bb9eacd5456214b6cf000760067d72f0cce464975fa1 + md5: a4cde595509a7ad9c13b1a3809bcfe51 + sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb category: main optional: false - name: zstd diff --git a/python/pdm.lock b/python/pdm.lock index a6973901..3e3e17d2 100644 --- a/python/pdm.lock +++ b/python/pdm.lock @@ -5,10 +5,13 @@ groups = ["default", "dev"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:7c3054f2a787c280df57211415a3aa43486b31fc48359d47e9d9b3e9ac27c10f" +content_hash = "sha256:a791bb55d90fb8dcbba5e8c629aafba2f6010acb5d675f791bf23b218f1e9a19" [[metadata.targets]] -requires_python = "==3.12.*" +requires_python = "==3.12.4" +platform = "manylinux_2_39_aarch64" +implementation = "cpython" +gil_disabled = false [[package]] name = "affine" @@ -16,6 +19,7 @@ version = "2.4.0" requires_python = ">=3.7" summary = "Matrices describing affine transformation of the plane" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "affine-2.4.0-py3-none-any.whl", hash = "sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92"}, {file = "affine-2.4.0.tar.gz", hash = "sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea"}, @@ -27,6 +31,7 @@ version = "0.7.0" requires_python = ">=3.8" summary = "Reusable constraint types to use with typing.Annotated" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "typing-extensions>=4.0.0; python_version < \"3.9\"", ] @@ -41,6 +46,7 @@ version = "4.4.0" requires_python = ">=3.8" summary = "High level compatibility layer for multiple asynchronous event loop implementations" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "exceptiongroup>=1.0.2; python_version < \"3.11\"", "idna>=2.8", @@ -57,29 +63,19 @@ name = "appdirs" version = "1.4.4" summary = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, ] -[[package]] -name = "appnope" -version = "0.1.4" -requires_python = ">=3.6" -summary = "Disable App Nap on macOS >= 10.9" -groups = ["default"] -marker = "platform_system == \"Darwin\"" -files = [ - {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, - {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, -] - [[package]] name = "argon2-cffi" version = "23.1.0" requires_python = ">=3.7" summary = "Argon2 for Python" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "argon2-cffi-bindings", "typing-extensions; python_version < \"3.8\"", @@ -95,6 +91,7 @@ version = "21.2.0" requires_python = ">=3.6" summary = "Low-level CFFI bindings for Argon2" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "cffi>=1.0.1", ] @@ -128,6 +125,7 @@ version = "1.3.0" requires_python = ">=3.8" summary = "Better dates & times for Python" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "python-dateutil>=2.7.0", "types-python-dateutil>=2.8.10", @@ -142,6 +140,7 @@ name = "asttokens" version = "2.4.1" summary = "Annotate AST trees with source code positions" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "six>=1.12.0", "typing; python_version < \"3.5\"", @@ -157,6 +156,7 @@ version = "2.0.4" requires_python = ">=3.8" summary = "Simple LRU cache for asyncio" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "typing-extensions>=4.0.0; python_version < \"3.11\"", ] @@ -171,6 +171,7 @@ version = "23.2.0" requires_python = ">=3.7" summary = "Classes Without Boilerplate" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "importlib-metadata; python_version < \"3.8\"", ] @@ -185,6 +186,7 @@ version = "2.15.0" requires_python = ">=3.8" summary = "Internationalization utilities" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "pytz>=2015.7; python_version < \"3.9\"", ] @@ -199,6 +201,7 @@ version = "0.18.5" requires_python = ">=3.8.0" summary = "Unbearably fast runtime type checking in pure Python." groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "beartype-0.18.5-py3-none-any.whl", hash = "sha256:5301a14f2a9a5540fe47ec6d34d758e9cd8331d36c4760fc7a5499ab86310089"}, {file = "beartype-0.18.5.tar.gz", hash = "sha256:264ddc2f1da9ec94ff639141fbe33d22e12a9f75aa863b83b7046ffff1381927"}, @@ -210,6 +213,7 @@ version = "4.12.3" requires_python = ">=3.6.0" summary = "Screen-scraping library" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "soupsieve>1.2", ] @@ -224,6 +228,7 @@ version = "6.1.0" requires_python = ">=3.8" summary = "An easy safelist-based HTML-sanitizing tool." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "six>=1.9.0", "webencodings", @@ -239,6 +244,7 @@ version = "1.8.2" requires_python = ">=3.8" summary = "Fast, simple object-to-object and broadcast signaling" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "blinker-1.8.2-py3-none-any.whl", hash = "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01"}, {file = "blinker-1.8.2.tar.gz", hash = "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83"}, @@ -250,6 +256,7 @@ version = "0.14.0" requires_python = ">=3.7" summary = "httplib2 caching for requests" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "msgpack<2.0.0,>=0.5.2", "requests>=2.16.0", @@ -266,6 +273,7 @@ extras = ["filecache"] requires_python = ">=3.7" summary = "httplib2 caching for requests" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "cachecontrol==0.14.0", "filelock>=3.8.0", @@ -281,6 +289,7 @@ version = "0.3.0" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "Cachy provides a simple yet effective caching library." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, @@ -292,6 +301,7 @@ version = "2024.7.4" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, @@ -303,6 +313,7 @@ version = "1.16.0" requires_python = ">=3.8" summary = "Foreign Function Interface for Python calling C code." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "pycparser", ] @@ -326,6 +337,7 @@ version = "3.4.0" requires_python = ">=3.8" summary = "Validate configuration and produce human readable error messages." groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -337,6 +349,7 @@ version = "1.6.4" requires_python = ">=3.8" summary = "Time-handling functionality from netcdf4-python" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy>1.13.3; python_version < \"3.12.0.rc1\"", "numpy>=1.26.0b1; python_version >= \"3.12.0.rc1\"", @@ -357,6 +370,7 @@ version = "3.3.2" requires_python = ">=3.7.0" summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, @@ -383,6 +397,7 @@ version = "8.1.7" requires_python = ">=3.7" summary = "Composable command line interface toolkit" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "colorama; platform_system == \"Windows\"", "importlib-metadata; python_version < \"3.8\"", @@ -398,6 +413,7 @@ version = "1.2.4" requires_python = ">=2.7" summary = "click_default_group" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "click", ] @@ -411,6 +427,7 @@ name = "click-plugins" version = "1.1.1" summary = "An extension module for click to enable registering CLI commands via setuptools entry-points." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "click>=4.0", ] @@ -425,6 +442,7 @@ version = "0.7.2" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" summary = "Click params for commmand line interfaces to GeoJSON" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "click>=4.0", ] @@ -439,6 +457,7 @@ version = "0.6.2" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "CliKit is a group of utilities to build beautiful and testable command line interfaces." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "crashtest<0.4.0,>=0.3.0; python_version ~= \"3.6\"", "enum34<2.0,>=1.1; python_version >= \"2.7\" and python_version < \"2.8\"", @@ -457,7 +476,8 @@ name = "colorama" version = "0.4.6" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Cross-platform colored terminal text." -groups = ["default", "dev"] +groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -469,6 +489,7 @@ version = "0.2.2" requires_python = ">=3.8" summary = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "traitlets>=4", ] @@ -483,6 +504,7 @@ version = "2.5.7" requires_python = ">=3.8" summary = "Lockfiles for conda" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "cachecontrol[filecache]>=0.12.9", "cachy>=0.3.0", @@ -520,6 +542,7 @@ version = "1.2.1" requires_python = ">=3.9" summary = "Python library for calculating contours of 2D quadrilateral grids" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy>=1.20", ] @@ -546,6 +569,7 @@ version = "7.6.0" requires_python = ">=3.8" summary = "Code coverage measurement for Python" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, @@ -563,15 +587,17 @@ files = [ [[package]] name = "coverage-badge" -version = "1.1.1" +version = "1.1.2" summary = "Generate coverage badges for Coverage.py." groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "coverage", + "setuptools", ] files = [ - {file = "coverage-badge-1.1.1.tar.gz", hash = "sha256:42252df917404af6147380861228a4ace3d9a29804df8fc2d34a22b2bc4f45b6"}, - {file = "coverage_badge-1.1.1-py2.py3-none-any.whl", hash = "sha256:1d8e566ad47c37910fa2bbc74ea19972b171b5b4e40624b31b3e2f2d93680266"}, + {file = "coverage_badge-1.1.2-py2.py3-none-any.whl", hash = "sha256:d8413ce51c91043a1692b943616b450868cbeeb0ea6a0c54a32f8318c9c96ff7"}, + {file = "coverage_badge-1.1.2.tar.gz", hash = "sha256:fe7ed58a3b72dad85a553b64a99e963dea3847dcd0b8ddd2b38a00333618642c"}, ] [[package]] @@ -581,6 +607,7 @@ extras = ["toml"] requires_python = ">=3.8" summary = "Code coverage measurement for Python" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "coverage==7.6.0", "tomli; python_full_version <= \"3.11.0a6\"", @@ -606,6 +633,7 @@ version = "0.3.1" requires_python = ">=3.6,<4.0" summary = "Manage Python errors with ease" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, @@ -617,37 +645,15 @@ version = "43.0.0" requires_python = ">=3.7" summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." groups = ["default"] -marker = "sys_platform == \"linux\"" +marker = "sys_platform == \"linux\" and python_full_version == \"3.12.4\"" dependencies = [ "cffi>=1.12; platform_python_implementation != \"PyPy\"", ] files = [ - {file = "cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74"}, {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22"}, {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf"}, - {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55"}, - {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431"}, - {file = "cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc"}, - {file = "cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778"}, - {file = "cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66"}, {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e"}, {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f"}, - {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"}, - {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b"}, - {file = "cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf"}, - {file = "cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1"}, {file = "cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e"}, ] @@ -657,6 +663,7 @@ version = "0.12.1" requires_python = ">=3.8" summary = "Composable style cycles" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -668,6 +675,7 @@ version = "1.8.2" requires_python = ">=3.8" summary = "An implementation of the Debug Adapter Protocol for Python" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "debugpy-1.8.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835"}, {file = "debugpy-1.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3"}, @@ -683,6 +691,7 @@ version = "5.1.1" requires_python = ">=3.5" summary = "Decorators for Humans" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -694,6 +703,7 @@ version = "0.7.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "XML bomb protection for Python stdlib modules" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, @@ -701,16 +711,17 @@ files = [ [[package]] name = "dep-logic" -version = "0.4.3" +version = "0.4.4" requires_python = ">=3.8" summary = "Python dependency specifications supporting logical operations" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "packaging>=22", ] files = [ - {file = "dep_logic-0.4.3-py3-none-any.whl", hash = "sha256:03f2740fc40e2848f2a4c77baddcc8f5e3773c304da947815306d1e616f3942c"}, - {file = "dep_logic-0.4.3.tar.gz", hash = "sha256:e4768f0a26c8c1c0e39fd520f3e0bd099ca528ec6a8f20359fbc89ffcdf8da45"}, + {file = "dep_logic-0.4.4-py3-none-any.whl", hash = "sha256:3f47301f9a8230443d3df7d7f9bdc33d35d8591a14112d36f221b0e33810d3ae"}, + {file = "dep_logic-0.4.4.tar.gz", hash = "sha256:e716afdda9351107c54ef4f6fd3fd29568f53529afb333b4958183b9d306e44a"}, ] [[package]] @@ -719,6 +730,7 @@ version = "0.3.8" requires_python = ">=3.8" summary = "serialize all of Python" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, @@ -729,6 +741,7 @@ name = "distlib" version = "0.3.8" summary = "Distribution utilities" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, @@ -740,6 +753,7 @@ version = "1.4.4" requires_python = ">=3.7" summary = "Lightweight bootstrapper for a conda executable" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "appdirs", "click>=5.1", @@ -758,6 +772,7 @@ version = "1.1.0" requires_python = ">=3.6" summary = "An implementation of lxml.xmlfile for the standard library" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, @@ -769,6 +784,7 @@ version = "2.1.1" requires_python = ">=3.8" summary = "execnet: rapid multi-Python deployment" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -780,6 +796,7 @@ version = "2.0.1" requires_python = ">=3.5" summary = "Get the currently executing AST node of a frame, and other information" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, @@ -790,6 +807,7 @@ name = "fastjsonschema" version = "2.20.0" summary = "Fastest Python implementation of JSON schema" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, @@ -801,6 +819,7 @@ version = "3.15.4" requires_python = ">=3.8" summary = "A platform independent file lock." groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, @@ -812,6 +831,7 @@ version = "0.6.1" requires_python = ">=3.8" summary = "A utility to find python versions on your system" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "packaging>=20", ] @@ -826,6 +846,7 @@ version = "4.53.1" requires_python = ">=3.8" summary = "Tools to manipulate font files" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, @@ -845,6 +866,7 @@ version = "1.5.1" requires_python = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" summary = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "cached-property>=1.3.0; python_version < \"3.8\"", ] @@ -859,6 +881,7 @@ version = "3.8.5" requires_python = ">=3.6.0" summary = "GDAL: Geospatial Data Abstraction Library" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "GDAL-3.8.5.tar.gz", hash = "sha256:ad8addd58ba9c62aefc7f65d345c168736798f137e5c8f247af76fcf4862d371"}, ] @@ -869,6 +892,7 @@ version = "1.0.1" requires_python = ">=3.9" summary = "Geographic pandas extensions" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy>=1.22", "packaging", @@ -888,6 +912,7 @@ version = "4.0.11" requires_python = ">=3.7" summary = "Git Object Database" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "smmap<6,>=3.0.1", ] @@ -902,6 +927,7 @@ version = "3.1.43" requires_python = ">=3.7" summary = "GitPython is a Python library used to interact with Git repositories" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "gitdb<5,>=4.0.1", "typing-extensions>=3.7.4.3; python_version < \"3.8\"", @@ -917,6 +943,7 @@ version = "0.48.0" requires_python = ">=3.8" summary = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "astunparse>=1.6; python_version < \"3.9\"", "backports-strenum>=1.3; python_version < \"3.11\"", @@ -933,6 +960,7 @@ version = "0.14.0" requires_python = ">=3.7" summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "typing-extensions; python_version < \"3.8\"", ] @@ -947,6 +975,7 @@ version = "0.0.30" requires_python = ">=3.8" summary = "Persistent cache implementation for httpx and httpcore" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "httpx>=0.22.0", "typing-extensions>=4.8.0", @@ -962,6 +991,7 @@ version = "1.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "HTML parser based on the WHATWG HTML specification" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "six>=1.9", "webencodings", @@ -977,6 +1007,7 @@ version = "1.0.5" requires_python = ">=3.8" summary = "A minimal low-level HTTP client." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "certifi", "h11<0.15,>=0.13", @@ -992,6 +1023,7 @@ version = "0.27.0" requires_python = ">=3.8" summary = "The next generation HTTP client." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "anyio", "certifi", @@ -1011,6 +1043,7 @@ extras = ["socks"] requires_python = ">=3.8" summary = "The next generation HTTP client." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "httpx==0.27.0", "socksio==1.*", @@ -1026,6 +1059,7 @@ version = "2.6.0" requires_python = ">=3.8" summary = "File identification library for Python" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, @@ -1037,6 +1071,7 @@ version = "3.7" requires_python = ">=3.5" summary = "Internationalized Domain Names in Applications (IDNA)" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, @@ -1048,6 +1083,7 @@ version = "8.0.0" requires_python = ">=3.8" summary = "Read metadata from Python packages" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "typing-extensions>=3.6.4; python_version < \"3.8\"", "zipp>=0.5", @@ -1063,6 +1099,7 @@ version = "6.4.0" requires_python = ">=3.8" summary = "Read resources from Python packages" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "zipp>=3.1.0; python_version < \"3.10\"", ] @@ -1077,6 +1114,7 @@ version = "2.0.0" requires_python = ">=3.7" summary = "brain-dead simple config-ini parsing" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -1088,6 +1126,7 @@ version = "0.7.0" requires_python = ">=3.7" summary = "A library for installing Python wheels." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53"}, {file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"}, @@ -1099,6 +1138,7 @@ version = "6.29.5" requires_python = ">=3.8" summary = "IPython Kernel for Jupyter" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "appnope; platform_system == \"Darwin\"", "comm>=0.1.1", @@ -1125,6 +1165,7 @@ version = "8.26.0" requires_python = ">=3.10" summary = "IPython: Productive Interactive Computing" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "colorama; sys_platform == \"win32\"", "decorator", @@ -1149,6 +1190,7 @@ version = "20.11.0" requires_python = ">=3.7" summary = "Operations with ISO 8601 durations" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "arrow>=0.15.0", ] @@ -1163,6 +1205,7 @@ version = "3.4.0" requires_python = ">=3.8" summary = "Utility functions for Python class constructs" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "more-itertools", ] @@ -1177,6 +1220,7 @@ version = "5.3.0" requires_python = ">=3.8" summary = "Useful decorators and context managers" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "backports-tarfile; python_version < \"3.12\"", ] @@ -1191,6 +1235,7 @@ version = "4.0.1" requires_python = ">=3.8" summary = "Functools like those found in stdlib" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "more-itertools", ] @@ -1205,6 +1250,7 @@ version = "0.19.1" requires_python = ">=3.6" summary = "An autocompletion tool for Python that can be used for text editors." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "parso<0.9.0,>=0.8.3", ] @@ -1219,7 +1265,7 @@ version = "0.8.0" requires_python = ">=3.7" summary = "Low-level, pure Python DBus protocol wrapper." groups = ["default"] -marker = "sys_platform == \"linux\"" +marker = "sys_platform == \"linux\" and python_full_version == \"3.12.4\"" files = [ {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, @@ -1231,6 +1277,7 @@ version = "3.1.4" requires_python = ">=3.7" summary = "A very fast and expressive template engine." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "MarkupSafe>=2.0", ] @@ -1245,6 +1292,7 @@ version = "0.9.25" requires_python = ">=3.8" summary = "A Python implementation of the JSON5 data format." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, @@ -1256,6 +1304,7 @@ version = "3.0.0" requires_python = ">=3.7" summary = "Identify specific nodes in a JSON document (RFC 6901) " groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -1267,6 +1316,7 @@ version = "4.23.0" requires_python = ">=3.8" summary = "An implementation of JSON Schema validation for Python" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "attrs>=22.2.0", "importlib-resources>=1.4.0; python_version < \"3.9\"", @@ -1286,6 +1336,7 @@ version = "2023.12.1" requires_python = ">=3.8" summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "importlib-resources>=1.4.0; python_version < \"3.9\"", "referencing>=0.31.0", @@ -1302,6 +1353,7 @@ extras = ["format-nongpl"] requires_python = ">=3.8" summary = "An implementation of JSON Schema validation for Python" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "fqdn", "idna", @@ -1324,6 +1376,7 @@ version = "8.6.2" requires_python = ">=3.8" summary = "Jupyter protocol implementation and client libraries" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "importlib-metadata>=4.8.3; python_version < \"3.10\"", "jupyter-core!=5.0.*,>=4.12", @@ -1343,6 +1396,7 @@ version = "5.7.2" requires_python = ">=3.8" summary = "Jupyter core package. A base package on which Jupyter projects rely." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "platformdirs>=2.5", "pywin32>=300; sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"", @@ -1359,6 +1413,7 @@ version = "0.10.0" requires_python = ">=3.8" summary = "Jupyter Event System library" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "jsonschema[format-nongpl]>=4.18.0", "python-json-logger>=2.0.4", @@ -1379,6 +1434,7 @@ version = "2.2.5" requires_python = ">=3.8" summary = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "importlib-metadata>=4.8.3; python_version < \"3.10\"", "jupyter-server>=1.1.2", @@ -1394,6 +1450,7 @@ version = "2.14.2" requires_python = ">=3.8" summary = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "anyio>=3.1.0", "argon2-cffi>=21.1", @@ -1426,6 +1483,7 @@ version = "0.5.3" requires_python = ">=3.8" summary = "A Jupyter Server Extension Providing Terminals." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "pywinpty>=2.0.3; os_name == \"nt\"", "terminado>=0.8.3", @@ -1437,10 +1495,11 @@ files = [ [[package]] name = "jupyterlab" -version = "4.2.4" +version = "4.2.5" requires_python = ">=3.8" summary = "JupyterLab computational environment" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "async-lru>=1.0.0", "httpx>=0.25.0", @@ -1460,8 +1519,8 @@ dependencies = [ "traitlets", ] files = [ - {file = "jupyterlab-4.2.4-py3-none-any.whl", hash = "sha256:807a7ec73637744f879e112060d4b9d9ebe028033b7a429b2d1f4fc523d00245"}, - {file = "jupyterlab-4.2.4.tar.gz", hash = "sha256:343a979fb9582fd08c8511823e320703281cd072a0049bcdafdc7afeda7f2537"}, + {file = "jupyterlab-4.2.5-py3-none-any.whl", hash = "sha256:73b6e0775d41a9fee7ee756c80f58a6bed4040869ccc21411dc559818874d321"}, + {file = "jupyterlab-4.2.5.tar.gz", hash = "sha256:ae7f3a1b8cb88b4f55009ce79fa7c06f99d70cd63601ee4aa91815d054f46f75"}, ] [[package]] @@ -1470,6 +1529,7 @@ version = "0.3.0" requires_python = ">=3.8" summary = "Pygments theme using JupyterLab CSS variables" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, @@ -1481,6 +1541,7 @@ version = "2.27.3" requires_python = ">=3.8" summary = "A set of server components for JupyterLab and JupyterLab like applications." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "babel>=2.10", "importlib-metadata>=4.8.3; python_version < \"3.10\"", @@ -1502,6 +1563,7 @@ version = "25.2.1" requires_python = ">=3.8" summary = "Store and access your passwords safely." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "SecretStorage>=3.2; sys_platform == \"linux\"", "importlib-metadata>=4.11.4; python_version < \"3.12\"", @@ -1523,6 +1585,7 @@ version = "1.4.5" requires_python = ">=3.7" summary = "A fast implementation of the Cassowary constraint solver" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "typing-extensions; python_version < \"3.8\"", ] @@ -1566,6 +1629,7 @@ version = "3.0.0" requires_python = ">=3.8" summary = "Python port of markdown-it. Markdown parsing, done right!" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "mdurl~=0.1", ] @@ -1580,6 +1644,7 @@ version = "2.1.5" requires_python = ">=3.7" summary = "Safely add untrusted strings to HTML/XML markup." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, @@ -1596,34 +1661,26 @@ files = [ [[package]] name = "matplotlib" -version = "3.9.1" +version = "3.8.4" requires_python = ">=3.9" summary = "Python plotting package" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "contourpy>=1.0.1", "cycler>=0.10", "fonttools>=4.22.0", "importlib-resources>=3.2.0; python_version < \"3.10\"", "kiwisolver>=1.3.1", - "numpy>=1.23", + "numpy>=1.21", "packaging>=20.0", "pillow>=8", "pyparsing>=2.3.1", "python-dateutil>=2.7", ] files = [ - {file = "matplotlib-3.9.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:565d572efea2b94f264dd86ef27919515aa6d629252a169b42ce5f570db7f37b"}, - {file = "matplotlib-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d397fd8ccc64af2ec0af1f0efc3bacd745ebfb9d507f3f552e8adb689ed730a"}, - {file = "matplotlib-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26040c8f5121cd1ad712abffcd4b5222a8aec3a0fe40bc8542c94331deb8780d"}, - {file = "matplotlib-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12cb1837cffaac087ad6b44399d5e22b78c729de3cdae4629e252067b705e2b"}, - {file = "matplotlib-3.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0e835c6988edc3d2d08794f73c323cc62483e13df0194719ecb0723b564e0b5c"}, - {file = "matplotlib-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:44a21d922f78ce40435cb35b43dd7d573cf2a30138d5c4b709d19f00e3907fd7"}, - {file = "matplotlib-3.9.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3fda72d4d472e2ccd1be0e9ccb6bf0d2eaf635e7f8f51d737ed7e465ac020cb3"}, - {file = "matplotlib-3.9.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:84b3ba8429935a444f1fdc80ed930babbe06725bcf09fbeb5c8757a2cd74af04"}, - {file = "matplotlib-3.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b918770bf3e07845408716e5bbda17eadfc3fcbd9307dc67f37d6cf834bb3d98"}, - {file = "matplotlib-3.9.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f1f2e5d29e9435c97ad4c36fb6668e89aee13d48c75893e25cef064675038ac9"}, - {file = "matplotlib-3.9.1.tar.gz", hash = "sha256:de06b19b8db95dd33d0dc17c926c7c9ebed9f572074b6fac4f65068a6814d010"}, + {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb"}, + {file = "matplotlib-3.8.4.tar.gz", hash = "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea"}, ] [[package]] @@ -1632,6 +1689,7 @@ version = "0.1.7" requires_python = ">=3.8" summary = "Inline Matplotlib backend for Jupyter" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "traitlets", ] @@ -1646,6 +1704,7 @@ version = "0.1.2" requires_python = ">=3.7" summary = "Markdown URL utilities" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -1657,6 +1716,7 @@ version = "3.0.2" requires_python = ">=3.7" summary = "A sane and fast Markdown parser with useful plugins and renderers" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, @@ -1668,6 +1728,7 @@ version = "10.3.0" requires_python = ">=3.8" summary = "More routines for operating on iterables, beyond itertools" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "more-itertools-10.3.0.tar.gz", hash = "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463"}, {file = "more_itertools-10.3.0-py3-none-any.whl", hash = "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320"}, @@ -1679,6 +1740,7 @@ version = "1.0.8" requires_python = ">=3.8" summary = "MessagePack serializer" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, @@ -1700,6 +1762,7 @@ version = "0.10.0" requires_python = ">=3.8.0" summary = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "jupyter-client>=6.1.12", "jupyter-core!=5.0.*,>=4.12", @@ -1717,6 +1780,7 @@ version = "7.16.4" requires_python = ">=3.8" summary = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "beautifulsoup4", "bleach!=5.0.0", @@ -1746,6 +1810,7 @@ version = "5.10.4" requires_python = ">=3.8" summary = "The Jupyter Notebook format" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "fastjsonschema>=2.15", "jsonschema>=2.6", @@ -1763,6 +1828,7 @@ version = "1.6.0" requires_python = ">=3.5" summary = "Patch asyncio to allow nested event loops" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, @@ -1770,22 +1836,19 @@ files = [ [[package]] name = "netcdf4" -version = "1.7.1.post1" +version = "1.7.1.post2" requires_python = ">=3.8" summary = "Provides an object-oriented python interface to the netCDF version 4 library" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "certifi", "cftime", "numpy", ] files = [ - {file = "netCDF4-1.7.1.post1-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:75bba24ef0354fb6913bc3acdcb3790534e86bf329bbeaaf54122b18e5fd05ea"}, - {file = "netCDF4-1.7.1.post1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:ce7f89b98dbb3acd9582db30e6478ce7a7003b2cb70dc20d85fe9506e65ab001"}, - {file = "netCDF4-1.7.1.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac4e30a0d5a8e227d6a890502cfa201388acf606c0c73a5a7594232f3a74e67e"}, - {file = "netCDF4-1.7.1.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:988c45f9122337a12267fb158953c0609e3ea50a557335a3105f104416a4821a"}, - {file = "netCDF4-1.7.1.post1-cp312-cp312-win_amd64.whl", hash = "sha256:8fb3ed3541fa1b5b46e9d92d7e803734a1a3f37d8f5adf5fdf7957c7750cb20e"}, - {file = "netcdf4-1.7.1.post1.tar.gz", hash = "sha256:797f0b25d87827fc6821e415d9e15a2068604b18c3be62563e72682bcba76548"}, + {file = "netCDF4-1.7.1.post2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5f396f150f97831229e47f449fe6acbca8ff9d08b2166560c46790aa6f11b56b"}, + {file = "netcdf4-1.7.1.post2.tar.gz", hash = "sha256:37d557e36654889d7020192bfb56f9d5f93894cb32997eb837ae586c538fd7b6"}, ] [[package]] @@ -1794,6 +1857,7 @@ version = "1.9.1" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Node.js virtual environment builder" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -1805,6 +1869,7 @@ version = "0.2.4" requires_python = ">=3.7" summary = "A shim layer for notebook traits and config" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "jupyter-server<3,>=1.8", ] @@ -1819,15 +1884,9 @@ version = "1.26.4" requires_python = ">=3.9" summary = "Fundamental package for array computing in Python" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] @@ -1837,6 +1896,7 @@ version = "3.1.5" requires_python = ">=3.8" summary = "A Python library to read/write Excel 2010 xlsx/xlsm files" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "et-xmlfile", ] @@ -1851,6 +1911,7 @@ version = "7.7.0" requires_python = ">=3.6" summary = "A decorator to automatically detect mismatch when overriding a method." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "typing; python_version < \"3.5\"", ] @@ -1865,6 +1926,7 @@ version = "24.1" requires_python = ">=3.8" summary = "Core utilities for Python packages" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, @@ -1876,6 +1938,7 @@ version = "2.2.2" requires_python = ">=3.9" summary = "Powerful data structures for data analysis, time series, and statistics" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy>=1.22.4; python_version < \"3.11\"", "numpy>=1.23.2; python_version == \"3.11\"", @@ -1901,6 +1964,7 @@ version = "1.5.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "Utilities for writing pandoc filters in python" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, @@ -1912,6 +1976,7 @@ version = "0.8.4" requires_python = ">=3.6" summary = "A Python Parser" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -1923,6 +1988,7 @@ version = "0.2.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "Bring colors to your terminal." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, @@ -1934,6 +2000,7 @@ version = "2024.4.24" requires_python = ">=3.8" summary = "Installer for Python Build Standalone" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "pbs_installer-2024.4.24-py3-none-any.whl", hash = "sha256:f8291f0231003d279d0de8fde88fa87b7c6d7fabc2671235113cf67513ff74f5"}, {file = "pbs_installer-2024.4.24.tar.gz", hash = "sha256:19224733068b0ffa39b53afbb61544bee8ecb9503e7222ba034f07b9913e2c1c"}, @@ -1941,13 +2008,14 @@ files = [ [[package]] name = "pdm" -version = "2.17.1" +version = "2.18.1" requires_python = ">=3.8" summary = "A modern Python package and dependency manager supporting the latest PEP standards" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "blinker", - "dep-logic>=0.4.3", + "dep-logic>=0.4.4", "filelock>=3.13", "findpython<1.0.0a0,>=0.6.0", "hishel<0.1.0,>=0.0.24", @@ -1967,12 +2035,12 @@ dependencies = [ "tomli>=1.1.0; python_version < \"3.11\"", "tomlkit<1,>=0.11.1", "truststore; python_version >= \"3.10\"", - "unearth>=0.16.0", + "unearth>=0.17.0", "virtualenv>=20", ] files = [ - {file = "pdm-2.17.1-py3-none-any.whl", hash = "sha256:2ef7bb1424217f267b81e40f9c5326af27a519e9535e3272aa3b454ad5ab096c"}, - {file = "pdm-2.17.1.tar.gz", hash = "sha256:9e1a28ecca83f3627aa700b1e3d52cd3f82f10fc908ac6499119baf7a3d4ea6c"}, + {file = "pdm-2.18.1-py3-none-any.whl", hash = "sha256:6a86b9a6fbe071dc26f266006ac8d688e8d16e5115ee115135713af95a860c0a"}, + {file = "pdm-2.18.1.tar.gz", hash = "sha256:acef692477a7190731ee7c1f626e97516eeb7473e4eeeeede4fef2bf0fb743ee"}, ] [[package]] @@ -1980,7 +2048,7 @@ name = "pexpect" version = "4.9.0" summary = "Pexpect allows easy control of interactive console applications." groups = ["default"] -marker = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" +marker = "(sys_platform != \"win32\" and sys_platform != \"emscripten\") and python_full_version == \"3.12.4\"" dependencies = [ "ptyprocess>=0.5", ] @@ -1995,6 +2063,7 @@ version = "10.4.0" requires_python = ">=3.8" summary = "Python Imaging Library (Fork)" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, @@ -2030,6 +2099,7 @@ version = "1.11.1" requires_python = ">=3.8" summary = "Query metadata from sdists / bdists / installed packages." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "pkginfo-1.11.1-py3-none-any.whl", hash = "sha256:bfa76a714fdfc18a045fcd684dbfc3816b603d9d075febef17cb6582bea29573"}, {file = "pkginfo-1.11.1.tar.gz", hash = "sha256:2e0dca1cf4c8e39644eed32408ea9966ee15e0d324c62ba899a393b3c6b467aa"}, @@ -2041,6 +2111,7 @@ version = "4.2.2" requires_python = ">=3.8" summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, @@ -2052,6 +2123,7 @@ version = "1.5.0" requires_python = ">=3.8" summary = "plugin and hook calling mechanisms for python" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -2063,6 +2135,7 @@ version = "2.5.2" requires_python = ">=3.8" summary = "Multiple dispatch in Python" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "beartype>=0.16.2", "rich>=10.0", @@ -2075,10 +2148,11 @@ files = [ [[package]] name = "pre-commit" -version = "3.7.1" +version = "3.8.0" requires_python = ">=3.9" summary = "A framework for managing and maintaining multi-language pre-commit hooks." groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "cfgv>=2.0.0", "identify>=1.0.0", @@ -2087,8 +2161,8 @@ dependencies = [ "virtualenv>=20.10.0", ] files = [ - {file = "pre_commit-3.7.1-py2.py3-none-any.whl", hash = "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5"}, - {file = "pre_commit-3.7.1.tar.gz", hash = "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a"}, + {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, + {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, ] [[package]] @@ -2097,6 +2171,7 @@ version = "0.20.0" requires_python = ">=3.8" summary = "Python client for the Prometheus monitoring system." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, @@ -2108,6 +2183,7 @@ version = "3.0.47" requires_python = ">=3.7.0" summary = "Library for building powerful interactive command lines in Python" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "wcwidth", ] @@ -2122,6 +2198,7 @@ version = "6.0.0" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" summary = "Cross-platform lib for process and system monitoring in Python." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, @@ -2138,7 +2215,7 @@ name = "ptyprocess" version = "0.7.0" summary = "Run a subprocess in a pseudo terminal" groups = ["default"] -marker = "sys_platform != \"win32\" and sys_platform != \"emscripten\" or os_name != \"nt\"" +marker = "(sys_platform != \"win32\" and sys_platform != \"emscripten\") and python_full_version == \"3.12.4\" or os_name != \"nt\" and python_full_version == \"3.12.4\"" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -2149,6 +2226,7 @@ name = "pure-eval" version = "0.2.2" summary = "Safely evaluate AST nodes without side effects" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, @@ -2160,6 +2238,7 @@ version = "2.22" requires_python = ">=3.8" summary = "C parser in Python" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -2171,6 +2250,7 @@ version = "2.8.2" requires_python = ">=3.8" summary = "Data validation using Python type hints" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "annotated-types>=0.4.0", "pydantic-core==2.20.1", @@ -2188,6 +2268,7 @@ version = "2.20.1" requires_python = ">=3.8" summary = "Core functionality for Pydantic validation and serialization" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "typing-extensions!=4.7.0,>=4.6.0", ] @@ -2229,6 +2310,7 @@ version = "2.18.0" requires_python = ">=3.8" summary = "Pygments is a syntax highlighting package written in Python." groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, @@ -2239,6 +2321,7 @@ name = "pylev" version = "1.4.0" summary = "A pure Python Levenshtein implementation that's not freaking GPL'd." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, @@ -2250,6 +2333,7 @@ version = "0.9.0" requires_python = ">=3.8" summary = "Vectorized spatial vector file format I/O using GDAL/OGR" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "certifi", "numpy", @@ -2270,6 +2354,7 @@ version = "3.1.2" requires_python = ">=3.6.8" summary = "pyparsing module - Classes and methods to define and execute parsing grammars" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, @@ -2281,6 +2366,7 @@ version = "3.6.1" requires_python = ">=3.9" summary = "Python interface to PROJ (cartographic projections and coordinate transformations library)" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "certifi", ] @@ -2302,6 +2388,7 @@ version = "1.1.0" requires_python = ">=3.7" summary = "Wrappers to call pyproject.toml-based build backend hooks." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "pyproject_hooks-1.1.0-py3-none-any.whl", hash = "sha256:7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2"}, {file = "pyproject_hooks-1.1.0.tar.gz", hash = "sha256:4b37730834edbd6bd37f26ece6b44802fb1c1ee2ece0e54ddff8bfc06db86965"}, @@ -2313,6 +2400,7 @@ version = "8.3.1" requires_python = ">=3.8" summary = "pytest: simple powerful testing with Python" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "colorama; sys_platform == \"win32\"", "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", @@ -2332,6 +2420,7 @@ version = "4.1.0" requires_python = ">=3.7" summary = "Pytest plugin for measuring coverage." groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "coverage[toml]>=5.2.1", "pytest>=4.6", @@ -2346,6 +2435,7 @@ name = "pytest-sugar" version = "1.0.0" summary = "pytest-sugar is a plugin for pytest that changes the default look and feel of pytest (e.g. progressbar, show tests that fail instantly)." groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "packaging>=21.3", "pytest>=6.2.0", @@ -2362,6 +2452,7 @@ version = "3.6.1" requires_python = ">=3.8" summary = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "execnet>=2.1", "pytest>=7.0.0", @@ -2377,6 +2468,7 @@ version = "2.9.0.post0" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" summary = "Extensions to the standard Python datetime module" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "six>=1.5", ] @@ -2391,6 +2483,7 @@ version = "1.0.1" requires_python = ">=3.8" summary = "Read key-value pairs from a .env file and set them as environment variables" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -2402,6 +2495,7 @@ version = "2.0.7" requires_python = ">=3.6" summary = "A python library adding a json log formatter" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, @@ -2412,53 +2506,19 @@ name = "pytz" version = "2024.1" summary = "World timezone definitions, modern and historical" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] -[[package]] -name = "pywin32" -version = "306" -summary = "Python for Window Extensions" -groups = ["default"] -marker = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" -files = [ - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, -] - -[[package]] -name = "pywin32-ctypes" -version = "0.2.2" -requires_python = ">=3.6" -summary = "A (partial) reimplementation of pywin32 using ctypes/cffi" -groups = ["default"] -marker = "sys_platform == \"win32\"" -files = [ - {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, - {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, -] - -[[package]] -name = "pywinpty" -version = "2.0.13" -requires_python = ">=3.8" -summary = "Pseudo terminal support for Windows from Python." -groups = ["default"] -marker = "os_name == \"nt\"" -files = [ - {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, - {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, -] - [[package]] name = "pyyaml" version = "6.0.1" requires_python = ">=3.6" summary = "YAML parser and emitter for Python" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, @@ -2476,6 +2536,7 @@ version = "26.0.3" requires_python = ">=3.7" summary = "Python bindings for 0MQ" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "cffi; implementation_name == \"pypy\"", ] @@ -2518,10 +2579,11 @@ files = [ [[package]] name = "quartodoc" -version = "0.7.5" +version = "0.7.6" requires_python = ">=3.9" summary = "Generate API documentation with Quarto." groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "click", "griffe>=0.33", @@ -2538,8 +2600,8 @@ dependencies = [ "watchdog>=3.0.0", ] files = [ - {file = "quartodoc-0.7.5-py3-none-any.whl", hash = "sha256:293c45c4b1b10936d562921ff32f7a5d3e24bde250c638f0033c0c38ecbc9a92"}, - {file = "quartodoc-0.7.5.tar.gz", hash = "sha256:328d40374fa4397cab67a820cdac3dca47a90eb0a33328ccf50c8f41507ef125"}, + {file = "quartodoc-0.7.6-py3-none-any.whl", hash = "sha256:d52f5c9e0b5842b74b93647c423af64c689d5aa0c43789ae4986a6044fde3733"}, + {file = "quartodoc-0.7.6.tar.gz", hash = "sha256:5513d66195f66d1edb547fdf9b4084532bd70b4ce44ce0f7a4e6a2cb55708626"}, ] [[package]] @@ -2548,6 +2610,7 @@ version = "1.3.10" requires_python = ">=3.8" summary = "Fast and direct raster I/O for use with Numpy and SciPy" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "affine", "attrs", @@ -2561,10 +2624,7 @@ dependencies = [ "snuggs>=1.4.1", ] files = [ - {file = "rasterio-1.3.10-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:3a9c4fb63e050e11bcd23e53f084ca186b445f976df1f70e7abd851c4072837f"}, {file = "rasterio-1.3.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c7ddca79444fd3b933f4cd1a1773e9f7839d0ce5d76e600bdf92ee9a79b95f8"}, - {file = "rasterio-1.3.10-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:f9cd757e11cfb07ef39b1cc79a32497bf22aff7fec41fe330b868cb3043b4db5"}, - {file = "rasterio-1.3.10-cp312-cp312-win_amd64.whl", hash = "sha256:7e653968f64840654d277e0f86f8666ed8f3030ba36fa865f420f9bc38d619ee"}, {file = "rasterio-1.3.10.tar.gz", hash = "sha256:ce182c735b4f9e8735d90600607ecab15ef895eb8aa660bf665751529477e326"}, ] @@ -2574,6 +2634,7 @@ version = "0.35.1" requires_python = ">=3.8" summary = "JSON Referencing + Python" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "attrs>=22.2.0", "rpds-py>=0.7.0", @@ -2589,6 +2650,7 @@ version = "2.32.3" requires_python = ">=3.8" summary = "Python HTTP for Humans." groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "certifi>=2017.4.17", "charset-normalizer<4,>=2", @@ -2605,6 +2667,7 @@ name = "resolvelib" version = "1.0.1" summary = "Resolve abstract dependencies into concrete ones" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf"}, {file = "resolvelib-1.0.1.tar.gz", hash = "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309"}, @@ -2616,6 +2679,7 @@ version = "0.1.4" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "A pure python RFC3339 validator" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "six", ] @@ -2630,6 +2694,7 @@ version = "0.1.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "Pure python rfc3986 validator" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, @@ -2637,18 +2702,19 @@ files = [ [[package]] name = "rich" -version = "13.7.1" +version = "13.8.0" requires_python = ">=3.7.0" summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "markdown-it-py>=2.2.0", "pygments<3.0.0,>=2.13.0", "typing-extensions<5.0,>=4.0.0; python_version < \"3.9\"", ] files = [ - {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, - {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, + {file = "rich-13.8.0-py3-none-any.whl", hash = "sha256:2e85306a063b9492dffc86278197a60cbece75bcb766022f3436f567cae11bdc"}, + {file = "rich-13.8.0.tar.gz", hash = "sha256:a5ac1f1cd448ade0d59cc3356f7db7a7ccda2c8cbae9c7a90c28ff463d3e91f4"}, ] [[package]] @@ -2657,6 +2723,7 @@ version = "0.17.0" requires_python = ">=3.10" summary = "geospatial xarray extension powered by rasterio" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy>=1.23", "packaging", @@ -2675,6 +2742,7 @@ version = "0.19.0" requires_python = ">=3.8" summary = "Python bindings to Rust's persistent data structures (rpds)" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "rpds_py-0.19.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5095a7c838a8647c32aa37c3a460d2c48debff7fc26e1136aee60100a8cd8f68"}, {file = "rpds_py-0.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f2f78ef14077e08856e788fa482107aa602636c16c25bdf59c22ea525a785e9"}, @@ -2731,6 +2799,7 @@ version = "0.18.6" requires_python = ">=3.7" summary = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "ruamel-yaml-clib>=0.2.7; platform_python_implementation == \"CPython\" and python_version < \"3.13\"", ] @@ -2745,7 +2814,7 @@ version = "0.2.8" requires_python = ">=3.6" summary = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" groups = ["default"] -marker = "platform_python_implementation == \"CPython\"" +marker = "platform_python_implementation == \"CPython\" and python_full_version == \"3.12.4\"" files = [ {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, @@ -2760,23 +2829,17 @@ files = [ [[package]] name = "scipy" -version = "1.14.0" -requires_python = ">=3.10" +version = "1.13.1" +requires_python = ">=3.9" summary = "Fundamental algorithms for scientific computing in Python" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ - "numpy<2.3,>=1.23.5", + "numpy<2.3,>=1.22.4", ] files = [ - {file = "scipy-1.14.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f"}, - {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209"}, - {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14"}, - {file = "scipy-1.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159"}, - {file = "scipy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20"}, - {file = "scipy-1.14.0.tar.gz", hash = "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b"}, + {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627"}, + {file = "scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c"}, ] [[package]] @@ -2785,6 +2848,7 @@ version = "0.13.2" requires_python = ">=3.8" summary = "Statistical data visualization" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "matplotlib!=3.6.1,>=3.4", "numpy!=1.24.0,>=1.20", @@ -2801,7 +2865,7 @@ version = "3.3.3" requires_python = ">=3.6" summary = "Python bindings to FreeDesktop.org Secret Service API" groups = ["default"] -marker = "sys_platform == \"linux\"" +marker = "sys_platform == \"linux\" and python_full_version == \"3.12.4\"" dependencies = [ "cryptography>=2.0", "jeepney>=0.6", @@ -2817,6 +2881,7 @@ version = "1.8.3" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" summary = "Send file to trash natively under Mac OS X, Windows and Linux" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, @@ -2827,7 +2892,8 @@ name = "setuptools" version = "71.0.4" requires_python = ">=3.8" summary = "Easily download, build, install, upgrade, and uninstall Python packages" -groups = ["default"] +groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "setuptools-71.0.4-py3-none-any.whl", hash = "sha256:ed2feca703be3bdbd94e6bb17365d91c6935c6b2a8d0bb09b66a2c435ba0b1a5"}, {file = "setuptools-71.0.4.tar.gz", hash = "sha256:48297e5d393a62b7cb2a10b8f76c63a73af933bd809c9e0d0d6352a1a0135dd8"}, @@ -2839,6 +2905,7 @@ version = "2.0.5" requires_python = ">=3.7" summary = "Manipulation and analysis of geometric objects" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy<3,>=1.14", ] @@ -2858,6 +2925,7 @@ version = "1.5.4" requires_python = ">=3.7" summary = "Tool to Detect Surrounding Shell" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, @@ -2869,6 +2937,7 @@ version = "1.16.0" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" summary = "Python 2 and 3 compatibility utilities" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -2880,6 +2949,7 @@ version = "5.0.1" requires_python = ">=3.7" summary = "A pure Python implementation of a sliding window memory map manager" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, @@ -2891,6 +2961,7 @@ version = "1.3.1" requires_python = ">=3.7" summary = "Sniff out which async library your code is running under" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -2901,6 +2972,7 @@ name = "snuggs" version = "1.4.7" summary = "Snuggs are s-expressions for Numpy" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy", "pyparsing>=2.1.6", @@ -2916,6 +2988,7 @@ version = "1.0.0" requires_python = ">=3.6" summary = "Sans-I/O implementation of SOCKS4, SOCKS4A, and SOCKS5." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "socksio-1.0.0-py3-none-any.whl", hash = "sha256:95dc1f15f9b34e8d7b16f06d74b8ccf48f609af32ab33c608d08761c5dcbb1f3"}, {file = "socksio-1.0.0.tar.gz", hash = "sha256:f88beb3da5b5c38b9890469de67d0cb0f9d494b78b106ca1845f96c10b91c4ac"}, @@ -2927,6 +3000,7 @@ version = "2.5" requires_python = ">=3.8" summary = "A modern CSS selector implementation for Beautiful Soup." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, @@ -2938,6 +3012,7 @@ version = "2.3.1.1" requires_python = ">=3.8" summary = "Sphinx objects.inv Inspection/Manipulation Tool" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "attrs>=19.2", "certifi", @@ -2953,6 +3028,7 @@ name = "stack-data" version = "0.6.3" summary = "Extract data from python stack frames and tracebacks for informative displays" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "asttokens>=2.1.0", "executing>=1.2.0", @@ -2969,6 +3045,7 @@ version = "1.1.1" requires_python = ">=3.6,<4.0" summary = "Simple and safe python wrapper for calling system rsync" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "toml<0.11.0,>=0.10.0", ] @@ -2983,6 +3060,7 @@ version = "0.9.0" requires_python = ">=3.7" summary = "Pretty-print tabular data" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, @@ -2994,6 +3072,7 @@ version = "2.4.0" requires_python = ">=3.8" summary = "ANSI color formatting for output in terminal" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, @@ -3005,6 +3084,7 @@ version = "0.18.1" requires_python = ">=3.8" summary = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "ptyprocess; os_name != \"nt\"", "pywinpty>=1.1.0; os_name == \"nt\"", @@ -3021,6 +3101,7 @@ version = "1.3.0" requires_python = ">=3.8" summary = "A tiny CSS parser" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "webencodings>=0.4", ] @@ -3035,6 +3116,7 @@ version = "0.10.2" requires_python = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" summary = "Python Library for Tom's Obvious, Minimal Language" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -3046,6 +3128,7 @@ version = "0.13.0" requires_python = ">=3.8" summary = "Style preserving TOML library" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "tomlkit-0.13.0-py3-none-any.whl", hash = "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264"}, {file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"}, @@ -3057,6 +3140,7 @@ version = "0.12.1" requires_python = ">=3.7" summary = "List processing tools and functional utilities" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, @@ -3068,6 +3152,7 @@ version = "6.4.1" requires_python = ">=3.8" summary = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, @@ -3084,16 +3169,17 @@ files = [ [[package]] name = "tqdm" -version = "4.66.4" +version = "4.66.5" requires_python = ">=3.7" summary = "Fast, Extensible Progress Meter" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "colorama; platform_system == \"Windows\"", ] files = [ - {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, - {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, ] [[package]] @@ -3102,6 +3188,7 @@ version = "5.14.3" requires_python = ">=3.8" summary = "Traitlets Python configuration system" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -3113,6 +3200,7 @@ version = "0.9.1" requires_python = ">=3.10" summary = "Verify certificates using native system trust stores" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "truststore-0.9.1-py3-none-any.whl", hash = "sha256:7f5b447d68318d966428131fc1c00442cca3a2d581a3986143558f007efba0b4"}, {file = "truststore-0.9.1.tar.gz", hash = "sha256:8f7312d70cc33e9003b748a80a04ead1fcb2ed856a7c6c9ca5a02482901a90be"}, @@ -3120,10 +3208,11 @@ files = [ [[package]] name = "typer" -version = "0.12.3" +version = "0.12.5" requires_python = ">=3.7" summary = "Typer, build great CLIs. Easy to code. Based on Python type hints." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "click>=8.0.0", "rich>=10.11.0", @@ -3131,8 +3220,8 @@ dependencies = [ "typing-extensions>=3.7.4.3", ] files = [ - {file = "typer-0.12.3-py3-none-any.whl", hash = "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914"}, - {file = "typer-0.12.3.tar.gz", hash = "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482"}, + {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"}, + {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"}, ] [[package]] @@ -3141,6 +3230,7 @@ version = "2.9.0.20240316" requires_python = ">=3.8" summary = "Typing stubs for python-dateutil" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, @@ -3152,6 +3242,7 @@ version = "4.12.2" requires_python = ">=3.8" summary = "Backported and Experimental Type Hints for Python 3.8+" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -3163,6 +3254,7 @@ version = "2024.1" requires_python = ">=2" summary = "Provider of IANA time zone data" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, @@ -3170,17 +3262,18 @@ files = [ [[package]] name = "unearth" -version = "0.16.1" +version = "0.17.2" requires_python = ">=3.8" summary = "A utility to fetch and download python packages" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "httpx<1,>=0.27.0", "packaging>=20", ] files = [ - {file = "unearth-0.16.1-py3-none-any.whl", hash = "sha256:5a598ac1a3f185144fadc9de47f1043bff805c36118ffc40f81ef98ff22e8e37"}, - {file = "unearth-0.16.1.tar.gz", hash = "sha256:988a43418fa0b78aeb628a15f6a3b02152c1787f63fe6d254c7f4e2ccf8db0a7"}, + {file = "unearth-0.17.2-py3-none-any.whl", hash = "sha256:4d21af1238a583835fca156322f7225382e718cdcc42d6278050a88e605c4ad5"}, + {file = "unearth-0.17.2.tar.gz", hash = "sha256:0b8a2afd3476f1ab6155fc579501ac47fffe43547d88a70e5a5b76a7fe6caa2c"}, ] [[package]] @@ -3189,6 +3282,7 @@ version = "1.3.0" requires_python = ">=3.7" summary = "RFC 6570 URI Template Processor" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, @@ -3200,6 +3294,7 @@ version = "1.26.19" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" summary = "HTTP library with thread-safe connection pooling, file post, and more." groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "urllib3-1.26.19-py2.py3-none-any.whl", hash = "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3"}, {file = "urllib3-1.26.19.tar.gz", hash = "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429"}, @@ -3211,6 +3306,7 @@ version = "20.26.3" requires_python = ">=3.7" summary = "Virtual Python Environment builder" groups = ["default", "dev"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "distlib<1,>=0.3.7", "filelock<4,>=3.12.2", @@ -3228,6 +3324,7 @@ version = "4.0.1" requires_python = ">=3.8" summary = "Filesystem events monitoring" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, @@ -3256,6 +3353,7 @@ name = "wcwidth" version = "0.2.13" summary = "Measures the displayed width of unicode strings in a terminal" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "backports-functools-lru-cache>=1.2.1; python_version < \"3.2\"", ] @@ -3270,6 +3368,7 @@ version = "24.6.0" requires_python = ">=3.8" summary = "A library for working with the color formats defined by HTML and CSS." groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "webcolors-24.6.0-py3-none-any.whl", hash = "sha256:8cf5bc7e28defd1d48b9e83d5fc30741328305a8195c29a8e668fa45586568a1"}, {file = "webcolors-24.6.0.tar.gz", hash = "sha256:1d160d1de46b3e81e58d0a280d0c78b467dc80f47294b91b1ad8029d2cedb55b"}, @@ -3280,6 +3379,7 @@ name = "webencodings" version = "0.5.1" summary = "Character encoding aliases for legacy web content" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, @@ -3291,6 +3391,7 @@ version = "1.8.0" requires_python = ">=3.8" summary = "WebSocket client for Python with low level API options" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, @@ -3302,6 +3403,7 @@ version = "2024.6.0" requires_python = ">=3.9" summary = "N-D labeled arrays and datasets in Python" groups = ["default"] +marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy>=1.23", "packaging>=23.1", @@ -3318,6 +3420,7 @@ version = "3.19.2" requires_python = ">=3.8" summary = "Backport of pathlib-compatible object wrapper for zip files" groups = ["dev"] +marker = "python_full_version == \"3.12.4\"" files = [ {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, diff --git a/python/pyproject.toml b/python/pyproject.toml index 996dc986..f2024ed4 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -22,12 +22,12 @@ license = {text = "MIT"} requires-python = "==3.12.*" dependencies = [ "tqdm>=4.66.4", - "scipy<2.0.0,>=1.12.0", + "scipy<1.14", "rioxarray<1.0.0,>=0.15.1", "rasterio<2.0.0,>=1.3.9", "python-dateutil<3.0.0,>=2.8.2", "jupyterlab<5.0.0,>=4.1.2", - "matplotlib>=3.8.3", + "matplotlib<3.9", "geopandas>=0.14.3", "openpyxl>=3.1.2", "gdal==3.8.5", From fde3e39da832c854c22fe46ceaac8e28d879c6bc Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 3 Sep 2024 21:27:19 +0100 Subject: [PATCH 67/92] fix: `numpy` and `rasterio` versions for `jupyter` `docker` and update `docs` --- compose/jupyter/Dockerfile | 30 +- python/pdm.lock | 928 ++++++++++++++----------------------- python/pyproject.toml | 6 +- setup-instructions.md | 58 ++- 4 files changed, 403 insertions(+), 619 deletions(-) diff --git a/compose/jupyter/Dockerfile b/compose/jupyter/Dockerfile index 2f6e565d..8a3a93c2 100644 --- a/compose/jupyter/Dockerfile +++ b/compose/jupyter/Dockerfile @@ -9,25 +9,11 @@ ARG HOST_DATA_PATH=/Volumes/vmfileshare # The local_data_path is an absolute path to mount ClimateData within `docker` ARG DOCKER_DATA_PATH=/mnt/vmfileshare -USER ${NB_UID} -COPY --chown=$NB_USER:$NB_USER conda-lock.yml /tmp/conda-lock.yml - -RUN conda install -y conda-lock - -RUN \ - conda-lock install --copy -n ${env_name} /tmp/conda-lock.yml && \ - conda clean --all -y && \ - fix-permissions "${CONDA_DIR}" && \ - fix-permissions "/home/${NB_USER}" - -# Note the below originally was run just prior to `conda clean` -# but may no longer be needed -# conda run -n ${env_name} python -m ipykernel install --user --name ${env_name} && \ # Needed for write permission USER root -# build-essential is needed for pysqlite3 and gdal +# Build-essential for gdal and potentially packages like scipy RUN sudo apt-get update && sudo apt-get install -y build-essential # First line changes a startup hook, which will activate the custom environment @@ -39,15 +25,13 @@ RUN chown -R ${NB_USER}:${NB_GID} /home/${NB_USER} USER ${NB_UID} -# pysqlite3 may no longer be included in the jupyter stack -# adding to fix, worth checking if necessary in future -# RUN conda update -n ${env_name} -y --all && \ -# conda install -n ${env_name} -y pysqlite3 -# RUN conda install -n ${env_name} -y pysqlite3 +RUN conda create -n ${env_name} +# Todo: either return to an update to environment.yml or document this +RUN conda install -n ${env_name} -y gdal=3.8.5 pdm rsync # This makes the custom environment default in Jupyter Terminals for already existing NB_USER # Note this *doesn't* apply if simply using sh -c RUN echo conda activate "${env_name}" >> "/home/${NB_USER}/.bashrc" -# RUN echo export activate "${env_name}" >> "/home/${NB_USER}/.bashrc" -# RUN export _PYPROJECT_HOOKS_BUILD_BACKEND=/home/${NB_USER}/.local/bin/pdm -# RUN cd python && conda run -n ${env_name} pdm install -v + +# Install dependencies +RUN cd python && conda run -n ${env_name} pdm install diff --git a/python/pdm.lock b/python/pdm.lock index 3e3e17d2..434f1d4f 100644 --- a/python/pdm.lock +++ b/python/pdm.lock @@ -5,13 +5,10 @@ groups = ["default", "dev"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:a791bb55d90fb8dcbba5e8c629aafba2f6010acb5d675f791bf23b218f1e9a19" +content_hash = "sha256:9d8cc63d68a52e6ede993eaff96c9864e0f6114c7650cc6ed657197471820e33" [[metadata.targets]] -requires_python = "==3.12.4" -platform = "manylinux_2_39_aarch64" -implementation = "cpython" -gil_disabled = false +requires_python = "==3.12.*" [[package]] name = "affine" @@ -19,7 +16,6 @@ version = "2.4.0" requires_python = ">=3.7" summary = "Matrices describing affine transformation of the plane" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "affine-2.4.0-py3-none-any.whl", hash = "sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92"}, {file = "affine-2.4.0.tar.gz", hash = "sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea"}, @@ -31,7 +27,6 @@ version = "0.7.0" requires_python = ">=3.8" summary = "Reusable constraint types to use with typing.Annotated" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "typing-extensions>=4.0.0; python_version < \"3.9\"", ] @@ -46,7 +41,6 @@ version = "4.4.0" requires_python = ">=3.8" summary = "High level compatibility layer for multiple asynchronous event loop implementations" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "exceptiongroup>=1.0.2; python_version < \"3.11\"", "idna>=2.8", @@ -63,19 +57,29 @@ name = "appdirs" version = "1.4.4" summary = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, ] +[[package]] +name = "appnope" +version = "0.1.4" +requires_python = ">=3.6" +summary = "Disable App Nap on macOS >= 10.9" +groups = ["default"] +marker = "platform_system == \"Darwin\"" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + [[package]] name = "argon2-cffi" version = "23.1.0" requires_python = ">=3.7" summary = "Argon2 for Python" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "argon2-cffi-bindings", "typing-extensions; python_version < \"3.8\"", @@ -91,7 +95,6 @@ version = "21.2.0" requires_python = ">=3.6" summary = "Low-level CFFI bindings for Argon2" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "cffi>=1.0.1", ] @@ -107,16 +110,6 @@ files = [ {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, ] [[package]] @@ -125,7 +118,6 @@ version = "1.3.0" requires_python = ">=3.8" summary = "Better dates & times for Python" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "python-dateutil>=2.7.0", "types-python-dateutil>=2.8.10", @@ -140,7 +132,6 @@ name = "asttokens" version = "2.4.1" summary = "Annotate AST trees with source code positions" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "six>=1.12.0", "typing; python_version < \"3.5\"", @@ -156,7 +147,6 @@ version = "2.0.4" requires_python = ">=3.8" summary = "Simple LRU cache for asyncio" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "typing-extensions>=4.0.0; python_version < \"3.11\"", ] @@ -167,32 +157,30 @@ files = [ [[package]] name = "attrs" -version = "23.2.0" +version = "24.2.0" requires_python = ">=3.7" summary = "Classes Without Boilerplate" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "importlib-metadata; python_version < \"3.8\"", ] files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [[package]] name = "babel" -version = "2.15.0" +version = "2.16.0" requires_python = ">=3.8" summary = "Internationalization utilities" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "pytz>=2015.7; python_version < \"3.9\"", ] files = [ - {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, - {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] [[package]] @@ -201,7 +189,7 @@ version = "0.18.5" requires_python = ">=3.8.0" summary = "Unbearably fast runtime type checking in pure Python." groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" +marker = "python_version >= \"3.10\"" files = [ {file = "beartype-0.18.5-py3-none-any.whl", hash = "sha256:5301a14f2a9a5540fe47ec6d34d758e9cd8331d36c4760fc7a5499ab86310089"}, {file = "beartype-0.18.5.tar.gz", hash = "sha256:264ddc2f1da9ec94ff639141fbe33d22e12a9f75aa863b83b7046ffff1381927"}, @@ -213,7 +201,6 @@ version = "4.12.3" requires_python = ">=3.6.0" summary = "Screen-scraping library" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "soupsieve>1.2", ] @@ -228,7 +215,6 @@ version = "6.1.0" requires_python = ">=3.8" summary = "An easy safelist-based HTML-sanitizing tool." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "six>=1.9.0", "webencodings", @@ -244,7 +230,6 @@ version = "1.8.2" requires_python = ">=3.8" summary = "Fast, simple object-to-object and broadcast signaling" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "blinker-1.8.2-py3-none-any.whl", hash = "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01"}, {file = "blinker-1.8.2.tar.gz", hash = "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83"}, @@ -256,7 +241,6 @@ version = "0.14.0" requires_python = ">=3.7" summary = "httplib2 caching for requests" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "msgpack<2.0.0,>=0.5.2", "requests>=2.16.0", @@ -273,7 +257,6 @@ extras = ["filecache"] requires_python = ">=3.7" summary = "httplib2 caching for requests" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "cachecontrol==0.14.0", "filelock>=3.8.0", @@ -289,7 +272,6 @@ version = "0.3.0" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "Cachy provides a simple yet effective caching library." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, @@ -297,38 +279,37 @@ files = [ [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.0" requires_python = ">=3.8" summary = "Foreign Function Interface for Python calling C code." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "pycparser", ] files = [ - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, + {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, + {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, + {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, ] [[package]] @@ -337,7 +318,6 @@ version = "3.4.0" requires_python = ">=3.8" summary = "Validate configuration and produce human readable error messages." groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -349,7 +329,6 @@ version = "1.6.4" requires_python = ">=3.8" summary = "Time-handling functionality from netcdf4-python" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy>1.13.3; python_version < \"3.12.0.rc1\"", "numpy>=1.26.0b1; python_version >= \"3.12.0.rc1\"", @@ -370,7 +349,6 @@ version = "3.3.2" requires_python = ">=3.7.0" summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, @@ -397,7 +375,6 @@ version = "8.1.7" requires_python = ">=3.7" summary = "Composable command line interface toolkit" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "colorama; platform_system == \"Windows\"", "importlib-metadata; python_version < \"3.8\"", @@ -413,7 +390,6 @@ version = "1.2.4" requires_python = ">=2.7" summary = "click_default_group" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "click", ] @@ -427,7 +403,6 @@ name = "click-plugins" version = "1.1.1" summary = "An extension module for click to enable registering CLI commands via setuptools entry-points." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "click>=4.0", ] @@ -442,7 +417,6 @@ version = "0.7.2" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" summary = "Click params for commmand line interfaces to GeoJSON" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "click>=4.0", ] @@ -457,7 +431,6 @@ version = "0.6.2" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "CliKit is a group of utilities to build beautiful and testable command line interfaces." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "crashtest<0.4.0,>=0.3.0; python_version ~= \"3.6\"", "enum34<2.0,>=1.1; python_version >= \"2.7\" and python_version < \"2.8\"", @@ -476,8 +449,7 @@ name = "colorama" version = "0.4.6" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Cross-platform colored terminal text." -groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" +groups = ["default", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -489,7 +461,6 @@ version = "0.2.2" requires_python = ">=3.8" summary = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "traitlets>=4", ] @@ -504,7 +475,6 @@ version = "2.5.7" requires_python = ">=3.8" summary = "Lockfiles for conda" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "cachecontrol[filecache]>=0.12.9", "cachy>=0.3.0", @@ -538,51 +508,45 @@ files = [ [[package]] name = "contourpy" -version = "1.2.1" +version = "1.3.0" requires_python = ">=3.9" summary = "Python library for calculating contours of 2D quadrilateral grids" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ - "numpy>=1.20", + "numpy>=1.23", ] files = [ - {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, - {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, - {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, - {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, - {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, - {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, - {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, + {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, + {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, + {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, ] [[package]] name = "coverage" -version = "7.6.0" +version = "7.6.1" requires_python = ">=3.8" summary = "Code coverage measurement for Python" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, - {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, - {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, - {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, - {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, - {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] [[package]] @@ -590,7 +554,6 @@ name = "coverage-badge" version = "1.1.2" summary = "Generate coverage badges for Coverage.py." groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "coverage", "setuptools", @@ -602,29 +565,27 @@ files = [ [[package]] name = "coverage" -version = "7.6.0" +version = "7.6.1" extras = ["toml"] requires_python = ">=3.8" summary = "Code coverage measurement for Python" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ - "coverage==7.6.0", + "coverage==7.6.1", "tomli; python_full_version <= \"3.11.0a6\"", ] files = [ - {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, - {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, - {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, - {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, - {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, - {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] [[package]] @@ -633,7 +594,6 @@ version = "0.3.1" requires_python = ">=3.6,<4.0" summary = "Manage Python errors with ease" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, @@ -645,15 +605,29 @@ version = "43.0.0" requires_python = ">=3.7" summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." groups = ["default"] -marker = "sys_platform == \"linux\" and python_full_version == \"3.12.4\"" +marker = "sys_platform == \"linux\"" dependencies = [ "cffi>=1.12; platform_python_implementation != \"PyPy\"", ] files = [ + {file = "cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74"}, {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22"}, {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431"}, + {file = "cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc"}, + {file = "cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778"}, + {file = "cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66"}, {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e"}, {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b"}, + {file = "cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf"}, + {file = "cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709"}, {file = "cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e"}, ] @@ -663,7 +637,6 @@ version = "0.12.1" requires_python = ">=3.8" summary = "Composable style cycles" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -671,18 +644,17 @@ files = [ [[package]] name = "debugpy" -version = "1.8.2" +version = "1.8.5" requires_python = ">=3.8" summary = "An implementation of the Debug Adapter Protocol for Python" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "debugpy-1.8.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835"}, - {file = "debugpy-1.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3"}, - {file = "debugpy-1.8.2-cp312-cp312-win32.whl", hash = "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e"}, - {file = "debugpy-1.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859"}, - {file = "debugpy-1.8.2-py2.py3-none-any.whl", hash = "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca"}, - {file = "debugpy-1.8.2.zip", hash = "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00"}, + {file = "debugpy-1.8.5-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:5b5c770977c8ec6c40c60d6f58cacc7f7fe5a45960363d6974ddb9b62dbee156"}, + {file = "debugpy-1.8.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a65b00b7cdd2ee0c2cf4c7335fef31e15f1b7056c7fdbce9e90193e1a8c8cb"}, + {file = "debugpy-1.8.5-cp312-cp312-win32.whl", hash = "sha256:c9f7c15ea1da18d2fcc2709e9f3d6de98b69a5b0fff1807fb80bc55f906691f7"}, + {file = "debugpy-1.8.5-cp312-cp312-win_amd64.whl", hash = "sha256:28ced650c974aaf179231668a293ecd5c63c0a671ae6d56b8795ecc5d2f48d3c"}, + {file = "debugpy-1.8.5-py2.py3-none-any.whl", hash = "sha256:55919dce65b471eff25901acf82d328bbd5b833526b6c1364bd5133754777a44"}, + {file = "debugpy-1.8.5.zip", hash = "sha256:b2112cfeb34b4507399d298fe7023a16656fc553ed5246536060ca7bd0e668d0"}, ] [[package]] @@ -691,7 +663,6 @@ version = "5.1.1" requires_python = ">=3.5" summary = "Decorators for Humans" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -703,7 +674,6 @@ version = "0.7.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "XML bomb protection for Python stdlib modules" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, @@ -715,7 +685,6 @@ version = "0.4.4" requires_python = ">=3.8" summary = "Python dependency specifications supporting logical operations" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "packaging>=22", ] @@ -730,7 +699,6 @@ version = "0.3.8" requires_python = ">=3.8" summary = "serialize all of Python" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, @@ -741,7 +709,6 @@ name = "distlib" version = "0.3.8" summary = "Distribution utilities" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, @@ -753,7 +720,6 @@ version = "1.4.4" requires_python = ">=3.7" summary = "Lightweight bootstrapper for a conda executable" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "appdirs", "click>=5.1", @@ -772,7 +738,6 @@ version = "1.1.0" requires_python = ">=3.6" summary = "An implementation of lxml.xmlfile for the standard library" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, @@ -784,7 +749,6 @@ version = "2.1.1" requires_python = ">=3.8" summary = "execnet: rapid multi-Python deployment" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -792,14 +756,13 @@ files = [ [[package]] name = "executing" -version = "2.0.1" -requires_python = ">=3.5" +version = "2.1.0" +requires_python = ">=3.8" summary = "Get the currently executing AST node of a frame, and other information" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, ] [[package]] @@ -807,7 +770,6 @@ name = "fastjsonschema" version = "2.20.0" summary = "Fastest Python implementation of JSON schema" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, @@ -819,7 +781,6 @@ version = "3.15.4" requires_python = ">=3.8" summary = "A platform independent file lock." groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, @@ -831,7 +792,6 @@ version = "0.6.1" requires_python = ">=3.8" summary = "A utility to find python versions on your system" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "packaging>=20", ] @@ -846,7 +806,6 @@ version = "4.53.1" requires_python = ">=3.8" summary = "Tools to manipulate font files" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, @@ -866,7 +825,6 @@ version = "1.5.1" requires_python = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" summary = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "cached-property>=1.3.0; python_version < \"3.8\"", ] @@ -881,7 +839,6 @@ version = "3.8.5" requires_python = ">=3.6.0" summary = "GDAL: Geospatial Data Abstraction Library" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "GDAL-3.8.5.tar.gz", hash = "sha256:ad8addd58ba9c62aefc7f65d345c168736798f137e5c8f247af76fcf4862d371"}, ] @@ -892,7 +849,6 @@ version = "1.0.1" requires_python = ">=3.9" summary = "Geographic pandas extensions" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy>=1.22", "packaging", @@ -912,7 +868,6 @@ version = "4.0.11" requires_python = ">=3.7" summary = "Git Object Database" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "smmap<6,>=3.0.1", ] @@ -927,7 +882,6 @@ version = "3.1.43" requires_python = ">=3.7" summary = "GitPython is a Python library used to interact with Git repositories" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "gitdb<5,>=4.0.1", "typing-extensions>=3.7.4.3; python_version < \"3.8\"", @@ -939,19 +893,17 @@ files = [ [[package]] name = "griffe" -version = "0.48.0" +version = "1.2.0" requires_python = ">=3.8" summary = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "astunparse>=1.6; python_version < \"3.9\"", - "backports-strenum>=1.3; python_version < \"3.11\"", "colorama>=0.4", ] files = [ - {file = "griffe-0.48.0-py3-none-any.whl", hash = "sha256:f944c6ff7bd31cf76f264adcd6ab8f3d00a2f972ae5cc8db2d7b6dcffeff65a2"}, - {file = "griffe-0.48.0.tar.gz", hash = "sha256:f099461c02f016b6be4af386d5aa92b01fb4efe6c1c2c360dda9a5d0a863bb7f"}, + {file = "griffe-1.2.0-py3-none-any.whl", hash = "sha256:a8b2fcb1ecdc5a412e646b0b4375eb20a5d2eac3a11dd8c10c56967a4097663c"}, + {file = "griffe-1.2.0.tar.gz", hash = "sha256:1c9f6ef7455930f3f9b0c4145a961c90385d1e2cbc496f7796fbff560ec60d31"}, ] [[package]] @@ -960,7 +912,6 @@ version = "0.14.0" requires_python = ">=3.7" summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "typing-extensions; python_version < \"3.8\"", ] @@ -975,7 +926,6 @@ version = "0.0.30" requires_python = ">=3.8" summary = "Persistent cache implementation for httpx and httpcore" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "httpx>=0.22.0", "typing-extensions>=4.8.0", @@ -991,7 +941,6 @@ version = "1.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "HTML parser based on the WHATWG HTML specification" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "six>=1.9", "webencodings", @@ -1007,7 +956,6 @@ version = "1.0.5" requires_python = ">=3.8" summary = "A minimal low-level HTTP client." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "certifi", "h11<0.15,>=0.13", @@ -1019,11 +967,10 @@ files = [ [[package]] name = "httpx" -version = "0.27.0" +version = "0.27.2" requires_python = ">=3.8" summary = "The next generation HTTP client." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "anyio", "certifi", @@ -1032,25 +979,24 @@ dependencies = [ "sniffio", ] files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, + {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, + {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, ] [[package]] name = "httpx" -version = "0.27.0" +version = "0.27.2" extras = ["socks"] requires_python = ">=3.8" summary = "The next generation HTTP client." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ - "httpx==0.27.0", + "httpx==0.27.2", "socksio==1.*", ] files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, + {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, + {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, ] [[package]] @@ -1059,7 +1005,6 @@ version = "2.6.0" requires_python = ">=3.8" summary = "File identification library for Python" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, @@ -1067,45 +1012,42 @@ files = [ [[package]] name = "idna" -version = "3.7" -requires_python = ">=3.5" +version = "3.8" +requires_python = ">=3.6" summary = "Internationalized Domain Names in Applications (IDNA)" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, + {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, ] [[package]] name = "importlib-metadata" -version = "8.0.0" +version = "8.4.0" requires_python = ">=3.8" summary = "Read metadata from Python packages" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "typing-extensions>=3.6.4; python_version < \"3.8\"", "zipp>=0.5", ] files = [ - {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, - {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, + {file = "importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1"}, + {file = "importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5"}, ] [[package]] name = "importlib-resources" -version = "6.4.0" +version = "6.4.4" requires_python = ">=3.8" summary = "Read resources from Python packages" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "zipp>=3.1.0; python_version < \"3.10\"", ] files = [ - {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, - {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, + {file = "importlib_resources-6.4.4-py3-none-any.whl", hash = "sha256:dda242603d1c9cd836c3368b1174ed74cb4049ecd209e7a1a0104620c18c5c11"}, + {file = "importlib_resources-6.4.4.tar.gz", hash = "sha256:20600c8b7361938dc0bb2d5ec0297802e575df486f5a544fa414da65e13721f7"}, ] [[package]] @@ -1114,7 +1056,6 @@ version = "2.0.0" requires_python = ">=3.7" summary = "brain-dead simple config-ini parsing" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -1126,7 +1067,6 @@ version = "0.7.0" requires_python = ">=3.7" summary = "A library for installing Python wheels." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53"}, {file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"}, @@ -1138,7 +1078,6 @@ version = "6.29.5" requires_python = ">=3.8" summary = "IPython Kernel for Jupyter" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "appnope; platform_system == \"Darwin\"", "comm>=0.1.1", @@ -1161,11 +1100,10 @@ files = [ [[package]] name = "ipython" -version = "8.26.0" +version = "8.27.0" requires_python = ">=3.10" summary = "IPython: Productive Interactive Computing" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "colorama; sys_platform == \"win32\"", "decorator", @@ -1180,8 +1118,8 @@ dependencies = [ "typing-extensions>=4.6; python_version < \"3.12\"", ] files = [ - {file = "ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff"}, - {file = "ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c"}, + {file = "ipython-8.27.0-py3-none-any.whl", hash = "sha256:f68b3cb8bde357a5d7adc9598d57e22a45dfbea19eb6b98286fa3b288c9cd55c"}, + {file = "ipython-8.27.0.tar.gz", hash = "sha256:0b99a2dc9f15fd68692e898e5568725c6d49c527d36a9fb5960ffbdeaa82ff7e"}, ] [[package]] @@ -1190,7 +1128,6 @@ version = "20.11.0" requires_python = ">=3.7" summary = "Operations with ISO 8601 durations" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "arrow>=0.15.0", ] @@ -1205,7 +1142,6 @@ version = "3.4.0" requires_python = ">=3.8" summary = "Utility functions for Python class constructs" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "more-itertools", ] @@ -1216,32 +1152,30 @@ files = [ [[package]] name = "jaraco-context" -version = "5.3.0" +version = "6.0.1" requires_python = ">=3.8" summary = "Useful decorators and context managers" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "backports-tarfile; python_version < \"3.12\"", ] files = [ - {file = "jaraco.context-5.3.0-py3-none-any.whl", hash = "sha256:3e16388f7da43d384a1a7cd3452e72e14732ac9fe459678773a3608a812bf266"}, - {file = "jaraco.context-5.3.0.tar.gz", hash = "sha256:c2f67165ce1f9be20f32f650f25d8edfc1646a8aeee48ae06fb35f90763576d2"}, + {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, + {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, ] [[package]] name = "jaraco-functools" -version = "4.0.1" +version = "4.0.2" requires_python = ">=3.8" summary = "Functools like those found in stdlib" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "more-itertools", ] files = [ - {file = "jaraco.functools-4.0.1-py3-none-any.whl", hash = "sha256:3b24ccb921d6b593bdceb56ce14799204f473976e2a9d4b15b04d0f2c2326664"}, - {file = "jaraco_functools-4.0.1.tar.gz", hash = "sha256:d33fa765374c0611b52f8b3a795f8900869aa88c84769d4d1746cd68fb28c3e8"}, + {file = "jaraco.functools-4.0.2-py3-none-any.whl", hash = "sha256:c9d16a3ed4ccb5a889ad8e0b7a343401ee5b2a71cee6ed192d3f68bc351e94e3"}, + {file = "jaraco_functools-4.0.2.tar.gz", hash = "sha256:3460c74cd0d32bf82b9576bbb3527c4364d5b27a21f5158a62aed6c4b42e23f5"}, ] [[package]] @@ -1250,7 +1184,6 @@ version = "0.19.1" requires_python = ">=3.6" summary = "An autocompletion tool for Python that can be used for text editors." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "parso<0.9.0,>=0.8.3", ] @@ -1265,7 +1198,7 @@ version = "0.8.0" requires_python = ">=3.7" summary = "Low-level, pure Python DBus protocol wrapper." groups = ["default"] -marker = "sys_platform == \"linux\" and python_full_version == \"3.12.4\"" +marker = "sys_platform == \"linux\"" files = [ {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, @@ -1277,7 +1210,6 @@ version = "3.1.4" requires_python = ">=3.7" summary = "A very fast and expressive template engine." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "MarkupSafe>=2.0", ] @@ -1292,7 +1224,6 @@ version = "0.9.25" requires_python = ">=3.8" summary = "A Python implementation of the JSON5 data format." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, @@ -1304,7 +1235,6 @@ version = "3.0.0" requires_python = ">=3.7" summary = "Identify specific nodes in a JSON document (RFC 6901) " groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -1316,7 +1246,6 @@ version = "4.23.0" requires_python = ">=3.8" summary = "An implementation of JSON Schema validation for Python" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "attrs>=22.2.0", "importlib-resources>=1.4.0; python_version < \"3.9\"", @@ -1336,7 +1265,6 @@ version = "2023.12.1" requires_python = ">=3.8" summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "importlib-resources>=1.4.0; python_version < \"3.9\"", "referencing>=0.31.0", @@ -1353,7 +1281,6 @@ extras = ["format-nongpl"] requires_python = ">=3.8" summary = "An implementation of JSON Schema validation for Python" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "fqdn", "idna", @@ -1376,7 +1303,6 @@ version = "8.6.2" requires_python = ">=3.8" summary = "Jupyter protocol implementation and client libraries" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "importlib-metadata>=4.8.3; python_version < \"3.10\"", "jupyter-core!=5.0.*,>=4.12", @@ -1396,7 +1322,6 @@ version = "5.7.2" requires_python = ">=3.8" summary = "Jupyter core package. A base package on which Jupyter projects rely." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "platformdirs>=2.5", "pywin32>=300; sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"", @@ -1413,7 +1338,6 @@ version = "0.10.0" requires_python = ">=3.8" summary = "Jupyter Event System library" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "jsonschema[format-nongpl]>=4.18.0", "python-json-logger>=2.0.4", @@ -1434,7 +1358,6 @@ version = "2.2.5" requires_python = ">=3.8" summary = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "importlib-metadata>=4.8.3; python_version < \"3.10\"", "jupyter-server>=1.1.2", @@ -1450,7 +1373,6 @@ version = "2.14.2" requires_python = ">=3.8" summary = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "anyio>=3.1.0", "argon2-cffi>=21.1", @@ -1483,7 +1405,6 @@ version = "0.5.3" requires_python = ">=3.8" summary = "A Jupyter Server Extension Providing Terminals." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "pywinpty>=2.0.3; os_name == \"nt\"", "terminado>=0.8.3", @@ -1499,7 +1420,6 @@ version = "4.2.5" requires_python = ">=3.8" summary = "JupyterLab computational environment" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "async-lru>=1.0.0", "httpx>=0.25.0", @@ -1529,7 +1449,6 @@ version = "0.3.0" requires_python = ">=3.8" summary = "Pygments theme using JupyterLab CSS variables" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, @@ -1541,7 +1460,6 @@ version = "2.27.3" requires_python = ">=3.8" summary = "A set of server components for JupyterLab and JupyterLab like applications." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "babel>=2.10", "importlib-metadata>=4.8.3; python_version < \"3.10\"", @@ -1559,11 +1477,10 @@ files = [ [[package]] name = "keyring" -version = "25.2.1" +version = "25.3.0" requires_python = ">=3.8" summary = "Store and access your passwords safely." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "SecretStorage>=3.2; sys_platform == \"linux\"", "importlib-metadata>=4.11.4; python_version < \"3.12\"", @@ -1575,52 +1492,34 @@ dependencies = [ "pywin32-ctypes>=0.2.0; sys_platform == \"win32\"", ] files = [ - {file = "keyring-25.2.1-py3-none-any.whl", hash = "sha256:2458681cdefc0dbc0b7eb6cf75d0b98e59f9ad9b2d4edd319d18f68bdca95e50"}, - {file = "keyring-25.2.1.tar.gz", hash = "sha256:daaffd42dbda25ddafb1ad5fec4024e5bbcfe424597ca1ca452b299861e49f1b"}, + {file = "keyring-25.3.0-py3-none-any.whl", hash = "sha256:8d963da00ccdf06e356acd9bf3b743208878751032d8599c6cc89eb51310ffae"}, + {file = "keyring-25.3.0.tar.gz", hash = "sha256:8d85a1ea5d6db8515b59e1c5d1d1678b03cf7fc8b8dcfb1651e8c4a524eb42ef"}, ] [[package]] name = "kiwisolver" -version = "1.4.5" -requires_python = ">=3.7" +version = "1.4.6" +requires_python = ">=3.8" summary = "A fast implementation of the Cassowary constraint solver" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" -dependencies = [ - "typing-extensions; python_version < \"3.8\"", -] files = [ - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, - {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, + {file = "kiwisolver-1.4.6-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:979df7e9334f6a3694ee9be8d42817e519ef6d155a16499714d082cf41296852"}, + {file = "kiwisolver-1.4.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50c9c6c42bb6ca231626d1182b9128e89c5ce3c64456f811ff0280deb42d7bfe"}, + {file = "kiwisolver-1.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ace86489e7951bd26329a589198d3875c3d48380f889c69d3eb254b506a80101"}, + {file = "kiwisolver-1.4.6-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f94771988da902b475f78e85cf63c5c94392773b4a6494234d87c1b363b2fbc5"}, + {file = "kiwisolver-1.4.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62379eee430b1c477bb0a0bf6858a57c7c0dad9cee8b3144a5cb5d366c66a54"}, + {file = "kiwisolver-1.4.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e99b97d69499a7414572c906fbc7ca312519f2e17999730129f6c4492786e953"}, + {file = "kiwisolver-1.4.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab93f58afe3a02922a343189404f24ed885564e6316649790240124b95ef1d6e"}, + {file = "kiwisolver-1.4.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34105f4460ba50fc18a16a8e77a5122f7affe075628763fda748ad0ec534c3ee"}, + {file = "kiwisolver-1.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0081f85f0222620563409d4804c6567a930a45dafbe9674c7913fde131653992"}, + {file = "kiwisolver-1.4.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:df2a4a7cc2e01991e039a792457751b601bdf30143ab5f23f9a1e58f20c875f4"}, + {file = "kiwisolver-1.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1f401784df70ea2870e4e10adade66b5b06cb2c151bc2a8a414a1d10554e9a81"}, + {file = "kiwisolver-1.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:b19761c8c613b6d04c44f1a4797a144b44136f17ec009ccfb025e17b5698140c"}, + {file = "kiwisolver-1.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ee7289430ded484cc2eff9d8ffcce58ed7fe2c26919321dbc0580322a49e0120"}, + {file = "kiwisolver-1.4.6-cp312-cp312-win32.whl", hash = "sha256:331b9d9f408e874ecf34bd79b79df8e099f0b1b351b8844609c1bfdc8d2d45b2"}, + {file = "kiwisolver-1.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:a9be95d086578b3ada61a4621c0e7ee5f456820bfdccc3329061fdeae1e31179"}, + {file = "kiwisolver-1.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:773f2d87825779ab69196dfcf63e9d91043273421c6128c8d4ed82bc6316068f"}, + {file = "kiwisolver-1.4.6.tar.gz", hash = "sha256:3cda29d601445e6aa11f80d90a9b8c2ae501650c55d7ad29829bd44499c9e7e0"}, ] [[package]] @@ -1629,7 +1528,6 @@ version = "3.0.0" requires_python = ">=3.8" summary = "Python port of markdown-it. Markdown parsing, done right!" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "mdurl~=0.1", ] @@ -1644,7 +1542,6 @@ version = "2.1.5" requires_python = ">=3.7" summary = "Safely add untrusted strings to HTML/XML markup." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, @@ -1665,7 +1562,6 @@ version = "3.8.4" requires_python = ">=3.9" summary = "Python plotting package" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "contourpy>=1.0.1", "cycler>=0.10", @@ -1679,7 +1575,12 @@ dependencies = [ "python-dateutil>=2.7", ] files = [ + {file = "matplotlib-3.8.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616"}, + {file = "matplotlib-3.8.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732"}, {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb"}, + {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30"}, + {file = "matplotlib-3.8.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25"}, + {file = "matplotlib-3.8.4-cp312-cp312-win_amd64.whl", hash = "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a"}, {file = "matplotlib-3.8.4.tar.gz", hash = "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea"}, ] @@ -1689,7 +1590,6 @@ version = "0.1.7" requires_python = ">=3.8" summary = "Inline Matplotlib backend for Jupyter" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "traitlets", ] @@ -1704,7 +1604,6 @@ version = "0.1.2" requires_python = ">=3.7" summary = "Markdown URL utilities" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -1716,7 +1615,6 @@ version = "3.0.2" requires_python = ">=3.7" summary = "A sane and fast Markdown parser with useful plugins and renderers" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, @@ -1724,14 +1622,13 @@ files = [ [[package]] name = "more-itertools" -version = "10.3.0" +version = "10.4.0" requires_python = ">=3.8" summary = "More routines for operating on iterables, beyond itertools" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "more-itertools-10.3.0.tar.gz", hash = "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463"}, - {file = "more_itertools-10.3.0-py3-none-any.whl", hash = "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320"}, + {file = "more-itertools-10.4.0.tar.gz", hash = "sha256:fe0e63c4ab068eac62410ab05cccca2dc71ec44ba8ef29916a0090df061cf923"}, + {file = "more_itertools-10.4.0-py3-none-any.whl", hash = "sha256:0f7d9f83a0a8dcfa8a2694a770590d98a67ea943e3d9f5298309a484758c4e27"}, ] [[package]] @@ -1740,7 +1637,6 @@ version = "1.0.8" requires_python = ">=3.8" summary = "MessagePack serializer" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, @@ -1762,7 +1658,6 @@ version = "0.10.0" requires_python = ">=3.8.0" summary = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "jupyter-client>=6.1.12", "jupyter-core!=5.0.*,>=4.12", @@ -1780,7 +1675,6 @@ version = "7.16.4" requires_python = ">=3.8" summary = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "beautifulsoup4", "bleach!=5.0.0", @@ -1810,7 +1704,6 @@ version = "5.10.4" requires_python = ">=3.8" summary = "The Jupyter Notebook format" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "fastjsonschema>=2.15", "jsonschema>=2.6", @@ -1828,7 +1721,6 @@ version = "1.6.0" requires_python = ">=3.5" summary = "Patch asyncio to allow nested event loops" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, @@ -1840,14 +1732,17 @@ version = "1.7.1.post2" requires_python = ">=3.8" summary = "Provides an object-oriented python interface to the netCDF version 4 library" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "certifi", "cftime", "numpy", ] files = [ + {file = "netCDF4-1.7.1.post2-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:658f38ceb74bb127e293a47fa36f949babba0c872cf3091e2fdafa73caacc7e4"}, {file = "netCDF4-1.7.1.post2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5f396f150f97831229e47f449fe6acbca8ff9d08b2166560c46790aa6f11b56b"}, + {file = "netCDF4-1.7.1.post2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d5216369a0a4a868dadb5c4137d854810a309b9f9ef1d16786269fbeb244101"}, + {file = "netCDF4-1.7.1.post2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12f8ab560320e879763b7837d6f8f5eb285195271f47fc5c18362e5b097ee67c"}, + {file = "netCDF4-1.7.1.post2-cp312-cp312-win_amd64.whl", hash = "sha256:2cbca7dcd92075aebe7c242e16f51f20bc5073b6f0f1449394dadc3c17e44b29"}, {file = "netcdf4-1.7.1.post2.tar.gz", hash = "sha256:37d557e36654889d7020192bfb56f9d5f93894cb32997eb837ae586c538fd7b6"}, ] @@ -1857,7 +1752,6 @@ version = "1.9.1" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Node.js virtual environment builder" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -1869,7 +1763,6 @@ version = "0.2.4" requires_python = ">=3.7" summary = "A shim layer for notebook traits and config" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "jupyter-server<3,>=1.8", ] @@ -1880,14 +1773,22 @@ files = [ [[package]] name = "numpy" -version = "1.26.4" -requires_python = ">=3.9" +version = "2.1.1" +requires_python = ">=3.10" summary = "Fundamental package for array computing in Python" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521"}, + {file = "numpy-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b"}, + {file = "numpy-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201"}, + {file = "numpy-2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a"}, + {file = "numpy-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313"}, + {file = "numpy-2.1.1-cp312-cp312-win32.whl", hash = "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed"}, + {file = "numpy-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270"}, + {file = "numpy-2.1.1.tar.gz", hash = "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd"}, ] [[package]] @@ -1896,7 +1797,6 @@ version = "3.1.5" requires_python = ">=3.8" summary = "A Python library to read/write Excel 2010 xlsx/xlsm files" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "et-xmlfile", ] @@ -1911,7 +1811,6 @@ version = "7.7.0" requires_python = ">=3.6" summary = "A decorator to automatically detect mismatch when overriding a method." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "typing; python_version < \"3.5\"", ] @@ -1926,7 +1825,6 @@ version = "24.1" requires_python = ">=3.8" summary = "Core utilities for Python packages" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, @@ -1938,7 +1836,6 @@ version = "2.2.2" requires_python = ">=3.9" summary = "Powerful data structures for data analysis, time series, and statistics" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy>=1.22.4; python_version < \"3.11\"", "numpy>=1.23.2; python_version == \"3.11\"", @@ -1964,7 +1861,6 @@ version = "1.5.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "Utilities for writing pandoc filters in python" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, @@ -1976,7 +1872,6 @@ version = "0.8.4" requires_python = ">=3.6" summary = "A Python Parser" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -1988,7 +1883,6 @@ version = "0.2.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "Bring colors to your terminal." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, @@ -1996,14 +1890,13 @@ files = [ [[package]] name = "pbs-installer" -version = "2024.4.24" +version = "2024.8.14" requires_python = ">=3.8" summary = "Installer for Python Build Standalone" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "pbs_installer-2024.4.24-py3-none-any.whl", hash = "sha256:f8291f0231003d279d0de8fde88fa87b7c6d7fabc2671235113cf67513ff74f5"}, - {file = "pbs_installer-2024.4.24.tar.gz", hash = "sha256:19224733068b0ffa39b53afbb61544bee8ecb9503e7222ba034f07b9913e2c1c"}, + {file = "pbs_installer-2024.8.14-py3-none-any.whl", hash = "sha256:9ec0c1e689fc956823d45952eb0879c303f411d8f9f315b06ef57138cc794285"}, + {file = "pbs_installer-2024.8.14.tar.gz", hash = "sha256:40144b21f04e90c73f1b79601e139d56d540356630fe473842ea439a59dffaee"}, ] [[package]] @@ -2012,7 +1905,6 @@ version = "2.18.1" requires_python = ">=3.8" summary = "A modern Python package and dependency manager supporting the latest PEP standards" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "blinker", "dep-logic>=0.4.4", @@ -2048,7 +1940,7 @@ name = "pexpect" version = "4.9.0" summary = "Pexpect allows easy control of interactive console applications." groups = ["default"] -marker = "(sys_platform != \"win32\" and sys_platform != \"emscripten\") and python_full_version == \"3.12.4\"" +marker = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" dependencies = [ "ptyprocess>=0.5", ] @@ -2063,7 +1955,6 @@ version = "10.4.0" requires_python = ">=3.8" summary = "Python Imaging Library (Fork)" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, @@ -2076,20 +1967,6 @@ files = [ {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] @@ -2099,7 +1976,6 @@ version = "1.11.1" requires_python = ">=3.8" summary = "Query metadata from sdists / bdists / installed packages." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "pkginfo-1.11.1-py3-none-any.whl", hash = "sha256:bfa76a714fdfc18a045fcd684dbfc3816b603d9d075febef17cb6582bea29573"}, {file = "pkginfo-1.11.1.tar.gz", hash = "sha256:2e0dca1cf4c8e39644eed32408ea9966ee15e0d324c62ba899a393b3c6b467aa"}, @@ -2111,7 +1987,6 @@ version = "4.2.2" requires_python = ">=3.8" summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, @@ -2123,7 +1998,6 @@ version = "1.5.0" requires_python = ">=3.8" summary = "plugin and hook calling mechanisms for python" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -2135,7 +2009,7 @@ version = "2.5.2" requires_python = ">=3.8" summary = "Multiple dispatch in Python" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" +marker = "python_version >= \"3.10\"" dependencies = [ "beartype>=0.16.2", "rich>=10.0", @@ -2152,7 +2026,6 @@ version = "3.8.0" requires_python = ">=3.9" summary = "A framework for managing and maintaining multi-language pre-commit hooks." groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "cfgv>=2.0.0", "identify>=1.0.0", @@ -2171,7 +2044,6 @@ version = "0.20.0" requires_python = ">=3.8" summary = "Python client for the Prometheus monitoring system." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, @@ -2183,7 +2055,6 @@ version = "3.0.47" requires_python = ">=3.7.0" summary = "Library for building powerful interactive command lines in Python" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "wcwidth", ] @@ -2198,7 +2069,6 @@ version = "6.0.0" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" summary = "Cross-platform lib for process and system monitoring in Python." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, @@ -2215,7 +2085,7 @@ name = "ptyprocess" version = "0.7.0" summary = "Run a subprocess in a pseudo terminal" groups = ["default"] -marker = "(sys_platform != \"win32\" and sys_platform != \"emscripten\") and python_full_version == \"3.12.4\" or os_name != \"nt\" and python_full_version == \"3.12.4\"" +marker = "sys_platform != \"win32\" and sys_platform != \"emscripten\" or os_name != \"nt\"" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -2223,13 +2093,12 @@ files = [ [[package]] name = "pure-eval" -version = "0.2.2" +version = "0.2.3" summary = "Safely evaluate AST nodes without side effects" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, ] [[package]] @@ -2238,7 +2107,6 @@ version = "2.22" requires_python = ">=3.8" summary = "C parser in Python" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -2250,7 +2118,6 @@ version = "2.8.2" requires_python = ">=3.8" summary = "Data validation using Python type hints" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "annotated-types>=0.4.0", "pydantic-core==2.20.1", @@ -2268,7 +2135,6 @@ version = "2.20.1" requires_python = ">=3.8" summary = "Core functionality for Pydantic validation and serialization" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "typing-extensions!=4.7.0,>=4.6.0", ] @@ -2285,22 +2151,6 @@ files = [ {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, ] @@ -2310,7 +2160,6 @@ version = "2.18.0" requires_python = ">=3.8" summary = "Pygments is a syntax highlighting package written in Python." groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, @@ -2321,7 +2170,6 @@ name = "pylev" version = "1.4.0" summary = "A pure Python Levenshtein implementation that's not freaking GPL'd." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, @@ -2333,7 +2181,6 @@ version = "0.9.0" requires_python = ">=3.8" summary = "Vectorized spatial vector file format I/O using GDAL/OGR" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "certifi", "numpy", @@ -2350,14 +2197,13 @@ files = [ [[package]] name = "pyparsing" -version = "3.1.2" +version = "3.1.4" requires_python = ">=3.6.8" summary = "pyparsing module - Classes and methods to define and execute parsing grammars" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, - {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, + {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, + {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, ] [[package]] @@ -2366,7 +2212,6 @@ version = "3.6.1" requires_python = ">=3.9" summary = "Python interface to PROJ (cartographic projections and coordinate transformations library)" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "certifi", ] @@ -2377,8 +2222,6 @@ files = [ {file = "pyproj-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb059ba3bced6f6725961ba758649261d85ed6ce670d3e3b0a26e81cf1aa8d"}, {file = "pyproj-3.6.1-cp312-cp312-win32.whl", hash = "sha256:2d6ff73cc6dbbce3766b6c0bce70ce070193105d8de17aa2470009463682a8eb"}, {file = "pyproj-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:7a27151ddad8e1439ba70c9b4b2b617b290c39395fa9ddb7411ebb0eb86d6fb0"}, - {file = "pyproj-3.6.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd93c1a0c6c4aedc77c0fe275a9f2aba4d59b8acf88cebfc19fe3c430cfabf4f"}, - {file = "pyproj-3.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6420ea8e7d2a88cb148b124429fba8cd2e0fae700a2d96eab7083c0928a85110"}, {file = "pyproj-3.6.1.tar.gz", hash = "sha256:44aa7c704c2b7d8fb3d483bbf75af6cb2350d30a63b144279a09b75fead501bf"}, ] @@ -2388,7 +2231,6 @@ version = "1.1.0" requires_python = ">=3.7" summary = "Wrappers to call pyproject.toml-based build backend hooks." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "pyproject_hooks-1.1.0-py3-none-any.whl", hash = "sha256:7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2"}, {file = "pyproject_hooks-1.1.0.tar.gz", hash = "sha256:4b37730834edbd6bd37f26ece6b44802fb1c1ee2ece0e54ddff8bfc06db86965"}, @@ -2396,11 +2238,10 @@ files = [ [[package]] name = "pytest" -version = "8.3.1" +version = "8.3.2" requires_python = ">=3.8" summary = "pytest: simple powerful testing with Python" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "colorama; sys_platform == \"win32\"", "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", @@ -2410,8 +2251,8 @@ dependencies = [ "tomli>=1; python_version < \"3.11\"", ] files = [ - {file = "pytest-8.3.1-py3-none-any.whl", hash = "sha256:e9600ccf4f563976e2c99fa02c7624ab938296551f280835ee6516df8bc4ae8c"}, - {file = "pytest-8.3.1.tar.gz", hash = "sha256:7e8e5c5abd6e93cb1cc151f23e57adc31fcf8cfd2a3ff2da63e23f732de35db6"}, + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, ] [[package]] @@ -2420,7 +2261,6 @@ version = "4.1.0" requires_python = ">=3.7" summary = "Pytest plugin for measuring coverage." groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "coverage[toml]>=5.2.1", "pytest>=4.6", @@ -2435,7 +2275,6 @@ name = "pytest-sugar" version = "1.0.0" summary = "pytest-sugar is a plugin for pytest that changes the default look and feel of pytest (e.g. progressbar, show tests that fail instantly)." groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "packaging>=21.3", "pytest>=6.2.0", @@ -2452,7 +2291,6 @@ version = "3.6.1" requires_python = ">=3.8" summary = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "execnet>=2.1", "pytest>=7.0.0", @@ -2468,7 +2306,6 @@ version = "2.9.0.post0" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" summary = "Extensions to the standard Python datetime module" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "six>=1.5", ] @@ -2483,7 +2320,6 @@ version = "1.0.1" requires_python = ">=3.8" summary = "Read key-value pairs from a .env file and set them as environment variables" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -2495,7 +2331,6 @@ version = "2.0.7" requires_python = ">=3.6" summary = "A python library adding a json log formatter" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, @@ -2506,75 +2341,89 @@ name = "pytz" version = "2024.1" summary = "World timezone definitions, modern and historical" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] -name = "pyyaml" -version = "6.0.1" +name = "pywin32" +version = "306" +summary = "Python for Window Extensions" +groups = ["default"] +marker = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" +files = [ + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" requires_python = ">=3.6" +summary = "A (partial) reimplementation of pywin32 using ctypes/cffi" +groups = ["default"] +marker = "sys_platform == \"win32\"" +files = [ + {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, + {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, +] + +[[package]] +name = "pywinpty" +version = "2.0.13" +requires_python = ">=3.8" +summary = "Pseudo terminal support for Windows from Python." +groups = ["default"] +marker = "os_name == \"nt\"" +files = [ + {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, + {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +requires_python = ">=3.8" summary = "YAML parser and emitter for Python" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] name = "pyzmq" -version = "26.0.3" +version = "26.2.0" requires_python = ">=3.7" summary = "Python bindings for 0MQ" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "cffi; implementation_name == \"pypy\"", ] files = [ - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798"}, - {file = "pyzmq-26.0.3-cp312-cp312-win32.whl", hash = "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad"}, - {file = "pyzmq-26.0.3.tar.gz", hash = "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"}, + {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"}, + {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"}, ] [[package]] @@ -2583,7 +2432,6 @@ version = "0.7.6" requires_python = ">=3.9" summary = "Generate API documentation with Quarto." groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "click", "griffe>=0.33", @@ -2606,11 +2454,10 @@ files = [ [[package]] name = "rasterio" -version = "1.3.10" -requires_python = ">=3.8" +version = "1.4b1" +requires_python = ">=3.9" summary = "Fast and direct raster I/O for use with Numpy and SciPy" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "affine", "attrs", @@ -2620,12 +2467,14 @@ dependencies = [ "cligj>=0.5", "importlib-metadata; python_version < \"3.10\"", "numpy", - "setuptools", - "snuggs>=1.4.1", + "pyparsing", ] files = [ - {file = "rasterio-1.3.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c7ddca79444fd3b933f4cd1a1773e9f7839d0ce5d76e600bdf92ee9a79b95f8"}, - {file = "rasterio-1.3.10.tar.gz", hash = "sha256:ce182c735b4f9e8735d90600607ecab15ef895eb8aa660bf665751529477e326"}, + {file = "rasterio-1.4b1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:3f21b1606a0150af778d1344d592c02c205361f5a4530cc9f73a00573aeb6188"}, + {file = "rasterio-1.4b1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:360f335bf29eb1a9f2b6a8d3cdc3f6b881e699d7a5d308bb165fae605079e422"}, + {file = "rasterio-1.4b1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21e4491ff7dc00f952ed8aaec589ae288d0e8bc301453b544e50405fa62bd552"}, + {file = "rasterio-1.4b1-cp312-cp312-win_amd64.whl", hash = "sha256:c585652c426c8d608b737c1ad2bbb9f38424d3d7497f7d45b9e504c051578e51"}, + {file = "rasterio-1.4b1.tar.gz", hash = "sha256:a7c2f490aa8fc6245eb2ffb2c8b16c817be6857855378ce7856515c305e10b2d"}, ] [[package]] @@ -2634,7 +2483,6 @@ version = "0.35.1" requires_python = ">=3.8" summary = "JSON Referencing + Python" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "attrs>=22.2.0", "rpds-py>=0.7.0", @@ -2650,7 +2498,6 @@ version = "2.32.3" requires_python = ">=3.8" summary = "Python HTTP for Humans." groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "certifi>=2017.4.17", "charset-normalizer<4,>=2", @@ -2667,7 +2514,6 @@ name = "resolvelib" version = "1.0.1" summary = "Resolve abstract dependencies into concrete ones" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf"}, {file = "resolvelib-1.0.1.tar.gz", hash = "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309"}, @@ -2679,7 +2525,6 @@ version = "0.1.4" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "A pure python RFC3339 validator" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "six", ] @@ -2694,7 +2539,6 @@ version = "0.1.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "Pure python rfc3986 validator" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, @@ -2706,7 +2550,6 @@ version = "13.8.0" requires_python = ">=3.7.0" summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "markdown-it-py>=2.2.0", "pygments<3.0.0,>=2.13.0", @@ -2723,7 +2566,6 @@ version = "0.17.0" requires_python = ">=3.10" summary = "geospatial xarray extension powered by rasterio" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy>=1.23", "packaging", @@ -2738,59 +2580,25 @@ files = [ [[package]] name = "rpds-py" -version = "0.19.0" +version = "0.20.0" requires_python = ">=3.8" summary = "Python bindings to Rust's persistent data structures (rpds)" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" -files = [ - {file = "rpds_py-0.19.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5095a7c838a8647c32aa37c3a460d2c48debff7fc26e1136aee60100a8cd8f68"}, - {file = "rpds_py-0.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f2f78ef14077e08856e788fa482107aa602636c16c25bdf59c22ea525a785e9"}, - {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7cc6cb44f8636fbf4a934ca72f3e786ba3c9f9ba4f4d74611e7da80684e48d2"}, - {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf902878b4af334a09de7a45badbff0389e7cf8dc2e4dcf5f07125d0b7c2656d"}, - {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:688aa6b8aa724db1596514751ffb767766e02e5c4a87486ab36b8e1ebc1aedac"}, - {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57dbc9167d48e355e2569346b5aa4077f29bf86389c924df25c0a8b9124461fb"}, - {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4cf5a9497874822341c2ebe0d5850fed392034caadc0bad134ab6822c0925b"}, - {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8a790d235b9d39c70a466200d506bb33a98e2ee374a9b4eec7a8ac64c2c261fa"}, - {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1d16089dfa58719c98a1c06f2daceba6d8e3fb9b5d7931af4a990a3c486241cb"}, - {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bc9128e74fe94650367fe23f37074f121b9f796cabbd2f928f13e9661837296d"}, - {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c8f77e661ffd96ff104bebf7d0f3255b02aa5d5b28326f5408d6284c4a8b3248"}, - {file = "rpds_py-0.19.0-cp312-none-win32.whl", hash = "sha256:5f83689a38e76969327e9b682be5521d87a0c9e5a2e187d2bc6be4765f0d4600"}, - {file = "rpds_py-0.19.0-cp312-none-win_amd64.whl", hash = "sha256:06925c50f86da0596b9c3c64c3837b2481337b83ef3519e5db2701df695453a4"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:75969cf900d7be665ccb1622a9aba225cf386bbc9c3bcfeeab9f62b5048f4a07"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8445f23f13339da640d1be8e44e5baf4af97e396882ebbf1692aecd67f67c479"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5a7c1062ef8aea3eda149f08120f10795835fc1c8bc6ad948fb9652a113ca55"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:462b0c18fbb48fdbf980914a02ee38c423a25fcc4cf40f66bacc95a2d2d73bc8"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3208f9aea18991ac7f2b39721e947bbd752a1abbe79ad90d9b6a84a74d44409b"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3444fe52b82f122d8a99bf66777aed6b858d392b12f4c317da19f8234db4533"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88cb4bac7185a9f0168d38c01d7a00addece9822a52870eee26b8d5b61409213"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6b130bd4163c93798a6b9bb96be64a7c43e1cec81126ffa7ffaa106e1fc5cef5"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a707b158b4410aefb6b054715545bbb21aaa5d5d0080217290131c49c2124a6e"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dc9ac4659456bde7c567107556ab065801622396b435a3ff213daef27b495388"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:81ea573aa46d3b6b3d890cd3c0ad82105985e6058a4baed03cf92518081eec8c"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f148c3f47f7f29a79c38cc5d020edcb5ca780020fab94dbc21f9af95c463581"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0906357f90784a66e89ae3eadc2654f36c580a7d65cf63e6a616e4aec3a81be"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f629ecc2db6a4736b5ba95a8347b0089240d69ad14ac364f557d52ad68cf94b0"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6feacd1d178c30e5bc37184526e56740342fd2aa6371a28367bad7908d454fc"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae8b6068ee374fdfab63689be0963333aa83b0815ead5d8648389a8ded593378"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d57546bad81e0da13263e4c9ce30e96dcbe720dbff5ada08d2600a3502e526"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b6683a37338818646af718c9ca2a07f89787551057fae57c4ec0446dc6224b"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e8481b946792415adc07410420d6fc65a352b45d347b78fec45d8f8f0d7496f0"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bec35eb20792ea64c3c57891bc3ca0bedb2884fbac2c8249d9b731447ecde4fa"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:aa5476c3e3a402c37779e95f7b4048db2cb5b0ed0b9d006983965e93f40fe05a"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:19d02c45f2507b489fd4df7b827940f1420480b3e2e471e952af4d44a1ea8e34"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a3e2fd14c5d49ee1da322672375963f19f32b3d5953f0615b175ff7b9d38daed"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:93a91c2640645303e874eada51f4f33351b84b351a689d470f8108d0e0694210"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5b9fc03bf76a94065299d4a2ecd8dfbae4ae8e2e8098bbfa6ab6413ca267709"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a4b07cdf3f84310c08c1de2c12ddadbb7a77568bcb16e95489f9c81074322ed"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba0ed0dc6763d8bd6e5de5cf0d746d28e706a10b615ea382ac0ab17bb7388633"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:474bc83233abdcf2124ed3f66230a1c8435896046caa4b0b5ab6013c640803cc"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329c719d31362355a96b435f4653e3b4b061fcc9eba9f91dd40804ca637d914e"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef9101f3f7b59043a34f1dccbb385ca760467590951952d6701df0da9893ca0c"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:0121803b0f424ee2109d6e1f27db45b166ebaa4b32ff47d6aa225642636cd834"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8344127403dea42f5970adccf6c5957a71a47f522171fafaf4c6ddb41b61703a"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:443cec402ddd650bb2b885113e1dcedb22b1175c6be223b14246a714b61cd521"}, - {file = "rpds_py-0.19.0.tar.gz", hash = "sha256:4fdc9afadbeb393b4bbbad75481e0ea78e4469f2e1d713a90811700830b553a9"}, +files = [ + {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, + {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, + {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, + {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, ] [[package]] @@ -2799,7 +2607,6 @@ version = "0.18.6" requires_python = ">=3.7" summary = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "ruamel-yaml-clib>=0.2.7; platform_python_implementation == \"CPython\" and python_version < \"3.13\"", ] @@ -2814,7 +2621,7 @@ version = "0.2.8" requires_python = ">=3.6" summary = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" groups = ["default"] -marker = "platform_python_implementation == \"CPython\" and python_full_version == \"3.12.4\"" +marker = "platform_python_implementation == \"CPython\" and python_version < \"3.13\"" files = [ {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, @@ -2833,12 +2640,16 @@ version = "1.13.1" requires_python = ">=3.9" summary = "Fundamental algorithms for scientific computing in Python" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy<2.3,>=1.22.4", ] files = [ + {file = "scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1"}, + {file = "scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d"}, {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627"}, + {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884"}, + {file = "scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16"}, + {file = "scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949"}, {file = "scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c"}, ] @@ -2848,7 +2659,6 @@ version = "0.13.2" requires_python = ">=3.8" summary = "Statistical data visualization" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "matplotlib!=3.6.1,>=3.4", "numpy!=1.24.0,>=1.20", @@ -2865,7 +2675,7 @@ version = "3.3.3" requires_python = ">=3.6" summary = "Python bindings to FreeDesktop.org Secret Service API" groups = ["default"] -marker = "sys_platform == \"linux\" and python_full_version == \"3.12.4\"" +marker = "sys_platform == \"linux\"" dependencies = [ "cryptography>=2.0", "jeepney>=0.6", @@ -2881,7 +2691,6 @@ version = "1.8.3" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" summary = "Send file to trash natively under Mac OS X, Windows and Linux" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, @@ -2889,34 +2698,32 @@ files = [ [[package]] name = "setuptools" -version = "71.0.4" +version = "74.1.1" requires_python = ">=3.8" summary = "Easily download, build, install, upgrade, and uninstall Python packages" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "setuptools-71.0.4-py3-none-any.whl", hash = "sha256:ed2feca703be3bdbd94e6bb17365d91c6935c6b2a8d0bb09b66a2c435ba0b1a5"}, - {file = "setuptools-71.0.4.tar.gz", hash = "sha256:48297e5d393a62b7cb2a10b8f76c63a73af933bd809c9e0d0d6352a1a0135dd8"}, + {file = "setuptools-74.1.1-py3-none-any.whl", hash = "sha256:fc91b5f89e392ef5b77fe143b17e32f65d3024744fba66dc3afe07201684d766"}, + {file = "setuptools-74.1.1.tar.gz", hash = "sha256:2353af060c06388be1cecbf5953dcdb1f38362f87a2356c480b6b4d5fcfc8847"}, ] [[package]] name = "shapely" -version = "2.0.5" +version = "2.0.6" requires_python = ">=3.7" summary = "Manipulation and analysis of geometric objects" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy<3,>=1.14", ] files = [ - {file = "shapely-2.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:03bd7b5fa5deb44795cc0a503999d10ae9d8a22df54ae8d4a4cd2e8a93466195"}, - {file = "shapely-2.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ff9521991ed9e201c2e923da014e766c1aa04771bc93e6fe97c27dcf0d40ace"}, - {file = "shapely-2.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b65365cfbf657604e50d15161ffcc68de5cdb22a601bbf7823540ab4918a98d"}, - {file = "shapely-2.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21f64e647a025b61b19585d2247137b3a38a35314ea68c66aaf507a1c03ef6fe"}, - {file = "shapely-2.0.5-cp312-cp312-win32.whl", hash = "sha256:3ac7dc1350700c139c956b03d9c3df49a5b34aaf91d024d1510a09717ea39199"}, - {file = "shapely-2.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:30e8737983c9d954cd17feb49eb169f02f1da49e24e5171122cf2c2b62d65c95"}, - {file = "shapely-2.0.5.tar.gz", hash = "sha256:bff2366bc786bfa6cb353d6b47d0443c570c32776612e527ee47b6df63fcfe32"}, + {file = "shapely-2.0.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cec9193519940e9d1b86a3b4f5af9eb6910197d24af02f247afbfb47bcb3fab0"}, + {file = "shapely-2.0.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83b94a44ab04a90e88be69e7ddcc6f332da7c0a0ebb1156e1c4f568bbec983c3"}, + {file = "shapely-2.0.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:537c4b2716d22c92036d00b34aac9d3775e3691f80c7aa517c2c290351f42cd8"}, + {file = "shapely-2.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fea108334be345c283ce74bf064fa00cfdd718048a8af7343c59eb40f59726"}, + {file = "shapely-2.0.6-cp312-cp312-win32.whl", hash = "sha256:42fd4cd4834747e4990227e4cbafb02242c0cffe9ce7ef9971f53ac52d80d55f"}, + {file = "shapely-2.0.6-cp312-cp312-win_amd64.whl", hash = "sha256:665990c84aece05efb68a21b3523a6b2057e84a1afbef426ad287f0796ef8a48"}, + {file = "shapely-2.0.6.tar.gz", hash = "sha256:997f6159b1484059ec239cacaa53467fd8b5564dabe186cd84ac2944663b0bf6"}, ] [[package]] @@ -2925,7 +2732,6 @@ version = "1.5.4" requires_python = ">=3.7" summary = "Tool to Detect Surrounding Shell" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, @@ -2937,7 +2743,6 @@ version = "1.16.0" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" summary = "Python 2 and 3 compatibility utilities" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -2949,7 +2754,6 @@ version = "5.0.1" requires_python = ">=3.7" summary = "A pure Python implementation of a sliding window memory map manager" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, @@ -2961,34 +2765,17 @@ version = "1.3.1" requires_python = ">=3.7" summary = "Sniff out which async library your code is running under" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] -[[package]] -name = "snuggs" -version = "1.4.7" -summary = "Snuggs are s-expressions for Numpy" -groups = ["default"] -marker = "python_full_version == \"3.12.4\"" -dependencies = [ - "numpy", - "pyparsing>=2.1.6", -] -files = [ - {file = "snuggs-1.4.7-py3-none-any.whl", hash = "sha256:988dde5d4db88e9d71c99457404773dabcc7a1c45971bfbe81900999942d9f07"}, - {file = "snuggs-1.4.7.tar.gz", hash = "sha256:501cf113fe3892e14e2fee76da5cd0606b7e149c411c271898e6259ebde2617b"}, -] - [[package]] name = "socksio" version = "1.0.0" requires_python = ">=3.6" summary = "Sans-I/O implementation of SOCKS4, SOCKS4A, and SOCKS5." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "socksio-1.0.0-py3-none-any.whl", hash = "sha256:95dc1f15f9b34e8d7b16f06d74b8ccf48f609af32ab33c608d08761c5dcbb1f3"}, {file = "socksio-1.0.0.tar.gz", hash = "sha256:f88beb3da5b5c38b9890469de67d0cb0f9d494b78b106ca1845f96c10b91c4ac"}, @@ -2996,14 +2783,13 @@ files = [ [[package]] name = "soupsieve" -version = "2.5" +version = "2.6" requires_python = ">=3.8" summary = "A modern CSS selector implementation for Beautiful Soup." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, ] [[package]] @@ -3012,7 +2798,6 @@ version = "2.3.1.1" requires_python = ">=3.8" summary = "Sphinx objects.inv Inspection/Manipulation Tool" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "attrs>=19.2", "certifi", @@ -3028,7 +2813,6 @@ name = "stack-data" version = "0.6.3" summary = "Extract data from python stack frames and tracebacks for informative displays" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "asttokens>=2.1.0", "executing>=1.2.0", @@ -3045,7 +2829,6 @@ version = "1.1.1" requires_python = ">=3.6,<4.0" summary = "Simple and safe python wrapper for calling system rsync" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "toml<0.11.0,>=0.10.0", ] @@ -3060,7 +2843,6 @@ version = "0.9.0" requires_python = ">=3.7" summary = "Pretty-print tabular data" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, @@ -3072,7 +2854,6 @@ version = "2.4.0" requires_python = ">=3.8" summary = "ANSI color formatting for output in terminal" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, @@ -3084,7 +2865,6 @@ version = "0.18.1" requires_python = ">=3.8" summary = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "ptyprocess; os_name != \"nt\"", "pywinpty>=1.1.0; os_name == \"nt\"", @@ -3101,7 +2881,6 @@ version = "1.3.0" requires_python = ">=3.8" summary = "A tiny CSS parser" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "webencodings>=0.4", ] @@ -3116,7 +2895,6 @@ version = "0.10.2" requires_python = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" summary = "Python Library for Tom's Obvious, Minimal Language" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -3124,14 +2902,13 @@ files = [ [[package]] name = "tomlkit" -version = "0.13.0" +version = "0.13.2" requires_python = ">=3.8" summary = "Style preserving TOML library" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "tomlkit-0.13.0-py3-none-any.whl", hash = "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264"}, - {file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"}, + {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, + {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, ] [[package]] @@ -3140,7 +2917,6 @@ version = "0.12.1" requires_python = ">=3.7" summary = "List processing tools and functional utilities" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, @@ -3152,7 +2928,6 @@ version = "6.4.1" requires_python = ">=3.8" summary = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, @@ -3173,7 +2948,6 @@ version = "4.66.5" requires_python = ">=3.7" summary = "Fast, Extensible Progress Meter" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "colorama; platform_system == \"Windows\"", ] @@ -3188,7 +2962,6 @@ version = "5.14.3" requires_python = ">=3.8" summary = "Traitlets Python configuration system" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -3196,14 +2969,14 @@ files = [ [[package]] name = "truststore" -version = "0.9.1" +version = "0.9.2" requires_python = ">=3.10" summary = "Verify certificates using native system trust stores" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" +marker = "python_version >= \"3.10\"" files = [ - {file = "truststore-0.9.1-py3-none-any.whl", hash = "sha256:7f5b447d68318d966428131fc1c00442cca3a2d581a3986143558f007efba0b4"}, - {file = "truststore-0.9.1.tar.gz", hash = "sha256:8f7312d70cc33e9003b748a80a04ead1fcb2ed856a7c6c9ca5a02482901a90be"}, + {file = "truststore-0.9.2-py3-none-any.whl", hash = "sha256:04559916f8810cc1a5ecc41f215eddc988746067b754fc0995da7a2ceaf54735"}, + {file = "truststore-0.9.2.tar.gz", hash = "sha256:a1dee0d0575ff22d2875476343783a5d64575419974e228f3248772613c3d993"}, ] [[package]] @@ -3212,7 +2985,6 @@ version = "0.12.5" requires_python = ">=3.7" summary = "Typer, build great CLIs. Easy to code. Based on Python type hints." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "click>=8.0.0", "rich>=10.11.0", @@ -3226,14 +2998,13 @@ files = [ [[package]] name = "types-python-dateutil" -version = "2.9.0.20240316" +version = "2.9.0.20240821" requires_python = ">=3.8" summary = "Typing stubs for python-dateutil" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, - {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, + {file = "types-python-dateutil-2.9.0.20240821.tar.gz", hash = "sha256:9649d1dcb6fef1046fb18bebe9ea2aa0028b160918518c34589a46045f6ebd98"}, + {file = "types_python_dateutil-2.9.0.20240821-py3-none-any.whl", hash = "sha256:f5889fcb4e63ed4aaa379b44f93c32593d50b9a94c9a60a0c854d8cc3511cd57"}, ] [[package]] @@ -3242,7 +3013,6 @@ version = "4.12.2" requires_python = ">=3.8" summary = "Backported and Experimental Type Hints for Python 3.8+" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -3254,7 +3024,6 @@ version = "2024.1" requires_python = ">=2" summary = "Provider of IANA time zone data" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, @@ -3266,7 +3035,6 @@ version = "0.17.2" requires_python = ">=3.8" summary = "A utility to fetch and download python packages" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "httpx<1,>=0.27.0", "packaging>=20", @@ -3282,7 +3050,6 @@ version = "1.3.0" requires_python = ">=3.7" summary = "RFC 6570 URI Template Processor" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, @@ -3290,14 +3057,13 @@ files = [ [[package]] name = "urllib3" -version = "1.26.19" +version = "1.26.20" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" summary = "HTTP library with thread-safe connection pooling, file post, and more." groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "urllib3-1.26.19-py2.py3-none-any.whl", hash = "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3"}, - {file = "urllib3-1.26.19.tar.gz", hash = "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429"}, + {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, + {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, ] [[package]] @@ -3306,7 +3072,6 @@ version = "20.26.3" requires_python = ">=3.7" summary = "Virtual Python Environment builder" groups = ["default", "dev"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "distlib<1,>=0.3.7", "filelock<4,>=3.12.2", @@ -3320,32 +3085,25 @@ files = [ [[package]] name = "watchdog" -version = "4.0.1" -requires_python = ">=3.8" +version = "5.0.1" +requires_python = ">=3.9" summary = "Filesystem events monitoring" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" -files = [ - {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"}, - {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7"}, - {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5"}, - {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193"}, - {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625"}, - {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd"}, - {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"}, - {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"}, - {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"}, - {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"}, - {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, +files = [ + {file = "watchdog-5.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e321f1561adea30e447130882efe451af519646178d04189d6ba91a8cd7d88a5"}, + {file = "watchdog-5.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c4ae0b3e95455fa9d959aa3b253c87845ad454ef188a4bf5a69cab287c131216"}, + {file = "watchdog-5.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b2d56425dfa0c1e6f8a510f21d3d54ef7fe50bbc29638943c2cb1394b7b49156"}, + {file = "watchdog-5.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:763c6f82bb65504b47d4aea268462b2fb662676676356e04787f332a11f03eb0"}, + {file = "watchdog-5.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:664917cd513538728875a42d5654584b533da88cf06680452c98e73b45466968"}, + {file = "watchdog-5.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:39e828c4270452b966bc9d814911a3c7e24c62d726d2a3245f5841664ff56b5e"}, + {file = "watchdog-5.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:59ec6111f3750772badae3403ef17263489ed6f27ac01ec50c0244b2afa258fb"}, + {file = "watchdog-5.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f3006361dba2005552cc8aa49c44d16a10e0a1939bb3286e888a14f722122808"}, + {file = "watchdog-5.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:72dbdffe4aa0c36c59f4a5190bceeb7fdfdf849ab98a562b3a783a64cc6dacdd"}, + {file = "watchdog-5.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c93aa24899cb4e8a51492c7ccc420bea45ced502fe9ef2e83f9ab1107e5a13b5"}, + {file = "watchdog-5.0.1-py3-none-win32.whl", hash = "sha256:2b8cd627b76194e725ed6f48d9524b1ad93a51a0dc3bd0225c56023716245091"}, + {file = "watchdog-5.0.1-py3-none-win_amd64.whl", hash = "sha256:4eaebff2f938f5325788cef26521891b2d8ecc8e7852aa123a9b458815f93875"}, + {file = "watchdog-5.0.1-py3-none-win_ia64.whl", hash = "sha256:9b1b32f89f95162f09aea6e15d9384f6e0490152f10d7ed241f8a85cddc50658"}, + {file = "watchdog-5.0.1.tar.gz", hash = "sha256:f0180e84e6493ef7c82e051334e8c9b00ffd89fa9de5e0613d3c267f6ccf2d38"}, ] [[package]] @@ -3353,7 +3111,6 @@ name = "wcwidth" version = "0.2.13" summary = "Measures the displayed width of unicode strings in a terminal" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "backports-functools-lru-cache>=1.2.1; python_version < \"3.2\"", ] @@ -3364,14 +3121,13 @@ files = [ [[package]] name = "webcolors" -version = "24.6.0" +version = "24.8.0" requires_python = ">=3.8" summary = "A library for working with the color formats defined by HTML and CSS." groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "webcolors-24.6.0-py3-none-any.whl", hash = "sha256:8cf5bc7e28defd1d48b9e83d5fc30741328305a8195c29a8e668fa45586568a1"}, - {file = "webcolors-24.6.0.tar.gz", hash = "sha256:1d160d1de46b3e81e58d0a280d0c78b467dc80f47294b91b1ad8029d2cedb55b"}, + {file = "webcolors-24.8.0-py3-none-any.whl", hash = "sha256:fc4c3b59358ada164552084a8ebee637c221e4059267d0f8325b3b560f6c7f0a"}, + {file = "webcolors-24.8.0.tar.gz", hash = "sha256:08b07af286a01bcd30d583a7acadf629583d1f79bfef27dd2c2c5c263817277d"}, ] [[package]] @@ -3379,7 +3135,6 @@ name = "webencodings" version = "0.5.1" summary = "Character encoding aliases for legacy web content" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, @@ -3391,7 +3146,6 @@ version = "1.8.0" requires_python = ">=3.8" summary = "WebSocket client for Python with low level API options" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" files = [ {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, @@ -3399,29 +3153,27 @@ files = [ [[package]] name = "xarray" -version = "2024.6.0" +version = "2024.7.0" requires_python = ">=3.9" summary = "N-D labeled arrays and datasets in Python" groups = ["default"] -marker = "python_full_version == \"3.12.4\"" dependencies = [ "numpy>=1.23", "packaging>=23.1", "pandas>=2.0", ] files = [ - {file = "xarray-2024.6.0-py3-none-any.whl", hash = "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c"}, - {file = "xarray-2024.6.0.tar.gz", hash = "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7"}, + {file = "xarray-2024.7.0-py3-none-any.whl", hash = "sha256:1b0fd51ec408474aa1f4a355d75c00cc1c02bd425d97b2c2e551fd21810e7f64"}, + {file = "xarray-2024.7.0.tar.gz", hash = "sha256:4cae512d121a8522d41e66d942fb06c526bc1fd32c2c181d5fe62fe65b671638"}, ] [[package]] name = "zipp" -version = "3.19.2" +version = "3.20.1" requires_python = ">=3.8" summary = "Backport of pathlib-compatible object wrapper for zip files" groups = ["dev"] -marker = "python_full_version == \"3.12.4\"" files = [ - {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, - {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, + {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, + {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, ] diff --git a/python/pyproject.toml b/python/pyproject.toml index f2024ed4..6aa2f82a 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -23,8 +23,6 @@ requires-python = "==3.12.*" dependencies = [ "tqdm>=4.66.4", "scipy<1.14", - "rioxarray<1.0.0,>=0.15.1", - "rasterio<2.0.0,>=1.3.9", "python-dateutil<3.0.0,>=2.8.2", "jupyterlab<5.0.0,>=4.1.2", "matplotlib<3.9", @@ -38,7 +36,9 @@ dependencies = [ "typer>=0.12.3", "seaborn>=0.13.2", "dill>=0.3.8", - "numpy<2", + "numpy>2", + "rioxarray>=0.17.0", + "rasterio==1.4b1", ] [project.scripts] diff --git a/setup-instructions.md b/setup-instructions.md index c45e2bfa..5b4c33e9 100644 --- a/setup-instructions.md +++ b/setup-instructions.md @@ -26,17 +26,65 @@ git clone https://github.com/alan-turing-institute/clim-recal cd clim-recal docker compose build jupyter docker compose up jupyter -docker compose run jupyter bash -cd python -pdm install -pdm run clim-recal --help +clim-recal --help ``` ::: {.callout-warning} There are cases where `pdm install` raises a `KeyError: '_PYPROJECT_HOOKS_BUILD_BACKEND'`. Thus far, running `pdm install` again works. ::: ```console -clim-recal --help +$ clim-recal --help + + Usage: clim-recal [OPTIONS] + + Crop and align UK climate projections and test debias methods. + +╭─ Options ──────────────────────────────────────────────────────────────╮ +│ --hads-input-path -d PATH [default: │ +│ /Volumes/vmfileshar… │ +│ --cpm-input-path -o PATH [default: │ +│ /Volumes/vmfileshar… │ +│ --output-path -o DIRECTORY [default: │ +│ clim-recal-runs] │ +│ --variable -v [tasmax|rainfall|t [default: tasmax] │ +│ asmin] │ +│ --region -a [Glasgow|Mancheste [default: │ +│ r|London|Scotland] Manchester] │ +│ --run -r [01|04|05|06|07|08 [default: 05] │ +│ |09|10|11|12|13|14 │ +│ |15] │ +│ --method -m [quantile_delta_ma [default: │ +│ pping|quantile_map quantile_delta_mapp… │ +│ ping|variance_scal │ +│ ing|delta_method] │ +│ --all-variables │ +│ --all-regions │ +│ --all-runs │ +│ --default-runs │ +│ --all-methods │ +│ --project-cpm [default: True] │ +│ --project-hads [default: True] │ +│ --crop-cpm [default: True] │ +│ --crop-hads [default: True] │ +│ --execute │ +│ --start-index -s INTEGER RANGE [default: 0] │ +│ [x>=0] │ +│ --total-from-index -t INTEGER RANGE [default: 0] │ +│ [x>=0] │ +│ --cpus INTEGER RANGE [default: 2] │ +│ [1<=x<=10] │ +│ --use-multiprocessi… │ +│ --install-completion Install completion │ +│ for the current │ +│ shell. │ +│ --show-completion Show completion for │ +│ the current shell, │ +│ to copy it or │ +│ customize the │ +│ installation. │ +│ --help Show this message │ +│ and exit. │ +╰────────────────────────────────────────────────────────────────────────╯ ``` From 35062ef4b4918b2f47ae5cd55fcd715699d4f0cd Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 3 Sep 2024 21:43:45 +0100 Subject: [PATCH 68/92] fix: `pyproject.toml` and `pdm.lock` for `python` `3.12.5` --- python/pdm.lock | 265 ++++++++++++++++++++++++++++++++++++------ python/pyproject.toml | 2 +- 2 files changed, 231 insertions(+), 36 deletions(-) diff --git a/python/pdm.lock b/python/pdm.lock index 434f1d4f..a5ca479b 100644 --- a/python/pdm.lock +++ b/python/pdm.lock @@ -5,10 +5,10 @@ groups = ["default", "dev"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:9d8cc63d68a52e6ede993eaff96c9864e0f6114c7650cc6ed657197471820e33" +content_hash = "sha256:0cdc21112758f7753fb9320582ff928e8e3629b9e5012128763450e4cfe491d1" [[metadata.targets]] -requires_python = "==3.12.*" +requires_python = "~=3.12.5" [[package]] name = "affine" @@ -16,6 +16,7 @@ version = "2.4.0" requires_python = ">=3.7" summary = "Matrices describing affine transformation of the plane" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "affine-2.4.0-py3-none-any.whl", hash = "sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92"}, {file = "affine-2.4.0.tar.gz", hash = "sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea"}, @@ -27,6 +28,7 @@ version = "0.7.0" requires_python = ">=3.8" summary = "Reusable constraint types to use with typing.Annotated" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "typing-extensions>=4.0.0; python_version < \"3.9\"", ] @@ -41,6 +43,7 @@ version = "4.4.0" requires_python = ">=3.8" summary = "High level compatibility layer for multiple asynchronous event loop implementations" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "exceptiongroup>=1.0.2; python_version < \"3.11\"", "idna>=2.8", @@ -57,6 +60,7 @@ name = "appdirs" version = "1.4.4" summary = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, @@ -68,7 +72,7 @@ version = "0.1.4" requires_python = ">=3.6" summary = "Disable App Nap on macOS >= 10.9" groups = ["default"] -marker = "platform_system == \"Darwin\"" +marker = "platform_system == \"Darwin\" and python_full_version ~= \"3.12.5\"" files = [ {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, @@ -80,6 +84,7 @@ version = "23.1.0" requires_python = ">=3.7" summary = "Argon2 for Python" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "argon2-cffi-bindings", "typing-extensions; python_version < \"3.8\"", @@ -95,6 +100,7 @@ version = "21.2.0" requires_python = ">=3.6" summary = "Low-level CFFI bindings for Argon2" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "cffi>=1.0.1", ] @@ -118,6 +124,7 @@ version = "1.3.0" requires_python = ">=3.8" summary = "Better dates & times for Python" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "python-dateutil>=2.7.0", "types-python-dateutil>=2.8.10", @@ -132,6 +139,7 @@ name = "asttokens" version = "2.4.1" summary = "Annotate AST trees with source code positions" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "six>=1.12.0", "typing; python_version < \"3.5\"", @@ -147,6 +155,7 @@ version = "2.0.4" requires_python = ">=3.8" summary = "Simple LRU cache for asyncio" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "typing-extensions>=4.0.0; python_version < \"3.11\"", ] @@ -161,6 +170,7 @@ version = "24.2.0" requires_python = ">=3.7" summary = "Classes Without Boilerplate" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "importlib-metadata; python_version < \"3.8\"", ] @@ -175,6 +185,7 @@ version = "2.16.0" requires_python = ">=3.8" summary = "Internationalization utilities" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "pytz>=2015.7; python_version < \"3.9\"", ] @@ -189,7 +200,7 @@ version = "0.18.5" requires_python = ">=3.8.0" summary = "Unbearably fast runtime type checking in pure Python." groups = ["dev"] -marker = "python_version >= \"3.10\"" +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "beartype-0.18.5-py3-none-any.whl", hash = "sha256:5301a14f2a9a5540fe47ec6d34d758e9cd8331d36c4760fc7a5499ab86310089"}, {file = "beartype-0.18.5.tar.gz", hash = "sha256:264ddc2f1da9ec94ff639141fbe33d22e12a9f75aa863b83b7046ffff1381927"}, @@ -201,6 +212,7 @@ version = "4.12.3" requires_python = ">=3.6.0" summary = "Screen-scraping library" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "soupsieve>1.2", ] @@ -215,6 +227,7 @@ version = "6.1.0" requires_python = ">=3.8" summary = "An easy safelist-based HTML-sanitizing tool." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "six>=1.9.0", "webencodings", @@ -230,6 +243,7 @@ version = "1.8.2" requires_python = ">=3.8" summary = "Fast, simple object-to-object and broadcast signaling" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "blinker-1.8.2-py3-none-any.whl", hash = "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01"}, {file = "blinker-1.8.2.tar.gz", hash = "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83"}, @@ -241,6 +255,7 @@ version = "0.14.0" requires_python = ">=3.7" summary = "httplib2 caching for requests" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "msgpack<2.0.0,>=0.5.2", "requests>=2.16.0", @@ -257,6 +272,7 @@ extras = ["filecache"] requires_python = ">=3.7" summary = "httplib2 caching for requests" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "cachecontrol==0.14.0", "filelock>=3.8.0", @@ -272,6 +288,7 @@ version = "0.3.0" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "Cachy provides a simple yet effective caching library." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, @@ -283,6 +300,7 @@ version = "2024.8.30" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, @@ -294,6 +312,7 @@ version = "1.17.0" requires_python = ">=3.8" summary = "Foreign Function Interface for Python calling C code." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "pycparser", ] @@ -318,6 +337,7 @@ version = "3.4.0" requires_python = ">=3.8" summary = "Validate configuration and produce human readable error messages." groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -329,6 +349,7 @@ version = "1.6.4" requires_python = ">=3.8" summary = "Time-handling functionality from netcdf4-python" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "numpy>1.13.3; python_version < \"3.12.0.rc1\"", "numpy>=1.26.0b1; python_version >= \"3.12.0.rc1\"", @@ -349,6 +370,7 @@ version = "3.3.2" requires_python = ">=3.7.0" summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, @@ -375,6 +397,7 @@ version = "8.1.7" requires_python = ">=3.7" summary = "Composable command line interface toolkit" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "colorama; platform_system == \"Windows\"", "importlib-metadata; python_version < \"3.8\"", @@ -390,6 +413,7 @@ version = "1.2.4" requires_python = ">=2.7" summary = "click_default_group" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "click", ] @@ -403,6 +427,7 @@ name = "click-plugins" version = "1.1.1" summary = "An extension module for click to enable registering CLI commands via setuptools entry-points." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "click>=4.0", ] @@ -417,6 +442,7 @@ version = "0.7.2" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" summary = "Click params for commmand line interfaces to GeoJSON" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "click>=4.0", ] @@ -431,6 +457,7 @@ version = "0.6.2" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "CliKit is a group of utilities to build beautiful and testable command line interfaces." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "crashtest<0.4.0,>=0.3.0; python_version ~= \"3.6\"", "enum34<2.0,>=1.1; python_version >= \"2.7\" and python_version < \"2.8\"", @@ -450,6 +477,7 @@ version = "0.4.6" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Cross-platform colored terminal text." groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -461,6 +489,7 @@ version = "0.2.2" requires_python = ">=3.8" summary = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "traitlets>=4", ] @@ -475,6 +504,7 @@ version = "2.5.7" requires_python = ">=3.8" summary = "Lockfiles for conda" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "cachecontrol[filecache]>=0.12.9", "cachy>=0.3.0", @@ -512,6 +542,7 @@ version = "1.3.0" requires_python = ">=3.9" summary = "Python library for calculating contours of 2D quadrilateral grids" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "numpy>=1.23", ] @@ -535,6 +566,7 @@ version = "7.6.1" requires_python = ">=3.8" summary = "Code coverage measurement for Python" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, @@ -554,6 +586,7 @@ name = "coverage-badge" version = "1.1.2" summary = "Generate coverage badges for Coverage.py." groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "coverage", "setuptools", @@ -570,6 +603,7 @@ extras = ["toml"] requires_python = ">=3.8" summary = "Code coverage measurement for Python" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "coverage==7.6.1", "tomli; python_full_version <= \"3.11.0a6\"", @@ -594,6 +628,7 @@ version = "0.3.1" requires_python = ">=3.6,<4.0" summary = "Manage Python errors with ease" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, @@ -601,34 +636,34 @@ files = [ [[package]] name = "cryptography" -version = "43.0.0" +version = "43.0.1" requires_python = ">=3.7" summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." groups = ["default"] -marker = "sys_platform == \"linux\"" +marker = "sys_platform == \"linux\" and python_full_version ~= \"3.12.5\"" dependencies = [ "cffi>=1.12; platform_python_implementation != \"PyPy\"", ] files = [ - {file = "cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf"}, - {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55"}, - {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431"}, - {file = "cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc"}, - {file = "cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778"}, - {file = "cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f"}, - {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"}, - {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b"}, - {file = "cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf"}, - {file = "cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709"}, - {file = "cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e"}, + {file = "cryptography-43.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a"}, + {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042"}, + {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494"}, + {file = "cryptography-43.0.1-cp37-abi3-win32.whl", hash = "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2"}, + {file = "cryptography-43.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d"}, + {file = "cryptography-43.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1"}, + {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa"}, + {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4"}, + {file = "cryptography-43.0.1-cp39-abi3-win32.whl", hash = "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47"}, + {file = "cryptography-43.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb"}, + {file = "cryptography-43.0.1.tar.gz", hash = "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d"}, ] [[package]] @@ -637,6 +672,7 @@ version = "0.12.1" requires_python = ">=3.8" summary = "Composable style cycles" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -648,6 +684,7 @@ version = "1.8.5" requires_python = ">=3.8" summary = "An implementation of the Debug Adapter Protocol for Python" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "debugpy-1.8.5-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:5b5c770977c8ec6c40c60d6f58cacc7f7fe5a45960363d6974ddb9b62dbee156"}, {file = "debugpy-1.8.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a65b00b7cdd2ee0c2cf4c7335fef31e15f1b7056c7fdbce9e90193e1a8c8cb"}, @@ -663,6 +700,7 @@ version = "5.1.1" requires_python = ">=3.5" summary = "Decorators for Humans" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -674,6 +712,7 @@ version = "0.7.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "XML bomb protection for Python stdlib modules" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, @@ -685,6 +724,7 @@ version = "0.4.4" requires_python = ">=3.8" summary = "Python dependency specifications supporting logical operations" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "packaging>=22", ] @@ -699,6 +739,7 @@ version = "0.3.8" requires_python = ">=3.8" summary = "serialize all of Python" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, @@ -709,6 +750,7 @@ name = "distlib" version = "0.3.8" summary = "Distribution utilities" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, @@ -720,6 +762,7 @@ version = "1.4.4" requires_python = ">=3.7" summary = "Lightweight bootstrapper for a conda executable" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "appdirs", "click>=5.1", @@ -738,6 +781,7 @@ version = "1.1.0" requires_python = ">=3.6" summary = "An implementation of lxml.xmlfile for the standard library" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, @@ -749,6 +793,7 @@ version = "2.1.1" requires_python = ">=3.8" summary = "execnet: rapid multi-Python deployment" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -760,6 +805,7 @@ version = "2.1.0" requires_python = ">=3.8" summary = "Get the currently executing AST node of a frame, and other information" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, @@ -770,6 +816,7 @@ name = "fastjsonschema" version = "2.20.0" summary = "Fastest Python implementation of JSON schema" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, @@ -781,6 +828,7 @@ version = "3.15.4" requires_python = ">=3.8" summary = "A platform independent file lock." groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, @@ -792,6 +840,7 @@ version = "0.6.1" requires_python = ">=3.8" summary = "A utility to find python versions on your system" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "packaging>=20", ] @@ -806,6 +855,7 @@ version = "4.53.1" requires_python = ">=3.8" summary = "Tools to manipulate font files" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, @@ -825,6 +875,7 @@ version = "1.5.1" requires_python = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" summary = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "cached-property>=1.3.0; python_version < \"3.8\"", ] @@ -839,6 +890,7 @@ version = "3.8.5" requires_python = ">=3.6.0" summary = "GDAL: Geospatial Data Abstraction Library" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "GDAL-3.8.5.tar.gz", hash = "sha256:ad8addd58ba9c62aefc7f65d345c168736798f137e5c8f247af76fcf4862d371"}, ] @@ -849,6 +901,7 @@ version = "1.0.1" requires_python = ">=3.9" summary = "Geographic pandas extensions" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "numpy>=1.22", "packaging", @@ -868,6 +921,7 @@ version = "4.0.11" requires_python = ">=3.7" summary = "Git Object Database" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "smmap<6,>=3.0.1", ] @@ -882,6 +936,7 @@ version = "3.1.43" requires_python = ">=3.7" summary = "GitPython is a Python library used to interact with Git repositories" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "gitdb<5,>=4.0.1", "typing-extensions>=3.7.4.3; python_version < \"3.8\"", @@ -897,6 +952,7 @@ version = "1.2.0" requires_python = ">=3.8" summary = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "astunparse>=1.6; python_version < \"3.9\"", "colorama>=0.4", @@ -912,6 +968,7 @@ version = "0.14.0" requires_python = ">=3.7" summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "typing-extensions; python_version < \"3.8\"", ] @@ -926,6 +983,7 @@ version = "0.0.30" requires_python = ">=3.8" summary = "Persistent cache implementation for httpx and httpcore" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "httpx>=0.22.0", "typing-extensions>=4.8.0", @@ -941,6 +999,7 @@ version = "1.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "HTML parser based on the WHATWG HTML specification" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "six>=1.9", "webencodings", @@ -956,6 +1015,7 @@ version = "1.0.5" requires_python = ">=3.8" summary = "A minimal low-level HTTP client." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "certifi", "h11<0.15,>=0.13", @@ -971,6 +1031,7 @@ version = "0.27.2" requires_python = ">=3.8" summary = "The next generation HTTP client." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "anyio", "certifi", @@ -990,6 +1051,7 @@ extras = ["socks"] requires_python = ">=3.8" summary = "The next generation HTTP client." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "httpx==0.27.2", "socksio==1.*", @@ -1005,6 +1067,7 @@ version = "2.6.0" requires_python = ">=3.8" summary = "File identification library for Python" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, @@ -1016,6 +1079,7 @@ version = "3.8" requires_python = ">=3.6" summary = "Internationalized Domain Names in Applications (IDNA)" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, @@ -1027,6 +1091,7 @@ version = "8.4.0" requires_python = ">=3.8" summary = "Read metadata from Python packages" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "typing-extensions>=3.6.4; python_version < \"3.8\"", "zipp>=0.5", @@ -1042,6 +1107,7 @@ version = "6.4.4" requires_python = ">=3.8" summary = "Read resources from Python packages" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "zipp>=3.1.0; python_version < \"3.10\"", ] @@ -1056,6 +1122,7 @@ version = "2.0.0" requires_python = ">=3.7" summary = "brain-dead simple config-ini parsing" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -1067,6 +1134,7 @@ version = "0.7.0" requires_python = ">=3.7" summary = "A library for installing Python wheels." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53"}, {file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"}, @@ -1078,6 +1146,7 @@ version = "6.29.5" requires_python = ">=3.8" summary = "IPython Kernel for Jupyter" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "appnope; platform_system == \"Darwin\"", "comm>=0.1.1", @@ -1104,6 +1173,7 @@ version = "8.27.0" requires_python = ">=3.10" summary = "IPython: Productive Interactive Computing" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "colorama; sys_platform == \"win32\"", "decorator", @@ -1128,6 +1198,7 @@ version = "20.11.0" requires_python = ">=3.7" summary = "Operations with ISO 8601 durations" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "arrow>=0.15.0", ] @@ -1142,6 +1213,7 @@ version = "3.4.0" requires_python = ">=3.8" summary = "Utility functions for Python class constructs" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "more-itertools", ] @@ -1156,6 +1228,7 @@ version = "6.0.1" requires_python = ">=3.8" summary = "Useful decorators and context managers" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "backports-tarfile; python_version < \"3.12\"", ] @@ -1170,6 +1243,7 @@ version = "4.0.2" requires_python = ">=3.8" summary = "Functools like those found in stdlib" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "more-itertools", ] @@ -1184,6 +1258,7 @@ version = "0.19.1" requires_python = ">=3.6" summary = "An autocompletion tool for Python that can be used for text editors." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "parso<0.9.0,>=0.8.3", ] @@ -1198,7 +1273,7 @@ version = "0.8.0" requires_python = ">=3.7" summary = "Low-level, pure Python DBus protocol wrapper." groups = ["default"] -marker = "sys_platform == \"linux\"" +marker = "sys_platform == \"linux\" and python_full_version ~= \"3.12.5\"" files = [ {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, @@ -1210,6 +1285,7 @@ version = "3.1.4" requires_python = ">=3.7" summary = "A very fast and expressive template engine." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "MarkupSafe>=2.0", ] @@ -1224,6 +1300,7 @@ version = "0.9.25" requires_python = ">=3.8" summary = "A Python implementation of the JSON5 data format." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, @@ -1235,6 +1312,7 @@ version = "3.0.0" requires_python = ">=3.7" summary = "Identify specific nodes in a JSON document (RFC 6901) " groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -1246,6 +1324,7 @@ version = "4.23.0" requires_python = ">=3.8" summary = "An implementation of JSON Schema validation for Python" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "attrs>=22.2.0", "importlib-resources>=1.4.0; python_version < \"3.9\"", @@ -1265,6 +1344,7 @@ version = "2023.12.1" requires_python = ">=3.8" summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "importlib-resources>=1.4.0; python_version < \"3.9\"", "referencing>=0.31.0", @@ -1281,6 +1361,7 @@ extras = ["format-nongpl"] requires_python = ">=3.8" summary = "An implementation of JSON Schema validation for Python" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "fqdn", "idna", @@ -1303,6 +1384,7 @@ version = "8.6.2" requires_python = ">=3.8" summary = "Jupyter protocol implementation and client libraries" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "importlib-metadata>=4.8.3; python_version < \"3.10\"", "jupyter-core!=5.0.*,>=4.12", @@ -1322,6 +1404,7 @@ version = "5.7.2" requires_python = ">=3.8" summary = "Jupyter core package. A base package on which Jupyter projects rely." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "platformdirs>=2.5", "pywin32>=300; sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"", @@ -1338,6 +1421,7 @@ version = "0.10.0" requires_python = ">=3.8" summary = "Jupyter Event System library" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "jsonschema[format-nongpl]>=4.18.0", "python-json-logger>=2.0.4", @@ -1358,6 +1442,7 @@ version = "2.2.5" requires_python = ">=3.8" summary = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "importlib-metadata>=4.8.3; python_version < \"3.10\"", "jupyter-server>=1.1.2", @@ -1373,6 +1458,7 @@ version = "2.14.2" requires_python = ">=3.8" summary = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "anyio>=3.1.0", "argon2-cffi>=21.1", @@ -1405,6 +1491,7 @@ version = "0.5.3" requires_python = ">=3.8" summary = "A Jupyter Server Extension Providing Terminals." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "pywinpty>=2.0.3; os_name == \"nt\"", "terminado>=0.8.3", @@ -1420,6 +1507,7 @@ version = "4.2.5" requires_python = ">=3.8" summary = "JupyterLab computational environment" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "async-lru>=1.0.0", "httpx>=0.25.0", @@ -1449,6 +1537,7 @@ version = "0.3.0" requires_python = ">=3.8" summary = "Pygments theme using JupyterLab CSS variables" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, @@ -1460,6 +1549,7 @@ version = "2.27.3" requires_python = ">=3.8" summary = "A set of server components for JupyterLab and JupyterLab like applications." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "babel>=2.10", "importlib-metadata>=4.8.3; python_version < \"3.10\"", @@ -1481,6 +1571,7 @@ version = "25.3.0" requires_python = ">=3.8" summary = "Store and access your passwords safely." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "SecretStorage>=3.2; sys_platform == \"linux\"", "importlib-metadata>=4.11.4; python_version < \"3.12\"", @@ -1502,6 +1593,7 @@ version = "1.4.6" requires_python = ">=3.8" summary = "A fast implementation of the Cassowary constraint solver" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "kiwisolver-1.4.6-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:979df7e9334f6a3694ee9be8d42817e519ef6d155a16499714d082cf41296852"}, {file = "kiwisolver-1.4.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50c9c6c42bb6ca231626d1182b9128e89c5ce3c64456f811ff0280deb42d7bfe"}, @@ -1528,6 +1620,7 @@ version = "3.0.0" requires_python = ">=3.8" summary = "Python port of markdown-it. Markdown parsing, done right!" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "mdurl~=0.1", ] @@ -1542,6 +1635,7 @@ version = "2.1.5" requires_python = ">=3.7" summary = "Safely add untrusted strings to HTML/XML markup." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, @@ -1562,6 +1656,7 @@ version = "3.8.4" requires_python = ">=3.9" summary = "Python plotting package" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "contourpy>=1.0.1", "cycler>=0.10", @@ -1590,6 +1685,7 @@ version = "0.1.7" requires_python = ">=3.8" summary = "Inline Matplotlib backend for Jupyter" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "traitlets", ] @@ -1604,6 +1700,7 @@ version = "0.1.2" requires_python = ">=3.7" summary = "Markdown URL utilities" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -1615,6 +1712,7 @@ version = "3.0.2" requires_python = ">=3.7" summary = "A sane and fast Markdown parser with useful plugins and renderers" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, @@ -1626,6 +1724,7 @@ version = "10.4.0" requires_python = ">=3.8" summary = "More routines for operating on iterables, beyond itertools" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "more-itertools-10.4.0.tar.gz", hash = "sha256:fe0e63c4ab068eac62410ab05cccca2dc71ec44ba8ef29916a0090df061cf923"}, {file = "more_itertools-10.4.0-py3-none-any.whl", hash = "sha256:0f7d9f83a0a8dcfa8a2694a770590d98a67ea943e3d9f5298309a484758c4e27"}, @@ -1637,6 +1736,7 @@ version = "1.0.8" requires_python = ">=3.8" summary = "MessagePack serializer" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, @@ -1658,6 +1758,7 @@ version = "0.10.0" requires_python = ">=3.8.0" summary = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "jupyter-client>=6.1.12", "jupyter-core!=5.0.*,>=4.12", @@ -1675,6 +1776,7 @@ version = "7.16.4" requires_python = ">=3.8" summary = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "beautifulsoup4", "bleach!=5.0.0", @@ -1704,6 +1806,7 @@ version = "5.10.4" requires_python = ">=3.8" summary = "The Jupyter Notebook format" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "fastjsonschema>=2.15", "jsonschema>=2.6", @@ -1721,6 +1824,7 @@ version = "1.6.0" requires_python = ">=3.5" summary = "Patch asyncio to allow nested event loops" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, @@ -1732,6 +1836,7 @@ version = "1.7.1.post2" requires_python = ">=3.8" summary = "Provides an object-oriented python interface to the netCDF version 4 library" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "certifi", "cftime", @@ -1752,6 +1857,7 @@ version = "1.9.1" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Node.js virtual environment builder" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -1763,6 +1869,7 @@ version = "0.2.4" requires_python = ">=3.7" summary = "A shim layer for notebook traits and config" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "jupyter-server<3,>=1.8", ] @@ -1777,6 +1884,7 @@ version = "2.1.1" requires_python = ">=3.10" summary = "Fundamental package for array computing in Python" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "numpy-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e"}, {file = "numpy-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe"}, @@ -1797,6 +1905,7 @@ version = "3.1.5" requires_python = ">=3.8" summary = "A Python library to read/write Excel 2010 xlsx/xlsm files" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "et-xmlfile", ] @@ -1811,6 +1920,7 @@ version = "7.7.0" requires_python = ">=3.6" summary = "A decorator to automatically detect mismatch when overriding a method." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "typing; python_version < \"3.5\"", ] @@ -1825,6 +1935,7 @@ version = "24.1" requires_python = ">=3.8" summary = "Core utilities for Python packages" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, @@ -1836,6 +1947,7 @@ version = "2.2.2" requires_python = ">=3.9" summary = "Powerful data structures for data analysis, time series, and statistics" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "numpy>=1.22.4; python_version < \"3.11\"", "numpy>=1.23.2; python_version == \"3.11\"", @@ -1861,6 +1973,7 @@ version = "1.5.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "Utilities for writing pandoc filters in python" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, @@ -1872,6 +1985,7 @@ version = "0.8.4" requires_python = ">=3.6" summary = "A Python Parser" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -1883,6 +1997,7 @@ version = "0.2.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "Bring colors to your terminal." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, @@ -1894,6 +2009,7 @@ version = "2024.8.14" requires_python = ">=3.8" summary = "Installer for Python Build Standalone" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "pbs_installer-2024.8.14-py3-none-any.whl", hash = "sha256:9ec0c1e689fc956823d45952eb0879c303f411d8f9f315b06ef57138cc794285"}, {file = "pbs_installer-2024.8.14.tar.gz", hash = "sha256:40144b21f04e90c73f1b79601e139d56d540356630fe473842ea439a59dffaee"}, @@ -1905,6 +2021,7 @@ version = "2.18.1" requires_python = ">=3.8" summary = "A modern Python package and dependency manager supporting the latest PEP standards" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "blinker", "dep-logic>=0.4.4", @@ -1940,7 +2057,7 @@ name = "pexpect" version = "4.9.0" summary = "Pexpect allows easy control of interactive console applications." groups = ["default"] -marker = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" +marker = "(sys_platform != \"win32\" and sys_platform != \"emscripten\") and python_full_version ~= \"3.12.5\"" dependencies = [ "ptyprocess>=0.5", ] @@ -1955,6 +2072,7 @@ version = "10.4.0" requires_python = ">=3.8" summary = "Python Imaging Library (Fork)" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, @@ -1976,6 +2094,7 @@ version = "1.11.1" requires_python = ">=3.8" summary = "Query metadata from sdists / bdists / installed packages." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "pkginfo-1.11.1-py3-none-any.whl", hash = "sha256:bfa76a714fdfc18a045fcd684dbfc3816b603d9d075febef17cb6582bea29573"}, {file = "pkginfo-1.11.1.tar.gz", hash = "sha256:2e0dca1cf4c8e39644eed32408ea9966ee15e0d324c62ba899a393b3c6b467aa"}, @@ -1987,6 +2106,7 @@ version = "4.2.2" requires_python = ">=3.8" summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, @@ -1998,6 +2118,7 @@ version = "1.5.0" requires_python = ">=3.8" summary = "plugin and hook calling mechanisms for python" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -2009,7 +2130,7 @@ version = "2.5.2" requires_python = ">=3.8" summary = "Multiple dispatch in Python" groups = ["dev"] -marker = "python_version >= \"3.10\"" +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "beartype>=0.16.2", "rich>=10.0", @@ -2026,6 +2147,7 @@ version = "3.8.0" requires_python = ">=3.9" summary = "A framework for managing and maintaining multi-language pre-commit hooks." groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "cfgv>=2.0.0", "identify>=1.0.0", @@ -2044,6 +2166,7 @@ version = "0.20.0" requires_python = ">=3.8" summary = "Python client for the Prometheus monitoring system." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, @@ -2055,6 +2178,7 @@ version = "3.0.47" requires_python = ">=3.7.0" summary = "Library for building powerful interactive command lines in Python" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "wcwidth", ] @@ -2069,6 +2193,7 @@ version = "6.0.0" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" summary = "Cross-platform lib for process and system monitoring in Python." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, @@ -2085,7 +2210,7 @@ name = "ptyprocess" version = "0.7.0" summary = "Run a subprocess in a pseudo terminal" groups = ["default"] -marker = "sys_platform != \"win32\" and sys_platform != \"emscripten\" or os_name != \"nt\"" +marker = "(sys_platform != \"win32\" and sys_platform != \"emscripten\") and python_full_version ~= \"3.12.5\" or os_name != \"nt\" and python_full_version ~= \"3.12.5\"" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -2096,6 +2221,7 @@ name = "pure-eval" version = "0.2.3" summary = "Safely evaluate AST nodes without side effects" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, @@ -2107,6 +2233,7 @@ version = "2.22" requires_python = ">=3.8" summary = "C parser in Python" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -2118,6 +2245,7 @@ version = "2.8.2" requires_python = ">=3.8" summary = "Data validation using Python type hints" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "annotated-types>=0.4.0", "pydantic-core==2.20.1", @@ -2135,6 +2263,7 @@ version = "2.20.1" requires_python = ">=3.8" summary = "Core functionality for Pydantic validation and serialization" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "typing-extensions!=4.7.0,>=4.6.0", ] @@ -2160,6 +2289,7 @@ version = "2.18.0" requires_python = ">=3.8" summary = "Pygments is a syntax highlighting package written in Python." groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, @@ -2170,6 +2300,7 @@ name = "pylev" version = "1.4.0" summary = "A pure Python Levenshtein implementation that's not freaking GPL'd." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, @@ -2181,6 +2312,7 @@ version = "0.9.0" requires_python = ">=3.8" summary = "Vectorized spatial vector file format I/O using GDAL/OGR" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "certifi", "numpy", @@ -2201,6 +2333,7 @@ version = "3.1.4" requires_python = ">=3.6.8" summary = "pyparsing module - Classes and methods to define and execute parsing grammars" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, @@ -2212,6 +2345,7 @@ version = "3.6.1" requires_python = ">=3.9" summary = "Python interface to PROJ (cartographic projections and coordinate transformations library)" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "certifi", ] @@ -2231,6 +2365,7 @@ version = "1.1.0" requires_python = ">=3.7" summary = "Wrappers to call pyproject.toml-based build backend hooks." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "pyproject_hooks-1.1.0-py3-none-any.whl", hash = "sha256:7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2"}, {file = "pyproject_hooks-1.1.0.tar.gz", hash = "sha256:4b37730834edbd6bd37f26ece6b44802fb1c1ee2ece0e54ddff8bfc06db86965"}, @@ -2242,6 +2377,7 @@ version = "8.3.2" requires_python = ">=3.8" summary = "pytest: simple powerful testing with Python" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "colorama; sys_platform == \"win32\"", "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", @@ -2261,6 +2397,7 @@ version = "4.1.0" requires_python = ">=3.7" summary = "Pytest plugin for measuring coverage." groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "coverage[toml]>=5.2.1", "pytest>=4.6", @@ -2275,6 +2412,7 @@ name = "pytest-sugar" version = "1.0.0" summary = "pytest-sugar is a plugin for pytest that changes the default look and feel of pytest (e.g. progressbar, show tests that fail instantly)." groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "packaging>=21.3", "pytest>=6.2.0", @@ -2291,6 +2429,7 @@ version = "3.6.1" requires_python = ">=3.8" summary = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "execnet>=2.1", "pytest>=7.0.0", @@ -2306,6 +2445,7 @@ version = "2.9.0.post0" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" summary = "Extensions to the standard Python datetime module" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "six>=1.5", ] @@ -2320,6 +2460,7 @@ version = "1.0.1" requires_python = ">=3.8" summary = "Read key-value pairs from a .env file and set them as environment variables" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -2331,6 +2472,7 @@ version = "2.0.7" requires_python = ">=3.6" summary = "A python library adding a json log formatter" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, @@ -2341,6 +2483,7 @@ name = "pytz" version = "2024.1" summary = "World timezone definitions, modern and historical" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, @@ -2351,7 +2494,7 @@ name = "pywin32" version = "306" summary = "Python for Window Extensions" groups = ["default"] -marker = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" +marker = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\" and python_full_version ~= \"3.12.5\"" files = [ {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, @@ -2364,7 +2507,7 @@ version = "0.2.3" requires_python = ">=3.6" summary = "A (partial) reimplementation of pywin32 using ctypes/cffi" groups = ["default"] -marker = "sys_platform == \"win32\"" +marker = "sys_platform == \"win32\" and python_full_version ~= \"3.12.5\"" files = [ {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, @@ -2376,7 +2519,7 @@ version = "2.0.13" requires_python = ">=3.8" summary = "Pseudo terminal support for Windows from Python." groups = ["default"] -marker = "os_name == \"nt\"" +marker = "os_name == \"nt\" and python_full_version ~= \"3.12.5\"" files = [ {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, @@ -2388,6 +2531,7 @@ version = "6.0.2" requires_python = ">=3.8" summary = "YAML parser and emitter for Python" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, @@ -2407,6 +2551,7 @@ version = "26.2.0" requires_python = ">=3.7" summary = "Python bindings for 0MQ" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "cffi; implementation_name == \"pypy\"", ] @@ -2432,6 +2577,7 @@ version = "0.7.6" requires_python = ">=3.9" summary = "Generate API documentation with Quarto." groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "click", "griffe>=0.33", @@ -2458,6 +2604,7 @@ version = "1.4b1" requires_python = ">=3.9" summary = "Fast and direct raster I/O for use with Numpy and SciPy" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "affine", "attrs", @@ -2483,6 +2630,7 @@ version = "0.35.1" requires_python = ">=3.8" summary = "JSON Referencing + Python" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "attrs>=22.2.0", "rpds-py>=0.7.0", @@ -2498,6 +2646,7 @@ version = "2.32.3" requires_python = ">=3.8" summary = "Python HTTP for Humans." groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "certifi>=2017.4.17", "charset-normalizer<4,>=2", @@ -2514,6 +2663,7 @@ name = "resolvelib" version = "1.0.1" summary = "Resolve abstract dependencies into concrete ones" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf"}, {file = "resolvelib-1.0.1.tar.gz", hash = "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309"}, @@ -2525,6 +2675,7 @@ version = "0.1.4" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "A pure python RFC3339 validator" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "six", ] @@ -2539,6 +2690,7 @@ version = "0.1.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "Pure python rfc3986 validator" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, @@ -2550,6 +2702,7 @@ version = "13.8.0" requires_python = ">=3.7.0" summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "markdown-it-py>=2.2.0", "pygments<3.0.0,>=2.13.0", @@ -2566,6 +2719,7 @@ version = "0.17.0" requires_python = ">=3.10" summary = "geospatial xarray extension powered by rasterio" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "numpy>=1.23", "packaging", @@ -2584,6 +2738,7 @@ version = "0.20.0" requires_python = ">=3.8" summary = "Python bindings to Rust's persistent data structures (rpds)" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, @@ -2607,6 +2762,7 @@ version = "0.18.6" requires_python = ">=3.7" summary = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "ruamel-yaml-clib>=0.2.7; platform_python_implementation == \"CPython\" and python_version < \"3.13\"", ] @@ -2621,7 +2777,7 @@ version = "0.2.8" requires_python = ">=3.6" summary = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" groups = ["default"] -marker = "platform_python_implementation == \"CPython\" and python_version < \"3.13\"" +marker = "platform_python_implementation == \"CPython\" and python_full_version ~= \"3.12.5\"" files = [ {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, @@ -2640,6 +2796,7 @@ version = "1.13.1" requires_python = ">=3.9" summary = "Fundamental algorithms for scientific computing in Python" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "numpy<2.3,>=1.22.4", ] @@ -2659,6 +2816,7 @@ version = "0.13.2" requires_python = ">=3.8" summary = "Statistical data visualization" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "matplotlib!=3.6.1,>=3.4", "numpy!=1.24.0,>=1.20", @@ -2675,7 +2833,7 @@ version = "3.3.3" requires_python = ">=3.6" summary = "Python bindings to FreeDesktop.org Secret Service API" groups = ["default"] -marker = "sys_platform == \"linux\"" +marker = "sys_platform == \"linux\" and python_full_version ~= \"3.12.5\"" dependencies = [ "cryptography>=2.0", "jeepney>=0.6", @@ -2691,6 +2849,7 @@ version = "1.8.3" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" summary = "Send file to trash natively under Mac OS X, Windows and Linux" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, @@ -2702,6 +2861,7 @@ version = "74.1.1" requires_python = ">=3.8" summary = "Easily download, build, install, upgrade, and uninstall Python packages" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "setuptools-74.1.1-py3-none-any.whl", hash = "sha256:fc91b5f89e392ef5b77fe143b17e32f65d3024744fba66dc3afe07201684d766"}, {file = "setuptools-74.1.1.tar.gz", hash = "sha256:2353af060c06388be1cecbf5953dcdb1f38362f87a2356c480b6b4d5fcfc8847"}, @@ -2713,6 +2873,7 @@ version = "2.0.6" requires_python = ">=3.7" summary = "Manipulation and analysis of geometric objects" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "numpy<3,>=1.14", ] @@ -2732,6 +2893,7 @@ version = "1.5.4" requires_python = ">=3.7" summary = "Tool to Detect Surrounding Shell" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, @@ -2743,6 +2905,7 @@ version = "1.16.0" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" summary = "Python 2 and 3 compatibility utilities" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -2754,6 +2917,7 @@ version = "5.0.1" requires_python = ">=3.7" summary = "A pure Python implementation of a sliding window memory map manager" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, @@ -2765,6 +2929,7 @@ version = "1.3.1" requires_python = ">=3.7" summary = "Sniff out which async library your code is running under" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -2776,6 +2941,7 @@ version = "1.0.0" requires_python = ">=3.6" summary = "Sans-I/O implementation of SOCKS4, SOCKS4A, and SOCKS5." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "socksio-1.0.0-py3-none-any.whl", hash = "sha256:95dc1f15f9b34e8d7b16f06d74b8ccf48f609af32ab33c608d08761c5dcbb1f3"}, {file = "socksio-1.0.0.tar.gz", hash = "sha256:f88beb3da5b5c38b9890469de67d0cb0f9d494b78b106ca1845f96c10b91c4ac"}, @@ -2787,6 +2953,7 @@ version = "2.6" requires_python = ">=3.8" summary = "A modern CSS selector implementation for Beautiful Soup." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, @@ -2798,6 +2965,7 @@ version = "2.3.1.1" requires_python = ">=3.8" summary = "Sphinx objects.inv Inspection/Manipulation Tool" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "attrs>=19.2", "certifi", @@ -2813,6 +2981,7 @@ name = "stack-data" version = "0.6.3" summary = "Extract data from python stack frames and tracebacks for informative displays" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "asttokens>=2.1.0", "executing>=1.2.0", @@ -2829,6 +2998,7 @@ version = "1.1.1" requires_python = ">=3.6,<4.0" summary = "Simple and safe python wrapper for calling system rsync" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "toml<0.11.0,>=0.10.0", ] @@ -2843,6 +3013,7 @@ version = "0.9.0" requires_python = ">=3.7" summary = "Pretty-print tabular data" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, @@ -2854,6 +3025,7 @@ version = "2.4.0" requires_python = ">=3.8" summary = "ANSI color formatting for output in terminal" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, @@ -2865,6 +3037,7 @@ version = "0.18.1" requires_python = ">=3.8" summary = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "ptyprocess; os_name != \"nt\"", "pywinpty>=1.1.0; os_name == \"nt\"", @@ -2881,6 +3054,7 @@ version = "1.3.0" requires_python = ">=3.8" summary = "A tiny CSS parser" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "webencodings>=0.4", ] @@ -2895,6 +3069,7 @@ version = "0.10.2" requires_python = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" summary = "Python Library for Tom's Obvious, Minimal Language" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -2906,6 +3081,7 @@ version = "0.13.2" requires_python = ">=3.8" summary = "Style preserving TOML library" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, @@ -2917,6 +3093,7 @@ version = "0.12.1" requires_python = ">=3.7" summary = "List processing tools and functional utilities" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, @@ -2928,6 +3105,7 @@ version = "6.4.1" requires_python = ">=3.8" summary = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, @@ -2948,6 +3126,7 @@ version = "4.66.5" requires_python = ">=3.7" summary = "Fast, Extensible Progress Meter" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "colorama; platform_system == \"Windows\"", ] @@ -2962,6 +3141,7 @@ version = "5.14.3" requires_python = ">=3.8" summary = "Traitlets Python configuration system" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -2973,7 +3153,7 @@ version = "0.9.2" requires_python = ">=3.10" summary = "Verify certificates using native system trust stores" groups = ["default"] -marker = "python_version >= \"3.10\"" +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "truststore-0.9.2-py3-none-any.whl", hash = "sha256:04559916f8810cc1a5ecc41f215eddc988746067b754fc0995da7a2ceaf54735"}, {file = "truststore-0.9.2.tar.gz", hash = "sha256:a1dee0d0575ff22d2875476343783a5d64575419974e228f3248772613c3d993"}, @@ -2985,6 +3165,7 @@ version = "0.12.5" requires_python = ">=3.7" summary = "Typer, build great CLIs. Easy to code. Based on Python type hints." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "click>=8.0.0", "rich>=10.11.0", @@ -3002,6 +3183,7 @@ version = "2.9.0.20240821" requires_python = ">=3.8" summary = "Typing stubs for python-dateutil" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "types-python-dateutil-2.9.0.20240821.tar.gz", hash = "sha256:9649d1dcb6fef1046fb18bebe9ea2aa0028b160918518c34589a46045f6ebd98"}, {file = "types_python_dateutil-2.9.0.20240821-py3-none-any.whl", hash = "sha256:f5889fcb4e63ed4aaa379b44f93c32593d50b9a94c9a60a0c854d8cc3511cd57"}, @@ -3013,6 +3195,7 @@ version = "4.12.2" requires_python = ">=3.8" summary = "Backported and Experimental Type Hints for Python 3.8+" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -3024,6 +3207,7 @@ version = "2024.1" requires_python = ">=2" summary = "Provider of IANA time zone data" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, @@ -3035,6 +3219,7 @@ version = "0.17.2" requires_python = ">=3.8" summary = "A utility to fetch and download python packages" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "httpx<1,>=0.27.0", "packaging>=20", @@ -3050,6 +3235,7 @@ version = "1.3.0" requires_python = ">=3.7" summary = "RFC 6570 URI Template Processor" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, @@ -3061,6 +3247,7 @@ version = "1.26.20" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" summary = "HTTP library with thread-safe connection pooling, file post, and more." groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, @@ -3072,6 +3259,7 @@ version = "20.26.3" requires_python = ">=3.7" summary = "Virtual Python Environment builder" groups = ["default", "dev"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "distlib<1,>=0.3.7", "filelock<4,>=3.12.2", @@ -3089,6 +3277,7 @@ version = "5.0.1" requires_python = ">=3.9" summary = "Filesystem events monitoring" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "watchdog-5.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e321f1561adea30e447130882efe451af519646178d04189d6ba91a8cd7d88a5"}, {file = "watchdog-5.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c4ae0b3e95455fa9d959aa3b253c87845ad454ef188a4bf5a69cab287c131216"}, @@ -3111,6 +3300,7 @@ name = "wcwidth" version = "0.2.13" summary = "Measures the displayed width of unicode strings in a terminal" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "backports-functools-lru-cache>=1.2.1; python_version < \"3.2\"", ] @@ -3125,6 +3315,7 @@ version = "24.8.0" requires_python = ">=3.8" summary = "A library for working with the color formats defined by HTML and CSS." groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "webcolors-24.8.0-py3-none-any.whl", hash = "sha256:fc4c3b59358ada164552084a8ebee637c221e4059267d0f8325b3b560f6c7f0a"}, {file = "webcolors-24.8.0.tar.gz", hash = "sha256:08b07af286a01bcd30d583a7acadf629583d1f79bfef27dd2c2c5c263817277d"}, @@ -3135,6 +3326,7 @@ name = "webencodings" version = "0.5.1" summary = "Character encoding aliases for legacy web content" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, @@ -3146,6 +3338,7 @@ version = "1.8.0" requires_python = ">=3.8" summary = "WebSocket client for Python with low level API options" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, @@ -3157,6 +3350,7 @@ version = "2024.7.0" requires_python = ">=3.9" summary = "N-D labeled arrays and datasets in Python" groups = ["default"] +marker = "python_full_version ~= \"3.12.5\"" dependencies = [ "numpy>=1.23", "packaging>=23.1", @@ -3173,6 +3367,7 @@ version = "3.20.1" requires_python = ">=3.8" summary = "Backport of pathlib-compatible object wrapper for zip files" groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" files = [ {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, diff --git a/python/pyproject.toml b/python/pyproject.toml index 6aa2f82a..7d8cfc82 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -19,7 +19,7 @@ maintainers = [ {name="Dr Griffith Rees", email="grees@turing.ac.uk"}, ] license = {text = "MIT"} -requires-python = "==3.12.*" +requires-python = ">=3.12.5" dependencies = [ "tqdm>=4.66.4", "scipy<1.14", From 9025257dc803fdbfa470d98cac8b0290755d3c2a Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Wed, 4 Sep 2024 09:53:26 +0100 Subject: [PATCH 69/92] feat: add `debug_mode` and filter repeated logs. Improve docs --- python/clim_recal/config.py | 5 +++++ python/clim_recal/utils/xarray.py | 7 ++++++- setup-instructions.md | 25 +++++++++++++++---------- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/python/clim_recal/config.py b/python/clim_recal/config.py index f6d625c7..05b2ae89 100644 --- a/python/clim_recal/config.py +++ b/python/clim_recal/config.py @@ -5,6 +5,7 @@ from pathlib import Path from typing import Any, Final, Sequence, TypedDict +from osgeo import gdal from tqdm import TqdmExperimentalWarning, tqdm from .debiasing.debias_wrapper import BaseRunConfig, RunConfig, RunConfigType @@ -74,6 +75,8 @@ class ClimRecalConfig(BaseRunConfig): A `dict` of parameters to pass to a `CPMResamplerManager`. hads_kwargs A `dict` of parameters to pass to `HADsResamplerManager`. + debug_mode + Set to `True` to add more detailed debug logs, including `GDAL`. Examples -------- @@ -111,6 +114,7 @@ class ClimRecalConfig(BaseRunConfig): add_local_dated_crops_path: bool = True local_dated_results_path_prefix: str = "run" local_dated_crops_path_prefix: str = "crop" + debug_mode: bool = False @property def resample_path(self) -> Path: @@ -211,6 +215,7 @@ def __post_init__(self) -> None: `VariableOptions.cpm_values()`, that occurs within `CPMResamplerManager` for ease of comparability with HADs. """ + gdal.UseExceptions() if self.debug_mode else gdal.DontUseExceptions() self.cpm_manager = CPMResamplerManager( input_paths=self.cpm_input_path, variables=self.variables, diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 5ef28af9..23b653a7 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -1,3 +1,4 @@ +import warnings from datetime import date, datetime, timedelta from logging import getLogger from os import PathLike @@ -159,7 +160,11 @@ def check_xarray_path_and_var_name( ) -> tuple[Dataset, str]: """Check and return a `T_Dataset` instances and included variable name.""" if isinstance(xr_time_series, PathLike): - xr_time_series = open_dataset(xr_time_series, decode_coords="all") + with warnings.catch_warnings(): + # Filter repeating warning such as: + # UserWarning: Variable(s) referenced in bounds not in variables: ['time_bnds'] + warnings.simplefilter(action="once", category=UserWarning) + xr_time_series = open_dataset(xr_time_series, decode_coords="all") try: assert isinstance(xr_time_series, Dataset) except AssertionError: diff --git a/setup-instructions.md b/setup-instructions.md index 5b4c33e9..72f572ad 100644 --- a/setup-instructions.md +++ b/setup-instructions.md @@ -29,21 +29,26 @@ docker compose up jupyter clim-recal --help ``` ::: {.callout-warning} -There are cases where `pdm install` raises a `KeyError: '_PYPROJECT_HOOKS_BUILD_BACKEND'`. Thus far, running `pdm install` again works. +There are cases where `pdm install` raises a +`KeyError: '_PYPROJECT_HOOKS_BUILD_BACKEND'`. Thus far, running `pdm install` +again works. ::: -```console -$ clim-recal --help +# Options + +Once installed the `clim-recal` command can be run with files. The settings +below are specific to a server + +```bash +clim-recal --help Usage: clim-recal [OPTIONS] Crop and align UK climate projections and test debias methods. ╭─ Options ──────────────────────────────────────────────────────────────╮ -│ --hads-input-path -d PATH [default: │ -│ /Volumes/vmfileshar… │ -│ --cpm-input-path -o PATH [default: │ -│ /Volumes/vmfileshar… │ +│ --hads-input-path -d PATH [default: .] │ +│ --cpm-input-path -o PATH [default: .] │ │ --output-path -o DIRECTORY [default: │ │ clim-recal-runs] │ │ --variable -v [tasmax|rainfall|t [default: tasmax] │ @@ -85,18 +90,18 @@ $ clim-recal --help │ --help Show this message │ │ and exit. │ ╰────────────────────────────────────────────────────────────────────────╯ - ``` -# Python +# Conda/Mamba Python ## `Conda` / `Mamba` -At present either `conda` or `mamba` are needed to use `clim-recal`. Installation instructions for these are available: +More detailed examples using `conda` or `mamba` are below. Installation instructions for either these are available: - `conda`: - `mamba`: +These options are primarily to ease use of `GDAL` and optionally `rsync`. ## Running debiasing methods diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index 1e834989..dad0a571 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -15,22 +15,34 @@ import dill as pickle import numpy as np import rioxarray # nopycln: import +from osgeo.gdal import Dataset as GDALDataset from osgeo.gdal import GRA_NearestNeighbour from rich import print from tqdm.rich import trange -from xarray import Dataset, open_dataset +from xarray import Dataset from xarray.core.types import T_Dataset from clim_recal.debiasing.debias_wrapper import VariableOptions from .utils.core import climate_data_mount_path, console, multiprocess_execute -from .utils.data import RegionOptions, RunOptions, VariableOptions +from .utils.data import ( + CPM_END_DATE, + CPM_RAW_X_COLUMN_NAME, + CPM_RAW_Y_COLUMN_NAME, + CPM_START_DATE, + CPM_SUB_PATH, + HADS_END_DATE, + HADS_START_DATE, + HADS_SUB_PATH, + HADS_XDIM, + HADS_YDIM, + RegionOptions, + RunOptions, + VariableOptions, +) from .utils.gdal_formats import TIF_EXTENSION_STR from .utils.xarray import ( BRITISH_NATIONAL_GRID_EPSG, - DEFAULT_RELATIVE_GRID_DATA_PATH, - HADS_RAW_X_COLUMN_NAME, - HADS_RAW_Y_COLUMN_NAME, NETCDF_EXTENSION_STR, ReprojectFuncType, apply_geo_func, @@ -71,19 +83,7 @@ ResamplingCallable = Callable[[list | tuple], int] CPM_STANDARD_CALENDAR_PATH: Final[Path] = Path("cpm-standard-calendar") CPM_SPATIAL_COORDS_PATH: Final[Path] = Path("cpm-to-27700-spatial") -HADS_2_2K_RESOLUTION_PATH: Final[Path] = Path("hads-to-27700-spatial-2.2km") -CPRUK_XDIM: Final[str] = "grid_longitude" -CPRUK_YDIM: Final[str] = "grid_latitude" - -HADS_XDIM: Final[str] = HADS_RAW_X_COLUMN_NAME -HADS_YDIM: Final[str] = HADS_RAW_Y_COLUMN_NAME - - -CPM_START_DATE: Final[date] = date(1980, 12, 1) -CPM_END_DATE: Final[date] = date(2060, 11, 30) - -HADS_START_DATE: Final[date] = date(1980, 1, 1) -HADS_END_DATE: Final[date] = date(2021, 12, 31) +# HADS_2_2K_RESOLUTION_PATH: Final[Path] = Path("hads-to-27700-spatial-2.2km") CPM_OUTPUT_LOCAL_PATH: Final[Path] = Path("cpm") HADS_OUTPUT_LOCAL_PATH: Final[Path] = Path("hads") @@ -108,22 +108,22 @@ def reproject_2_2km_filename(path: Path) -> Path: class ResamblerBase: """Base class to inherit for `HADs` and `CPM`.""" - input_path: PathLike | None = RAW_HADS_TASMAX_PATH - output_path: PathLike = RESAMPLING_OUTPUT_PATH / HADS_OUTPUT_LOCAL_PATH + input_path: PathLike | None = Path() + output_path: PathLike = RESAMPLING_OUTPUT_PATH variable_name: VariableOptions | str = VariableOptions.default() # grid: PathLike | T_Dataset = DEFAULT_RELATIVE_GRID_DATA_PATH input_files: Iterable[PathLike] | None = None cpus: int | None = None crop_regions: tuple[RegionOptions | str, ...] | None = RegionOptions.all() - crop_path: PathLike = RESAMPLING_OUTPUT_PATH / HADS_CROP_OUTPUT_LOCAL_PATH + crop_path: PathLike = RESAMPLING_OUTPUT_PATH final_crs: str = BRITISH_NATIONAL_GRID_EPSG # grid_x_column_name: str = HADS_XDIM # grid_y_column_name: str = HADS_YDIM input_file_extension: NETCDF_OR_TIF = NETCDF_EXTENSION_STR export_file_extension: NETCDF_OR_TIF = NETCDF_EXTENSION_STR - resolution_relative_path: Path = HADS_2_2K_RESOLUTION_PATH - input_file_x_column_name: str = HADS_XDIM - input_file_y_column_name: str = HADS_YDIM + # resolution_relative_path: Path = HADS_2_2K_RESOLUTION_PATH + input_file_x_column_name: str = "" + input_file_y_column_name: str = "" start_index: int = 0 stop_index: int | None = None @@ -197,24 +197,24 @@ def __repr__(self) -> str: f"output_path='{self.output_path}')>" ) - def set_grid(self, new_grid_data_path: PathLike | None = None) -> None: - """Set check and set (if necessary) `grid` attribute of `self`. - - Notes - ----- - To be depricated. - - Parameters - ---------- - new_grid_data_path - New `Path` to load to `self.grid`. - """ - if new_grid_data_path: - self.grid = new_grid_data_path - if isinstance(self.grid, PathLike): - self._grid_path = Path(self.grid) - self.grid = open_dataset(self.grid) - assert isinstance(self.grid, Dataset) + # def set_grid(self, new_grid_data_path: PathLike | None = None) -> None: + # """Set check and set (if necessary) `grid` attribute of `self`. + # + # Notes + # ----- + # To be depricated. + # + # Parameters + # ---------- + # new_grid_data_path + # New `Path` to load to `self.grid`. + # """ + # if new_grid_data_path: + # self.grid = new_grid_data_path + # if isinstance(self.grid, PathLike): + # self._grid_path = Path(self.grid) + # self.grid = open_dataset(self.grid) + # assert isinstance(self.grid, Dataset) def _get_source_path( self, index: int, source_to_index: Sequence | None = None @@ -420,14 +420,10 @@ class HADsResampler(ResamblerBase): `Path` to `HADs` files to process. output `Path` to save processed `HADS` files. - grid_data_path - `Path` to load to `self.grid`. - grid - `Dataset` of grid (either passed via `grid_data_path` or as a parameter). input_files - NCF or TIF files to process with `self.grid` etc. + `Path` or `Paths` of `NCF` files to resample. resampling_func - Function to call on `self.input_files` with `self.grid` + Function to call on `self.input_files`. crop Path or file to spatially crop `input_files` with. final_crs @@ -438,6 +434,11 @@ class HADsResampler(ResamblerBase): Column name in `input_files` or `input` for `y` coordinates. input_file_extension File extensions to glob `input_files` with. + start_index + First index of file to iterate processing from. + stop_index + Last index of files to iterate processing from as a count from `start_index`. + If `None`, this will simply iterate over all available files. Notes ----- @@ -465,9 +466,11 @@ class HADsResampler(ResamblerBase): input_path: PathLike | None = RAW_HADS_TASMAX_PATH output_path: PathLike = RESAMPLING_OUTPUT_PATH / HADS_OUTPUT_LOCAL_PATH - variable_name: VariableOptions = VariableOptions.default() - grid: PathLike | T_Dataset = DEFAULT_RELATIVE_GRID_DATA_PATH + # variable_name: VariableOptions = VariableOptions.default() + # grid: PathLike | T_Dataset = DEFAULT_RELATIVE_GRID_DATA_PATH input_files: Iterable[PathLike] | None = None + + # input_path: PathLike | None = RAW_HADS_TASMAX_PATH cpus: int | None = None crop_path: PathLike = RESAMPLING_OUTPUT_PATH / HADS_CROP_OUTPUT_LOCAL_PATH final_crs: str = BRITISH_NATIONAL_GRID_EPSG @@ -480,7 +483,7 @@ class HADsResampler(ResamblerBase): input_file_y_column_name: str = HADS_YDIM cpm_for_coord_alignment: T_Dataset | PathLike = RAW_CPM_TASMAX_PATH _resample_func: ReprojectFuncType = hads_resample_and_reproject - _use_reference_grid: bool = True + # _use_reference_grid: bool = True def __post_init__(self) -> None: """Ensure `self.cpm_for_coord_alignment` is set.""" @@ -544,16 +547,12 @@ class CPMResampler(ResamblerBase): `Path` to `CPM` files to process. output `Path` to save processed `CPM` files. - grid_data_path - `Path` to load to `self.grid`. - grid - `Dataset` of grid (either passed via `grid_data_path` or as a parameter). input_files - NCF or TIF files to process with `self.grid` etc. + `Path` or `Paths` of `NCF` files to reproject. cpus Number of `cpu` cores to use during multiprocessing. resampling_func - Function to call on `self.input_files` with `self.grid` + Function to call on `self.input_files`. crop Path or file to spatially crop `input_files` with. final_crs @@ -590,8 +589,8 @@ class CPMResampler(ResamblerBase): output_path: PathLike = RESAMPLING_OUTPUT_PATH / CPM_OUTPUT_LOCAL_PATH crop_path: PathLike = RESAMPLING_OUTPUT_PATH / CPM_CROP_OUTPUT_LOCAL_PATH # standard_calendar_relative_path: Path = CPM_STANDARD_CALENDAR_PATH - input_file_x_column_name: str = CPRUK_XDIM - input_file_y_column_name: str = CPRUK_YDIM + input_file_x_column_name: str = CPM_RAW_X_COLUMN_NAME + input_file_y_column_name: str = CPM_RAW_Y_COLUMN_NAME # resolution_relative_path: Path = CPM_SPATIAL_COORDS_PATH _resample_func: ReprojectFuncType = cpm_reproject_with_standard_calendar @@ -658,8 +657,27 @@ class HADsResamplerManager: `Path` or `Paths` to to save processed `CPM` files to. If `Path` will be propagated to match `input_paths`. variables Which `VariableOptions` to include. + crop_regions + `RegionOptions` (like Manchester, Scoltand etc.) to crop results to. + crop_paths + Where to save region crop files. sub_path - `Path` to include at the stem of generating `input_paths`. + `Path` to include at the stem of `input_paths`. + start_index + Index to begin iterating input files for `resampling` or `cropping`. + stop_index + Index to to run from `start_index` to when `resampling` or + `cropping`. If `None`, iterate full list of paths. + start_date + Not yet implemented, but in future from what date to generate start index from. + end_date + Not yet implemented, but in future from what date to generate stop index from. + configs + List of `HADsResampler` instances to iterate `resampling` or `cropping`. + config_default_kwargs + Parameters passed to all running `self.configs`. + resampler_class + `class` to construct all `self.configs` instances with. cpus Number of `cpu` cores to use during multiprocessing. @@ -684,7 +702,7 @@ class HADsResamplerManager: crop_paths: Sequence[PathLike] | PathLike = ( RESAMPLING_OUTPUT_PATH / HADS_CROP_OUTPUT_LOCAL_PATH ) - sub_path: Path = Path("day") + sub_path: Path = HADS_SUB_PATH start_index: int = 0 stop_index: int | None = None start_date: date = HADS_START_DATE @@ -1009,6 +1027,41 @@ def execute_crop_configs( class CPMResamplerManager(HADsResamplerManager): """Class to manage processing CPM resampling. + Attributes + ---------- + input_paths + `Path` or `Paths` to `CPM` files to process. If `Path`, will be propegated with files matching + resample_paths + `Path` or `Paths` to to save processed `CPM` files to. If `Path` will be propagated to match `input_paths`. + variables + Which `VariableOptions` to include. + runs + Which `RunOptions` to include. + crop_regions + `RegionOptions` (like Manchester, Scoltand etc.) to crop results to. + crop_paths + Where to save region crop files. + sub_path + `Path` to include at the stem of `input_paths`. + start_index + Index to begin iterating input files for `resampling` or `cropping`. + stop_index + Index to to run from `start_index` to when `resampling` or + `cropping`. If `None`, iterate full list of paths. + start_date + Not yet implemented, but in future from what date to generate start index from. + end_date + Not yet implemented, but in future from what date to generate stop index from. + configs + List of `HADsResampler` instances to iterate `resampling` or `cropping`. + config_default_kwargs + Parameters passed to all running `self.configs`. + resampler_class + `class` to construct all `self.configs` instances with. + cpus + Number of `cpu` cores to use during multiprocessing. + + Examples -------- >>> if not is_data_mounted: @@ -1042,13 +1095,14 @@ class CPMResamplerManager(HADsResamplerManager): resample_paths: PathLike | Sequence[PathLike] = ( RESAMPLING_OUTPUT_PATH / CPM_OUTPUT_LOCAL_PATH ) - sub_path: Path = Path("latest") + sub_path: Path = CPM_SUB_PATH start_date: date = CPM_START_DATE end_date: date = CPM_END_DATE configs: list[CPMResampler] = field(default_factory=list) resampler_class: type[CPMResampler] = CPMResampler - runs: Sequence[RunOptions] = RunOptions.preferred() - crop_paths: PathLike = RESAMPLING_OUTPUT_PATH / CPM_CROP_OUTPUT_LOCAL_PATH + # Runs are CPM simulations, not applicalbe to HADs + runs: Sequence[RunOptions | str] = RunOptions.preferred() + crop_paths = RESAMPLING_OUTPUT_PATH / CPM_CROP_OUTPUT_LOCAL_PATH # Uncomment if cpm specific paths like 'pr' for 'rainbow' # are needed at the manager level. diff --git a/python/clim_recal/utils/core.py b/python/clim_recal/utils/core.py index 25c1d949..f7028f43 100644 --- a/python/clim_recal/utils/core.py +++ b/python/clim_recal/utils/core.py @@ -134,7 +134,7 @@ def from_year_range_to_str( ) -DEFAULT_START_MONTH_DAY: Final[MonthDay] = MonthDay(month=12, day=1) +DEFAULT_CPM_START_MONTH_DAY: Final[MonthDay] = MonthDay(month=12, day=1) def run_callable_attr( @@ -602,7 +602,7 @@ def annual_data_paths_generator( def annual_data_path( start_year: int = 1980, end_year: int = 1981, - month_day: MonthDay | tuple[int, int] | None = DEFAULT_START_MONTH_DAY, + month_day: MonthDay | tuple[int, int] | None = DEFAULT_CPM_START_MONTH_DAY, include_end_date: bool = False, parent_path: Path | None = None, file_name_middle_str: str = CPM_FILE_NAME_MIDDLE_STR, diff --git a/python/clim_recal/utils/data.py b/python/clim_recal/utils/data.py index b5bed3e5..d129b310 100644 --- a/python/clim_recal/utils/data.py +++ b/python/clim_recal/utils/data.py @@ -11,10 +11,34 @@ from .core import StrEnumReprName +DEFAULT_RESAMPLING_METHOD: Final[Resampling] = Resampling.average + BRITISH_NATION_GRID_COORDS_NUMBER: Final[int] = 27700 BRITISH_NATIONAL_GRID_EPSG: Final[str] = f"EPSG:{BRITISH_NATION_GRID_COORDS_NUMBER}" -DEFAULT_RESAMPLING_METHOD: Final[Resampling] = Resampling.average +HADS_START_DATE: Final[date] = date(1980, 1, 1) +HADS_END_DATE: Final[date] = date(2021, 12, 31) + +CPM_START_DATE: Final[date] = date(1980, 12, 1) +CPM_END_DATE: Final[date] = date(2060, 11, 30) + +HADS_RAW_X_COLUMN_NAME: Final[str] = "projection_x_coordinate" +HADS_RAW_Y_COLUMN_NAME: Final[str] = "projection_y_coordinate" + +HADS_XDIM: Final[str] = HADS_RAW_X_COLUMN_NAME +HADS_YDIM: Final[str] = HADS_RAW_Y_COLUMN_NAME + +HADS_SUB_PATH: Final[Path] = Path("day") + +CPM_RAW_X_COLUMN_NAME: Final[str] = "grid_longitude" +CPM_RAW_Y_COLUMN_NAME: Final[str] = "grid_latitude" + +CPRUK_XDIM: Final[str] = CPM_RAW_X_COLUMN_NAME +CPRUK_YDIM: Final[str] = CPM_RAW_Y_COLUMN_NAME + +CPM_SUB_PATH: Final[Path] = Path("latest") + +CPM_RESOLUTION_METERS: Final[int] = 2200 AuthorshipType = Union[ str | tuple[str, ...], dict[str, str] | @@ -120,9 +144,9 @@ def rioxarry_epsg(self) -> str: DEFAULT_CALENDAR_ALIGN: Final[ConvertCalendarAlignOptions] = "year" NETCDF4_XARRAY_ENGINE: Final[str] = "netcdf4" -DEFAULT_RELATIVE_GRID_DATA_PATH: Final[Path] = ( - Path().absolute() / "../data/rcp85_land-cpm_uk_2.2km_grid.nc" -) +# DEFAULT_RELATIVE_GRID_DATA_PATH: Final[Path] = ( +# Path().absolute() / "../data/rcp85_land-cpm_uk_2.2km_grid.nc" +# ) TIME_COLUMN_NAME: Final[str] = "time" GLASGOW_GEOM_LOCAL_PATH: Final[Path] = Path( diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index ebeee112..8baaeb31 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -11,7 +11,6 @@ import seaborn from cftime._cftime import Datetime360Day from matplotlib import pyplot as plt -from numpy import ndarray from numpy.typing import NDArray from osgeo.gdal import Dataset as GDALDataset from osgeo.gdal import ( @@ -42,13 +41,16 @@ climate_data_mount_path, results_path, ) -from .data import ( +from .data import ( # DEFAULT_RELATIVE_GRID_DATA_PATH, BRITISH_NATIONAL_GRID_EPSG, + CPM_RAW_X_COLUMN_NAME, + CPM_RAW_Y_COLUMN_NAME, DEFAULT_CALENDAR_ALIGN, DEFAULT_INTERPOLATION_METHOD, - DEFAULT_RELATIVE_GRID_DATA_PATH, DEFAULT_RESAMPLING_METHOD, GLASGOW_GEOM_LOCAL_PATH, + HADS_RAW_X_COLUMN_NAME, + HADS_RAW_Y_COLUMN_NAME, NETCDF4_XARRAY_ENGINE, TIME_COLUMN_NAME, BoundingBoxCoords, @@ -80,13 +82,13 @@ # """A `set` of tuples of month and day numbers for `enforce_date_changes`.""" -HADS_RAW_X_COLUMN_NAME: Final[str] = "projection_x_coordinate" -HADS_RAW_Y_COLUMN_NAME: Final[str] = "projection_y_coordinate" +# HADS_RAW_X_COLUMN_NAME: Final[str] = "projection_x_coordinate" +# HADS_RAW_Y_COLUMN_NAME: Final[str] = "projection_y_coordinate" HADS_DROP_VARS_AFTER_PROJECTION: Final[tuple[str, ...]] = ("longitude", "latitude") -CPM_RESOLUTION_METERS: Final[int] = 2200 -CPM_RAW_X_COLUMN_NAME: Final[str] = "grid_longitude" -CPM_RAW_Y_COLUMN_NAME: Final[str] = "grid_latitude" +# CPM_RESOLUTION_METERS: Final[int] = 2200 +# CPM_RAW_X_COLUMN_NAME: Final[str] = "grid_longitude" +# CPM_RAW_Y_COLUMN_NAME: Final[str] = "grid_latitude" # TODO: CHECK IF THESE ARE BACKWARDS FINAL_RESAMPLE_LON_COL: Final[str] = "x" @@ -372,16 +374,16 @@ def xr_reproject_crs( match_xr_time_series = match_xr_time_series_load_func( match_xr_time_series, **match_xr_time_series_load_kwargs ) - if not {x_dim_name, y_dim_name} < match_xr_time_series.dims.keys(): + if not {x_dim_name, y_dim_name} < match_xr_time_series.sizes.keys(): # If dim name # likely x, y indexes from a projection like cpm, need to match logger.debug( f"'x_dim_name': {x_dim_name} and " f"'y_dim_name': {y_dim_name} not in " f"'match_xr_time_series' dims: " - f"{match_xr_time_series.dims.keys()}." + f"{match_xr_time_series.sizes.keys()}." ) - if {"x", "y"} < match_xr_time_series.dims.keys(): + if {"x", "y"} < match_xr_time_series.sizes.keys(): logger.debug( f"Renaming dims: '{x_dim_name}' -> 'x', '{y_dim_name}' -> 'y'" ) @@ -423,96 +425,96 @@ def error_message(method: str) -> str: raise ValueError(error_message(method)) -def interpolate_coords( - xr_time_series: T_Dataset, - variable_name: str, - x_grid: NDArray | None = None, - y_grid: NDArray | None = None, - x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, - y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, - reference_coords: T_Dataset | PathLike = DEFAULT_RELATIVE_GRID_DATA_PATH, - reference_coord_x_column_name: str = HADS_RAW_X_COLUMN_NAME, - reference_coord_y_column_name: str = HADS_RAW_Y_COLUMN_NAME, - method: str = "linear", - engine: XArrayEngineType = NETCDF4_XARRAY_ENGINE, - use_reference_grid: bool = True, - **kwargs, -) -> T_Dataset: - """Reproject `xr_time_series` to `x_resolution`/`y_resolution`. - - Notes - ----- - The `rio.reproject` approach commented out below raises - `ValueError: IndexVariable objects must be 1-dimensional` - See https://github.com/corteva/rioxarray/discussions/762 - """ - if isinstance(xr_time_series, PathLike | str): - xr_time_series = open_dataset( - xr_time_series, decode_coords="all", engine=engine - ) - - try: - assert isinstance(xr_time_series, Dataset) - except: - ValueError(f"'xr_time_series' must be an 'xr.Dataset' instance.") - - if use_reference_grid or (x_grid is None or y_grid is None): - if isinstance(reference_coords, PathLike | str): - reference_coords = open_dataset( - reference_coords, decode_coords="all", engine=engine - ) - try: - assert isinstance(reference_coords, Dataset) - except: - ValueError(f"'reference_coords' must be an 'xr.Dataset' instance.") - try: - assert reference_coord_x_column_name in reference_coords.coords - assert reference_coord_y_column_name in reference_coords.coords - assert x_coord_column_name in xr_time_series.coords - assert y_coord_column_name in xr_time_series.coords - except AssertionError: - raise ValueError( - f"At least one of\n" - f"'reference_coord_x_column_name': '{reference_coord_x_column_name}'\n" - f"'reference_coord_y_column_name': '{reference_coord_y_column_name}'\n" - f"'x_coord_column_name': '{x_coord_column_name}'\n" - f"'y_coord_column_name': '{y_coord_column_name}'\n" - f"not in 'reference_coords' and/or 'xr_time_series'." - ) - - x_grid = ( - reference_coords[reference_coord_x_column_name].values - if x_grid is None - else x_grid - ) - y_grid = ( - reference_coords[reference_coord_y_column_name].values - if y_grid is None - else y_grid - ) - use_reference_grid = True - - try: - assert isinstance(x_grid, ndarray) - assert isinstance(y_grid, ndarray) - except: - raise ValueError( - f"Both must be 'ndarray' instances.\n" - f"'x_grid': {x_grid}\n'y_grid': {y_grid}" - ) - kwargs[x_coord_column_name] = x_grid - kwargs[y_coord_column_name] = y_grid - reprojected_data_array: T_DataArray = xr_time_series[variable_name].interp( - method=method, **kwargs - ) - - # Ensure original `rio.crs` is kept in returned `Dataset` - if use_reference_grid: - reprojected_data_array.rio.write_crs(reference_coords.rio.crs, inplace=True) - else: - reprojected_data_array.rio.write_crs(xr_time_series.rio.crs, inplace=True) - reprojected: T_Dataset = Dataset({variable_name: reprojected_data_array}) - return reprojected +# def interpolate_coords( +# xr_time_series: T_Dataset, +# variable_name: str, +# x_grid: NDArray | None = None, +# y_grid: NDArray | None = None, +# x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, +# y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, +# reference_coords: T_Dataset | PathLike = DEFAULT_RELATIVE_GRID_DATA_PATH, +# reference_coord_x_column_name: str = HADS_RAW_X_COLUMN_NAME, +# reference_coord_y_column_name: str = HADS_RAW_Y_COLUMN_NAME, +# method: str = "linear", +# engine: XArrayEngineType = NETCDF4_XARRAY_ENGINE, +# use_reference_grid: bool = True, +# **kwargs, +# ) -> T_Dataset: +# """Reproject `xr_time_series` to `x_resolution`/`y_resolution`. +# +# Notes +# ----- +# The `rio.reproject` approach commented out below raises +# `ValueError: IndexVariable objects must be 1-dimensional` +# See https://github.com/corteva/rioxarray/discussions/762 +# """ +# if isinstance(xr_time_series, PathLike | str): +# xr_time_series = open_dataset( +# xr_time_series, decode_coords="all", engine=engine +# ) +# +# try: +# assert isinstance(xr_time_series, Dataset) +# except: +# ValueError(f"'xr_time_series' must be an 'xr.Dataset' instance.") +# +# if use_reference_grid or (x_grid is None or y_grid is None): +# if isinstance(reference_coords, PathLike | str): +# reference_coords = open_dataset( +# reference_coords, decode_coords="all", engine=engine +# ) +# try: +# assert isinstance(reference_coords, Dataset) +# except: +# ValueError(f"'reference_coords' must be an 'xr.Dataset' instance.") +# try: +# assert reference_coord_x_column_name in reference_coords.coords +# assert reference_coord_y_column_name in reference_coords.coords +# assert x_coord_column_name in xr_time_series.coords +# assert y_coord_column_name in xr_time_series.coords +# except AssertionError: +# raise ValueError( +# f"At least one of\n" +# f"'reference_coord_x_column_name': '{reference_coord_x_column_name}'\n" +# f"'reference_coord_y_column_name': '{reference_coord_y_column_name}'\n" +# f"'x_coord_column_name': '{x_coord_column_name}'\n" +# f"'y_coord_column_name': '{y_coord_column_name}'\n" +# f"not in 'reference_coords' and/or 'xr_time_series'." +# ) +# +# x_grid = ( +# reference_coords[reference_coord_x_column_name].values +# if x_grid is None +# else x_grid +# ) +# y_grid = ( +# reference_coords[reference_coord_y_column_name].values +# if y_grid is None +# else y_grid +# ) +# use_reference_grid = True +# +# try: +# assert isinstance(x_grid, ndarray) +# assert isinstance(y_grid, ndarray) +# except: +# raise ValueError( +# f"Both must be 'ndarray' instances.\n" +# f"'x_grid': {x_grid}\n'y_grid': {y_grid}" +# ) +# kwargs[x_coord_column_name] = x_grid +# kwargs[y_coord_column_name] = y_grid +# reprojected_data_array: T_DataArray = xr_time_series[variable_name].interp( +# method=method, **kwargs +# ) +# +# # Ensure original `rio.crs` is kept in returned `Dataset` +# if use_reference_grid: +# reprojected_data_array.rio.write_crs(reference_coords.rio.crs, inplace=True) +# else: +# reprojected_data_array.rio.write_crs(xr_time_series.rio.crs, inplace=True) +# reprojected: T_Dataset = Dataset({variable_name: reprojected_data_array}) +# return reprojected def hads_resample_and_reproject( @@ -524,7 +526,7 @@ def hads_resample_and_reproject( y_dim_name: str = HADS_RAW_Y_COLUMN_NAME, ) -> T_Dataset: """Resample `HADs` `xarray` time series to 2.2km.""" - if isinstance(cpm_to_match, Dataset) and {"x", "y"} < cpm_to_match.dims.keys(): + if isinstance(cpm_to_match, Dataset) and {"x", "y"} < cpm_to_match.sizes.keys(): cpm_to_match_func = None epsg_277000_2_2km: T_Dataset = xr_reproject_crs( hads_xr_time_series, diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 89ab67e5..1d04bdeb 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -1,6 +1,6 @@ from datetime import date from pathlib import Path -from typing import Any, Final +from typing import Final import numpy as np import pytest @@ -10,15 +10,10 @@ from xarray import open_dataset from xarray.core.types import T_DataArray, T_Dataset -from clim_recal.resample import ( +from clim_recal.resample import ( # DEFAULT_RELATIVE_GRID_DATA_PATH, BRITISH_NATIONAL_GRID_EPSG, CPM_CROP_OUTPUT_LOCAL_PATH, - CPRUK_XDIM, - CPRUK_YDIM, - DEFAULT_RELATIVE_GRID_DATA_PATH, HADS_CROP_OUTPUT_LOCAL_PATH, - HADS_XDIM, - HADS_YDIM, CPMResampler, CPMResamplerManager, HADsResampler, @@ -33,7 +28,7 @@ ) from clim_recal.utils.data import HadUKGrid, UKCPLocalProjections from clim_recal.utils.gdal_formats import NETCDF_EXTENSION_STR -from clim_recal.utils.xarray import ( +from clim_recal.utils.xarray import ( # interpolate_coords, FINAL_RESAMPLE_LAT_COL, FINAL_RESAMPLE_LON_COL, HADS_RAW_X_COLUMN_NAME, @@ -45,7 +40,6 @@ cpm_xarray_to_standard_calendar, file_name_to_start_end_dates, hads_resample_and_reproject, - interpolate_coords, plot_xarray, ) @@ -146,9 +140,9 @@ ) -@pytest.fixture(scope="session") -def reference_final_coord_grid() -> T_Dataset: - return open_dataset(DEFAULT_RELATIVE_GRID_DATA_PATH, decode_coords="all") +# @pytest.fixture(scope="session") +# def reference_final_coord_grid() -> T_Dataset: +# return open_dataset(DEFAULT_RELATIVE_GRID_DATA_PATH, decode_coords="all") @pytest.fixture @@ -664,69 +658,69 @@ def test_hads_manager( ) -@pytest.mark.localcache -@pytest.mark.mount -@pytest.mark.slow -@pytest.mark.parametrize("data_type", ("hads", "cpm")) -@pytest.mark.parametrize("use_reference_grid", (True, False)) -def test_interpolate_coords( - data_type: str, - reference_final_coord_grid: T_Dataset, - tasmax_cpm_1980_raw: T_Dataset, - tasmax_hads_1980_raw: T_Dataset, - use_reference_grid: bool, -) -> None: - """Test reprojecting raw spatial files. - - Notes - ----- - Still seems to run even when `-m "not mount"` is specified. - """ - reprojected_xr_time_series: T_Dataset - kwargs: dict[str, Any] = dict( - variable_name="tasmax", - x_grid=reference_final_coord_grid.projection_x_coordinate.values, - y_grid=reference_final_coord_grid.projection_y_coordinate.values, - ) - x_col_name: str = HADS_XDIM - y_col_name: str = HADS_YDIM - if data_type == "hads": - reprojected_xr_time_series = interpolate_coords( - tasmax_hads_1980_raw, - x_coord_column_name=x_col_name, - y_coord_column_name=y_col_name, - use_reference_grid=use_reference_grid, - **kwargs, - ) - assert reprojected_xr_time_series.dims["time"] == 31 - assert_allclose( - reprojected_xr_time_series.tasmax[10][430][200:210], - FINAL_HADS_JAN_10_430_X_200_210_Y, - ) - if use_reference_grid: - assert reprojected_xr_time_series.rio.crs == BRITISH_NATIONAL_GRID_EPSG - else: - assert reprojected_xr_time_series.rio.crs == tasmax_hads_1980_raw.rio.crs - else: - x_col_name = CPRUK_XDIM - y_col_name = CPRUK_YDIM - # We are now using gdal_warp_wrapper. See test_cpm_warp_steps - reprojected_xr_time_series = interpolate_coords( - tasmax_cpm_1980_raw, - x_coord_column_name=x_col_name, - y_coord_column_name=y_col_name, - use_reference_grid=use_reference_grid, - **kwargs, - ) - # Note: this test is to a raw file without 365 day projection - assert reprojected_xr_time_series.dims["time"] == 360 - assert np.isnan(reprojected_xr_time_series.tasmax[0][10][5][:10].values).all() - if use_reference_grid: - assert reprojected_xr_time_series.rio.crs == BRITISH_NATIONAL_GRID_EPSG - else: - assert reprojected_xr_time_series.rio.crs == tasmax_cpm_1980_raw.rio.crs - assert reprojected_xr_time_series.dims[x_col_name] == 528 - assert reprojected_xr_time_series.dims[y_col_name] == 651 +# @pytest.mark.localcache +# @pytest.mark.mount +# @pytest.mark.slow +# @pytest.mark.parametrize("data_type", ("hads", "cpm")) +# @pytest.mark.parametrize("use_reference_grid", (True, False)) +# def test_interpolate_coords( +# data_type: str, +# reference_final_coord_grid: T_Dataset, +# tasmax_cpm_1980_raw: T_Dataset, +# tasmax_hads_1980_raw: T_Dataset, +# use_reference_grid: bool, +# ) -> None: +# """Test reprojecting raw spatial files. +# +# Notes +# ----- +# Still seems to run even when `-m "not mount"` is specified. +# """ +# reprojected_xr_time_series: T_Dataset +# kwargs: dict[str, Any] = dict( +# variable_name="tasmax", +# x_grid=reference_final_coord_grid.projection_x_coordinate.values, +# y_grid=reference_final_coord_grid.projection_y_coordinate.values, +# ) +# x_col_name: str = HADS_XDIM +# y_col_name: str = HADS_YDIM +# if data_type == "hads": +# reprojected_xr_time_series = interpolate_coords( +# tasmax_hads_1980_raw, +# x_coord_column_name=x_col_name, +# y_coord_column_name=y_col_name, +# use_reference_grid=use_reference_grid, +# **kwargs, +# ) +# assert reprojected_xr_time_series.dims["time"] == 31 +# assert_allclose( +# reprojected_xr_time_series.tasmax[10][430][200:210], +# FINAL_HADS_JAN_10_430_X_200_210_Y, +# ) +# if use_reference_grid: +# assert reprojected_xr_time_series.rio.crs == BRITISH_NATIONAL_GRID_EPSG +# else: +# assert reprojected_xr_time_series.rio.crs == tasmax_hads_1980_raw.rio.crs +# else: +# x_col_name = CPRUK_XDIM +# y_col_name = CPRUK_YDIM +# # We are now using gdal_warp_wrapper. See test_cpm_warp_steps +# reprojected_xr_time_series = interpolate_coords( +# tasmax_cpm_1980_raw, +# x_coord_column_name=x_col_name, +# y_coord_column_name=y_col_name, +# use_reference_grid=use_reference_grid, +# **kwargs, +# ) +# # Note: this test is to a raw file without 365 day projection +# assert reprojected_xr_time_series.dims["time"] == 360 +# assert np.isnan(reprojected_xr_time_series.tasmax[0][10][5][:10].values).all() +# if use_reference_grid: +# assert reprojected_xr_time_series.rio.crs == BRITISH_NATIONAL_GRID_EPSG +# else: +# assert reprojected_xr_time_series.rio.crs == tasmax_cpm_1980_raw.rio.crs +# assert reprojected_xr_time_series.dims[x_col_name] == 528 +# assert reprojected_xr_time_series.dims[y_col_name] == 651 @pytest.mark.slow From 6bc346682f9af9887638ed2fabc771b6701d0e9d Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Fri, 6 Sep 2024 00:30:10 +0100 Subject: [PATCH 78/92] feat: automate `cpm_for_coord_alignment` reuse for `hads` --- python/clim_recal/resample.py | 523 ++++++++++++++++++++++++++---- python/clim_recal/utils/xarray.py | 23 ++ 2 files changed, 476 insertions(+), 70 deletions(-) diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index dad0a571..335a79f2 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -48,6 +48,7 @@ apply_geo_func, cpm_reproject_with_standard_calendar, crop_xarray, + get_cpm_for_coord_alignment, hads_resample_and_reproject, ) @@ -439,6 +440,8 @@ class HADsResampler(ResamblerBase): stop_index Last index of files to iterate processing from as a count from `start_index`. If `None`, this will simply iterate over all available files. + cpm_for_coord_alignment + `CPM` `Path` or `Dataset` to match alignment with. Notes ----- @@ -488,17 +491,31 @@ class HADsResampler(ResamblerBase): def __post_init__(self) -> None: """Ensure `self.cpm_for_coord_alignment` is set.""" super().__post_init__() - if Path(self.cpm_for_coord_alignment).is_dir(): - self.cpm_for_coord_alignment = next( - Path(self.cpm_for_coord_alignment).glob("t*.nc") - ) - self.cpm_for_coord_alignment = cpm_reproject_with_standard_calendar( + self.set_cpm_for_coord_alignment() + # cpm_match_variable_name: str = self.cpm_for_coord_alignment + + def set_cpm_for_coord_alignment(self) -> None: + """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" + self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( self.cpm_for_coord_alignment ) - logger.info( - f"Set 'self.cpm_for_coord_alignment' to: '{self.cpm_for_coord_alignment}'" - ) - # cpm_match_variable_name: str = self.cpm_for_coord_alignment + # if isinstance(self.cpm_for_coord_alignment, PathLike): + # if Path(self.cpm_for_coord_alignment).is_dir(): + # self.cpm_for_coord_alignment = next( + # Path(self.cpm_for_coord_alignment).glob("t*.nc") + # ) + # self.cpm_for_coord_alignment = cpm_reproject_with_standard_calendar( + # self.cpm_for_coord_alignment + # ) + # logger.info( + # f"Set 'self.cpm_for_coord_alignment' to: '{self.cpm_for_coord_alignment}'" + # ) + # try: + # assert isinstance(self.cpm_for_coord_alignment, Dataset) + # except AssertionError: + # raise AttributeError( + # f"'cpm_for_coord_alignment' must be a 'Dataset'. " + # f"Currently a {type(self.cpm_for_coord_alignment)} in {self}.") def to_reprojection( self, @@ -646,70 +663,22 @@ def __getstate__(self): @dataclass(kw_only=True) -class HADsResamplerManager: - """Class to manage processing HADs resampling. - - Attributes - ---------- - input_paths - `Path` or `Paths` to `CPM` files to process. If `Path`, will be propegated with files matching - resample_paths - `Path` or `Paths` to to save processed `CPM` files to. If `Path` will be propagated to match `input_paths`. - variables - Which `VariableOptions` to include. - crop_regions - `RegionOptions` (like Manchester, Scoltand etc.) to crop results to. - crop_paths - Where to save region crop files. - sub_path - `Path` to include at the stem of `input_paths`. - start_index - Index to begin iterating input files for `resampling` or `cropping`. - stop_index - Index to to run from `start_index` to when `resampling` or - `cropping`. If `None`, iterate full list of paths. - start_date - Not yet implemented, but in future from what date to generate start index from. - end_date - Not yet implemented, but in future from what date to generate stop index from. - configs - List of `HADsResampler` instances to iterate `resampling` or `cropping`. - config_default_kwargs - Parameters passed to all running `self.configs`. - resampler_class - `class` to construct all `self.configs` instances with. - cpus - Number of `cpu` cores to use during multiprocessing. +class ResamblerManagerBase: + """Base class to inherit for `HADs` and `CPM` resampler managers.""" - Examples - -------- - >>> if not is_data_mounted: - ... pytest.skip(mount_doctest_skip_message) - >>> hads_resampler_manager: HADsResamplerManager = HADsResamplerManager( - ... variables=VariableOptions.all(), - ... resample_paths=resample_test_hads_output_path, - ... ) - >>> hads_resampler_manager - - """ - - input_paths: PathLike | Sequence[PathLike] = RAW_HADS_PATH - resample_paths: PathLike | Sequence[PathLike] = ( - RESAMPLING_OUTPUT_PATH / HADS_OUTPUT_LOCAL_PATH - ) + input_paths: PathLike | Sequence[PathLike] = Path() + resample_paths: PathLike | Sequence[PathLike] = Path() variables: Sequence[VariableOptions | str] = (VariableOptions.default(),) crop_regions: tuple[RegionOptions | str, ...] | None = RegionOptions.all() - crop_paths: Sequence[PathLike] | PathLike = ( - RESAMPLING_OUTPUT_PATH / HADS_CROP_OUTPUT_LOCAL_PATH - ) - sub_path: Path = HADS_SUB_PATH + crop_paths: Sequence[PathLike] | PathLike = Path() + sub_path: Path = Path() start_index: int = 0 stop_index: int | None = None - start_date: date = HADS_START_DATE - end_date: date = HADS_END_DATE - configs: list[HADsResampler] = field(default_factory=list) + start_date: date | None = None + end_date: date | None = None + configs: list[HADsResampler | CPMResampler] = field(default_factory=list) config_default_kwargs: dict[str, Any] = field(default_factory=dict) - resampler_class: type[HADsResampler] = HADsResampler + resampler_class: type[HADsResampler | CPMResampler] | None = None cpus: int | None = None _input_path_dict: dict[Path, str] = field(default_factory=dict) _resampled_path_dict: dict[PathLike, VariableOptions | str] = field( @@ -734,6 +703,7 @@ def __post_init__(self) -> None: self.total_cpus: int | None = cpu_count() if not self.cpus: self.cpus = 1 if not self.total_cpus else self.total_cpus + self.cpm_for_coord_alignment: T_Dataset | PathLike = RAW_CPM_TASMAX_PATH @property def input_folder(self) -> Path | None: @@ -887,7 +857,7 @@ def set_resample_paths(self): ) ) - def set_crop_paths(self): + def set_crop_paths(self) -> None: """Propagate `self.resample_paths` if needed.""" if isinstance(self.crop_paths, PathLike): self._crop_path = self.crop_paths @@ -1024,7 +994,420 @@ def execute_crop_configs( @dataclass(kw_only=True, repr=False) -class CPMResamplerManager(HADsResamplerManager): +class HADsResamplerManager(ResamblerManagerBase): + """Class to manage processing HADs resampling. + + Attributes + ---------- + input_paths + `Path` or `Paths` to `CPM` files to process. If `Path`, will be propegated with files matching + resample_paths + `Path` or `Paths` to to save processed `CPM` files to. If `Path` will be propagated to match `input_paths`. + variables + Which `VariableOptions` to include. + crop_regions + `RegionOptions` (like Manchester, Scotland etc.) to crop results to. + crop_paths + Where to save region crop files. + sub_path + `Path` to include at the stem of `input_paths`. + start_index + Index to begin iterating input files for `resampling` or `cropping`. + stop_index + Index to to run from `start_index` to when `resampling` or + `cropping`. If `None`, iterate full list of paths. + start_date + Not yet implemented, but in future from what date to generate start index from. + end_date + Not yet implemented, but in future from what date to generate stop index from. + configs + List of `HADsResampler` instances to iterate `resampling` or `cropping`. + config_default_kwargs + Parameters passed to all running `self.configs`. + resampler_class + `class` to construct all `self.configs` instances with. + cpus + Number of `cpu` cores to use during multiprocessing. + cpm_for_coord_alignment + `CPM` `Path` or `Dataset` to match alignment with. + + Examples + -------- + >>> if not is_data_mounted: + ... pytest.skip(mount_doctest_skip_message) + >>> hads_resampler_manager: HADsResamplerManager = HADsResamplerManager( + ... variables=VariableOptions.all(), + ... resample_paths=resample_test_hads_output_path, + ... ) + >>> hads_resampler_manager + + """ + + input_paths: PathLike | Sequence[PathLike] = RAW_HADS_PATH + resample_paths: PathLike | Sequence[PathLike] = ( + RESAMPLING_OUTPUT_PATH / HADS_OUTPUT_LOCAL_PATH + ) + # variables: Sequence[VariableOptions | str] = (VariableOptions.default(),) + # crop_regions: tuple[RegionOptions | str, ...] | None = RegionOptions.all() + crop_paths: Sequence[PathLike] | PathLike = ( + RESAMPLING_OUTPUT_PATH / HADS_CROP_OUTPUT_LOCAL_PATH + ) + sub_path: Path = HADS_SUB_PATH + # start_index: int = 0 + # stop_index: int | None = None + start_date: date = HADS_START_DATE + end_date: date = HADS_END_DATE + configs: list[HADsResampler] = field(default_factory=list) + config_default_kwargs: dict[str, Any] = field(default_factory=dict) + resampler_class: type[HADsResampler] = HADsResampler + cpm_for_coord_alignment: T_Dataset | PathLike = RAW_CPM_TASMAX_PATH + # cpus: int | None = None + # _input_path_dict: dict[Path, str] = field(default_factory=dict) + # _resampled_path_dict: dict[PathLike, VariableOptions | str] = field( + # default_factory=dict + # ) + # _cropped_path_dict: dict[PathLike, VariableOptions | str] = field( + # default_factory=dict + # ) + # _strict_fail_if_var_in_input_path: bool = True + # _allow_check_fail: bool = False + + # class VarirableInBaseImportPathError(Exception): + # """Checking import path validity for `self.variables`.""" + # pass + # + # def __post_init__(self) -> None: + # """Populate config attributes.""" + # if not self.crop_regions: + # self.crop_regions = () + # self.check_paths() + # self.total_cpus: int | None = cpu_count() + # if not self.cpus: + # self.cpus = 1 if not self.total_cpus else self.total_cpus + # self.cpm_for_coord_alignment: T_Dataset | PathLike = RAW_CPM_TASMAX_PATH + # + # @property + # def input_folder(self) -> Path | None: + # """Return `self._input_path` set by `set_input_paths()`.""" + # if hasattr(self, "_input_path"): + # return Path(self._input_path) + # else: + # return None + # + # @property + # def resample_folder(self) -> Path | None: + # """Return `self._output_path` set by `set_resample_paths()`.""" + # if hasattr(self, "_input_path"): + # return Path(self._input_path) + # else: + # return None + # + # @property + # def crop_folder(self) -> Path | None: + # """Return `self._output_path` set by `set_resample_paths()`.""" + # if hasattr(self, "_crop_path"): + # return Path(self._crop_path) + # else: + # return None + # + def __repr__(self) -> str: + """Summary of `self` configuration as a `str`.""" + return ( + f"<{self.__class__.__name__}(" + f"variables_count={len(self.variables)}, " + f"input_paths_count={len(self.input_paths) if isinstance(self.input_paths, Sequence) else 1})>" + ) + + def __post_init__(self) -> None: + """Ensure `self.cpm_for_coord_alignment` is set.""" + super().__post_init__() + self.set_cpm_for_coord_alignment() + + def set_cpm_for_coord_alignment(self) -> None: + """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" + self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( + self.cpm_for_coord_alignment + ) + + def yield_configs(self) -> Iterable[HADsResampler]: + """Generate a `CPMResampler` or `HADsResampler` for `self.input_paths`.""" + self.check_paths() + assert isinstance(self.resample_paths, Iterable) + # assert isinstance(self.crop_paths, Iterable) + for index, var_path in enumerate(self._input_path_dict.items()): + yield self.resampler_class( + input_path=var_path[0], + output_path=self.resample_paths[index], + variable_name=var_path[1], + start_index=self.start_index, + stop_index=self.stop_index, + cpm_for_coord_alignment=self.cpm_for_coord_alignment, + **self.config_default_kwargs, + ) + + # + # # def _gen_input_folder_paths( + # # self, + # # path: PathLike, + # # append_var_path_dict: bool = False, + # # ) -> Iterator[Path]: + # # """Yield input paths of `self.variables` and `self.runs`.""" + # # var_path: Path + # # for var in self.variables: + # # var_path = Path(path) / var / self.sub_path + # # if append_var_path_dict: + # # self._path_dict[var_path] = var + # # yield var_path + # + # def _gen_resample_folder_paths( + # self, + # path: PathLike, + # append_input_path_dict: bool = False, + # append_resampled_path_dict: bool = False, + # ) -> Iterator[tuple[Path, Path]]: + # """Yield paths of resampled `self.variables` and `self.runs`.""" + # for var in self.variables: + # input_path: Path = Path(path) / var / self.sub_path + # resample_path: Path = Path(path) / var + # if append_input_path_dict: + # self._input_path_dict[input_path] = var + # if append_resampled_path_dict: + # self._resampled_path_dict[resample_path] = var + # yield input_path, resample_path + # + # def _gen_crop_folder_paths( + # self, path: PathLike, append_cropped_path_dict: bool = False + # ) -> Iterator[Path | None]: + # """Return a Generator of paths of `self.variables` and `self.crops`.""" + # if not self.crop_regions: + # return None + # if not self._resampled_path_dict: + # self._gen_resample_folder_paths( + # self.input_paths, + # append_input_path_dict=True, + # append_resampled_path_dict=True, + # ) + # for var in self.variables: + # for region in self.crop_regions: + # crop_path = Path(path) / var / region + # if append_cropped_path_dict: + # self._cropped_path_dict[crop_path] = var + # yield crop_path + # + # def check_paths( + # self, run_set_data_paths: bool = True, run_set_crop_paths: bool = True + # ): + # """Check if all `self.input_paths` exist.""" + # + # if run_set_data_paths: + # # self.set_input_paths() + # self.set_resample_paths() + # if run_set_crop_paths: + # self.set_crop_paths() + # assert isinstance(self.input_paths, Iterable) + # assert isinstance(self.resample_paths, Iterable) + # if self.crop_paths: + # try: + # assert isinstance(self.crop_paths, Iterable) + # except AssertionError: + # raise ValueError( + # f"'crop_paths' not iterable for {self}. Hint: try setting 'run_set_crop_paths' to 'True'." + # ) + # assert len(self.input_paths) == len(self.resample_paths) + # for path in self.input_paths: + # try: + # assert Path(path).exists() + # assert Path(path).is_dir() + # except AssertionError: + # message: str = ( + # f"One of 'self.input_paths' in {self} not valid: '{path}'" + # ) + # if self._allow_check_fail: + # logger.error(message) + # else: + # raise FileExistsError(message) + # try: + # assert path in self._input_path_dict + # except: + # NotImplemented( + # f"Syncing `self._input_path_dict` with changes to `self.input_paths`." + # ) + # + # def _set_input_paths(self): + # """Propagate `self.input_paths` if needed.""" + # if isinstance(self.input_paths, PathLike): + # self._input_path = self.input_paths + # self.input_paths = tuple( + # input_path + # for input_path, _ in self._gen_resample_folder_paths( + # self.input_paths, append_input_path_dict=True + # ) + # ) + # if self._strict_fail_if_var_in_input_path: + # for var in self.variables: + # try: + # assert var not in str(self._input_path) + # except AssertionError: + # raise self.VarirableInBaseImportPathError( + # f"Folder named '{var}' in self._input_path: " + # f"'{self._input_path}'. Try passing a parent path or " + # f"set '_strict_fail_if_var_in_input_path' to 'False'." + # ) + # + # def set_resample_paths(self): + # """Propagate `self.resample_paths` if needed.""" + # self._set_input_paths() + # if isinstance(self.resample_paths, PathLike): + # self._output_path = self.resample_paths + # self.resample_paths = tuple( + # resample_path + # for _, resample_path in self._gen_resample_folder_paths( + # self.resample_paths, append_resampled_path_dict=True + # ) + # ) + # + # def set_crop_paths(self): + # """Propagate `self.resample_paths` if needed.""" + # if isinstance(self.crop_paths, PathLike): + # self._crop_path = self.crop_paths + # self.crop_paths = tuple( + # self._gen_crop_folder_paths( + # self.crop_paths, append_cropped_path_dict=True + # ) + # ) + # + # def set_cpm_for_coord_alignment(self) -> None: + # """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" + # self.cpm_for_coord_alignment = get_cpm_for_coord_alignment(self.cpm_for_coord_alignment) + # + # def yield_configs(self) -> Iterable[HADsResampler]: + # """Generate a `CPMResampler` or `HADsResampler` for `self.input_paths`.""" + # self.check_paths() + # assert isinstance(self.resample_paths, Iterable) + # # assert isinstance(self.crop_paths, Iterable) + # for index, var_path in enumerate(self._input_path_dict.items()): + # yield self.resampler_class( + # input_path=var_path[0], + # output_path=self.resample_paths[index], + # variable_name=var_path[1], + # start_index=self.start_index, + # stop_index=self.stop_index, + # **self.config_default_kwargs, + # ) + # + # def yield_crop_configs(self) -> Iterable[HADsResampler]: + # """Generate a `CPMResampler` or `HADsResampler` for `self.input_paths`.""" + # self.check_paths() + # assert isinstance(self.input_paths, Iterable) + # assert isinstance(self.resample_paths, Iterable) + # assert isinstance(self.crop_paths, Iterable) + # for index, input_resample_paths in enumerate(self._resampled_path_dict.items()): + # for crop_path, region in self._cropped_path_dict.items(): + # yield self.resampler_class( + # input_path=input_resample_paths[0], + # output_path=self.resample_paths[index], + # variable_name=input_resample_paths[1], + # start_index=self.start_index, + # stop_index=self.stop_index, + # crop_path=crop_path, + # # Todo: remove below if single crop configs iterate over all + # # crop_regions=self.crop_regions, + # crop_regions=(region,), + # **self.config_default_kwargs, + # ) + # + # def __len__(self) -> int: + # """Return the length of `self.input_files`.""" + # return ( + # len(self.input_paths[self.start_index : self.stop_index]) + # if isinstance(self.input_paths, Sequence) + # else 0 + # ) + # + # @property + # def max_count(self) -> int: + # """Maximum length of `self.input_files` ignoring `start_index` and `start_index`.""" + # return len(self.input_paths) if isinstance(self.input_paths, Sequence) else 0 + # + # def __iter__(self) -> Iterator[Path] | None: + # if isinstance(self.input_paths, Sequence): + # for file_path in self.input_paths[self.start_index : self.stop_index]: + # yield Path(file_path) + # else: + # return None + # + # def __getitem__(self, key: int | slice) -> Path | tuple[Path, ...] | None: + # if not self.input_paths or not isinstance(self.input_paths, Sequence): + # return None + # elif isinstance(key, int): + # return Path(self.input_paths[key]) + # elif isinstance(key, slice): + # return tuple(Path(path) for path in self.input_paths[key]) + # else: + # raise IndexError(f"Can only index with 'int', not: '{key}'") + # + # def execute_resample_configs( + # self, multiprocess: bool = False, cpus: int | None = None + # ) -> tuple[CPMResampler | HADsResampler, ...]: + # """Run all resampler configurations + # + # Parameters + # ---------- + # multiprocess + # If `True` run parameters in `resample_configs` with `multiprocess_execute`. + # cpus + # Number of `cpus` to pass to `multiprocess_execute`. + # """ + # resamplers: tuple[CPMResampler | HADsResampler, ...] = tuple( + # self.yield_configs() + # ) + # results: list[list[Path] | None] = [] + # if multiprocess: + # cpus = cpus or self.cpus + # if self.total_cpus and cpus: + # cpus = min(cpus, self.total_cpus - 1) + # results = multiprocess_execute(resamplers, method_name="execute", cpus=cpus) + # else: + # for resampler in resamplers: + # print(resampler) + # results.append(resampler.execute()) + # return resamplers + # + # def execute_crop_configs( + # self, multiprocess: bool = False, cpus: int | None = None + # ) -> tuple[CPMResampler | HADsResampler, ...]: + # """Run all resampler configurations + # + # Parameters + # ---------- + # multiprocess + # If `True` run parameters in `resample_configs` with `multiprocess_execute`. + # cpus + # Number of `cpus` to pass to `multiprocess_execute`. + # """ + # croppers: tuple[CPMResampler | HADsResampler, ...] = tuple( + # # self.yield_configs( + # # input_path=self.resample_paths, output_path=self.crop_path + # # ) + # self.yield_crop_configs() + # ) + # results: list[list[Path] | None] = [] + # if multiprocess: + # cpus = cpus or self.cpus + # if self.total_cpus and cpus: + # cpus = min(cpus, self.total_cpus - 1) + # results = multiprocess_execute( + # croppers, method_name="execute_crops", cpus=cpus + # ) + # else: + # for cropper in croppers: + # print(cropper) + # results.append(cropper.execute_crops()) + # return croppers + + +@dataclass(kw_only=True, repr=False) +class CPMResamplerManager(ResamblerManagerBase): """Class to manage processing CPM resampling. Attributes @@ -1038,7 +1421,7 @@ class CPMResamplerManager(HADsResamplerManager): runs Which `RunOptions` to include. crop_regions - `RegionOptions` (like Manchester, Scoltand etc.) to crop results to. + `RegionOptions` (like Manchester, Scotland etc.) to crop results to. crop_paths Where to save region crop files. sub_path diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 8baaeb31..5d05a3f2 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -1294,3 +1294,26 @@ def cftime_range_gen(time_data_array: T_DataArray, **kwargs) -> NDArray: ) time_bnds_fix_range_end: CFTimeIndex = time_bnds_fix_range_start + timedelta(days=1) return np.array((time_bnds_fix_range_start, time_bnds_fix_range_end)).T + + +def get_cpm_for_coord_alignment( + cpm_for_coord_alignment: PathLike | T_Dataset, +) -> T_Dataset: + """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" + if isinstance(cpm_for_coord_alignment, PathLike): + if Path(cpm_for_coord_alignment).is_dir(): + cpm_for_coord_alignment = next(Path(cpm_for_coord_alignment).glob("t*.nc")) + cpm_for_coord_alignment = cpm_reproject_with_standard_calendar( + cpm_for_coord_alignment + ) + logger.info( + f"Set 'self.cpm_for_coord_alignment' to: '{cpm_for_coord_alignment}'" + ) + try: + assert isinstance(cpm_for_coord_alignment, Dataset) + except AssertionError: + raise AttributeError( + f"'cpm_for_coord_alignment' must be a 'Dataset'. " + f"Currently a {type(cpm_for_coord_alignment)}." + ) + return cpm_for_coord_alignment From 387070e3edb6b207e6ba762d51b25960dd0e2d08 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Fri, 6 Sep 2024 00:42:45 +0100 Subject: [PATCH 79/92] feat: add `cache-cpm-for-hads` to `GitHubActions` --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 44694821..eef97674 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -17,11 +17,11 @@ env: on: pull_request: - branches: ['main', 'raw-data-resample', ] + branches: ['main', 'cache-cpm-for-hads', ] paths-ignore: ['docs/**'] push: - branches: ['main', 'raw-data-resample', ] + branches: ['main', 'cache-cpm-for-hads', ] paths-ignore: ['docs/**'] concurrency: From 5cd4ce38c89930393ff94a146464ec1d69a3ab06 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sat, 7 Sep 2024 16:52:14 +0100 Subject: [PATCH 80/92] fix: `cpm_for_coord_alignment` and `LockCache` fixture delays --- python/clim_recal/config.py | 20 ++++++ python/clim_recal/pipeline.py | 4 +- python/clim_recal/resample.py | 23 +++++-- python/clim_recal/utils/core.py | 4 +- python/clim_recal/utils/xarray.py | 22 ++++++- python/conftest.py | 57 ++++++++++++++--- python/pdm.lock | 17 ++++- python/pyproject.toml | 2 + python/tests/utils.py | 102 ++++++++++++++++++++++++------ 9 files changed, 210 insertions(+), 41 deletions(-) diff --git a/python/clim_recal/config.py b/python/clim_recal/config.py index 05b2ae89..1c655320 100644 --- a/python/clim_recal/config.py +++ b/python/clim_recal/config.py @@ -19,6 +19,7 @@ ) from .utils.core import product_dict, results_path from .utils.data import MethodOptions, RegionOptions, RunOptions, VariableOptions +from .utils.xarray import get_cpm_for_coord_alignment warnings.filterwarnings("ignore", category=TqdmExperimentalWarning) @@ -75,6 +76,8 @@ class ClimRecalConfig(BaseRunConfig): A `dict` of parameters to pass to a `CPMResamplerManager`. hads_kwargs A `dict` of parameters to pass to `HADsResamplerManager`. + cpm_for_coord_alignment + A `Path` to a `CPM` file to align `HADs` coordinates to. debug_mode Set to `True` to add more detailed debug logs, including `GDAL`. @@ -114,6 +117,8 @@ class ClimRecalConfig(BaseRunConfig): add_local_dated_crops_path: bool = True local_dated_results_path_prefix: str = "run" local_dated_crops_path_prefix: str = "crop" + cpm_for_coord_alignment: PathLike | None = None + process_cmp_for_coord_alignment: bool = False debug_mode: bool = False @property @@ -132,6 +137,7 @@ def exec_path(self) -> Path: Examples -------- + >>> clim_runner: ClimRecalConfig = getfixture('clim_runner') >>> print(clim_runner.exec_path) ...test-run-results.../run... @@ -152,6 +158,7 @@ def dated_results_path(self) -> Path | None: Examples -------- + >>> clim_runner: ClimRecalConfig = getfixture('clim_runner') >>> print(clim_runner.dated_results_path) ...test-run-results.../run... @@ -172,6 +179,7 @@ def dated_crops_path(self) -> Path | None: Examples -------- + >>> clim_runner: ClimRecalConfig = getfixture('clim_runner') >>> print(clim_runner.dated_crops_path) ...test-run-results.../crop... @@ -226,6 +234,8 @@ def __post_init__(self) -> None: stop_index=self.stop_index, **self.cpm_kwargs, ) + if self.process_cmp_for_coord_alignment: + self.set_cpm_for_coord_alignment() self.hads_manager = HADsResamplerManager( input_paths=self.hads_input_path, variables=self.variables, @@ -233,12 +243,19 @@ def __post_init__(self) -> None: crop_paths=self.crops_path, start_index=self.start_index, stop_index=self.stop_index, + cpm_for_coord_alignment=self.cpm_for_coord_alignment, **self.hads_kwargs, ) self.total_cpus: int | None = cpu_count() if self.cpus == None or (self.total_cpus and self.cpus >= self.total_cpus): self.cpus = 1 if not self.total_cpus else self.total_cpus - 1 + def set_cpm_for_coord_alignment(self) -> None: + """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" + self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( + self.cpm_for_coord_alignment + ) + def __repr__(self) -> str: """Summary of `self` configuration as a `str`.""" return ( @@ -260,6 +277,7 @@ def model_vars(self) -> ClimRecalRunsConfigType: Examples -------- + >>> clim_runner: ClimRecalConfig = getfixture('clim_runner') >>> pprint(clim_runner.model_vars) {'methods': ('quantile_delta_mapping',), 'regions': ('Glasgow', 'Manchester'), @@ -279,6 +297,7 @@ def model_configs(self) -> tuple[RunConfigType, ...]: Examples -------- + >>> clim_runner: ClimRecalConfig = getfixture('clim_runner') >>> pprint(clim_runner.model_configs) ({'method': 'quantile_delta_mapping', 'region': 'Glasgow', @@ -362,6 +381,7 @@ def run_models(self) -> ClimRecalRunResultsType: Examples -------- + >>> clim_runner: ClimRecalConfig = getfixture('clim_runner') >>> runs: dict[tuple, dict] = clim_runner.run_models() >>> pprint(tuple(runs.keys())) (('Glasgow', 'tasmax', '05', 'quantile_delta_mapping'), diff --git a/python/clim_recal/pipeline.py b/python/clim_recal/pipeline.py index db043f14..d5959398 100644 --- a/python/clim_recal/pipeline.py +++ b/python/clim_recal/pipeline.py @@ -303,7 +303,7 @@ def main( else: print(f"Cropping CPMs to regions {config.regions}: ...") region_cropped_cpm_resamples: tuple[CPMResampler, ...] = ( - config.cpm_manager.execute_region_crop_configs( + config.cpm_manager.execute_crop_configs( multiprocess=multiprocess, cpus=cpus ) ) @@ -315,7 +315,7 @@ def main( f"Cropping HADS 2.2km projections to regions {config.regions}: ..." ) region_cropped_hads_resamples: tuple[CPMResampler, ...] = ( - config.hads_manager.execute_region_crop_configs( + config.hads_manager.execute_crop_configs( multiprocess=multiprocess, cpus=cpus ) ) diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index 335a79f2..66fdd3fc 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -453,14 +453,16 @@ class HADsResampler(ResamblerBase): -------- >>> if not is_data_mounted: ... pytest.skip(mount_doctest_skip_message) - >>> hads_resampler: HADsResampler = HADsResampler( + >>> resample_test_hads_output_path: Path = getfixture( + ... 'resample_test_hads_output_path') + >>> hads_resampler: HADsResampler = HADsResampler( # doctest: +SKIP ... output_path=resample_test_hads_output_path, ... ) - >>> hads_resampler + >>> hads_resampler # doctest: +SKIP - >>> pprint(hads_resampler.input_files) + >>> pprint(hads_resampler.input_files) # doctest: +SKIP (...Path('.../tasmax/day/tasmax_hadukgrid_uk_1km_day_19800101-19800131.nc'), ...Path('.../tasmax/day/tasmax_hadukgrid_uk_1km_day_19800201-19800229.nc'), ..., @@ -585,6 +587,8 @@ class CPMResampler(ResamblerBase): -------- >>> if not is_data_mounted: ... pytest.skip(mount_doctest_skip_message) + >>> resample_test_cpm_output_path: Path = getfixture( + ... 'resample_test_cpm_output_path') >>> cpm_resampler: CPMResampler = CPMResampler( ... input_path=REPROJECTED_CPM_TASMAX_05_LATEST_INPUT_PATH, ... output_path=resample_test_cpm_output_path, @@ -703,7 +707,7 @@ def __post_init__(self) -> None: self.total_cpus: int | None = cpu_count() if not self.cpus: self.cpus = 1 if not self.total_cpus else self.total_cpus - self.cpm_for_coord_alignment: T_Dataset | PathLike = RAW_CPM_TASMAX_PATH + # self.cpm_for_coord_alignment: T_Dataset | PathLike = RAW_CPM_TASMAX_PATH @property def input_folder(self) -> Path | None: @@ -1035,6 +1039,8 @@ class HADsResamplerManager(ResamblerManagerBase): -------- >>> if not is_data_mounted: ... pytest.skip(mount_doctest_skip_message) + >>> resample_test_hads_output_path: Path = getfixture( + ... 'resample_test_hads_output_path') >>> hads_resampler_manager: HADsResamplerManager = HADsResamplerManager( ... variables=VariableOptions.all(), ... resample_paths=resample_test_hads_output_path, @@ -1121,7 +1127,7 @@ def __repr__(self) -> str: def __post_init__(self) -> None: """Ensure `self.cpm_for_coord_alignment` is set.""" super().__post_init__() - self.set_cpm_for_coord_alignment() + # self.set_cpm_for_coord_alignment() def set_cpm_for_coord_alignment(self) -> None: """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" @@ -1449,6 +1455,8 @@ class CPMResamplerManager(ResamblerManagerBase): -------- >>> if not is_data_mounted: ... pytest.skip(mount_doctest_skip_message) + >>> resample_test_cpm_output_path: Path = getfixture( + ... 'resample_test_cpm_output_path') >>> cpm_resampler_manager: CPMResamplerManager = CPMResamplerManager( ... stop_index=9, ... resample_paths=resample_test_cpm_output_path, @@ -1503,6 +1511,11 @@ def __repr__(self) -> str: f"input_paths_count={len(self.input_paths) if isinstance(self.input_paths, Sequence) else 1})>" ) + # def __post_init__(self) -> None: + # """Ensure `self.cpm_for_coord_alignment` is set.""" + # super().__post_init__() + # self.set_cpm_for_coord_alignment() + # def _gen_input_folder_paths( # self, path: PathLike, append_var_path_dict: bool = False, cpm_paths: bool = True # ) -> Iterator[Path]: diff --git a/python/clim_recal/utils/core.py b/python/clim_recal/utils/core.py index f7028f43..919c472d 100644 --- a/python/clim_recal/utils/core.py +++ b/python/clim_recal/utils/core.py @@ -187,9 +187,11 @@ def multiprocess_execute( >>> if not is_data_mounted: ... pytest.skip(mount_doctest_skip_message) >>> from clim_recal.resample import CPMResampler + >>> resample_test_hads_output_path: Path = getfixture( + ... 'resample_test_cpm_output_path') >>> cpm_resampler: CPMResampler = CPMResampler( ... stop_index=3, - ... output_path=resample_test_cpm_output_path, + ... output_path=resample_test_hads_output_path, ... ) >>> multiprocess_execute(cpm_resampler, method_name="exists") [True, True, True] diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 5d05a3f2..11afd4b0 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -76,6 +76,7 @@ GLASGOW_GEOM_ABSOLUTE_PATH: Final[Path] = ( climate_data_mount_path() / GLASGOW_GEOM_LOCAL_PATH ) +CPM_REGEX: Final[str] = "[!.]*cpm*.nc" HADS_MIN_NULL: float = -1000000 # MONTH_DAY_DROP: DropDayType = {(1, 31), (4, 1), (6, 1), (8, 1), (10, 1), (12, 1)} @@ -1297,12 +1298,27 @@ def cftime_range_gen(time_data_array: T_DataArray, **kwargs) -> NDArray: def get_cpm_for_coord_alignment( - cpm_for_coord_alignment: PathLike | T_Dataset, + cpm_for_coord_alignment: PathLike | T_Dataset, cpm_regex: str = CPM_REGEX ) -> T_Dataset: - """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" + """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`. + + Parameters + ---------- + cpm_for_coord_alignment + Either a `Path` or a file or folder with a `cpm` file to align to + or a `xarray.Dataset`. If a folder, the first file matching + `cpm_regex` will be used. It will then be processed via + `cpm_reproject_with_standard_calendar` for comparability and use + alongside `cpm` files. + cpm_regex + A regular expression to filter suitable files if + `cpm_for_coord_alignment` is a folder `Path`. + """ if isinstance(cpm_for_coord_alignment, PathLike): if Path(cpm_for_coord_alignment).is_dir(): - cpm_for_coord_alignment = next(Path(cpm_for_coord_alignment).glob("t*.nc")) + cpm_for_coord_alignment = next( + Path(cpm_for_coord_alignment).glob(cpm_regex) + ) cpm_for_coord_alignment = cpm_reproject_with_standard_calendar( cpm_for_coord_alignment ) diff --git a/python/conftest.py b/python/conftest.py index c3c207c0..2360243e 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -4,7 +4,7 @@ from pathlib import Path from pprint import pprint from shutil import copytree, rmtree -from typing import Final, Iterator +from typing import Callable, Final, Iterator import pytest from coverage_badge.__main__ import main as gen_cov_badge @@ -67,6 +67,8 @@ TEST_DATA_PATH: Final[Path] = TEST_FILE_PATH / "data" LOCAL_FIXTURE_PATH_NAME: Final[Path] = Path("local-cache") +collect_ignore_glob: list[str] = ["*run*", "*.png", "*.xlsx"] + @pytest.fixture def mod_folder_files_count_correct() -> int: @@ -118,7 +120,9 @@ def local_cache_fixtures( local_hads_cache_path: Path, sync_all: bool, use_async: bool, + printer_session: Callable[[str], None], ) -> LocalCachesManager: + printer_session("Loading local fixtures cache...") cache_manager: LocalCachesManager = LocalCachesManager( default_local_cache_path=local_cache_path, caches=( @@ -129,6 +133,14 @@ def local_cache_fixtures( reader=open_dataset, reader_kwargs={"decode_coords": "all"}, ), + # LocalCache( + # name="tasmax_cpm_1980_converted", + # source_path=CPM_RAW_TASMAX_EXAMPLE_PATH, + # local_cache_path=local_cpm_cache_path, + # reader=open_dataset, + # reader_kwargs={"decode_coords": "all"}, + # parser=cpm_reproject_with_standard_calendar, + # ), LocalCache( name="tasmax_hads_1980_raw", source_path=HADS_RAW_TASMAX_EXAMPLE_PATH, @@ -210,6 +222,31 @@ def tasmax_hads_1980_raw_path( return local_cache_fixtures["tasmax_hads_1980_raw"].source_path +@pytest.fixture(scope="session") +def tasmax_cpm_1980_converted( + local_cache: bool, + local_cpm_cache_path: Path, + local_cache_fixtures: LocalCachesManager, +) -> T_Dataset | None: + if local_cache: + return local_cache_fixtures["tasmax_cpm_1980_converted"].read( + cache_path=local_cpm_cache_path + ) + else: + return None + + +@pytest.fixture(scope="session") +def tasmax_cpm_1980_converted_path( + local_cache: bool, + local_cache_fixtures: LocalCachesManager, +) -> T_Dataset: + if local_cache: + return local_cache_fixtures["tasmax_cpm_1980_converted"].local_cache_path + else: + return local_cache_fixtures["tasmax_cpm_1980_converted"].source_path + + # This may be removed in future # @pytest.fixture(autouse=True) def ensure_python_path() -> None: @@ -377,6 +414,7 @@ def uk_rotated_grid_bounds() -> BoundsTupleType: # Note: it may be worth setting this to cache for session runs +# This requires a different tmp_path configuration @pytest.fixture def clim_runner( tmp_path: Path, @@ -385,6 +423,7 @@ def clim_runner( test_runs_output_path: PathLike, local_hads_cache_path: PathLike, local_cpm_cache_path: PathLike, + # tasmax_cpm_1980_converted_path: PathLike, ) -> ClimRecalConfig: """Return default `ClimRecalConfig`.""" assert local_cache_fixtures.default_local_cache_path @@ -400,6 +439,7 @@ def clim_runner( preprocess_out_folder=tmp_path, regions=regions, output_path=test_runs_output_path, + # cpm_for_coord_alignment=tasmax_cpm_1980_converted_path, ) except (FileExistsError, AssertionError): return ClimRecalConfig( @@ -411,6 +451,7 @@ def clim_runner( # Todo: refactor to use caching to speed up runs cpm_kwargs=dict(_allow_check_fail=True), hads_kwargs=dict(_allow_check_fail=True), + # cpm_for_coord_alignment=tasmax_cpm_1980_converted_path, ) @@ -437,7 +478,7 @@ def glasgow_example_cropped_cpm_rainfall_path(data_fixtures_path: Path) -> Path: @pytest.fixture -def glasgow_tif_cache(data_fixtures_path: Path, tmp_path: Path) -> LocalCache: +def test_users_cache(data_fixtures_path: Path, tmp_path: Path) -> LocalCache: return LocalCache( name="test-users", source_path=data_fixtures_path / "test_user_accounts.xlsx", @@ -462,10 +503,10 @@ def doctest_auto_fixtures( glasgow_epsg_27700_bounds: BoundsTupleType, glasgow_shape_file_path: Path, test_runs_output_path: Path, - resample_test_cpm_output_path: Path, - resample_test_hads_output_path: Path, + # resample_test_cpm_output_path: Path, + # resample_test_hads_output_path: Path, glasgow_example_cropped_cpm_rainfall_path: Path, - clim_runner: ClimRecalConfig, + # clim_runner: ClimRecalConfig, ) -> None: """Elements to add to default `doctest` namespace.""" doctest_namespace["CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT"] = ( @@ -510,8 +551,8 @@ def doctest_auto_fixtures( doctest_namespace["glasgow_epsg_27700_bounds"] = glasgow_epsg_27700_bounds doctest_namespace["glasgow_shape_file_path"] = glasgow_shape_file_path doctest_namespace["test_runs_output_path"] = test_runs_output_path - doctest_namespace["resample_test_hads_output_path"] = resample_test_hads_output_path - doctest_namespace["resample_test_cpm_output_path"] = resample_test_cpm_output_path + # doctest_namespace["resample_test_hads_output_path"] = resample_test_hads_output_path + # doctest_namespace["resample_test_cpm_output_path"] = resample_test_cpm_output_path doctest_namespace["mount_doctest_skip_message"] = MOUNT_DOCTEST_SKIP_MESSAGE doctest_namespace["mount_or_cache_doctest_skip_message"] = ( MOUNT_OR_CACHE_DOCTEST_SKIP_MESSAGE @@ -519,7 +560,7 @@ def doctest_auto_fixtures( doctest_namespace["glasgow_example_cropped_cpm_rainfall_path"] = ( glasgow_example_cropped_cpm_rainfall_path ) - doctest_namespace["clim_runner"] = clim_runner + # doctest_namespace["clim_runner"] = clim_runner def pytest_sessionfinish(session, exitstatus): diff --git a/python/pdm.lock b/python/pdm.lock index a5ca479b..9ab6f9aa 100644 --- a/python/pdm.lock +++ b/python/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:0cdc21112758f7753fb9320582ff928e8e3629b9e5012128763450e4cfe491d1" +content_hash = "sha256:315d60178a32e76bd4dac1cfc8bb65598021c0490932d1047c4ba94df1c38f00" [[metadata.targets]] requires_python = "~=3.12.5" @@ -2407,6 +2407,21 @@ files = [ {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, ] +[[package]] +name = "pytest-print" +version = "1.0.0" +requires_python = ">=3.8" +summary = "pytest-print adds the printer fixture you can use to print messages to the user (directly to the pytest runner, not stdout)" +groups = ["dev"] +marker = "python_full_version ~= \"3.12.5\"" +dependencies = [ + "pytest>=7.4", +] +files = [ + {file = "pytest_print-1.0.0-py3-none-any.whl", hash = "sha256:23484f42b906b87e31abd564761efffeb0348a6f83109fb857ee6e8e5df42b69"}, + {file = "pytest_print-1.0.0.tar.gz", hash = "sha256:1fcde9945fba462227a8959271369b10bb7a193be8452162707e63cd60875ca0"}, +] + [[package]] name = "pytest-sugar" version = "1.0.0" diff --git a/python/pyproject.toml b/python/pyproject.toml index 7d8cfc82..357c0d04 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -61,6 +61,7 @@ dev = [ "pytest-xdist>=3.5.0", "sysrsync>=1.1.1", "pydantic>=2.8.2", + "pytest-print>=1.0.0", ] [tool.pdm.build] @@ -89,6 +90,7 @@ addopts = """ --strict-markers --durations=5 --failed-first + --print """ doctest_optionflags = ["NORMALIZE_WHITESPACE", "ELLIPSIS",] testpaths = [ diff --git a/python/tests/utils.py b/python/tests/utils.py index c39ca9fc..5299f321 100644 --- a/python/tests/utils.py +++ b/python/tests/utils.py @@ -9,7 +9,7 @@ import sysrsync from numpy import array, random -from pandas import date_range, to_datetime +from pandas import to_datetime from xarray import DataArray from xarray.core.types import T_DataArray, T_DataArrayOrSet @@ -55,6 +55,9 @@ CPM_RAW_TASMAX_1980_FILE: Final[Path] = Path( "tasmax_rcp85_land-cpm_uk_2.2km_01_day_19801201-19811130.nc" ) +CPM_CONVERTED_TASMAX_1980_FILE: Final[Path] = Path( + "tasmax_rcp85_land-cpm_uk_2.2km_05_day_std_year_19801201-19811130.nc" +) HADS_RAW_TASMAX_1980_FILE: Final[Path] = Path( "tasmax_hadukgrid_uk_1km_day_19800101-19800131.nc" ) @@ -368,6 +371,9 @@ class LocalCache: reader: Callable | None = None reader_kwargs: dict[str, Any] = field(default_factory=dict) + parser: Callable | None = None + parser_kwargs: dict[str, Any] = field(default_factory=dict) + _make_parent_folders: bool = True def __repr__(self) -> str: @@ -394,7 +400,7 @@ def cache_path(self) -> Path: """Path to copy `source_path` file to.""" assert isinstance(self.source_path, Path) assert isinstance(self.local_cache_path, Path) - if not self.local_cache_path.is_file(): + if not self.local_cache_path.is_file() and not self.local_cache_path.suffix: logger.debug( f"'local_cache_path' is a folder: " f"'{self.local_cache_path}'. Inferring file name " @@ -430,24 +436,70 @@ def _update_synced(self) -> None: if not self.created: self.created = self.synced + def parse(self) -> T_DataArrayOrSet | None: + """If `self.parser` is set, process file prior to syncing. + + Examples + -------- + >>> test_users_cache = getfixture('test_users_cache') + >>> from pandas import read_excel + >>> from xarray import Dataset, open_dataset + >>> + >>> def excel_to_netcdf(path: PathLike): + ... df = read_excel(Path(path)) + ... return df.to_xarray() + >>> test_users_cache.parser = excel_to_netcdf + >>> test_users_cache.reader = open_dataset + >>> users_df: Dataset = test_users_cache.parse() + >>> test_users_cache.read(run_sync=True) + ... + Dimensions: (index: 5) + Coordinates: + * index (index) int64 40B 0 1 2 3 4 + Data variables: + A Column (index) int64 40B ... + User Name (index) >> test_users_cache + + """ + if self.parser: + return self.parser(self.source_path, **self.parser_kwargs) + else: + return None + async def async_sync( self, fail_if_no_source: bool = True, **kwargs ) -> CacheLogType: """Asyncronously sync `self.source_path` to `self.cache_path`.""" if self._check_source_path(fail_if_no_source=fail_if_no_source): - await asyncio.create_subprocess_exec( - "rsync", str(self.source_path), str(self.cache_path), **kwargs - ) + if self.parser: + logger.info(f"Asyncing 'parser' for {self}...") + intermediate: T_DataArrayOrSet = self.parse() + intermediate.to_netcdf(self.cache_path) + else: + logger.info(f"Asyncing 'rsync' for {self}...") + await asyncio.create_subprocess_exec( + "rsync", str(self.source_path), str(self.cache_path), **kwargs + ) self._update_synced() return self.name, self.synced, self.cache_path def sync(self, fail_if_no_source: bool = True, **kwargs) -> CacheLogType: """Sync `self.source_path` to `self.cache_path`.""" if self._check_source_path(fail_if_no_source=fail_if_no_source): - sysrsync.run( - source=str(self.source_path), destination=str(self.cache_path), **kwargs - ) - self._update_synced() + if self.parser: + logger.info(f"Syncing 'parser' for {self}...") + intermediate: T_DataArrayOrSet = self.parse() + intermediate.to_netcdf(self.cache_path) + else: + logger.info(f"Syncing 'rsync' for {self}...") + sysrsync.run( + source=str(self.source_path), + destination=str(self.cache_path), + **kwargs, + ) + self._update_synced() return self.name, self.synced, self.cache_path def read(self, cache_path: bool = True, run_sync: bool = False, **kwargs) -> Any: @@ -459,6 +511,8 @@ def read(self, cache_path: bool = True, run_sync: bool = False, **kwargs) -> Any Whether to read `self.cache_path` (`True`) or `self.source_path` (`False`). run_sync Whether to run `run_sync` if `self.cache_path` is not set. + kwargs + Any additional parameters to pass to `self.reader` Returns ------- @@ -466,28 +520,28 @@ def read(self, cache_path: bool = True, run_sync: bool = False, **kwargs) -> Any Examples -------- - >>> glasgow_tif_cache = getfixture('glasgow_tif_cache') - >>> glasgow_tif_cache.read() + >>> test_users_cache = getfixture('test_users_cache') + >>> test_users_cache.read() Traceback (most recent call last): ... ValueError: `reader` attribute must be set for >>> from pandas import read_excel - >>> glasgow_tif_cache.reader = read_excel - >>> glasgow_tif_cache.read() + >>> test_users_cache.reader = read_excel + >>> test_users_cache.read() Traceback (most recent call last): ... ValueError: Can't use `local_path` prior to cache run. Run with `run_sync` to override for . - >>> glasgow_tif_cache.read(run_sync=True) + >>> test_users_cache.read(run_sync=True) A Column User Name Password 0 1 sally a pass 1 2 george another pass 2 34 jean passing 3 4 felicity pastoral 4 2 frank plough - >>> glasgow_tif_cache + >>> test_users_cache """ if not self.reader: @@ -515,13 +569,13 @@ class LocalCachesManager(UserDict): Attributes ---------- - sources - A `dict` of `name`: `configs` to construct `LocalCache` instances + caches + A `Sequence` of `LocalCache` instances to manage Examples -------- - >>> glasow_tif_cache = getfixture('glasgow_tif_cache') - >>> cache_configs = LocalCachesManager([glasow_tif_cache]) + >>> test_users_cache = getfixture('test_users_cache') + >>> cache_configs = LocalCachesManager([test_users_cache]) >>> cache_configs >>> asyncio.run(cache_configs.async_sync_all()) @@ -561,8 +615,9 @@ def check_default_cache_path(self) -> bool: def __post_init__(self) -> None: """Populate the `data` attribute.""" self._sync_caches_attr() - if not self._synced: - self.sync_all(fail_if_no_source=self.fail_if_no_source) + # Removing this to avoid test delays from auto_syncing + # if not self._synced: + # self.sync_all(fail_if_no_source=self.fail_if_no_source) @property def cached_paths(self) -> tuple[Path, ...]: @@ -572,6 +627,11 @@ def cached_paths(self) -> tuple[Path, ...]: def sync_all(self, fail_if_no_source: bool = True, **kwargs) -> tuple[Path, ...]: """Run `sync` on all `self.caches` instances.""" sync_results: CacheLogType + fail_if_no_source = self.fail_if_no_source or self.fail_if_no_source + logger.info( + f"'fail_if_no_source' is {self.fail_if_no_source}. " + f"Syncing {len(self)} cached files..." + ) for local_cacher in self.values(): sync_results = local_cacher.sync( fail_if_no_source=fail_if_no_source, **kwargs From 4c89c642ba905d5d5d2f82de2594d9f269f1f0fd Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sat, 7 Sep 2024 18:46:12 +0100 Subject: [PATCH 81/92] fix: remove `pytest-print` and fix `doctests` for `GitHub` --- python/clim_recal/utils/server.py | 8 ++++---- python/conftest.py | 4 +--- python/pdm.lock | 17 +---------------- python/pyproject.toml | 2 -- python/tests/utils.py | 8 ++++---- 5 files changed, 10 insertions(+), 29 deletions(-) diff --git a/python/clim_recal/utils/server.py b/python/clim_recal/utils/server.py index 4220e323..6b1b502e 100644 --- a/python/clim_recal/utils/server.py +++ b/python/clim_recal/utils/server.py @@ -495,9 +495,9 @@ def make_user( >>> user_name: str = 'an_unlinkely_test_user' >>> password: str = 'test_pass' >>> code_path: Path = JUPYTER_DOCKER_USER_PATH - >>> make_user(user_name, password, code_path=code_path) + >>> make_user(user_name, password, code_path=code_path) # +SKIP PosixPath('/home/an_unlinkely_test_user') - >>> Path(f'/home/{user_name}/python/conftest.py').is_file() + >>> Path(f'/home/{user_name}/python/conftest.py').is_file() # +SKIP True >>> rm_user(user_name) 'an_unlinkely_test_user' @@ -593,10 +593,10 @@ def make_users( ... file_reader=excel_row_iter, ... code_path=JUPYTER_DOCKER_USER_PATH, ... )) - >>> [(path / 'python' / 'conftest.py').is_file() + >>> [(path / 'python' / 'conftest.py').is_file() # +SKIP ... for path in user_paths] [True, True, True, True, True] - >>> [rm_user(user_path.name) for user_path in user_paths] + >>> [rm_user(user_path.name) for user_path in user_paths] # +SKIP ['sally', 'george', 'jean', 'felicity', 'frank'] """ for record in file_reader(file_path): diff --git a/python/conftest.py b/python/conftest.py index 2360243e..aed35818 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -4,7 +4,7 @@ from pathlib import Path from pprint import pprint from shutil import copytree, rmtree -from typing import Callable, Final, Iterator +from typing import Final, Iterator import pytest from coverage_badge.__main__ import main as gen_cov_badge @@ -120,9 +120,7 @@ def local_cache_fixtures( local_hads_cache_path: Path, sync_all: bool, use_async: bool, - printer_session: Callable[[str], None], ) -> LocalCachesManager: - printer_session("Loading local fixtures cache...") cache_manager: LocalCachesManager = LocalCachesManager( default_local_cache_path=local_cache_path, caches=( diff --git a/python/pdm.lock b/python/pdm.lock index 9ab6f9aa..a5ca479b 100644 --- a/python/pdm.lock +++ b/python/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:315d60178a32e76bd4dac1cfc8bb65598021c0490932d1047c4ba94df1c38f00" +content_hash = "sha256:0cdc21112758f7753fb9320582ff928e8e3629b9e5012128763450e4cfe491d1" [[metadata.targets]] requires_python = "~=3.12.5" @@ -2407,21 +2407,6 @@ files = [ {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, ] -[[package]] -name = "pytest-print" -version = "1.0.0" -requires_python = ">=3.8" -summary = "pytest-print adds the printer fixture you can use to print messages to the user (directly to the pytest runner, not stdout)" -groups = ["dev"] -marker = "python_full_version ~= \"3.12.5\"" -dependencies = [ - "pytest>=7.4", -] -files = [ - {file = "pytest_print-1.0.0-py3-none-any.whl", hash = "sha256:23484f42b906b87e31abd564761efffeb0348a6f83109fb857ee6e8e5df42b69"}, - {file = "pytest_print-1.0.0.tar.gz", hash = "sha256:1fcde9945fba462227a8959271369b10bb7a193be8452162707e63cd60875ca0"}, -] - [[package]] name = "pytest-sugar" version = "1.0.0" diff --git a/python/pyproject.toml b/python/pyproject.toml index 357c0d04..7d8cfc82 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -61,7 +61,6 @@ dev = [ "pytest-xdist>=3.5.0", "sysrsync>=1.1.1", "pydantic>=2.8.2", - "pytest-print>=1.0.0", ] [tool.pdm.build] @@ -90,7 +89,6 @@ addopts = """ --strict-markers --durations=5 --failed-first - --print """ doctest_optionflags = ["NORMALIZE_WHITESPACE", "ELLIPSIS",] testpaths = [ diff --git a/python/tests/utils.py b/python/tests/utils.py index 5299f321..0484b893 100644 --- a/python/tests/utils.py +++ b/python/tests/utils.py @@ -455,11 +455,11 @@ def parse(self) -> T_DataArrayOrSet | None: ... Dimensions: (index: 5) Coordinates: - * index (index) int64 40B 0 1 2 3 4 + * index (index) int64...0 1 2 3 4 Data variables: - A Column (index) int64 40B ... - User Name (index) >> test_users_cache """ From f27b82abac20f454d8a10e166d26441a349347a0 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 8 Sep 2024 04:25:16 +0100 Subject: [PATCH 82/92] fix: crop management for `cpm` data, progress for `hads` --- python/clim_recal/resample.py | 131 ++++++++++++++++++++---------- python/clim_recal/utils/server.py | 8 +- python/clim_recal/utils/xarray.py | 55 ++++++++++++- python/conftest.py | 47 ++++++----- python/tests/test_resample.py | 80 +++++++++++++++++- 5 files changed, 251 insertions(+), 70 deletions(-) diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index 66fdd3fc..42868dba 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -46,10 +46,12 @@ NETCDF_EXTENSION_STR, ReprojectFuncType, apply_geo_func, + check_xarray_path_and_var_name, cpm_reproject_with_standard_calendar, crop_xarray, get_cpm_for_coord_alignment, hads_resample_and_reproject, + region_crop_file_name, ) logger = getLogger(__name__) @@ -115,7 +117,8 @@ class ResamblerBase: # grid: PathLike | T_Dataset = DEFAULT_RELATIVE_GRID_DATA_PATH input_files: Iterable[PathLike] | None = None cpus: int | None = None - crop_regions: tuple[RegionOptions | str, ...] | None = RegionOptions.all() + # crop_regions: tuple[RegionOptions | str, ...] | None = RegionOptions.all() + crop_region: RegionOptions | str | None = RegionOptions.GLASGOW crop_path: PathLike = RESAMPLING_OUTPUT_PATH final_crs: str = BRITISH_NATIONAL_GRID_EPSG # grid_x_column_name: str = HADS_XDIM @@ -139,7 +142,9 @@ def __post_init__(self) -> None: # self.set_grid_x_y() self.set_input_files() Path(self.output_path).mkdir(parents=True, exist_ok=True) - if self.crop_regions: + # if self.crop_regions: + # Path(self.crop_path).mkdir(parents=True, exist_ok=True) + if self.crop_region: Path(self.crop_path).mkdir(parents=True, exist_ok=True) self.total_cpus: int | None = cpu_count() if not self.cpus: @@ -326,7 +331,8 @@ def _sync_reprojected_paths( def range_crop_projection( self, - regions: Iterable[str] | None = None, + # regions: Iterable[str] | None = None, + # regions: Iterable[str] | None = None, start: int | None = None, stop: int | None = None, step: int = 1, @@ -334,33 +340,34 @@ def range_crop_projection( return_results: bool = False, **kwargs, ) -> list[Path]: - regions = regions or self.crop_regions + # regions = regions or self.crop_regions start = start or self.start_index stop = stop or self.stop_index export_paths: list[Path | T_Dataset] = [] if stop is None: stop = len(self) - try: - assert regions - except: - raise ValueError(f"Iterable 'regions' must be set.") - for region in regions: - console.print(f"Cropping to '{region}' from {self}...") - for index in trange(start, stop, step): - export_paths.append( - self.crop_projection( - region=region, - index=index, - override_export_path=override_export_path, - return_results=return_results, - **kwargs, - ) + # try: + # assert regions + # except: + # raise ValueError(f"Iterable 'regions' must be set.") + # for region in regions: + # console.print(f"Cropping to '{region}' from {self}...") + console.print(f"Cropping to '{self.crop_path}'") + for index in trange(start, stop, step): + export_paths.append( + self.crop_projection( + # region=region, + index=index, + override_export_path=override_export_path, + return_results=return_results, + **kwargs, ) + ) return export_paths def crop_projection( self, - region: str, + # region: str, index: int = 0, override_export_path: Path | None = None, return_results: bool = False, @@ -379,26 +386,41 @@ def crop_projection( "Run after 'self.to_reprojection()' or set as a " "list directly." ) + # try: + # assert region and region in self.crop_regions + # except AttributeError: + # raise IndexError(f"'{region}' not in 'crop_regions': '{self.crop_regions}'") + # try: + # assert self.crop_region except AttributeError: + # raise IndexError(f"'{region}' not in 'crop_regions': '{self.crop_regions}'") try: - assert region and region in self.crop_regions + assert self.crop_region in RegionOptions except AttributeError: - raise IndexError(f"'{region}' not in 'crop_regions': '{self.crop_regions}'") - path: PathLike = override_export_path or Path(self.crop_path) / (region) + raise ValueError( + f"'{self.crop_path}' not in 'RegionOptions': {RegionOptions.all()}" + ) + path: PathLike = override_export_path or Path(self.crop_path) # / (region) path.mkdir(exist_ok=True, parents=True) resampled_xr: Dataset = self._reprojected_paths[index] + cropped: Dataset = crop_xarray( xr_time_series=resampled_xr, - crop_box=RegionOptions.bounding_box(region), + crop_box=RegionOptions.bounding_box(self.crop_region), **kwargs, ) - cropped_file_name: str = "crop_" + region + "-" + resampled_xr.name + # cropped_file_name: str = "crop_" + str(self.crop_region) + "-" + resampled_xr.name + cropped_file_name: str = region_crop_file_name( + self.crop_region, resampled_xr.name + ) export_path: Path = path / cropped_file_name cropped.to_netcdf(export_path) if not hasattr(self, "_cropped_paths"): - self._cropped_paths: dict[str, list[PathLike]] = {} - if region not in self._cropped_paths: - self._cropped_paths[region] = [] - self._cropped_paths[region].append(export_path) + self._cropped_paths: list[PathLike] = [] + # self._cropped_paths: dict[str, list[PathLike]] = {} + # if region not in self._cropped_paths: + # self._cropped_paths[region] = [] + # self._cropped_paths[region].append(export_path) + self._cropped_paths.append(export_path) if return_results: return cropped else: @@ -442,6 +464,8 @@ class HADsResampler(ResamblerBase): If `None`, this will simply iterate over all available files. cpm_for_coord_alignment `CPM` `Path` or `Dataset` to match alignment with. + cpm_for_coord_alignment_path_converted + Whether a `Path` passed to `cpm_for_coord_alignment` should be processed. Notes ----- @@ -487,6 +511,7 @@ class HADsResampler(ResamblerBase): input_file_x_column_name: str = HADS_XDIM input_file_y_column_name: str = HADS_YDIM cpm_for_coord_alignment: T_Dataset | PathLike = RAW_CPM_TASMAX_PATH + cpm_for_coord_alignment_path_converted: bool = False _resample_func: ReprojectFuncType = hads_resample_and_reproject # _use_reference_grid: bool = True @@ -498,9 +523,26 @@ def __post_init__(self) -> None: def set_cpm_for_coord_alignment(self) -> None: """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" - self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( - self.cpm_for_coord_alignment - ) + if self.cpm_for_coord_alignment_path_converted: + if isinstance(self.cpm_for_coord_alignment, Dataset): + logger.info("Using 'self.cpm_for_coord_alignment'...") + elif isinstance(self.cpm_for_coord_alignment, PathLike): + logger.info( + f"Loading 'self.cpm_for_coord_alignment' from " + f"'{self.cpm_for_coord_alignment}'..." + ) + self.cpm_for_coord_alignment, _ = check_xarray_path_and_var_name( + self.cpm_for_coord_alignment, None + ) + else: + raise ValueError( + f"Type of 'cpm_for_coord_alingment' not valid for {self}" + ) + else: + self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( + self.cpm_for_coord_alignment + ) + # if isinstance(self.cpm_for_coord_alignment, PathLike): # if Path(self.cpm_for_coord_alignment).is_dir(): # self.cpm_for_coord_alignment = next( @@ -786,13 +828,13 @@ def _gen_crop_folder_paths( for region in self.crop_regions: crop_path = Path(path) / var / region if append_cropped_path_dict: - self._cropped_path_dict[crop_path] = var + self._cropped_path_dict[crop_path] = region yield crop_path def check_paths( self, run_set_data_paths: bool = True, run_set_crop_paths: bool = True ): - """Check if all `self.input_paths` exist.""" + """Check and set `input`, `resample` and `crop` paths.""" if run_set_data_paths: # self.set_input_paths() @@ -823,8 +865,8 @@ def check_paths( raise FileExistsError(message) try: assert path in self._input_path_dict - except: - NotImplemented( + except AssertionError: + NotImplementedError( f"Syncing `self._input_path_dict` with changes to `self.input_paths`." ) @@ -893,6 +935,7 @@ def yield_crop_configs(self) -> Iterable[HADsResampler]: assert isinstance(self.resample_paths, Iterable) assert isinstance(self.crop_paths, Iterable) for index, input_resample_paths in enumerate(self._resampled_path_dict.items()): + # for crop_path, region in self._cropped_path_dict.items(): for crop_path, region in self._cropped_path_dict.items(): yield self.resampler_class( input_path=input_resample_paths[0], @@ -903,7 +946,8 @@ def yield_crop_configs(self) -> Iterable[HADsResampler]: crop_path=crop_path, # Todo: remove below if single crop configs iterate over all # crop_regions=self.crop_regions, - crop_regions=(region,), + # crop_regions=(region,), + crop_region=region, **self.config_default_kwargs, ) @@ -1034,6 +1078,8 @@ class HADsResamplerManager(ResamblerManagerBase): Number of `cpu` cores to use during multiprocessing. cpm_for_coord_alignment `CPM` `Path` or `Dataset` to match alignment with. + cpm_for_coord_alignment_path_converted + Whether a `Path` passed to `cpm_for_coord_alignment` should be processed. Examples -------- @@ -1067,6 +1113,7 @@ class HADsResamplerManager(ResamblerManagerBase): config_default_kwargs: dict[str, Any] = field(default_factory=dict) resampler_class: type[HADsResampler] = HADsResampler cpm_for_coord_alignment: T_Dataset | PathLike = RAW_CPM_TASMAX_PATH + cpm_for_coord_alignment_path_converted: bool = False # cpus: int | None = None # _input_path_dict: dict[Path, str] = field(default_factory=dict) # _resampled_path_dict: dict[PathLike, VariableOptions | str] = field( @@ -1131,9 +1178,10 @@ def __post_init__(self) -> None: def set_cpm_for_coord_alignment(self) -> None: """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" - self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( - self.cpm_for_coord_alignment - ) + if not self.cpm_for_coord_alignment_path_converted: + self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( + self.cpm_for_coord_alignment + ) def yield_configs(self) -> Iterable[HADsResampler]: """Generate a `CPMResampler` or `HADsResampler` for `self.input_paths`.""" @@ -1148,6 +1196,7 @@ def yield_configs(self) -> Iterable[HADsResampler]: start_index=self.start_index, stop_index=self.stop_index, cpm_for_coord_alignment=self.cpm_for_coord_alignment, + cpm_for_coord_alignment_path_converted=self.cpm_for_coord_alignment_path_converted, **self.config_default_kwargs, ) @@ -1587,5 +1636,5 @@ def _gen_crop_folder_paths( else: crop_path: Path = Path(path) / var / region / run_type if append_cropped_path_dict: - self._cropped_path_dict[crop_path] = var + self._cropped_path_dict[crop_path] = region yield crop_path diff --git a/python/clim_recal/utils/server.py b/python/clim_recal/utils/server.py index 6b1b502e..4220e323 100644 --- a/python/clim_recal/utils/server.py +++ b/python/clim_recal/utils/server.py @@ -495,9 +495,9 @@ def make_user( >>> user_name: str = 'an_unlinkely_test_user' >>> password: str = 'test_pass' >>> code_path: Path = JUPYTER_DOCKER_USER_PATH - >>> make_user(user_name, password, code_path=code_path) # +SKIP + >>> make_user(user_name, password, code_path=code_path) PosixPath('/home/an_unlinkely_test_user') - >>> Path(f'/home/{user_name}/python/conftest.py').is_file() # +SKIP + >>> Path(f'/home/{user_name}/python/conftest.py').is_file() True >>> rm_user(user_name) 'an_unlinkely_test_user' @@ -593,10 +593,10 @@ def make_users( ... file_reader=excel_row_iter, ... code_path=JUPYTER_DOCKER_USER_PATH, ... )) - >>> [(path / 'python' / 'conftest.py').is_file() # +SKIP + >>> [(path / 'python' / 'conftest.py').is_file() ... for path in user_paths] [True, True, True, True, True] - >>> [rm_user(user_path.name) for user_path in user_paths] # +SKIP + >>> [rm_user(user_path.name) for user_path in user_paths] ['sally', 'george', 'jean', 'felicity', 'frank'] """ for record in file_reader(file_path): diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 11afd4b0..b79eb1c7 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -41,7 +41,7 @@ climate_data_mount_path, results_path, ) -from .data import ( # DEFAULT_RELATIVE_GRID_DATA_PATH, +from .data import ( BRITISH_NATIONAL_GRID_EPSG, CPM_RAW_X_COLUMN_NAME, CPM_RAW_Y_COLUMN_NAME, @@ -56,6 +56,7 @@ BoundingBoxCoords, CFCalendarSTANDARD, ConvertCalendarAlignOptions, + RegionOptions, VariableOptions, XArrayEngineType, ) @@ -1333,3 +1334,55 @@ def get_cpm_for_coord_alignment( f"Currently a {type(cpm_for_coord_alignment)}." ) return cpm_for_coord_alignment + + +def region_crop_file_name( + crop_region: str | RegionOptions | None, file_name: PathLike +) -> str: + """Generate a file name for a regional crop. + + Parameters + ---------- + crop_region + Region name to include in cropped file name. + file_name + File name to add `crop_region` name to. + + Examples + -------- + >>> region_crop_file_name( + ... 'Glasgow', + ... 'tasmax.nc') + 'crop_Glasgow_tasmax.nc' + >>> region_crop_file_name( + ... 'Glasgow', + ... 'tasmax_hadukgrid_uk_2_2km_day_19800601-19800630.nc') + 'crop_Glasgow_tasmax_hads_19800601-19800630.nc' + >>> region_crop_file_name( + ... 'Glasgow', + ... 'tasmax_rcp85_land-cpm_uk_2.2km_05_day_std_year_19861201-19871130.nc') + 'crop_Glasgow_tasmax_cpm_05_19861201-19871130.nc' + """ + file_name_sections = Path(file_name).name.split("_") + final_suffix: str + crop_region = crop_region or "" + if "_rcp85_land-cpm_uk_2" in str(file_name): + final_suffix = "_".join( + ( + file_name_sections[0], + "cpm", + file_name_sections[5], + file_name_sections[-1], + ) + ) + elif "_hadukgrid_uk_2_2km_day" in str(file_name): + final_suffix = "_".join( + ( + file_name_sections[0], + "hads", + file_name_sections[-1], + ) + ) + else: + final_suffix = str(file_name) + return "_".join(("crop", str(crop_region), final_suffix)) diff --git a/python/conftest.py b/python/conftest.py index aed35818..65f6828e 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -24,7 +24,10 @@ ) from clim_recal.utils.data import BoundsTupleType from clim_recal.utils.server import CondaLockFileManager -from clim_recal.utils.xarray import GLASGOW_GEOM_LOCAL_PATH +from clim_recal.utils.xarray import ( + GLASGOW_GEOM_LOCAL_PATH, + cpm_reproject_with_standard_calendar, +) from tests.utils import ( CLI_CMETHODS_DEFAULT_COMMAND_STR_CORRECT, CLI_CMETHODS_DEFAULT_COMMAND_TUPLE_CORRECT, @@ -32,6 +35,7 @@ CLI_PREPROCESS_DEFAULT_COMMAND_STR_CORRECT, CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_CORRECT, CLI_PREPROCESS_DEFAULT_COMMAND_TUPLE_STR_CORRECT, + CPM_CONVERTED_TASMAX_1980_FILE, CPM_RAW_TASMAX_1980_FILE, CPM_RAW_TASMAX_EXAMPLE_PATH, HADS_RAW_TASMAX_1980_FILE, @@ -127,18 +131,19 @@ def local_cache_fixtures( LocalCache( name="tasmax_cpm_1980_raw", source_path=CPM_RAW_TASMAX_EXAMPLE_PATH, + # local_cache_path=local_cpm_cache_path / 'tasmax/01/latest' / CPM_RAW_TASMAX_1980_FILE, local_cache_path=local_cpm_cache_path / CPM_RAW_TASMAX_1980_FILE, reader=open_dataset, reader_kwargs={"decode_coords": "all"}, ), - # LocalCache( - # name="tasmax_cpm_1980_converted", - # source_path=CPM_RAW_TASMAX_EXAMPLE_PATH, - # local_cache_path=local_cpm_cache_path, - # reader=open_dataset, - # reader_kwargs={"decode_coords": "all"}, - # parser=cpm_reproject_with_standard_calendar, - # ), + LocalCache( + name="tasmax_cpm_1980_converted", + source_path=CPM_RAW_TASMAX_EXAMPLE_PATH, + local_cache_path=local_cpm_cache_path / CPM_CONVERTED_TASMAX_1980_FILE, + reader=open_dataset, + reader_kwargs={"decode_coords": "all"}, + parser=cpm_reproject_with_standard_calendar, + ), LocalCache( name="tasmax_hads_1980_raw", source_path=HADS_RAW_TASMAX_EXAMPLE_PATH, @@ -220,18 +225,18 @@ def tasmax_hads_1980_raw_path( return local_cache_fixtures["tasmax_hads_1980_raw"].source_path -@pytest.fixture(scope="session") -def tasmax_cpm_1980_converted( - local_cache: bool, - local_cpm_cache_path: Path, - local_cache_fixtures: LocalCachesManager, -) -> T_Dataset | None: - if local_cache: - return local_cache_fixtures["tasmax_cpm_1980_converted"].read( - cache_path=local_cpm_cache_path - ) - else: - return None +# @pytest.fixture(scope="session") +# def tasmax_cpm_1980_converted( +# local_cache: bool, +# local_cpm_cache_path: Path, +# local_cache_fixtures: LocalCachesManager, +# ) -> T_Dataset | None: +# if local_cache: +# return local_cache_fixtures["tasmax_cpm_1980_converted"].read( +# cache_path=local_cpm_cache_path +# ) +# else: +# return None @pytest.fixture(scope="session") diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 1d04bdeb..621acb92 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -1,6 +1,6 @@ from datetime import date from pathlib import Path -from typing import Final +from typing import Any, Final import numpy as np import pytest @@ -10,7 +10,7 @@ from xarray import open_dataset from xarray.core.types import T_DataArray, T_Dataset -from clim_recal.resample import ( # DEFAULT_RELATIVE_GRID_DATA_PATH, +from clim_recal.resample import ( BRITISH_NATIONAL_GRID_EPSG, CPM_CROP_OUTPUT_LOCAL_PATH, HADS_CROP_OUTPUT_LOCAL_PATH, @@ -18,6 +18,7 @@ CPMResamplerManager, HADsResampler, HADsResamplerManager, + ResamblerManagerBase, ) from clim_recal.utils.core import ( CLI_DATE_FORMAT_STR, @@ -26,7 +27,12 @@ date_range_generator, results_path, ) -from clim_recal.utils.data import HadUKGrid, UKCPLocalProjections +from clim_recal.utils.data import ( + HadUKGrid, + RegionOptions, + RunOptions, + UKCPLocalProjections, +) from clim_recal.utils.gdal_formats import NETCDF_EXTENSION_STR from clim_recal.utils.xarray import ( # interpolate_coords, FINAL_RESAMPLE_LAT_COL, @@ -835,3 +841,71 @@ def test_execute_resample_configs( HADS_FIRST_DATES.astype(object) == export.time.dt.strftime(CLI_DATE_FORMAT_STR).head().values ).all() + + +@pytest.mark.localcache +@pytest.mark.slow +@pytest.mark.mount +@pytest.mark.parametrize("manager", (CPMResamplerManager, HADsResamplerManager)) +# @pytest.mark.parametrize("multiprocess", (False, True)) +# @pytest.mark.parametrize("multiprocess", (False, False)) +def test_execute_crop_configs( + manager: ResamblerManagerBase, + # multiprocess: bool, + tmp_path: Path, + resample_test_hads_output_path: Path, + resample_test_cpm_output_path: Path, + tasmax_hads_1980_raw_path: Path, + tasmax_cpm_1980_raw_path: Path, + tasmax_cpm_1980_converted_path: Path, +) -> None: + """Test running default HADs spatial projection.""" + multiprocess: bool = False + input_path: Path + crop_path: Path + manager_kwargs: dict[str, Any] = {} + if isinstance(manager, type(HADsResamplerManager)): + input_path = tasmax_hads_1980_raw_path.parent + crop_path = ( + resample_test_hads_output_path / "manage" / HADS_CROP_OUTPUT_LOCAL_PATH + ) + manager_kwargs["cpm_for_coord_alignment"] = tasmax_cpm_1980_converted_path + manager_kwargs["cpm_for_coord_alignment_path_converted"] = True + else: + input_path = tasmax_cpm_1980_raw_path.parent + crop_path = ( + resample_test_cpm_output_path / "manage" / CPM_CROP_OUTPUT_LOCAL_PATH + ) + manager_kwargs["runs"] = (RunOptions.ONE,) + test_config: ResamblerManagerBase = manager( + input_paths=input_path, + resample_paths=tmp_path, + crop_paths=crop_path, + stop_index=1, + _strict_fail_if_var_in_input_path=False, + **manager_kwargs, + ) + if isinstance(test_config, HADsResamplerManager): + test_config.set_cpm_for_coord_alignment = tasmax_cpm_1980_converted_path + + _: tuple[HADsResampler | CPMResampler, ...] = test_config.execute_resample_configs( + multiprocess=multiprocess + ) + region_crops: tuple[HADsResampler | CPMResampler, ...] = ( + test_config.execute_crop_configs(multiprocess=multiprocess) + ) + region_crop_dict: dict[str, tuple[Path, ...]] = { + crop.crop_region: tuple(Path(crop.crop_path).iterdir()) for crop in region_crops + } + assert len(region_crop_dict) == len(region_crops) == len(RegionOptions) + for region, path in region_crop_dict.items(): + cropped_region: T_Dataset = open_dataset(path[0]) + bbox = RegionOptions.bounding_box(region) + assert_allclose(cropped_region["x"].max(), bbox.xmax, rtol=0.1) + assert_allclose(cropped_region["x"].min(), bbox.xmin, rtol=0.1) + assert_allclose(cropped_region["y"].max(), bbox.ymax, rtol=0.1) + assert_allclose(cropped_region["y"].min(), bbox.ymin, rtol=0.1) + if isinstance(test_config, HADsResamplerManager): + assert len(cropped_region["time"]) == 31 + else: + assert len(cropped_region["time"]) == 365 From 76a14ce530c8a063f9c0c24dcc6ef7434f624de2 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 8 Sep 2024 18:43:23 +0100 Subject: [PATCH 83/92] fix: add `cpm_check_converted` to help fix `get_cpm_for_coord_alignment` --- python/clim_recal/config.py | 20 +- python/clim_recal/resample.py | 413 ++--------- python/clim_recal/utils/xarray.py | 86 ++- python/conftest.py | 24 +- python/tests/test_resample.py | 1086 ++++++++++++++--------------- python/tests/test_utils_xarray.py | 659 +++++++++++++++++ python/tests/utils.py | 21 +- 7 files changed, 1358 insertions(+), 951 deletions(-) create mode 100644 python/tests/test_utils_xarray.py diff --git a/python/clim_recal/config.py b/python/clim_recal/config.py index 1c655320..6c89629d 100644 --- a/python/clim_recal/config.py +++ b/python/clim_recal/config.py @@ -19,12 +19,9 @@ ) from .utils.core import product_dict, results_path from .utils.data import MethodOptions, RegionOptions, RunOptions, VariableOptions -from .utils.xarray import get_cpm_for_coord_alignment warnings.filterwarnings("ignore", category=TqdmExperimentalWarning) -# DATA_PATH_DEFAULT: Final[Path] = climate_data_mount_path() - DEFAULT_OUTPUT_PATH: Final[Path] = Path("clim-recal-runs") DEFAULT_RESAMPLE_FOLDER: Final[Path] = Path("resample") @@ -119,6 +116,7 @@ class ClimRecalConfig(BaseRunConfig): local_dated_crops_path_prefix: str = "crop" cpm_for_coord_alignment: PathLike | None = None process_cmp_for_coord_alignment: bool = False + cpm_for_coord_alignment_path_converted: bool = False debug_mode: bool = False @property @@ -234,8 +232,8 @@ def __post_init__(self) -> None: stop_index=self.stop_index, **self.cpm_kwargs, ) - if self.process_cmp_for_coord_alignment: - self.set_cpm_for_coord_alignment() + # if self.process_cmp_for_coord_alignment: + # self.set_cpm_for_coord_alignment() self.hads_manager = HADsResamplerManager( input_paths=self.hads_input_path, variables=self.variables, @@ -244,17 +242,19 @@ def __post_init__(self) -> None: start_index=self.start_index, stop_index=self.stop_index, cpm_for_coord_alignment=self.cpm_for_coord_alignment, + cpm_for_coord_alignment_path_converted=self.cpm_for_coord_alignment_path_converted, **self.hads_kwargs, ) self.total_cpus: int | None = cpu_count() if self.cpus == None or (self.total_cpus and self.cpus >= self.total_cpus): self.cpus = 1 if not self.total_cpus else self.total_cpus - 1 - def set_cpm_for_coord_alignment(self) -> None: - """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" - self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( - self.cpm_for_coord_alignment - ) + # def set_cpm_for_coord_alignment(self) -> None: + # """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" + # self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( + # self.cpm_for_coord_alignment, + # skip_reproject=self.cpm_for_coord_alignment_path_converted, + # ) def __repr__(self) -> str: """Summary of `self` configuration as a `str`.""" diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index 42868dba..1323d025 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -46,7 +46,6 @@ NETCDF_EXTENSION_STR, ReprojectFuncType, apply_geo_func, - check_xarray_path_and_var_name, cpm_reproject_with_standard_calendar, crop_xarray, get_cpm_for_coord_alignment, @@ -510,38 +509,42 @@ class HADsResampler(ResamblerBase): # resolution_relative_path: Path = HADS_2_2K_RESOLUTION_PATH input_file_x_column_name: str = HADS_XDIM input_file_y_column_name: str = HADS_YDIM - cpm_for_coord_alignment: T_Dataset | PathLike = RAW_CPM_TASMAX_PATH + cpm_for_coord_alignment: T_Dataset | PathLike | None = RAW_CPM_TASMAX_PATH cpm_for_coord_alignment_path_converted: bool = False _resample_func: ReprojectFuncType = hads_resample_and_reproject # _use_reference_grid: bool = True - def __post_init__(self) -> None: - """Ensure `self.cpm_for_coord_alignment` is set.""" - super().__post_init__() - self.set_cpm_for_coord_alignment() - # cpm_match_variable_name: str = self.cpm_for_coord_alignment + # def __post_init__(self) -> None: + # """Ensure `self.cpm_for_coord_alignment` is set.""" + # super().__post_init__() + # # self.set_cpm_for_coord_alignment() + # # cpm_match_variable_name: str = self.cpm_for_coord_alignment def set_cpm_for_coord_alignment(self) -> None: """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" - if self.cpm_for_coord_alignment_path_converted: - if isinstance(self.cpm_for_coord_alignment, Dataset): - logger.info("Using 'self.cpm_for_coord_alignment'...") - elif isinstance(self.cpm_for_coord_alignment, PathLike): - logger.info( - f"Loading 'self.cpm_for_coord_alignment' from " - f"'{self.cpm_for_coord_alignment}'..." - ) - self.cpm_for_coord_alignment, _ = check_xarray_path_and_var_name( - self.cpm_for_coord_alignment, None - ) - else: - raise ValueError( - f"Type of 'cpm_for_coord_alingment' not valid for {self}" - ) - else: - self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( - self.cpm_for_coord_alignment - ) + self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( + self.cpm_for_coord_alignment, + skip_reproject=self.cpm_for_coord_alignment_path_converted, + ) + # if self.cpm_for_coord_alignment_path_converted: + # if isinstance(self.cpm_for_coord_alignment, Dataset): + # logger.info("Using 'self.cpm_for_coord_alignment'...") + # elif isinstance(self.cpm_for_coord_alignment, PathLike): + # logger.info( + # f"Loading 'self.cpm_for_coord_alignment' from " + # f"'{self.cpm_for_coord_alignment}'..." + # ) + # self.cpm_for_coord_alignment, _ = check_xarray_path_and_var_name( + # self.cpm_for_coord_alignment, None + # ) + # else: + # raise ValueError( + # f"Type of 'cpm_for_coord_alingment' not valid for {self}" + # ) + # else: + # self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( + # self.cpm_for_coord_alignment + # ) # if isinstance(self.cpm_for_coord_alignment, PathLike): # if Path(self.cpm_for_coord_alignment).is_dir(): @@ -572,6 +575,7 @@ def to_reprojection( index=index, source_to_index=source_to_index ) path: PathLike = self.output_path + self.set_cpm_for_coord_alignment() # path: PathLike = self._output_path( # self.resolution_relative_path, override_export_path # ) @@ -1114,55 +1118,7 @@ class HADsResamplerManager(ResamblerManagerBase): resampler_class: type[HADsResampler] = HADsResampler cpm_for_coord_alignment: T_Dataset | PathLike = RAW_CPM_TASMAX_PATH cpm_for_coord_alignment_path_converted: bool = False - # cpus: int | None = None - # _input_path_dict: dict[Path, str] = field(default_factory=dict) - # _resampled_path_dict: dict[PathLike, VariableOptions | str] = field( - # default_factory=dict - # ) - # _cropped_path_dict: dict[PathLike, VariableOptions | str] = field( - # default_factory=dict - # ) - # _strict_fail_if_var_in_input_path: bool = True - # _allow_check_fail: bool = False - - # class VarirableInBaseImportPathError(Exception): - # """Checking import path validity for `self.variables`.""" - # pass - # - # def __post_init__(self) -> None: - # """Populate config attributes.""" - # if not self.crop_regions: - # self.crop_regions = () - # self.check_paths() - # self.total_cpus: int | None = cpu_count() - # if not self.cpus: - # self.cpus = 1 if not self.total_cpus else self.total_cpus - # self.cpm_for_coord_alignment: T_Dataset | PathLike = RAW_CPM_TASMAX_PATH - # - # @property - # def input_folder(self) -> Path | None: - # """Return `self._input_path` set by `set_input_paths()`.""" - # if hasattr(self, "_input_path"): - # return Path(self._input_path) - # else: - # return None - # - # @property - # def resample_folder(self) -> Path | None: - # """Return `self._output_path` set by `set_resample_paths()`.""" - # if hasattr(self, "_input_path"): - # return Path(self._input_path) - # else: - # return None - # - # @property - # def crop_folder(self) -> Path | None: - # """Return `self._output_path` set by `set_resample_paths()`.""" - # if hasattr(self, "_crop_path"): - # return Path(self._crop_path) - # else: - # return None - # + def __repr__(self) -> str: """Summary of `self` configuration as a `str`.""" return ( @@ -1171,17 +1127,21 @@ def __repr__(self) -> str: f"input_paths_count={len(self.input_paths) if isinstance(self.input_paths, Sequence) else 1})>" ) - def __post_init__(self) -> None: - """Ensure `self.cpm_for_coord_alignment` is set.""" - super().__post_init__() - # self.set_cpm_for_coord_alignment() + # def __post_init__(self) -> None: + # """Ensure `self.cpm_for_coord_alignment` is set.""" + # super().__post_init__() + # # self.set_cpm_for_coord_alignment() def set_cpm_for_coord_alignment(self) -> None: """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" - if not self.cpm_for_coord_alignment_path_converted: - self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( - self.cpm_for_coord_alignment - ) + self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( + self.cpm_for_coord_alignment, + skip_reproject=self.cpm_for_coord_alignment_path_converted, + ) + # if not self.cpm_for_coord_alignment_path_converted: + # self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( + # self.cpm_for_coord_alignment + # ) def yield_configs(self) -> Iterable[HADsResampler]: """Generate a `CPMResampler` or `HADsResampler` for `self.input_paths`.""" @@ -1200,266 +1160,6 @@ def yield_configs(self) -> Iterable[HADsResampler]: **self.config_default_kwargs, ) - # - # # def _gen_input_folder_paths( - # # self, - # # path: PathLike, - # # append_var_path_dict: bool = False, - # # ) -> Iterator[Path]: - # # """Yield input paths of `self.variables` and `self.runs`.""" - # # var_path: Path - # # for var in self.variables: - # # var_path = Path(path) / var / self.sub_path - # # if append_var_path_dict: - # # self._path_dict[var_path] = var - # # yield var_path - # - # def _gen_resample_folder_paths( - # self, - # path: PathLike, - # append_input_path_dict: bool = False, - # append_resampled_path_dict: bool = False, - # ) -> Iterator[tuple[Path, Path]]: - # """Yield paths of resampled `self.variables` and `self.runs`.""" - # for var in self.variables: - # input_path: Path = Path(path) / var / self.sub_path - # resample_path: Path = Path(path) / var - # if append_input_path_dict: - # self._input_path_dict[input_path] = var - # if append_resampled_path_dict: - # self._resampled_path_dict[resample_path] = var - # yield input_path, resample_path - # - # def _gen_crop_folder_paths( - # self, path: PathLike, append_cropped_path_dict: bool = False - # ) -> Iterator[Path | None]: - # """Return a Generator of paths of `self.variables` and `self.crops`.""" - # if not self.crop_regions: - # return None - # if not self._resampled_path_dict: - # self._gen_resample_folder_paths( - # self.input_paths, - # append_input_path_dict=True, - # append_resampled_path_dict=True, - # ) - # for var in self.variables: - # for region in self.crop_regions: - # crop_path = Path(path) / var / region - # if append_cropped_path_dict: - # self._cropped_path_dict[crop_path] = var - # yield crop_path - # - # def check_paths( - # self, run_set_data_paths: bool = True, run_set_crop_paths: bool = True - # ): - # """Check if all `self.input_paths` exist.""" - # - # if run_set_data_paths: - # # self.set_input_paths() - # self.set_resample_paths() - # if run_set_crop_paths: - # self.set_crop_paths() - # assert isinstance(self.input_paths, Iterable) - # assert isinstance(self.resample_paths, Iterable) - # if self.crop_paths: - # try: - # assert isinstance(self.crop_paths, Iterable) - # except AssertionError: - # raise ValueError( - # f"'crop_paths' not iterable for {self}. Hint: try setting 'run_set_crop_paths' to 'True'." - # ) - # assert len(self.input_paths) == len(self.resample_paths) - # for path in self.input_paths: - # try: - # assert Path(path).exists() - # assert Path(path).is_dir() - # except AssertionError: - # message: str = ( - # f"One of 'self.input_paths' in {self} not valid: '{path}'" - # ) - # if self._allow_check_fail: - # logger.error(message) - # else: - # raise FileExistsError(message) - # try: - # assert path in self._input_path_dict - # except: - # NotImplemented( - # f"Syncing `self._input_path_dict` with changes to `self.input_paths`." - # ) - # - # def _set_input_paths(self): - # """Propagate `self.input_paths` if needed.""" - # if isinstance(self.input_paths, PathLike): - # self._input_path = self.input_paths - # self.input_paths = tuple( - # input_path - # for input_path, _ in self._gen_resample_folder_paths( - # self.input_paths, append_input_path_dict=True - # ) - # ) - # if self._strict_fail_if_var_in_input_path: - # for var in self.variables: - # try: - # assert var not in str(self._input_path) - # except AssertionError: - # raise self.VarirableInBaseImportPathError( - # f"Folder named '{var}' in self._input_path: " - # f"'{self._input_path}'. Try passing a parent path or " - # f"set '_strict_fail_if_var_in_input_path' to 'False'." - # ) - # - # def set_resample_paths(self): - # """Propagate `self.resample_paths` if needed.""" - # self._set_input_paths() - # if isinstance(self.resample_paths, PathLike): - # self._output_path = self.resample_paths - # self.resample_paths = tuple( - # resample_path - # for _, resample_path in self._gen_resample_folder_paths( - # self.resample_paths, append_resampled_path_dict=True - # ) - # ) - # - # def set_crop_paths(self): - # """Propagate `self.resample_paths` if needed.""" - # if isinstance(self.crop_paths, PathLike): - # self._crop_path = self.crop_paths - # self.crop_paths = tuple( - # self._gen_crop_folder_paths( - # self.crop_paths, append_cropped_path_dict=True - # ) - # ) - # - # def set_cpm_for_coord_alignment(self) -> None: - # """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" - # self.cpm_for_coord_alignment = get_cpm_for_coord_alignment(self.cpm_for_coord_alignment) - # - # def yield_configs(self) -> Iterable[HADsResampler]: - # """Generate a `CPMResampler` or `HADsResampler` for `self.input_paths`.""" - # self.check_paths() - # assert isinstance(self.resample_paths, Iterable) - # # assert isinstance(self.crop_paths, Iterable) - # for index, var_path in enumerate(self._input_path_dict.items()): - # yield self.resampler_class( - # input_path=var_path[0], - # output_path=self.resample_paths[index], - # variable_name=var_path[1], - # start_index=self.start_index, - # stop_index=self.stop_index, - # **self.config_default_kwargs, - # ) - # - # def yield_crop_configs(self) -> Iterable[HADsResampler]: - # """Generate a `CPMResampler` or `HADsResampler` for `self.input_paths`.""" - # self.check_paths() - # assert isinstance(self.input_paths, Iterable) - # assert isinstance(self.resample_paths, Iterable) - # assert isinstance(self.crop_paths, Iterable) - # for index, input_resample_paths in enumerate(self._resampled_path_dict.items()): - # for crop_path, region in self._cropped_path_dict.items(): - # yield self.resampler_class( - # input_path=input_resample_paths[0], - # output_path=self.resample_paths[index], - # variable_name=input_resample_paths[1], - # start_index=self.start_index, - # stop_index=self.stop_index, - # crop_path=crop_path, - # # Todo: remove below if single crop configs iterate over all - # # crop_regions=self.crop_regions, - # crop_regions=(region,), - # **self.config_default_kwargs, - # ) - # - # def __len__(self) -> int: - # """Return the length of `self.input_files`.""" - # return ( - # len(self.input_paths[self.start_index : self.stop_index]) - # if isinstance(self.input_paths, Sequence) - # else 0 - # ) - # - # @property - # def max_count(self) -> int: - # """Maximum length of `self.input_files` ignoring `start_index` and `start_index`.""" - # return len(self.input_paths) if isinstance(self.input_paths, Sequence) else 0 - # - # def __iter__(self) -> Iterator[Path] | None: - # if isinstance(self.input_paths, Sequence): - # for file_path in self.input_paths[self.start_index : self.stop_index]: - # yield Path(file_path) - # else: - # return None - # - # def __getitem__(self, key: int | slice) -> Path | tuple[Path, ...] | None: - # if not self.input_paths or not isinstance(self.input_paths, Sequence): - # return None - # elif isinstance(key, int): - # return Path(self.input_paths[key]) - # elif isinstance(key, slice): - # return tuple(Path(path) for path in self.input_paths[key]) - # else: - # raise IndexError(f"Can only index with 'int', not: '{key}'") - # - # def execute_resample_configs( - # self, multiprocess: bool = False, cpus: int | None = None - # ) -> tuple[CPMResampler | HADsResampler, ...]: - # """Run all resampler configurations - # - # Parameters - # ---------- - # multiprocess - # If `True` run parameters in `resample_configs` with `multiprocess_execute`. - # cpus - # Number of `cpus` to pass to `multiprocess_execute`. - # """ - # resamplers: tuple[CPMResampler | HADsResampler, ...] = tuple( - # self.yield_configs() - # ) - # results: list[list[Path] | None] = [] - # if multiprocess: - # cpus = cpus or self.cpus - # if self.total_cpus and cpus: - # cpus = min(cpus, self.total_cpus - 1) - # results = multiprocess_execute(resamplers, method_name="execute", cpus=cpus) - # else: - # for resampler in resamplers: - # print(resampler) - # results.append(resampler.execute()) - # return resamplers - # - # def execute_crop_configs( - # self, multiprocess: bool = False, cpus: int | None = None - # ) -> tuple[CPMResampler | HADsResampler, ...]: - # """Run all resampler configurations - # - # Parameters - # ---------- - # multiprocess - # If `True` run parameters in `resample_configs` with `multiprocess_execute`. - # cpus - # Number of `cpus` to pass to `multiprocess_execute`. - # """ - # croppers: tuple[CPMResampler | HADsResampler, ...] = tuple( - # # self.yield_configs( - # # input_path=self.resample_paths, output_path=self.crop_path - # # ) - # self.yield_crop_configs() - # ) - # results: list[list[Path] | None] = [] - # if multiprocess: - # cpus = cpus or self.cpus - # if self.total_cpus and cpus: - # cpus = min(cpus, self.total_cpus - 1) - # results = multiprocess_execute( - # croppers, method_name="execute_crops", cpus=cpus - # ) - # else: - # for cropper in croppers: - # print(cropper) - # results.append(cropper.execute_crops()) - # return croppers - @dataclass(kw_only=True, repr=False) class CPMResamplerManager(ResamblerManagerBase): @@ -1560,33 +1260,6 @@ def __repr__(self) -> str: f"input_paths_count={len(self.input_paths) if isinstance(self.input_paths, Sequence) else 1})>" ) - # def __post_init__(self) -> None: - # """Ensure `self.cpm_for_coord_alignment` is set.""" - # super().__post_init__() - # self.set_cpm_for_coord_alignment() - - # def _gen_input_folder_paths( - # self, path: PathLike, append_var_path_dict: bool = False, cpm_paths: bool = True - # ) -> Iterator[Path]: - # """Yield input paths of `self.variables` and `self.runs`.""" - # var_path: Path - # for var in self.variables: - # for run_type in self.runs: - # if cpm_paths: - # var_path: Path = ( - # Path(path) - # / VariableOptions.cpm_value(var) - # / run_type - # / self.sub_path - # ) - # else: - # var_path: Path = Path(path) / var / run_type / self.sub_path - # if append_var_path_dict: - # self._var_path_dict[var_path] = var - # # Todo: remove below once testing confirms _var_path_dict works - # # self._var_path_dict[var].append(var_path) - # yield var_path - def _gen_resample_folder_paths( self, path: PathLike, diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index b79eb1c7..e0c56cd1 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -80,6 +80,9 @@ CPM_REGEX: Final[str] = "[!.]*cpm*.nc" HADS_MIN_NULL: float = -1000000 +FINAL_CONVERTED_CPM_WIDTH: Final[int] = 493 +FINAL_CONVERTED_CPM_HEIGHT: Final[int] = 607 + # MONTH_DAY_DROP: DropDayType = {(1, 31), (4, 1), (6, 1), (8, 1), (10, 1), (12, 1)} # """A `set` of tuples of month and day numbers for `enforce_date_changes`.""" @@ -195,10 +198,43 @@ def check_xarray_path_and_var_name( return xr_time_series, variable_name +def cpm_check_converted(cpm_xr_time_series: T_Dataset | PathLike) -> bool: + """Check if `cpm_xr_time_series` is likely already reprojected. + + Parameters + ---------- + cpm_xr_time_series + `Dataset` instance or `Path` to check. + + Returns + ------- + `True` if all of the methics are `True`, else `False` + """ + cpm_xr_time_series, variable = check_xarray_path_and_var_name( + xr_time_series=cpm_xr_time_series, variable_name=None + ) + checks_dict: dict[str, bool] = {} + if "time" in cpm_xr_time_series.dims: + checks_dict["time-365-or-366"] = cpm_xr_time_series.dims["time"] in (365, 366) + if "x" in cpm_xr_time_series.dims: + checks_dict["x-final-coords"] = ( + cpm_xr_time_series.dims["x"] == FINAL_CONVERTED_CPM_WIDTH + ) + if "y" in cpm_xr_time_series.dims: + checks_dict["y-final-coords"] = ( + cpm_xr_time_series.dims["y"] == FINAL_CONVERTED_CPM_HEIGHT + ) + if all(checks_dict.values()): + return True + else: + return False + + def cpm_reproject_with_standard_calendar( cpm_xr_time_series: T_Dataset | PathLike, variable_name: str | None = None, close_temp_paths: bool = True, + force: bool = False, ) -> T_Dataset: """Convert raw `cpm_xr_time_series` to an 365/366 days and 27700 coords. @@ -245,6 +281,16 @@ def cpm_reproject_with_standard_calendar( >>> tasmax_cpm_1980_365_day.dims Frozen...({'time': 365, 'x': 493, 'y': 607}) """ + if not force: + logger.info("Checking if already converted...") + if cpm_check_converted(cpm_xr_time_series): + logger.info("Similar to already converted. Returning unmodified") + xr_dataset, _ = check_xarray_path_and_var_name( + cpm_xr_time_series, variable_name=variable_name + ) + return xr_dataset + else: + logger.info("Force skip checking if already converted...") temp_cpm: _TemporaryFileWrapper = NamedTemporaryFile( suffix="." + NETCDF_EXTENSION_STR ) @@ -1299,7 +1345,9 @@ def cftime_range_gen(time_data_array: T_DataArray, **kwargs) -> NDArray: def get_cpm_for_coord_alignment( - cpm_for_coord_alignment: PathLike | T_Dataset, cpm_regex: str = CPM_REGEX + cpm_for_coord_alignment: PathLike | T_Dataset | None, + skip_reproject: bool = False, + cpm_regex: str = CPM_REGEX, ) -> T_Dataset: """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`. @@ -1311,20 +1359,46 @@ def get_cpm_for_coord_alignment( `cpm_regex` will be used. It will then be processed via `cpm_reproject_with_standard_calendar` for comparability and use alongside `cpm` files. + skip_reproject + Whether to skip calling `cpm_reproject_with_standard_calendar`. cpm_regex A regular expression to filter suitable files if `cpm_for_coord_alignment` is a folder `Path`. + + Returns + ------- + An `xarray.Dataset` coordinate structure to align `HADs` coordinates. """ - if isinstance(cpm_for_coord_alignment, PathLike): - if Path(cpm_for_coord_alignment).is_dir(): - cpm_for_coord_alignment = next( - Path(cpm_for_coord_alignment).glob(cpm_regex) + if not cpm_for_coord_alignment: + raise ValueError("'cpm_for_coord_alignment' must be a Path or xarray Dataset.") + elif isinstance(cpm_for_coord_alignment, PathLike): + path: Path = Path(cpm_for_coord_alignment) + if Path(path).is_dir(): + path = next(Path(path).glob(cpm_regex)) + if skip_reproject: + logger.info(f"Skipping reprojection and loading '{path}'...") + cpm_for_coord_alignment, variable = check_xarray_path_and_var_name( + cpm_for_coord_alignment, None + ) + logger.info( + f"Variable '{variable}' loaded for coord alignment from '{path}'." ) + else: + logger.info(f"Converting coordinates of '{path}'...") + cpm_for_coord_alignment = cpm_reproject_with_standard_calendar(path) + logger.info(f"Coordinates converted from '{path}''") + elif not skip_reproject: + logger.info( + f"Converting coordinates of type {type(cpm_for_coord_alignment)} ..." + ) cpm_for_coord_alignment = cpm_reproject_with_standard_calendar( cpm_for_coord_alignment ) + logger.info(f"Coordinates converted to type {type(cpm_for_coord_alignment)}") + else: logger.info( - f"Set 'self.cpm_for_coord_alignment' to: '{cpm_for_coord_alignment}'" + f"Coordinate converter of type {type(cpm_for_coord_alignment)} " + f"loaded without processing." ) try: assert isinstance(cpm_for_coord_alignment, Dataset) diff --git a/python/conftest.py b/python/conftest.py index 65f6828e..ab675a14 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -225,18 +225,18 @@ def tasmax_hads_1980_raw_path( return local_cache_fixtures["tasmax_hads_1980_raw"].source_path -# @pytest.fixture(scope="session") -# def tasmax_cpm_1980_converted( -# local_cache: bool, -# local_cpm_cache_path: Path, -# local_cache_fixtures: LocalCachesManager, -# ) -> T_Dataset | None: -# if local_cache: -# return local_cache_fixtures["tasmax_cpm_1980_converted"].read( -# cache_path=local_cpm_cache_path -# ) -# else: -# return None +@pytest.fixture(scope="session") +def tasmax_cpm_1980_converted( + local_cache: bool, + local_cpm_cache_path: Path, + local_cache_fixtures: LocalCachesManager, +) -> T_Dataset | None: + if local_cache: + return local_cache_fixtures["tasmax_cpm_1980_converted"].read( + cache_path=local_cpm_cache_path + ) + else: + return None @pytest.fixture(scope="session") diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 621acb92..238e1ca8 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -1,4 +1,3 @@ -from datetime import date from pathlib import Path from typing import Any, Final @@ -6,12 +5,10 @@ import pytest from numpy.testing import assert_allclose from numpy.typing import NDArray -from osgeo.gdal import Dataset as GDALDataset from xarray import open_dataset -from xarray.core.types import T_DataArray, T_Dataset +from xarray.core.types import T_Dataset from clim_recal.resample import ( - BRITISH_NATIONAL_GRID_EPSG, CPM_CROP_OUTPUT_LOCAL_PATH, HADS_CROP_OUTPUT_LOCAL_PATH, CPMResampler, @@ -20,73 +17,40 @@ HADsResamplerManager, ResamblerManagerBase, ) -from clim_recal.utils.core import ( - CLI_DATE_FORMAT_STR, - DateType, - annual_data_paths_generator, - date_range_generator, - results_path, -) -from clim_recal.utils.data import ( - HadUKGrid, - RegionOptions, - RunOptions, - UKCPLocalProjections, -) -from clim_recal.utils.gdal_formats import NETCDF_EXTENSION_STR -from clim_recal.utils.xarray import ( # interpolate_coords, - FINAL_RESAMPLE_LAT_COL, +from clim_recal.utils.core import CLI_DATE_FORMAT_STR +from clim_recal.utils.data import RegionOptions, RunOptions +from clim_recal.utils.xarray import ( + FINAL_CONVERTED_CPM_WIDTH, FINAL_RESAMPLE_LON_COL, - HADS_RAW_X_COLUMN_NAME, - HADS_RAW_Y_COLUMN_NAME, - NETCDF4_XARRAY_ENGINE, - ConvertCalendarAlignOptions, - convert_xr_calendar, - cpm_reproject_with_standard_calendar, - cpm_xarray_to_standard_calendar, - file_name_to_start_end_dates, - hads_resample_and_reproject, plot_xarray, ) from .utils import ( - CPM_RAW_TASMAX_EXAMPLE_PATH, CPM_TASMAX_DAY_SERVER_PATH, CPM_TASMAX_LOCAL_TEST_PATH, + FINAL_CPM_DEC_10_X_2_Y_200_210, HADS_UK_TASMAX_DAY_SERVER_PATH, HADS_UK_TASMAX_LOCAL_TEST_PATH, - xarray_example, - year_days_count, ) HADS_FIRST_DATES: Final[NDArray] = np.array( ["19800101", "19800102", "19800103", "19800104", "19800105"] ) -CALENDAR_CONVERTED_CPM_WIDTH: Final[int] = 484 -CALENDAR_CONVERTED_CPM_HEIGHT: Final[int] = 606 - # FINAL_CONVERTED_CPM_WIDTH: Final[int] = 410 # FINAL_CONVERTED_CPM_HEIGHT: Final[int] = 660 -FINAL_CONVERTED_CPM_WIDTH: Final[int] = 493 -FINAL_CONVERTED_CPM_HEIGHT: Final[int] = 607 - -FINAL_CONVERTED_HADS_WIDTH: Final[int] = 410 -FINAL_CONVERTED_HADS_HEIGHT: Final[int] = 660 - -RAW_CPM_TASMAX_1980_FIRST_5: Final[NDArray] = np.array( - [12.654932, 12.63711, 12.616358, 12.594385, 12.565821], dtype="float32" -) -RAW_CPM_TASMAX_1980_DEC_30_FIRST_5: Final[NDArray] = np.array( - [13.832666, 13.802149, 13.788477, 13.777491, 13.768946], dtype="float32" -) +# FINAL_CONVERTED_CPM_WIDTH: Final[int] = 493 +# FINAL_CONVERTED_CPM_HEIGHT: Final[int] = 607 +# +# FINAL_CONVERTED_HADS_WIDTH: Final[int] = 410 +# FINAL_CONVERTED_HADS_HEIGHT: Final[int] = 660 -PROJECTED_CPM_TASMAX_1980_FIRST_5: Final[NDArray] = np.array( - [13.406641, 13.376368, 13.361719, 13.354639, 13.334864], dtype="float32" -) -PROJECTED_CPM_TASMAX_1980_DEC_31_FIRST_5: Final[NDArray] = np.array( - [10.645899, 10.508448, 10.546778, 10.547998, 10.553614], dtype="float32" -) +# RAW_CPM_TASMAX_1980_FIRST_5: Final[NDArray] = np.array( +# [12.654932, 12.63711, 12.616358, 12.594385, 12.565821], dtype="float32" +# ) +# RAW_CPM_TASMAX_1980_DEC_30_FIRST_5: Final[NDArray] = np.array( +# [13.832666, 13.802149, 13.788477, 13.777491, 13.768946], dtype="float32" +# ) # FINAL_HADS_JAN_10_430_X_230_250_Y: Final[NDArray] = np.array( @@ -114,37 +78,37 @@ # ) # ) -FINAL_HADS_JAN_10_430_X_200_210_Y: Final[NDArray] = np.array( - ( - np.nan, - np.nan, - np.nan, - np.nan, - 7.57977839, - 7.47138044, - 7.27587694, - 7.27587694, - 7.07294578, - 7.04533059, - ) -) - - -FINAL_CPM_DEC_10_X_2_Y_200_210: Final[NDArray] = np.array( - ( - np.nan, - np.nan, - 9.637598, - 9.646631, - 9.636621, - 9.622217, - 9.625147, - 9.640039, - 9.6349125, - 9.509668, - ) -) +# FINAL_HADS_JAN_10_430_X_200_210_Y: Final[NDArray] = np.array( +# ( +# np.nan, +# np.nan, +# np.nan, +# np.nan, +# 7.57977839, +# 7.47138044, +# 7.27587694, +# 7.27587694, +# 7.07294578, +# 7.04533059, +# ) +# ) +# +# FINAL_CPM_DEC_10_X_2_Y_200_210: Final[NDArray] = np.array( +# ( +# np.nan, +# np.nan, +# 9.637598, +# 9.646631, +# 9.636621, +# 9.622217, +# 9.625147, +# 9.640039, +# 9.6349125, +# 9.509668, +# ) +# ) +# # @pytest.fixture(scope="session") # def reference_final_coord_grid() -> T_Dataset: @@ -156,10 +120,11 @@ def cpm_tasmax_raw_mount_path(data_mount_path: Path) -> Path: return data_mount_path / CPM_TASMAX_DAY_SERVER_PATH -@pytest.fixture -def cpm_tasmax_raw_5_years_paths(cpm_tasmax_raw_path: Path) -> tuple[Path, ...]: - """Return a `tuple` of valid paths for 5 years of""" - return tuple(annual_data_paths_generator(parent_path=cpm_tasmax_raw_path)) +# +# @pytest.fixture +# def cpm_tasmax_raw_5_years_paths(cpm_tasmax_raw_path: Path) -> tuple[Path, ...]: +# """Return a `tuple` of valid paths for 5 years of""" +# return tuple(annual_data_paths_generator(parent_path=cpm_tasmax_raw_path)) @pytest.fixture @@ -177,413 +142,413 @@ def cpm_tasmax_local_test_path(data_fixtures_path: Path) -> Path: return data_fixtures_path / CPM_TASMAX_LOCAL_TEST_PATH -def test_leap_year_days() -> None: - """Test covering a leap year of 366 days.""" - start_date_str: str = "2024-03-01" - end_date_str: str = "2025-03-01" - xarray_2024_2025: T_DataArray = xarray_example( - start_date=start_date_str, - end_date=end_date_str, - inclusive=True, - ) - assert len(xarray_2024_2025) == year_days_count(leap_years=1) - - -# This is roughly what I had in mind for -# https://github.com/alan-turing-institute/clim-recal/issues/132 -# This tests converting from a standard calendar to a 360_day calendar. -@pytest.mark.parametrize( - # Only one of start_date and end_date are included the day counts - "start_date, end_date, gen_date_count, days_360, converted_days, align_on", - [ - pytest.param( - # 4 years, including a leap year - "2024-03-02", - "2028-03-02", - year_days_count(standard_years=3, leap_years=1), - year_days_count(xarray_360_day_years=4), - year_days_count(standard_years=3, leap_years=1), - "year", - id="years_4_annual_align", - ), - pytest.param( - # A whole year, most of which is in a leap year, but avoids the leap day - "2024-03-02", - "2025-03-02", - year_days_count(standard_years=1), - year_days_count(xarray_360_day_years=1) - 1, - year_days_count(standard_years=1), - "year", - id="leap_year_but_no_leap_day_annual_align", - ), - pytest.param( - # A whole year, the same date range as the previous test, - # but includes the leap day and the majority of the days are in a non-leap year - # Note: the current final export configuration *adds* a day - "2023-03-02", - "2024-03-02", - year_days_count(leap_years=1), - year_days_count(xarray_360_day_years=1) + 1, - year_days_count(leap_years=1) + 1, - "year", - id="leap_year_with_leap_day_annual_align", - ), - pytest.param( - # An exact calendar year which *IS NOT* a leap year - "2023-01-01", - "2024-01-01", - year_days_count(standard_years=1), - year_days_count(xarray_360_day_years=1), - year_days_count(standard_years=1), - "year", - id="non_leap_year_annual_align", - ), - pytest.param( - # A leap day (just the days either side, in a leap year) - "2024-02-28", - "2024-03-01", - 2, - 2, - 2, - "year", - id="leap_day", - ), - pytest.param( - # A non-leap day (just the days either side, in a non-leap year) - "2023-02-28", - "2023-03-01", - 1, - 1, - 1, - "year", - id="non_leap_day_date_align", - ), - # Add more test cases to cover the different scenarios and edge cases - pytest.param( - # 4 years, including a leap year - # WARNING: the intermittent year days seems a week short - "2024-03-02", - "2028-03-02", - year_days_count(standard_years=3, leap_years=1), - year_days_count(xarray_360_day_years=4) - 7, - year_days_count(standard_years=3, leap_years=1), - "date", - id="years_4_date_align", - marks=pytest.mark.xfail(reason="raises `date_range_like` error"), - ), - pytest.param( - # A whole year, most of which is in a leap year, but avoids the leap day - "2024-03-02", - "2025-03-02", - year_days_count(standard_years=1), - year_days_count(xarray_360_day_years=1) - 2, - year_days_count(standard_years=1), - "date", - id="leap_year_but_no_leap_day_date_align", - marks=pytest.mark.xfail(reason="raises `date_range_like` error"), - ), - pytest.param( - # A whole year, the same date range as the previous test, - # but includes the leap day and the majority of the days are in a non-leap year - # Note: the current final export configuration *adds* a day - "2023-03-02", - "2024-03-02", - year_days_count(leap_years=1), - year_days_count(xarray_360_day_years=1) - 1, - year_days_count(leap_years=1) + 1, - "date", - id="leap_year_with_leap_day_date_align", - marks=pytest.mark.xfail(reason="raises `date_range_like` error"), - ), - pytest.param( - # An exact calendar year which *IS NOT* a leap year - "2023-01-01", - "2024-01-01", - year_days_count(standard_years=1), - year_days_count(xarray_360_day_years=1) - 2, - year_days_count(standard_years=1), - "date", - id="non_leap_year_date_align", - marks=pytest.mark.xfail(reason="raises `date_range_like` error"), - ), - pytest.param( - # A leap day (just the days either side, in a leap year) - "2024-02-28", - "2024-03-01", - 2, - 2, - 2, - "date", - id="leap_day", - ), - pytest.param( - # A non-leap day (just the days either side, in a non-leap year) - "2023-02-28", - "2023-03-01", - 1, - 1, - 1, - "date", - id="non_leap_day_date_align", - ), - ], -) -def test_time_gaps_360_to_standard_calendar( - start_date: DateType, - end_date: DateType, - gen_date_count: int, - days_360: int, - converted_days: int, - align_on: ConvertCalendarAlignOptions, -): - """Test `convert_xr_calendar` call of `360_day` `DataArray` to `standard` calendar.""" - # Potential paramaterized variables - inclusive_date_range: bool = False # includes the last day specified - use_cftime: bool = True # Whether to enforece using `cftime` over `datetime64` - # align_on: ConvertCalendarAlignOptions = 'date' - - # Create a base - base: T_Dataset = xarray_example( - start_date, end_date, as_dataset=True, inclusive=inclusive_date_range - ) - - # Ensure the generated date range matches for later checks - # This occurs for a sigle leap year - assert len(base.time) == gen_date_count - - # Convert to `360_day` calendar example - dates_360: T_Dataset = base.convert_calendar( - calendar="360_day", - align_on=align_on, - use_cftime=use_cftime, - ) - - # Check the total number of days are as expected - assert len(dates_360.time) == days_360 - - if converted_days < 5: - with pytest.raises(ValueError): - convert_xr_calendar(dates_360, align_on=align_on, use_cftime=use_cftime) - else: - dates_converted: T_Dataset = convert_xr_calendar( - dates_360, align_on=align_on, use_cftime=use_cftime - ) - assert len(dates_converted.time) == converted_days - - # Optionally now check which dates have been dropped and added - # Add more assertions here... - assert all(base.time == dates_converted.time) - assert all(base.time != dates_360.time) - - -@pytest.mark.slow -@pytest.mark.mount -@pytest.mark.parametrize("interpolate_na", (True, False)) -def test_convert_cpm_calendar(interpolate_na: bool) -> None: - """Test `convert_calendar` on mounted `cpm` data. - - Notes - ----- - If `interpolate_na` is `True`, there shouldn't be `tasmax` `nan` values, hence - creating the `na_values` `bool` as the inverse of `interpolate_na`. - """ - any_na_values_in_tasmax: bool = not interpolate_na - raw_nc: T_Dataset = open_dataset( - CPM_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all", engine=NETCDF4_XARRAY_ENGINE - ) - assert len(raw_nc.time) == 360 - assert len(raw_nc.time_bnds) == 360 - converted: T_Dataset = convert_xr_calendar(raw_nc, interpolate_na=interpolate_na) - assert len(converted.time) == 365 - assert len(converted.time_bnds) == 365 - assert ( - np.isnan(converted.tasmax.head()[0][0][0].values).all() - == any_na_values_in_tasmax - ) - - -@pytest.mark.localcache -@pytest.mark.mount -@pytest.mark.slow -@pytest.mark.parametrize("include_bnds_index", (True, False)) -def test_cpm_xarray_to_standard_calendar( - tasmax_cpm_1980_raw: T_Dataset, - include_bnds_index: bool, -) -> None: - """Test 360 raw to 365/366 calendar conversion. - - Notes - ----- - Indexing differs between `include_bnds_index` ``bool`. - ``` - """ - CORRECT_PROJ4: Final[str] = ( - "+proj=ob_tran +o_proj=longlat +o_lon_p=0 +o_lat_p=37.5 +lon_0=357.5 +R=6371229 +no_defs=True" - ) - test_converted = cpm_xarray_to_standard_calendar( - tasmax_cpm_1980_raw, include_bnds_index=include_bnds_index - ) - assert test_converted.rio.width == CALENDAR_CONVERTED_CPM_WIDTH - assert test_converted.rio.height == CALENDAR_CONVERTED_CPM_HEIGHT - assert test_converted.rio.crs.to_proj4() == CORRECT_PROJ4 - assert test_converted.tasmax.rio.crs.to_proj4() == CORRECT_PROJ4 - assert len(test_converted.time) == 365 - - tasmax_data_subset: NDArray - if include_bnds_index: - assert len(test_converted.tasmax.data) == 2 # second band - assert len(test_converted.tasmax.data[0][0]) == 365 # first band - assert len(test_converted.tasmax.data[1][0]) == 365 # second band - tasmax_data_subset = test_converted.tasmax.data[0][0] # first band - else: - assert len(test_converted.tasmax.data) == 1 # no band index - tasmax_data_subset = test_converted.tasmax.data[0] - assert len(tasmax_data_subset) == 365 - - # By default December 1 in a 360 to 365 projection would - # be null. The values matching below should indicate the - # projection has interpolated null values on the first date - assert ( - tasmax_data_subset[0][0][:5] - == PROJECTED_CPM_TASMAX_1980_FIRST_5 - # test_converted.tasmax.data[0][0][0][0][:5] == PROJECTED_CPM_TASMAX_1980_FIRST_5 - ).all() - # Check December 31 1980, which wouldn't be included in 360 day calendar - assert ( - # test_converted.tasmax.data[0][0][31][0][:5] - tasmax_data_subset[31][0][:5] - == PROJECTED_CPM_TASMAX_1980_DEC_31_FIRST_5 - ).all() - - -@pytest.mark.localcache -@pytest.mark.mount -@pytest.mark.slow -def test_cpm_reproject_with_standard_calendar( - tasmax_cpm_1980_raw_path: Path, - test_runs_output_path: Path, - variable_name: str = "tasmax", -) -> None: - """Test all steps around calendar and warping CPM RAW data.""" - output_path: Path = results_path( - "test-cpm-warp", - path=test_runs_output_path, - mkdir=True, - extension=NETCDF_EXTENSION_STR, - ) - plot_path: Path = output_path.parent / (output_path.stem + ".png") - projected: T_Dataset = cpm_reproject_with_standard_calendar( - tasmax_cpm_1980_raw_path, - ) - assert projected.rio.crs == BRITISH_NATIONAL_GRID_EPSG - projected.to_netcdf(output_path) - results: T_Dataset = open_dataset(output_path, decode_coords="all") - assert (results.time == projected.time).all() - assert results.dims == { - FINAL_RESAMPLE_LON_COL: FINAL_CONVERTED_CPM_WIDTH, - FINAL_RESAMPLE_LAT_COL: FINAL_CONVERTED_CPM_HEIGHT, - "time": 365, - } - assert results.rio.crs == BRITISH_NATIONAL_GRID_EPSG - assert len(results.data_vars) == 1 - assert_allclose( - results[variable_name][10][2][200:210], FINAL_CPM_DEC_10_X_2_Y_200_210 - ) - plot_xarray(results.tasmax[0], plot_path, time_stamp=True) - +# def test_leap_year_days() -> None: +# """Test covering a leap year of 366 days.""" +# start_date_str: str = "2024-03-01" +# end_date_str: str = "2025-03-01" +# xarray_2024_2025: T_DataArray = xarray_example( +# start_date=start_date_str, +# end_date=end_date_str, +# inclusive=True, +# ) +# assert len(xarray_2024_2025) == year_days_count(leap_years=1) +# +# +# # This is roughly what I had in mind for +# # https://github.com/alan-turing-institute/clim-recal/issues/132 +# # This tests converting from a standard calendar to a 360_day calendar. +# @pytest.mark.parametrize( +# # Only one of start_date and end_date are included the day counts +# "start_date, end_date, gen_date_count, days_360, converted_days, align_on", +# [ +# pytest.param( +# # 4 years, including a leap year +# "2024-03-02", +# "2028-03-02", +# year_days_count(standard_years=3, leap_years=1), +# year_days_count(xarray_360_day_years=4), +# year_days_count(standard_years=3, leap_years=1), +# "year", +# id="years_4_annual_align", +# ), +# pytest.param( +# # A whole year, most of which is in a leap year, but avoids the leap day +# "2024-03-02", +# "2025-03-02", +# year_days_count(standard_years=1), +# year_days_count(xarray_360_day_years=1) - 1, +# year_days_count(standard_years=1), +# "year", +# id="leap_year_but_no_leap_day_annual_align", +# ), +# pytest.param( +# # A whole year, the same date range as the previous test, +# # but includes the leap day and the majority of the days are in a non-leap year +# # Note: the current final export configuration *adds* a day +# "2023-03-02", +# "2024-03-02", +# year_days_count(leap_years=1), +# year_days_count(xarray_360_day_years=1) + 1, +# year_days_count(leap_years=1) + 1, +# "year", +# id="leap_year_with_leap_day_annual_align", +# ), +# pytest.param( +# # An exact calendar year which *IS NOT* a leap year +# "2023-01-01", +# "2024-01-01", +# year_days_count(standard_years=1), +# year_days_count(xarray_360_day_years=1), +# year_days_count(standard_years=1), +# "year", +# id="non_leap_year_annual_align", +# ), +# pytest.param( +# # A leap day (just the days either side, in a leap year) +# "2024-02-28", +# "2024-03-01", +# 2, +# 2, +# 2, +# "year", +# id="leap_day", +# ), +# pytest.param( +# # A non-leap day (just the days either side, in a non-leap year) +# "2023-02-28", +# "2023-03-01", +# 1, +# 1, +# 1, +# "year", +# id="non_leap_day_date_align", +# ), +# # Add more test cases to cover the different scenarios and edge cases +# pytest.param( +# # 4 years, including a leap year +# # WARNING: the intermittent year days seems a week short +# "2024-03-02", +# "2028-03-02", +# year_days_count(standard_years=3, leap_years=1), +# year_days_count(xarray_360_day_years=4) - 7, +# year_days_count(standard_years=3, leap_years=1), +# "date", +# id="years_4_date_align", +# marks=pytest.mark.xfail(reason="raises `date_range_like` error"), +# ), +# pytest.param( +# # A whole year, most of which is in a leap year, but avoids the leap day +# "2024-03-02", +# "2025-03-02", +# year_days_count(standard_years=1), +# year_days_count(xarray_360_day_years=1) - 2, +# year_days_count(standard_years=1), +# "date", +# id="leap_year_but_no_leap_day_date_align", +# marks=pytest.mark.xfail(reason="raises `date_range_like` error"), +# ), +# pytest.param( +# # A whole year, the same date range as the previous test, +# # but includes the leap day and the majority of the days are in a non-leap year +# # Note: the current final export configuration *adds* a day +# "2023-03-02", +# "2024-03-02", +# year_days_count(leap_years=1), +# year_days_count(xarray_360_day_years=1) - 1, +# year_days_count(leap_years=1) + 1, +# "date", +# id="leap_year_with_leap_day_date_align", +# marks=pytest.mark.xfail(reason="raises `date_range_like` error"), +# ), +# pytest.param( +# # An exact calendar year which *IS NOT* a leap year +# "2023-01-01", +# "2024-01-01", +# year_days_count(standard_years=1), +# year_days_count(xarray_360_day_years=1) - 2, +# year_days_count(standard_years=1), +# "date", +# id="non_leap_year_date_align", +# marks=pytest.mark.xfail(reason="raises `date_range_like` error"), +# ), +# pytest.param( +# # A leap day (just the days either side, in a leap year) +# "2024-02-28", +# "2024-03-01", +# 2, +# 2, +# 2, +# "date", +# id="leap_day", +# ), +# pytest.param( +# # A non-leap day (just the days either side, in a non-leap year) +# "2023-02-28", +# "2023-03-01", +# 1, +# 1, +# 1, +# "date", +# id="non_leap_day_date_align", +# ), +# ], +# ) +# def test_time_gaps_360_to_standard_calendar( +# start_date: DateType, +# end_date: DateType, +# gen_date_count: int, +# days_360: int, +# converted_days: int, +# align_on: ConvertCalendarAlignOptions, +# ): +# """Test `convert_xr_calendar` call of `360_day` `DataArray` to `standard` calendar.""" +# # Potential paramaterized variables +# inclusive_date_range: bool = False # includes the last day specified +# use_cftime: bool = True # Whether to enforece using `cftime` over `datetime64` +# # align_on: ConvertCalendarAlignOptions = 'date' +# +# # Create a base +# base: T_Dataset = xarray_example( +# start_date, end_date, as_dataset=True, inclusive=inclusive_date_range +# ) +# +# # Ensure the generated date range matches for later checks +# # This occurs for a sigle leap year +# assert len(base.time) == gen_date_count +# +# # Convert to `360_day` calendar example +# dates_360: T_Dataset = base.convert_calendar( +# calendar="360_day", +# align_on=align_on, +# use_cftime=use_cftime, +# ) +# +# # Check the total number of days are as expected +# assert len(dates_360.time) == days_360 +# +# if converted_days < 5: +# with pytest.raises(ValueError): +# convert_xr_calendar(dates_360, align_on=align_on, use_cftime=use_cftime) +# else: +# dates_converted: T_Dataset = convert_xr_calendar( +# dates_360, align_on=align_on, use_cftime=use_cftime +# ) +# assert len(dates_converted.time) == converted_days +# +# # Optionally now check which dates have been dropped and added +# # Add more assertions here... +# assert all(base.time == dates_converted.time) +# assert all(base.time != dates_360.time) +# -@pytest.mark.xfail(reason="test not complete") -def test_cpm_tif_to_standard_calendar( - glasgow_example_cropped_cpm_rainfall_path: Path, -) -> None: - test_converted: tuple[date, ...] = tuple( - date_range_generator( - *file_name_to_start_end_dates(glasgow_example_cropped_cpm_rainfall_path) - ) - ) - assert len(test_converted) == 366 - assert False +# @pytest.mark.slow +# @pytest.mark.mount +# @pytest.mark.parametrize("interpolate_na", (True, False)) +# def test_convert_cpm_calendar(interpolate_na: bool) -> None: +# """Test `convert_calendar` on mounted `cpm` data. +# +# Notes +# ----- +# If `interpolate_na` is `True`, there shouldn't be `tasmax` `nan` values, hence +# creating the `na_values` `bool` as the inverse of `interpolate_na`. +# """ +# any_na_values_in_tasmax: bool = not interpolate_na +# raw_nc: T_Dataset = open_dataset( +# CPM_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all", engine=NETCDF4_XARRAY_ENGINE +# ) +# assert len(raw_nc.time) == 360 +# assert len(raw_nc.time_bnds) == 360 +# converted: T_Dataset = convert_xr_calendar(raw_nc, interpolate_na=interpolate_na) +# assert len(converted.time) == 365 +# assert len(converted.time_bnds) == 365 +# assert ( +# np.isnan(converted.tasmax.head()[0][0][0].values).all() +# == any_na_values_in_tasmax +# ) -# @pytest.mark.xfail(reason="not finished writing, will need refactor") -@pytest.mark.localcache -@pytest.mark.slow -@pytest.mark.mount -@pytest.mark.parametrize("region", ("Glasgow", "Manchester", "London", "Scotland")) -@pytest.mark.parametrize("data_type", (UKCPLocalProjections, HadUKGrid)) -@pytest.mark.parametrize( - # "config", ("direct", "range", "direct_provided", "range_provided") - "config", - ("direct", "range"), -) -def test_crop_xarray( - tasmax_cpm_1980_raw_path, - tasmax_hads_1980_raw_path, - resample_test_cpm_output_path, - resample_test_hads_output_path, - config: str, - data_type: str, - region: str, -): - """Test `cropping` `DataArray` to `standard` calendar.""" - CPM_FIRST_DATES: np.array = np.array( - ["19801201", "19801202", "19801203", "19801204", "19801205"] - ) - test_config: CPMResampler | HADsResampler - if data_type == HadUKGrid: - output_path: Path = resample_test_hads_output_path / config - crop_path: Path = ( - resample_test_hads_output_path / config / HADS_CROP_OUTPUT_LOCAL_PATH - ) +# @pytest.mark.localcache +# @pytest.mark.mount +# @pytest.mark.slow +# @pytest.mark.parametrize("include_bnds_index", (True, False)) +# def test_cpm_xarray_to_standard_calendar( +# tasmax_cpm_1980_raw: T_Dataset, +# include_bnds_index: bool, +# ) -> None: +# """Test 360 raw to 365/366 calendar conversion. +# +# Notes +# ----- +# Indexing differs between `include_bnds_index` ``bool`. +# ``` +# """ +# CORRECT_PROJ4: Final[str] = ( +# "+proj=ob_tran +o_proj=longlat +o_lon_p=0 +o_lat_p=37.5 +lon_0=357.5 +R=6371229 +no_defs=True" +# ) +# test_converted = cpm_xarray_to_standard_calendar( +# tasmax_cpm_1980_raw, include_bnds_index=include_bnds_index +# ) +# assert test_converted.rio.width == CALENDAR_CONVERTED_CPM_WIDTH +# assert test_converted.rio.height == CALENDAR_CONVERTED_CPM_HEIGHT +# assert test_converted.rio.crs.to_proj4() == CORRECT_PROJ4 +# assert test_converted.tasmax.rio.crs.to_proj4() == CORRECT_PROJ4 +# assert len(test_converted.time) == 365 +# +# tasmax_data_subset: NDArray +# if include_bnds_index: +# assert len(test_converted.tasmax.data) == 2 # second band +# assert len(test_converted.tasmax.data[0][0]) == 365 # first band +# assert len(test_converted.tasmax.data[1][0]) == 365 # second band +# tasmax_data_subset = test_converted.tasmax.data[0][0] # first band +# else: +# assert len(test_converted.tasmax.data) == 1 # no band index +# tasmax_data_subset = test_converted.tasmax.data[0] +# assert len(tasmax_data_subset) == 365 +# +# # By default December 1 in a 360 to 365 projection would +# # be null. The values matching below should indicate the +# # projection has interpolated null values on the first date +# assert ( +# tasmax_data_subset[0][0][:5] +# == PROJECTED_CPM_TASMAX_1980_FIRST_5 +# # test_converted.tasmax.data[0][0][0][0][:5] == PROJECTED_CPM_TASMAX_1980_FIRST_5 +# ).all() +# # Check December 31 1980, which wouldn't be included in 360 day calendar +# assert ( +# # test_converted.tasmax.data[0][0][31][0][:5] +# tasmax_data_subset[31][0][:5] +# == PROJECTED_CPM_TASMAX_1980_DEC_31_FIRST_5 +# ).all() - test_config = HADsResampler( - input_path=tasmax_hads_1980_raw_path.parent, - output_path=output_path, - crop_path=crop_path, - ) - else: - assert data_type == UKCPLocalProjections - output_path: Path = resample_test_cpm_output_path / config - crop_path: Path = ( - resample_test_cpm_output_path / config / CPM_CROP_OUTPUT_LOCAL_PATH - ) - test_config = CPMResampler( - input_path=tasmax_cpm_1980_raw_path.parent, - output_path=output_path, - crop_path=crop_path, - ) - paths: list[Path] - try: - reproject_result: GDALDataset = test_config.to_reprojection() - except FileExistsError: - test_config._sync_reprojected_paths(overwrite_output_path=output_path) - match config: - case "direct": - paths = [test_config.crop_projection(region=region)] - case "range": - paths = test_config.range_crop_projection(stop=1) - # case "direct_provided": - # paths = [ - # test_config.to_reprojection(index=0, source_to_index=tuple(test_config)) - # ] - # case "range_provided": - # paths = test_config.range_to_reprojection( - # stop=1, source_to_index=tuple(test_config) - # ) - crop: T_Dataset = open_dataset(paths[0]) - # assert crop.dims[FINAL_RESAMPLE_LON_COL] == FINAL_CONVERTED_CPM_WIDTH - # assert_allclose(export.tasmax[10][5][:10].values, FINAL_CPM_DEC_10_5_X_0_10_Y) - if data_type == UKCPLocalProjections: - assert crop.dims["time"] == 365 - assert ( - CPM_FIRST_DATES == crop.time.dt.strftime(CLI_DATE_FORMAT_STR).head().values - ).all() - plot_xarray( - crop.tasmax[0], - path=crop_path / region / f"config-{config}.png", - time_stamp=True, - ) +# @pytest.mark.localcache +# @pytest.mark.mount +# @pytest.mark.slow +# def test_cpm_reproject_with_standard_calendar( +# tasmax_cpm_1980_raw_path: Path, +# test_runs_output_path: Path, +# variable_name: str = "tasmax", +# ) -> None: +# """Test all steps around calendar and warping CPM RAW data.""" +# output_path: Path = results_path( +# "test-cpm-warp", +# path=test_runs_output_path, +# mkdir=True, +# extension=NETCDF_EXTENSION_STR, +# ) +# plot_path: Path = output_path.parent / (output_path.stem + ".png") +# projected: T_Dataset = cpm_reproject_with_standard_calendar( +# tasmax_cpm_1980_raw_path, +# ) +# assert projected.rio.crs == BRITISH_NATIONAL_GRID_EPSG +# projected.to_netcdf(output_path) +# results: T_Dataset = open_dataset(output_path, decode_coords="all") +# assert (results.time == projected.time).all() +# assert results.dims == { +# FINAL_RESAMPLE_LON_COL: FINAL_CONVERTED_CPM_WIDTH, +# FINAL_RESAMPLE_LAT_COL: FINAL_CONVERTED_CPM_HEIGHT, +# "time": 365, +# } +# assert results.rio.crs == BRITISH_NATIONAL_GRID_EPSG +# assert len(results.data_vars) == 1 +# assert_allclose( +# results[variable_name][10][2][200:210], FINAL_CPM_DEC_10_X_2_Y_200_210 +# ) +# plot_xarray(results.tasmax[0], plot_path, time_stamp=True) +# +# +# @pytest.mark.xfail(reason="test not complete") +# def test_cpm_tif_to_standard_calendar( +# glasgow_example_cropped_cpm_rainfall_path: Path, +# ) -> None: +# test_converted: tuple[date, ...] = tuple( +# date_range_generator( +# *file_name_to_start_end_dates(glasgow_example_cropped_cpm_rainfall_path) +# ) +# ) +# assert len(test_converted) == 366 +# assert False +# +# +# # @pytest.mark.xfail(reason="not finished writing, will need refactor") +# @pytest.mark.localcache +# @pytest.mark.slow +# @pytest.mark.mount +# @pytest.mark.parametrize("region", ("Glasgow", "Manchester", "London", "Scotland")) +# @pytest.mark.parametrize("data_type", (UKCPLocalProjections, HadUKGrid)) +# @pytest.mark.parametrize( +# # "config", ("direct", "range", "direct_provided", "range_provided") +# "config", +# ("direct", "range"), +# ) +# def test_crop_xarray( +# tasmax_cpm_1980_raw_path, +# tasmax_hads_1980_raw_path, +# resample_test_cpm_output_path, +# resample_test_hads_output_path, +# config: str, +# data_type: str, +# region: str, +# ): +# """Test `cropping` `DataArray` to `standard` calendar.""" +# CPM_FIRST_DATES: np.array = np.array( +# ["19801201", "19801202", "19801203", "19801204", "19801205"] +# ) +# test_config: CPMResampler | HADsResampler +# if data_type == HadUKGrid: +# output_path: Path = resample_test_hads_output_path / config +# crop_path: Path = ( +# resample_test_hads_output_path / config / HADS_CROP_OUTPUT_LOCAL_PATH +# ) +# +# test_config = HADsResampler( +# input_path=tasmax_hads_1980_raw_path.parent, +# output_path=output_path, +# crop_path=crop_path, +# ) +# else: +# assert data_type == UKCPLocalProjections +# output_path: Path = resample_test_cpm_output_path / config +# crop_path: Path = ( +# resample_test_cpm_output_path / config / CPM_CROP_OUTPUT_LOCAL_PATH +# ) +# test_config = CPMResampler( +# input_path=tasmax_cpm_1980_raw_path.parent, +# output_path=output_path, +# crop_path=crop_path, +# ) +# paths: list[Path] +# try: +# reproject_result: GDALDataset = test_config.to_reprojection() +# except FileExistsError: +# test_config._sync_reprojected_paths(overwrite_output_path=output_path) +# +# match config: +# case "direct": +# paths = [test_config.crop_projection(region=region)] +# case "range": +# paths = test_config.range_crop_projection(stop=1) +# # case "direct_provided": +# # paths = [ +# # test_config.to_reprojection(index=0, source_to_index=tuple(test_config)) +# # ] +# # case "range_provided": +# # paths = test_config.range_to_reprojection( +# # stop=1, source_to_index=tuple(test_config) +# # ) +# crop: T_Dataset = open_dataset(paths[0]) +# # assert crop.dims[FINAL_RESAMPLE_LON_COL] == FINAL_CONVERTED_CPM_WIDTH +# # assert_allclose(export.tasmax[10][5][:10].values, FINAL_CPM_DEC_10_5_X_0_10_Y) +# if data_type == UKCPLocalProjections: +# assert crop.dims["time"] == 365 +# assert ( +# CPM_FIRST_DATES == crop.time.dt.strftime(CLI_DATE_FORMAT_STR).head().values +# ).all() +# plot_xarray( +# crop.tasmax[0], +# path=crop_path / region / f"config-{config}.png", +# time_stamp=True, +# ) @pytest.mark.localcache @@ -729,68 +694,68 @@ def test_hads_manager( # assert reprojected_xr_time_series.dims[y_col_name] == 651 -@pytest.mark.slow -@pytest.mark.localcache -@pytest.mark.mount -def test_hads_resample_and_reproject( - tasmax_hads_1980_raw: T_Dataset, - tasmax_cpm_1980_raw: T_Dataset, -) -> None: - variable_name: str = "tasmax" - output_path: Path = Path("tests/runs/reample-hads") - # First index is for month, in this case January 1980 - # The following could be replaced by a cached fixture - cpm_to_match: T_Dataset = cpm_reproject_with_standard_calendar(tasmax_cpm_1980_raw) - plot_xarray( - tasmax_hads_1980_raw.tasmax[0], - path=output_path / "tasmas-1980-JAN-1-raw.png", - time_stamp=True, - ) - - assert tasmax_hads_1980_raw.dims["time"] == 31 - assert tasmax_hads_1980_raw.dims[HADS_RAW_X_COLUMN_NAME] == 900 - assert tasmax_hads_1980_raw.dims[HADS_RAW_Y_COLUMN_NAME] == 1450 - reprojected: T_Dataset = hads_resample_and_reproject( - tasmax_hads_1980_raw, - variable_name=variable_name, - cpm_to_match=tasmax_cpm_1980_raw, - ) - - assert reprojected.rio.crs.to_epsg() == int(BRITISH_NATIONAL_GRID_EPSG[5:]) - export_netcdf_path: Path = results_path( - "tasmax-1980-converted", path=output_path, extension="nc" - ) - reprojected.to_netcdf(export_netcdf_path) - read_from_export: T_Dataset = open_dataset(export_netcdf_path, decode_coords="all") - plot_xarray( - read_from_export.tasmax[0], - path=output_path / "tasmax-1980-JAN-1-resampled.png", - time_stamp=True, - ) - assert_allclose( - read_from_export.tasmax[10][430][200:210], FINAL_HADS_JAN_10_430_X_200_210_Y - ) - assert read_from_export.dims["time"] == 31 - assert ( - read_from_export.dims[FINAL_RESAMPLE_LON_COL] == FINAL_CONVERTED_CPM_WIDTH - ) # replaces projection_x_coordinate - assert ( - read_from_export.dims[FINAL_RESAMPLE_LAT_COL] == FINAL_CONVERTED_CPM_HEIGHT - ) # replaces projection_y_coordinate - assert reprojected.rio.crs == read_from_export.rio.crs == BRITISH_NATIONAL_GRID_EPSG - # Check projection coordinates match for CPM and HADs - assert ( - reprojected.tasmax.rio.crs - == read_from_export.tasmax.rio.crs - == BRITISH_NATIONAL_GRID_EPSG - ) - # Check projection coordinates are set at the variable level - assert all(cpm_to_match.x == read_from_export.x) - assert all(cpm_to_match.y == read_from_export.y) - assert ( - read_from_export.spatial_ref.attrs["spatial_ref"] - == cpm_to_match.spatial_ref.attrs["spatial_ref"] - ) +# @pytest.mark.slow +# @pytest.mark.localcache +# @pytest.mark.mount +# def test_hads_resample_and_reproject( +# tasmax_hads_1980_raw: T_Dataset, +# tasmax_cpm_1980_raw: T_Dataset, +# ) -> None: +# variable_name: str = "tasmax" +# output_path: Path = Path("tests/runs/reample-hads") +# # First index is for month, in this case January 1980 +# # The following could be replaced by a cached fixture +# cpm_to_match: T_Dataset = cpm_reproject_with_standard_calendar(tasmax_cpm_1980_raw) +# plot_xarray( +# tasmax_hads_1980_raw.tasmax[0], +# path=output_path / "tasmas-1980-JAN-1-raw.png", +# time_stamp=True, +# ) +# +# assert tasmax_hads_1980_raw.dims["time"] == 31 +# assert tasmax_hads_1980_raw.dims[HADS_RAW_X_COLUMN_NAME] == 900 +# assert tasmax_hads_1980_raw.dims[HADS_RAW_Y_COLUMN_NAME] == 1450 +# reprojected: T_Dataset = hads_resample_and_reproject( +# tasmax_hads_1980_raw, +# variable_name=variable_name, +# cpm_to_match=tasmax_cpm_1980_raw, +# ) +# +# assert reprojected.rio.crs.to_epsg() == int(BRITISH_NATIONAL_GRID_EPSG[5:]) +# export_netcdf_path: Path = results_path( +# "tasmax-1980-converted", path=output_path, extension="nc" +# ) +# reprojected.to_netcdf(export_netcdf_path) +# read_from_export: T_Dataset = open_dataset(export_netcdf_path, decode_coords="all") +# plot_xarray( +# read_from_export.tasmax[0], +# path=output_path / "tasmax-1980-JAN-1-resampled.png", +# time_stamp=True, +# ) +# assert_allclose( +# read_from_export.tasmax[10][430][200:210], FINAL_HADS_JAN_10_430_X_200_210_Y +# ) +# assert read_from_export.dims["time"] == 31 +# assert ( +# read_from_export.dims[FINAL_RESAMPLE_LON_COL] == FINAL_CONVERTED_CPM_WIDTH +# ) # replaces projection_x_coordinate +# assert ( +# read_from_export.dims[FINAL_RESAMPLE_LAT_COL] == FINAL_CONVERTED_CPM_HEIGHT +# ) # replaces projection_y_coordinate +# assert reprojected.rio.crs == read_from_export.rio.crs == BRITISH_NATIONAL_GRID_EPSG +# # Check projection coordinates match for CPM and HADs +# assert ( +# reprojected.tasmax.rio.crs +# == read_from_export.tasmax.rio.crs +# == BRITISH_NATIONAL_GRID_EPSG +# ) +# # Check projection coordinates are set at the variable level +# assert all(cpm_to_match.x == read_from_export.x) +# assert all(cpm_to_match.y == read_from_export.y) +# assert ( +# read_from_export.spatial_ref.attrs["spatial_ref"] +# == cpm_to_match.spatial_ref.attrs["spatial_ref"] +# ) @pytest.mark.localcache @@ -843,6 +808,23 @@ def test_execute_resample_configs( ).all() +# +# @pytest.mark.localcache +# @pytest.mark.slow +# @pytest.mark.mount +# @pytest.mark.parametrize("skip_reproject", (True, False)) +# def test_set_cpm_for_coord_alignment( +# skip_reproject: bool, +# tasmax_cpm_1980_raw_path: Path, +# tasmax_cpm_1980_converted_path: Path, +# ) -> None: +# """Test using `set_cpm_for_coord_alignment` to manage coord alignment.""" +# path: Path = tasmax_cpm_1980_converted_path if skip_reproject else tasmax_cpm_1980_raw_path +# assert False +# test_result: T_Dataset = set_cpm_for_coord_alignment(path, skip_reproject) +# assert isinstance(test_result, Dataset) + + @pytest.mark.localcache @pytest.mark.slow @pytest.mark.mount @@ -864,7 +846,7 @@ def test_execute_crop_configs( input_path: Path crop_path: Path manager_kwargs: dict[str, Any] = {} - if isinstance(manager, type(HADsResamplerManager)): + if manager is HADsResamplerManager: input_path = tasmax_hads_1980_raw_path.parent crop_path = ( resample_test_hads_output_path / "manage" / HADS_CROP_OUTPUT_LOCAL_PATH diff --git a/python/tests/test_utils_xarray.py b/python/tests/test_utils_xarray.py new file mode 100644 index 00000000..bc4194c3 --- /dev/null +++ b/python/tests/test_utils_xarray.py @@ -0,0 +1,659 @@ +import logging +from datetime import date +from pathlib import Path +from typing import Final + +import numpy as np +import pytest +from numpy.testing import assert_allclose +from numpy.typing import NDArray +from osgeo.gdal import Dataset as GDALDataset +from xarray import Dataset, open_dataset +from xarray.core.types import T_DataArray, T_Dataset + +from clim_recal.resample import ( + CPM_CROP_OUTPUT_LOCAL_PATH, + HADS_CROP_OUTPUT_LOCAL_PATH, + CPMResampler, + HADsResampler, +) +from clim_recal.utils.core import ( + CLI_DATE_FORMAT_STR, + DateType, + date_range_generator, + results_path, +) +from clim_recal.utils.data import ( + BRITISH_NATIONAL_GRID_EPSG, + HadUKGrid, + UKCPLocalProjections, +) +from clim_recal.utils.gdal_formats import NETCDF_EXTENSION_STR +from clim_recal.utils.xarray import ( + FINAL_CONVERTED_CPM_HEIGHT, + FINAL_CONVERTED_CPM_WIDTH, + FINAL_RESAMPLE_LAT_COL, + FINAL_RESAMPLE_LON_COL, + HADS_RAW_X_COLUMN_NAME, + HADS_RAW_Y_COLUMN_NAME, + NETCDF4_XARRAY_ENGINE, + ConvertCalendarAlignOptions, + convert_xr_calendar, + cpm_check_converted, + cpm_reproject_with_standard_calendar, + cpm_xarray_to_standard_calendar, + file_name_to_start_end_dates, + get_cpm_for_coord_alignment, + hads_resample_and_reproject, + plot_xarray, +) + +from .utils import ( + CPM_RAW_TASMAX_EXAMPLE_PATH, + FINAL_CPM_DEC_10_X_2_Y_200_210, + xarray_example, + year_days_count, +) + +CALENDAR_CONVERTED_CPM_WIDTH: Final[int] = 484 +CALENDAR_CONVERTED_CPM_HEIGHT: Final[int] = 606 + +PROJECTED_CPM_TASMAX_1980_FIRST_5: Final[NDArray] = np.array( + [13.406641, 13.376368, 13.361719, 13.354639, 13.334864], dtype="float32" +) +PROJECTED_CPM_TASMAX_1980_DEC_31_FIRST_5: Final[NDArray] = np.array( + [10.645899, 10.508448, 10.546778, 10.547998, 10.553614], dtype="float32" +) + +FINAL_HADS_JAN_10_430_X_200_210_Y: Final[NDArray] = np.array( + ( + np.nan, + np.nan, + np.nan, + np.nan, + 7.57977839, + 7.47138044, + 7.27587694, + 7.27587694, + 7.07294578, + 7.04533059, + ) +) + + +@pytest.mark.localcache +@pytest.mark.slow +@pytest.mark.mount +@pytest.mark.parametrize("is_path", (True, False)) +@pytest.mark.parametrize("is_converted", (True, False)) +def test_cpm_check_converted( + is_path: bool, + is_converted: bool, + tasmax_cpm_1980_raw_path: Path, + tasmax_cpm_1980_raw: T_Dataset, + tasmax_cpm_1980_converted_path: Path, + tasmax_cpm_1980_converted: T_Dataset, +) -> None: + """Test if `cpm_check_converted` correctly checkes `CPM` converted files.""" + result: bool + if is_converted: + result = cpm_check_converted( + tasmax_cpm_1980_converted_path if is_path else tasmax_cpm_1980_converted + ) + assert result + else: + result = cpm_check_converted( + tasmax_cpm_1980_raw_path if is_path else tasmax_cpm_1980_raw + ) + assert not result + + +@pytest.mark.localcache +@pytest.mark.slow +@pytest.mark.mount +@pytest.mark.parametrize("skip_reproject", (True, False)) +@pytest.mark.parametrize("is_path", (True, False)) +@pytest.mark.parametrize("is_converted", (True, False)) +def test_get_cpm_for_coord_alignment( + skip_reproject: bool, + is_path: bool, + is_converted: bool, + tasmax_cpm_1980_raw: T_Dataset, + tasmax_cpm_1980_raw_path: Path, + tasmax_cpm_1980_converted_path: Path, + tasmax_cpm_1980_converted: T_Dataset, + caplog, +) -> None: + """Test using `set_cpm_for_coord_alignment` to manage coord alignment.""" + with caplog.at_level(logging.INFO): + path: Path = ( + tasmax_cpm_1980_converted_path if is_converted else tasmax_cpm_1980_raw_path + ) + xr_dataset: T_Dataset = ( + tasmax_cpm_1980_converted if is_converted else tasmax_cpm_1980_raw + ) + converter_dataset: T_Dataset = get_cpm_for_coord_alignment( + cpm_for_coord_alignment=path if is_path else xr_dataset, + skip_reproject=skip_reproject, + ) + log_tuples: list[tuple[str, int, str]] = caplog.record_tuples + if is_path: + if skip_reproject: + assert "Skipping reprojection and loading" in log_tuples[0][2] + assert ( + "Variable 'tasmax' loaded for coord alignment from" in log_tuples[1][2] + ) + elif is_converted: + assert "Converting coordinates of" in log_tuples[0][2] + assert "Checking if already converted..." in log_tuples[1][2] + assert ( + "Similar to already converted. Returning unmodified" in log_tuples[2][2] + ) + assert "Coordinates converted from" in log_tuples[3][2] + else: + assert "Converting coordinates of" in log_tuples[0][2] + assert "Checking if already converted..." in log_tuples[1][2] + assert "Coordinates converted from" in log_tuples[2][2] + elif not skip_reproject: + if is_converted: + assert ( + "Converting coordinates of type ..." + in log_tuples[0][2] + ) + assert "Checking if already converted..." in log_tuples[1][2] + assert ( + "Similar to already converted. Returning unmodified" in log_tuples[2][2] + ) + assert "Coordinates converted to type" in log_tuples[3][2] + else: + assert "Converting coordinates of type" in log_tuples[0][2] + assert "Checking if already converted..." in log_tuples[1][2] + assert "Coordinates converted to type" in log_tuples[2][2] + else: + assert ( + f"Coordinate converter of type " + f"loaded without processing." + ) in log_tuples[0][2] + if skip_reproject and not is_converted: + assert isinstance(converter_dataset, Dataset) + assert converter_dataset.dims["time"] == 360 + assert "x" not in converter_dataset.dims + assert "y" not in converter_dataset.dims + else: + assert isinstance(converter_dataset, Dataset) + assert converter_dataset.dims["time"] == 365 + assert converter_dataset.dims["x"] == FINAL_CONVERTED_CPM_WIDTH + assert converter_dataset.dims["y"] == FINAL_CONVERTED_CPM_HEIGHT + + +@pytest.mark.slow +@pytest.mark.localcache +@pytest.mark.mount +def test_hads_resample_and_reproject( + tasmax_hads_1980_raw: T_Dataset, + tasmax_cpm_1980_raw: T_Dataset, +) -> None: + variable_name: str = "tasmax" + output_path: Path = Path("tests/runs/reample-hads") + # First index is for month, in this case January 1980 + # The following could be replaced by a cached fixture + cpm_to_match: T_Dataset = cpm_reproject_with_standard_calendar(tasmax_cpm_1980_raw) + plot_xarray( + tasmax_hads_1980_raw.tasmax[0], + path=output_path / "tasmas-1980-JAN-1-raw.png", + time_stamp=True, + ) + + assert tasmax_hads_1980_raw.dims["time"] == 31 + assert tasmax_hads_1980_raw.dims[HADS_RAW_X_COLUMN_NAME] == 900 + assert tasmax_hads_1980_raw.dims[HADS_RAW_Y_COLUMN_NAME] == 1450 + reprojected: T_Dataset = hads_resample_and_reproject( + tasmax_hads_1980_raw, + variable_name=variable_name, + cpm_to_match=tasmax_cpm_1980_raw, + ) + + assert reprojected.rio.crs.to_epsg() == int(BRITISH_NATIONAL_GRID_EPSG[5:]) + export_netcdf_path: Path = results_path( + "tasmax-1980-converted", path=output_path, extension="nc" + ) + reprojected.to_netcdf(export_netcdf_path) + read_from_export: T_Dataset = open_dataset(export_netcdf_path, decode_coords="all") + plot_xarray( + read_from_export.tasmax[0], + path=output_path / "tasmax-1980-JAN-1-resampled.png", + time_stamp=True, + ) + assert_allclose( + read_from_export.tasmax[10][430][200:210], FINAL_HADS_JAN_10_430_X_200_210_Y + ) + assert read_from_export.dims["time"] == 31 + assert ( + read_from_export.dims[FINAL_RESAMPLE_LON_COL] == FINAL_CONVERTED_CPM_WIDTH + ) # replaces projection_x_coordinate + assert ( + read_from_export.dims[FINAL_RESAMPLE_LAT_COL] == FINAL_CONVERTED_CPM_HEIGHT + ) # replaces projection_y_coordinate + assert reprojected.rio.crs == read_from_export.rio.crs == BRITISH_NATIONAL_GRID_EPSG + # Check projection coordinates match for CPM and HADs + assert ( + reprojected.tasmax.rio.crs + == read_from_export.tasmax.rio.crs + == BRITISH_NATIONAL_GRID_EPSG + ) + # Check projection coordinates are set at the variable level + assert all(cpm_to_match.x == read_from_export.x) + assert all(cpm_to_match.y == read_from_export.y) + assert ( + read_from_export.spatial_ref.attrs["spatial_ref"] + == cpm_to_match.spatial_ref.attrs["spatial_ref"] + ) + + +@pytest.mark.slow +@pytest.mark.mount +@pytest.mark.parametrize("interpolate_na", (True, False)) +def test_convert_cpm_calendar(interpolate_na: bool) -> None: + """Test `convert_calendar` on mounted `cpm` data. + + Notes + ----- + If `interpolate_na` is `True`, there shouldn't be `tasmax` `nan` values, hence + creating the `na_values` `bool` as the inverse of `interpolate_na`. + """ + any_na_values_in_tasmax: bool = not interpolate_na + raw_nc: T_Dataset = open_dataset( + CPM_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all", engine=NETCDF4_XARRAY_ENGINE + ) + assert len(raw_nc.time) == 360 + assert len(raw_nc.time_bnds) == 360 + converted: T_Dataset = convert_xr_calendar(raw_nc, interpolate_na=interpolate_na) + assert len(converted.time) == 365 + assert len(converted.time_bnds) == 365 + assert ( + np.isnan(converted.tasmax.head()[0][0][0].values).all() + == any_na_values_in_tasmax + ) + + +@pytest.mark.localcache +@pytest.mark.mount +@pytest.mark.slow +@pytest.mark.parametrize("include_bnds_index", (True, False)) +def test_cpm_xarray_to_standard_calendar( + tasmax_cpm_1980_raw: T_Dataset, + include_bnds_index: bool, +) -> None: + """Test 360 raw to 365/366 calendar conversion. + + Notes + ----- + Indexing differs between `include_bnds_index` ``bool`. + ``` + """ + CORRECT_PROJ4: Final[str] = ( + "+proj=ob_tran +o_proj=longlat +o_lon_p=0 +o_lat_p=37.5 +lon_0=357.5 +R=6371229 +no_defs=True" + ) + test_converted = cpm_xarray_to_standard_calendar( + tasmax_cpm_1980_raw, include_bnds_index=include_bnds_index + ) + assert test_converted.rio.width == CALENDAR_CONVERTED_CPM_WIDTH + assert test_converted.rio.height == CALENDAR_CONVERTED_CPM_HEIGHT + assert test_converted.rio.crs.to_proj4() == CORRECT_PROJ4 + assert test_converted.tasmax.rio.crs.to_proj4() == CORRECT_PROJ4 + assert len(test_converted.time) == 365 + + tasmax_data_subset: NDArray + if include_bnds_index: + assert len(test_converted.tasmax.data) == 2 # second band + assert len(test_converted.tasmax.data[0][0]) == 365 # first band + assert len(test_converted.tasmax.data[1][0]) == 365 # second band + tasmax_data_subset = test_converted.tasmax.data[0][0] # first band + else: + assert len(test_converted.tasmax.data) == 1 # no band index + tasmax_data_subset = test_converted.tasmax.data[0] + assert len(tasmax_data_subset) == 365 + + # By default December 1 in a 360 to 365 projection would + # be null. The values matching below should indicate the + # projection has interpolated null values on the first date + assert ( + tasmax_data_subset[0][0][:5] + == PROJECTED_CPM_TASMAX_1980_FIRST_5 + # test_converted.tasmax.data[0][0][0][0][:5] == PROJECTED_CPM_TASMAX_1980_FIRST_5 + ).all() + # Check December 31 1980, which wouldn't be included in 360 day calendar + assert ( + # test_converted.tasmax.data[0][0][31][0][:5] + tasmax_data_subset[31][0][:5] + == PROJECTED_CPM_TASMAX_1980_DEC_31_FIRST_5 + ).all() + + +@pytest.mark.localcache +@pytest.mark.mount +@pytest.mark.slow +def test_cpm_reproject_with_standard_calendar( + tasmax_cpm_1980_raw_path: Path, + test_runs_output_path: Path, + variable_name: str = "tasmax", +) -> None: + """Test all steps around calendar and warping CPM RAW data.""" + output_path: Path = results_path( + "test-cpm-warp", + path=test_runs_output_path, + mkdir=True, + extension=NETCDF_EXTENSION_STR, + ) + plot_path: Path = output_path.parent / (output_path.stem + ".png") + projected: T_Dataset = cpm_reproject_with_standard_calendar( + tasmax_cpm_1980_raw_path, + ) + assert projected.rio.crs == BRITISH_NATIONAL_GRID_EPSG + projected.to_netcdf(output_path) + results: T_Dataset = open_dataset(output_path, decode_coords="all") + assert (results.time == projected.time).all() + assert results.dims == { + FINAL_RESAMPLE_LON_COL: FINAL_CONVERTED_CPM_WIDTH, + FINAL_RESAMPLE_LAT_COL: FINAL_CONVERTED_CPM_HEIGHT, + "time": 365, + } + assert results.rio.crs == BRITISH_NATIONAL_GRID_EPSG + assert len(results.data_vars) == 1 + assert_allclose( + results[variable_name][10][2][200:210], FINAL_CPM_DEC_10_X_2_Y_200_210 + ) + plot_xarray(results.tasmax[0], plot_path, time_stamp=True) + + +@pytest.mark.xfail(reason="test not complete") +def test_cpm_tif_to_standard_calendar( + glasgow_example_cropped_cpm_rainfall_path: Path, +) -> None: + test_converted: tuple[date, ...] = tuple( + date_range_generator( + *file_name_to_start_end_dates(glasgow_example_cropped_cpm_rainfall_path) + ) + ) + assert len(test_converted) == 366 + assert False + + +# @pytest.mark.xfail(reason="not finished writing, will need refactor") +@pytest.mark.localcache +@pytest.mark.slow +@pytest.mark.mount +@pytest.mark.parametrize("region", ("Glasgow", "Manchester", "London", "Scotland")) +@pytest.mark.parametrize("data_type", (UKCPLocalProjections, HadUKGrid)) +@pytest.mark.parametrize( + # "config", ("direct", "range", "direct_provided", "range_provided") + "config", + ("direct", "range"), +) +def test_crop_xarray( + tasmax_cpm_1980_raw_path, + tasmax_hads_1980_raw_path, + resample_test_cpm_output_path, + resample_test_hads_output_path, + config: str, + data_type: str, + region: str, +): + """Test `cropping` `DataArray` to `standard` calendar.""" + CPM_FIRST_DATES: np.array = np.array( + ["19801201", "19801202", "19801203", "19801204", "19801205"] + ) + test_config: CPMResampler | HADsResampler + if data_type == HadUKGrid: + output_path: Path = resample_test_hads_output_path / config + crop_path: Path = ( + resample_test_hads_output_path / config / HADS_CROP_OUTPUT_LOCAL_PATH + ) + + test_config = HADsResampler( + input_path=tasmax_hads_1980_raw_path.parent, + output_path=output_path, + crop_path=crop_path, + ) + else: + assert data_type == UKCPLocalProjections + output_path: Path = resample_test_cpm_output_path / config + crop_path: Path = ( + resample_test_cpm_output_path / config / CPM_CROP_OUTPUT_LOCAL_PATH + ) + test_config = CPMResampler( + input_path=tasmax_cpm_1980_raw_path.parent, + output_path=output_path, + crop_path=crop_path, + ) + paths: list[Path] + try: + reproject_result: GDALDataset = test_config.to_reprojection() + except FileExistsError: + test_config._sync_reprojected_paths(overwrite_output_path=output_path) + + match config: + case "direct": + paths = [test_config.crop_projection(region=region)] + case "range": + paths = test_config.range_crop_projection(stop=1) + # case "direct_provided": + # paths = [ + # test_config.to_reprojection(index=0, source_to_index=tuple(test_config)) + # ] + # case "range_provided": + # paths = test_config.range_to_reprojection( + # stop=1, source_to_index=tuple(test_config) + # ) + crop: T_Dataset = open_dataset(paths[0]) + # assert crop.dims[FINAL_RESAMPLE_LON_COL] == FINAL_CONVERTED_CPM_WIDTH + # assert_allclose(export.tasmax[10][5][:10].values, FINAL_CPM_DEC_10_5_X_0_10_Y) + if data_type == UKCPLocalProjections: + assert crop.dims["time"] == 365 + assert ( + CPM_FIRST_DATES == crop.time.dt.strftime(CLI_DATE_FORMAT_STR).head().values + ).all() + plot_xarray( + crop.tasmax[0], + path=crop_path / region / f"config-{config}.png", + time_stamp=True, + ) + + +def test_leap_year_days() -> None: + """Test covering a leap year of 366 days.""" + start_date_str: str = "2024-03-01" + end_date_str: str = "2025-03-01" + xarray_2024_2025: T_DataArray = xarray_example( + start_date=start_date_str, + end_date=end_date_str, + inclusive=True, + ) + assert len(xarray_2024_2025) == year_days_count(leap_years=1) + + +# This is roughly what I had in mind for +# https://github.com/alan-turing-institute/clim-recal/issues/132 +# This tests converting from a standard calendar to a 360_day calendar. +@pytest.mark.parametrize( + # Only one of start_date and end_date are included the day counts + "start_date, end_date, gen_date_count, days_360, converted_days, align_on", + [ + pytest.param( + # 4 years, including a leap year + "2024-03-02", + "2028-03-02", + year_days_count(standard_years=3, leap_years=1), + year_days_count(xarray_360_day_years=4), + year_days_count(standard_years=3, leap_years=1), + "year", + id="years_4_annual_align", + ), + pytest.param( + # A whole year, most of which is in a leap year, but avoids the leap day + "2024-03-02", + "2025-03-02", + year_days_count(standard_years=1), + year_days_count(xarray_360_day_years=1) - 1, + year_days_count(standard_years=1), + "year", + id="leap_year_but_no_leap_day_annual_align", + ), + pytest.param( + # A whole year, the same date range as the previous test, + # but includes the leap day and the majority of the days are in a non-leap year + # Note: the current final export configuration *adds* a day + "2023-03-02", + "2024-03-02", + year_days_count(leap_years=1), + year_days_count(xarray_360_day_years=1) + 1, + year_days_count(leap_years=1) + 1, + "year", + id="leap_year_with_leap_day_annual_align", + ), + pytest.param( + # An exact calendar year which *IS NOT* a leap year + "2023-01-01", + "2024-01-01", + year_days_count(standard_years=1), + year_days_count(xarray_360_day_years=1), + year_days_count(standard_years=1), + "year", + id="non_leap_year_annual_align", + ), + pytest.param( + # A leap day (just the days either side, in a leap year) + "2024-02-28", + "2024-03-01", + 2, + 2, + 2, + "year", + id="leap_day", + ), + pytest.param( + # A non-leap day (just the days either side, in a non-leap year) + "2023-02-28", + "2023-03-01", + 1, + 1, + 1, + "year", + id="non_leap_day_date_align", + ), + # Add more test cases to cover the different scenarios and edge cases + pytest.param( + # 4 years, including a leap year + # WARNING: the intermittent year days seems a week short + "2024-03-02", + "2028-03-02", + year_days_count(standard_years=3, leap_years=1), + year_days_count(xarray_360_day_years=4) - 7, + year_days_count(standard_years=3, leap_years=1), + "date", + id="years_4_date_align", + marks=pytest.mark.xfail(reason="raises `date_range_like` error"), + ), + pytest.param( + # A whole year, most of which is in a leap year, but avoids the leap day + "2024-03-02", + "2025-03-02", + year_days_count(standard_years=1), + year_days_count(xarray_360_day_years=1) - 2, + year_days_count(standard_years=1), + "date", + id="leap_year_but_no_leap_day_date_align", + marks=pytest.mark.xfail(reason="raises `date_range_like` error"), + ), + pytest.param( + # A whole year, the same date range as the previous test, + # but includes the leap day and the majority of the days are in a non-leap year + # Note: the current final export configuration *adds* a day + "2023-03-02", + "2024-03-02", + year_days_count(leap_years=1), + year_days_count(xarray_360_day_years=1) - 1, + year_days_count(leap_years=1) + 1, + "date", + id="leap_year_with_leap_day_date_align", + marks=pytest.mark.xfail(reason="raises `date_range_like` error"), + ), + pytest.param( + # An exact calendar year which *IS NOT* a leap year + "2023-01-01", + "2024-01-01", + year_days_count(standard_years=1), + year_days_count(xarray_360_day_years=1) - 2, + year_days_count(standard_years=1), + "date", + id="non_leap_year_date_align", + marks=pytest.mark.xfail(reason="raises `date_range_like` error"), + ), + pytest.param( + # A leap day (just the days either side, in a leap year) + "2024-02-28", + "2024-03-01", + 2, + 2, + 2, + "date", + id="leap_day", + ), + pytest.param( + # A non-leap day (just the days either side, in a non-leap year) + "2023-02-28", + "2023-03-01", + 1, + 1, + 1, + "date", + id="non_leap_day_date_align", + ), + ], +) +def test_time_gaps_360_to_standard_calendar( + start_date: DateType, + end_date: DateType, + gen_date_count: int, + days_360: int, + converted_days: int, + align_on: ConvertCalendarAlignOptions, +): + """Test `convert_xr_calendar` call of `360_day` `DataArray` to `standard` calendar.""" + # Potential paramaterized variables + inclusive_date_range: bool = False # includes the last day specified + use_cftime: bool = True # Whether to enforece using `cftime` over `datetime64` + # align_on: ConvertCalendarAlignOptions = 'date' + + # Create a base + base: T_Dataset = xarray_example( + start_date, end_date, as_dataset=True, inclusive=inclusive_date_range + ) + + # Ensure the generated date range matches for later checks + # This occurs for a sigle leap year + assert len(base.time) == gen_date_count + + # Convert to `360_day` calendar example + dates_360: T_Dataset = base.convert_calendar( + calendar="360_day", + align_on=align_on, + use_cftime=use_cftime, + ) + + # Check the total number of days are as expected + assert len(dates_360.time) == days_360 + + if converted_days < 5: + with pytest.raises(ValueError): + convert_xr_calendar(dates_360, align_on=align_on, use_cftime=use_cftime) + else: + dates_converted: T_Dataset = convert_xr_calendar( + dates_360, align_on=align_on, use_cftime=use_cftime + ) + assert len(dates_converted.time) == converted_days + + # Optionally now check which dates have been dropped and added + # Add more assertions here... + assert all(base.time == dates_converted.time) + assert all(base.time != dates_360.time) diff --git a/python/tests/utils.py b/python/tests/utils.py index 0484b893..3cd30337 100644 --- a/python/tests/utils.py +++ b/python/tests/utils.py @@ -8,7 +8,8 @@ from typing import Any, Awaitable, Callable, Final, Iterable, Sequence, TypedDict import sysrsync -from numpy import array, random +from numpy import array, nan, random +from numpy.typing import NDArray from pandas import to_datetime from xarray import DataArray from xarray.core.types import T_DataArray, T_DataArrayOrSet @@ -47,6 +48,24 @@ logger = getLogger(__name__) +FINAL_CONVERTED_HADS_WIDTH: Final[int] = 410 +FINAL_CONVERTED_HADS_HEIGHT: Final[int] = 660 + +FINAL_CPM_DEC_10_X_2_Y_200_210: Final[NDArray] = array( + ( + nan, + nan, + 9.637598, + 9.646631, + 9.636621, + 9.622217, + 9.625147, + 9.640039, + 9.6349125, + 9.509668, + ) +) + HADS_UK_TASMAX_DAY_SERVER_PATH: Final[Path] = Path("Raw/HadsUKgrid/tasmax/day") HADS_UK_RESAMPLED_DAY_SERVER_PATH: Final[Path] = Path( "Processed/HadsUKgrid/resampled_2.2km/tasmax/day" From cbb9fae990420843fdc90f1c9239d4aee0c00f3a Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 8 Sep 2024 19:19:17 +0100 Subject: [PATCH 84/92] fix: set `ClimRecalConfig` default `cpm_for_coord_alignment` to `self.cpm_input_path` --- python/clim_recal/config.py | 22 +++++++++++++++++++++- python/clim_recal/utils/xarray.py | 14 +++++++------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/python/clim_recal/config.py b/python/clim_recal/config.py index 6c89629d..0d344da7 100644 --- a/python/clim_recal/config.py +++ b/python/clim_recal/config.py @@ -17,7 +17,7 @@ CPMResamplerManager, HADsResamplerManager, ) -from .utils.core import product_dict, results_path +from .utils.core import console, product_dict, results_path from .utils.data import MethodOptions, RegionOptions, RunOptions, VariableOptions warnings.filterwarnings("ignore", category=TqdmExperimentalWarning) @@ -232,6 +232,7 @@ def __post_init__(self) -> None: stop_index=self.stop_index, **self.cpm_kwargs, ) + self.set_cpm_for_coord_alignment() # if self.process_cmp_for_coord_alignment: # self.set_cpm_for_coord_alignment() self.hads_manager = HADsResamplerManager( @@ -249,6 +250,25 @@ def __post_init__(self) -> None: if self.cpus == None or (self.total_cpus and self.cpus >= self.total_cpus): self.cpus = 1 if not self.total_cpus else self.total_cpus - 1 + def set_cpm_for_coord_alignment(self) -> None: + """If `cpm_for_coord_alignment` is `None` use `self.cpm_input_path`. + + It would be more efficient to use `self.resample_cpm_path` as + long as that option is used, but support cases of only + """ + if not self.cpm_for_coord_alignment: + if self.cpm_input_path: + console.info( + "'set_cpm_for_coord_alignment' for 'HADs' not speficied.\n" + f"Defaulting to 'self.cpm_input_path': '{self.cpm_input_path}'" + ) + self.cpm_for_coord_alignment = self.cpm_input_path + else: + raise ValueError( + f"Neither required 'self.cpm_for_coord_alignment' nor backup " + f"'self.cpm_input_path' provided for {self}" + ) + # def set_cpm_for_coord_alignment(self) -> None: # """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" # self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index e0c56cd1..3e36fe9a 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -210,19 +210,19 @@ def cpm_check_converted(cpm_xr_time_series: T_Dataset | PathLike) -> bool: ------- `True` if all of the methics are `True`, else `False` """ - cpm_xr_time_series, variable = check_xarray_path_and_var_name( + cpm_xr_time_series, _ = check_xarray_path_and_var_name( xr_time_series=cpm_xr_time_series, variable_name=None ) checks_dict: dict[str, bool] = {} - if "time" in cpm_xr_time_series.dims: - checks_dict["time-365-or-366"] = cpm_xr_time_series.dims["time"] in (365, 366) - if "x" in cpm_xr_time_series.dims: + if "time" in cpm_xr_time_series.sizes: + checks_dict["time-365-or-366"] = cpm_xr_time_series.sizes["time"] in (365, 366) + if "x" in cpm_xr_time_series.sizes: checks_dict["x-final-coords"] = ( - cpm_xr_time_series.dims["x"] == FINAL_CONVERTED_CPM_WIDTH + cpm_xr_time_series.sizes["x"] == FINAL_CONVERTED_CPM_WIDTH ) - if "y" in cpm_xr_time_series.dims: + if "y" in cpm_xr_time_series.sizes: checks_dict["y-final-coords"] = ( - cpm_xr_time_series.dims["y"] == FINAL_CONVERTED_CPM_HEIGHT + cpm_xr_time_series.sizes["y"] == FINAL_CONVERTED_CPM_HEIGHT ) if all(checks_dict.values()): return True From 1da989ec6686078dbae56f3944f5bc76757ae707 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 8 Sep 2024 19:21:53 +0100 Subject: [PATCH 85/92] fix: `console` `info` -> `print` --- python/clim_recal/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/clim_recal/config.py b/python/clim_recal/config.py index 0d344da7..2761d2dc 100644 --- a/python/clim_recal/config.py +++ b/python/clim_recal/config.py @@ -258,7 +258,7 @@ def set_cpm_for_coord_alignment(self) -> None: """ if not self.cpm_for_coord_alignment: if self.cpm_input_path: - console.info( + console.print( "'set_cpm_for_coord_alignment' for 'HADs' not speficied.\n" f"Defaulting to 'self.cpm_input_path': '{self.cpm_input_path}'" ) From 98b95555cc7645125ef457f3fb4ab98ff6bbdd46 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 8 Sep 2024 20:29:07 +0100 Subject: [PATCH 86/92] fix: expand `CPM_REGEX` to cover sub folders --- python/clim_recal/utils/xarray.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 3e36fe9a..4d5baa22 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -77,7 +77,7 @@ GLASGOW_GEOM_ABSOLUTE_PATH: Final[Path] = ( climate_data_mount_path() / GLASGOW_GEOM_LOCAL_PATH ) -CPM_REGEX: Final[str] = "[!.]*cpm*.nc" +CPM_REGEX: Final[str] = "**/[!.]*cpm*.nc" HADS_MIN_NULL: float = -1000000 FINAL_CONVERTED_CPM_WIDTH: Final[int] = 493 From 9acf27d3d6a1d897c01d2d1f3ef110fb8981afd7 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 8 Sep 2024 20:58:17 +0100 Subject: [PATCH 87/92] fix: `hads_regions` -> `crop_regions` in `pipeline.py` --- python/clim_recal/pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/clim_recal/pipeline.py b/python/clim_recal/pipeline.py index d5959398..1e15368b 100644 --- a/python/clim_recal/pipeline.py +++ b/python/clim_recal/pipeline.py @@ -308,7 +308,7 @@ def main( ) ) print(region_cropped_cpm_resamples[:print_range_length]) - if not hads_regions: + if not crop_hads: print("Skipping cropping HADS 2.2km projections.") else: print( From 04954a97de5bce16d8b08a6093a478b319380a59 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Sun, 8 Sep 2024 22:17:23 +0100 Subject: [PATCH 88/92] fix: add `hads` and `cpm` to `crop` paths --- python/clim_recal/resample.py | 41 ++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index 1323d025..c728ad6b 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -816,25 +816,6 @@ def _gen_resample_folder_paths( self._resampled_path_dict[resample_path] = var yield input_path, resample_path - def _gen_crop_folder_paths( - self, path: PathLike, append_cropped_path_dict: bool = False - ) -> Iterator[Path | None]: - """Return a Generator of paths of `self.variables` and `self.crops`.""" - if not self.crop_regions: - return None - if not self._resampled_path_dict: - self._gen_resample_folder_paths( - self.input_paths, - append_input_path_dict=True, - append_resampled_path_dict=True, - ) - for var in self.variables: - for region in self.crop_regions: - crop_path = Path(path) / var / region - if append_cropped_path_dict: - self._cropped_path_dict[crop_path] = region - yield crop_path - def check_paths( self, run_set_data_paths: bool = True, run_set_crop_paths: bool = True ): @@ -1127,6 +1108,25 @@ def __repr__(self) -> str: f"input_paths_count={len(self.input_paths) if isinstance(self.input_paths, Sequence) else 1})>" ) + def _gen_crop_folder_paths( + self, path: PathLike, append_cropped_path_dict: bool = False + ) -> Iterator[Path | None]: + """Return a Generator of paths of `self.variables` and `self.crops`.""" + if not self.crop_regions: + return None + if not self._resampled_path_dict: + self._gen_resample_folder_paths( + self.input_paths, + append_input_path_dict=True, + append_resampled_path_dict=True, + ) + for var in self.variables: + for region in self.crop_regions: + crop_path = Path(path) / "hads" / var / region + if append_cropped_path_dict: + self._cropped_path_dict[crop_path] = region + yield crop_path + # def __post_init__(self) -> None: # """Ensure `self.cpm_for_coord_alignment` is set.""" # super().__post_init__() @@ -1302,12 +1302,13 @@ def _gen_crop_folder_paths( if cpm_paths: crop_path: Path = ( Path(path) + / "cpm" / VariableOptions.cpm_value(var) / region / run_type ) else: - crop_path: Path = Path(path) / var / region / run_type + crop_path: Path = Path(path) / "cpm" / var / region / run_type if append_cropped_path_dict: self._cropped_path_dict[crop_path] = region yield crop_path From 1f7ee1d073505e3e807a45b65bcfe9dd142fe619 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 10 Sep 2024 01:05:03 +0100 Subject: [PATCH 89/92] fix: add `cpm_for_coord_alignment=tasmax_cpm_1980_converted_path` for local tests --- python/conftest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/conftest.py b/python/conftest.py index ab675a14..8dc43b1b 100644 --- a/python/conftest.py +++ b/python/conftest.py @@ -426,7 +426,7 @@ def clim_runner( test_runs_output_path: PathLike, local_hads_cache_path: PathLike, local_cpm_cache_path: PathLike, - # tasmax_cpm_1980_converted_path: PathLike, + tasmax_cpm_1980_converted_path: PathLike, ) -> ClimRecalConfig: """Return default `ClimRecalConfig`.""" assert local_cache_fixtures.default_local_cache_path @@ -454,7 +454,7 @@ def clim_runner( # Todo: refactor to use caching to speed up runs cpm_kwargs=dict(_allow_check_fail=True), hads_kwargs=dict(_allow_check_fail=True), - # cpm_for_coord_alignment=tasmax_cpm_1980_converted_path, + cpm_for_coord_alignment=tasmax_cpm_1980_converted_path, ) From 3ede18b4b7c8633edcc30922005dc733fa6a9e66 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 10 Sep 2024 01:16:00 +0100 Subject: [PATCH 90/92] fix: `pipeline.main` `doctest` --- python/clim_recal/pipeline.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/clim_recal/pipeline.py b/python/clim_recal/pipeline.py index 1e15368b..d8a852b6 100644 --- a/python/clim_recal/pipeline.py +++ b/python/clim_recal/pipeline.py @@ -222,6 +222,8 @@ def main( ... cpm_kwargs=dict(_allow_check_fail=True), ... hads_kwargs=dict(_allow_check_fail=True), ... ) + 'set_cpm_for_coord_alignment' for 'HADs' not speficied. + Defaulting to 'self.cpm_input_path': '...' clim-recal pipeline configurations: Date: Tue, 10 Sep 2024 02:01:24 +0100 Subject: [PATCH 91/92] chore: remove large commented blocks --- python/clim_recal/config.py | 9 - python/clim_recal/pipeline.py | 4 +- python/clim_recal/resample.py | 196 +-------- python/clim_recal/utils/data.py | 3 - python/clim_recal/utils/xarray.py | 157 +------- python/tests/test_resample.py | 641 ------------------------------ 6 files changed, 13 insertions(+), 997 deletions(-) diff --git a/python/clim_recal/config.py b/python/clim_recal/config.py index 2761d2dc..34a140b8 100644 --- a/python/clim_recal/config.py +++ b/python/clim_recal/config.py @@ -233,8 +233,6 @@ def __post_init__(self) -> None: **self.cpm_kwargs, ) self.set_cpm_for_coord_alignment() - # if self.process_cmp_for_coord_alignment: - # self.set_cpm_for_coord_alignment() self.hads_manager = HADsResamplerManager( input_paths=self.hads_input_path, variables=self.variables, @@ -269,13 +267,6 @@ def set_cpm_for_coord_alignment(self) -> None: f"'self.cpm_input_path' provided for {self}" ) - # def set_cpm_for_coord_alignment(self) -> None: - # """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" - # self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( - # self.cpm_for_coord_alignment, - # skip_reproject=self.cpm_for_coord_alignment_path_converted, - # ) - def __repr__(self) -> str: """Summary of `self` configuration as a `str`.""" return ( diff --git a/python/clim_recal/pipeline.py b/python/clim_recal/pipeline.py index d8a852b6..f22dfcd6 100644 --- a/python/clim_recal/pipeline.py +++ b/python/clim_recal/pipeline.py @@ -49,7 +49,7 @@ - [x] Ensure HADs still works - [x] Add function for UKCP - [x] Check `convert_xr_calendar` `doctest` examples -- [ ] Fix order of UKCP changes +- [x] Fix order of UKCP changes To run this step in the pipeline the following should work for the default combindations of `variables`: `tasmax`, @@ -324,5 +324,3 @@ def main( print(region_cropped_hads_resamples[:print_range_length]) else: print("No steps run. Add '--execute' to run steps.") - - # config.cpm.resample_multiprocessing() diff --git a/python/clim_recal/resample.py b/python/clim_recal/resample.py index c728ad6b..40867c43 100644 --- a/python/clim_recal/resample.py +++ b/python/clim_recal/resample.py @@ -85,7 +85,6 @@ ResamplingCallable = Callable[[list | tuple], int] CPM_STANDARD_CALENDAR_PATH: Final[Path] = Path("cpm-standard-calendar") CPM_SPATIAL_COORDS_PATH: Final[Path] = Path("cpm-to-27700-spatial") -# HADS_2_2K_RESOLUTION_PATH: Final[Path] = Path("hads-to-27700-spatial-2.2km") CPM_OUTPUT_LOCAL_PATH: Final[Path] = Path("cpm") HADS_OUTPUT_LOCAL_PATH: Final[Path] = Path("hads") @@ -113,18 +112,13 @@ class ResamblerBase: input_path: PathLike | None = Path() output_path: PathLike = RESAMPLING_OUTPUT_PATH variable_name: VariableOptions | str = VariableOptions.default() - # grid: PathLike | T_Dataset = DEFAULT_RELATIVE_GRID_DATA_PATH input_files: Iterable[PathLike] | None = None cpus: int | None = None - # crop_regions: tuple[RegionOptions | str, ...] | None = RegionOptions.all() crop_region: RegionOptions | str | None = RegionOptions.GLASGOW crop_path: PathLike = RESAMPLING_OUTPUT_PATH final_crs: str = BRITISH_NATIONAL_GRID_EPSG - # grid_x_column_name: str = HADS_XDIM - # grid_y_column_name: str = HADS_YDIM input_file_extension: NETCDF_OR_TIF = NETCDF_EXTENSION_STR export_file_extension: NETCDF_OR_TIF = NETCDF_EXTENSION_STR - # resolution_relative_path: Path = HADS_2_2K_RESOLUTION_PATH input_file_x_column_name: str = "" input_file_y_column_name: str = "" start_index: int = 0 @@ -138,11 +132,8 @@ def __post_init__(self) -> None: raise AttributeError( f"'input_path' or 'input_file' are None; at least one must be set." ) - # self.set_grid_x_y() self.set_input_files() Path(self.output_path).mkdir(parents=True, exist_ok=True) - # if self.crop_regions: - # Path(self.crop_path).mkdir(parents=True, exist_ok=True) if self.crop_region: Path(self.crop_path).mkdir(parents=True, exist_ok=True) self.total_cpus: int | None = cpu_count() @@ -202,25 +193,6 @@ def __repr__(self) -> str: f"output_path='{self.output_path}')>" ) - # def set_grid(self, new_grid_data_path: PathLike | None = None) -> None: - # """Set check and set (if necessary) `grid` attribute of `self`. - # - # Notes - # ----- - # To be depricated. - # - # Parameters - # ---------- - # new_grid_data_path - # New `Path` to load to `self.grid`. - # """ - # if new_grid_data_path: - # self.grid = new_grid_data_path - # if isinstance(self.grid, PathLike): - # self._grid_path = Path(self.grid) - # self.grid = open_dataset(self.grid) - # assert isinstance(self.grid, Dataset) - def _get_source_path( self, index: int, source_to_index: Sequence | None = None ) -> Path: @@ -282,30 +254,6 @@ def range_to_reprojection( source_to_index=source_to_index, ) - # def set_grid_x_y( - # self, - # grid_x_column_name: str | None = None, - # grid_y_column_name: str | None = None, - # ) -> None: - # """Set the `x` `y` values via `grid_x_column_name` and `grid_y_column_name`. - # - # Parameters - # ---------- - # grid_x_column_name - # Name of column in `self.grid` `Dataset` to extract to `self.x`. - # If `None` use `self.grid_x_column_name`, else overwrite. - # grid_y_column_name - # Name of column in `self.grid` `Dataset` to extract to `self.y`. - # If `None` use `self.grid_y_column_name`, else overwrite. - # """ - # if self.grid is None or isinstance(self.grid, PathLike): - # self.set_grid() - # assert isinstance(self.grid, Dataset) - # self.grid_x_column_name = grid_x_column_name or self.grid_x_column_name - # self.grid_y_column_name = grid_y_column_name or self.grid_y_column_name - # self.x: NDArray = self.grid[self.grid_x_column_name][:].values - # self.y: NDArray = self.grid[self.grid_y_column_name][:].values - def execute(self, skip_spatial: bool = False, **kwargs) -> list[Path] | None: """Run all steps for processing""" return self.range_to_reprojection(**kwargs) if not skip_spatial else None @@ -330,8 +278,6 @@ def _sync_reprojected_paths( def range_crop_projection( self, - # regions: Iterable[str] | None = None, - # regions: Iterable[str] | None = None, start: int | None = None, stop: int | None = None, step: int = 1, @@ -339,18 +285,11 @@ def range_crop_projection( return_results: bool = False, **kwargs, ) -> list[Path]: - # regions = regions or self.crop_regions start = start or self.start_index stop = stop or self.stop_index export_paths: list[Path | T_Dataset] = [] if stop is None: stop = len(self) - # try: - # assert regions - # except: - # raise ValueError(f"Iterable 'regions' must be set.") - # for region in regions: - # console.print(f"Cropping to '{region}' from {self}...") console.print(f"Cropping to '{self.crop_path}'") for index in trange(start, stop, step): export_paths.append( @@ -366,7 +305,6 @@ def range_crop_projection( def crop_projection( self, - # region: str, index: int = 0, override_export_path: Path | None = None, return_results: bool = False, @@ -385,13 +323,6 @@ def crop_projection( "Run after 'self.to_reprojection()' or set as a " "list directly." ) - # try: - # assert region and region in self.crop_regions - # except AttributeError: - # raise IndexError(f"'{region}' not in 'crop_regions': '{self.crop_regions}'") - # try: - # assert self.crop_region except AttributeError: - # raise IndexError(f"'{region}' not in 'crop_regions': '{self.crop_regions}'") try: assert self.crop_region in RegionOptions except AttributeError: @@ -407,7 +338,6 @@ def crop_projection( crop_box=RegionOptions.bounding_box(self.crop_region), **kwargs, ) - # cropped_file_name: str = "crop_" + str(self.crop_region) + "-" + resampled_xr.name cropped_file_name: str = region_crop_file_name( self.crop_region, resampled_xr.name ) @@ -415,22 +345,12 @@ def crop_projection( cropped.to_netcdf(export_path) if not hasattr(self, "_cropped_paths"): self._cropped_paths: list[PathLike] = [] - # self._cropped_paths: dict[str, list[PathLike]] = {} - # if region not in self._cropped_paths: - # self._cropped_paths[region] = [] - # self._cropped_paths[region].append(export_path) self._cropped_paths.append(export_path) if return_results: return cropped else: return export_path - # def execute_crop(self, **kwargs) -> list[Path] | None: - # """Run crop for related reprojections.""" - # if not self.output_path or not Path(self.output_path).exists(): - # raise ValueError(f"Output path {self.output_path} required to crop.") - # else: - @dataclass(kw_only=True, repr=False) class HADsResampler(ResamblerBase): @@ -494,31 +414,18 @@ class HADsResampler(ResamblerBase): input_path: PathLike | None = RAW_HADS_TASMAX_PATH output_path: PathLike = RESAMPLING_OUTPUT_PATH / HADS_OUTPUT_LOCAL_PATH - # variable_name: VariableOptions = VariableOptions.default() - # grid: PathLike | T_Dataset = DEFAULT_RELATIVE_GRID_DATA_PATH input_files: Iterable[PathLike] | None = None - # input_path: PathLike | None = RAW_HADS_TASMAX_PATH cpus: int | None = None crop_path: PathLike = RESAMPLING_OUTPUT_PATH / HADS_CROP_OUTPUT_LOCAL_PATH final_crs: str = BRITISH_NATIONAL_GRID_EPSG - # grid_x_column_name: str = HADS_XDIM - # grid_y_column_name: str = HADS_YDIM input_file_extension: NETCDF_OR_TIF = NETCDF_EXTENSION_STR export_file_extension: NETCDF_OR_TIF = NETCDF_EXTENSION_STR - # resolution_relative_path: Path = HADS_2_2K_RESOLUTION_PATH input_file_x_column_name: str = HADS_XDIM input_file_y_column_name: str = HADS_YDIM cpm_for_coord_alignment: T_Dataset | PathLike | None = RAW_CPM_TASMAX_PATH cpm_for_coord_alignment_path_converted: bool = False _resample_func: ReprojectFuncType = hads_resample_and_reproject - # _use_reference_grid: bool = True - - # def __post_init__(self) -> None: - # """Ensure `self.cpm_for_coord_alignment` is set.""" - # super().__post_init__() - # # self.set_cpm_for_coord_alignment() - # # cpm_match_variable_name: str = self.cpm_for_coord_alignment def set_cpm_for_coord_alignment(self) -> None: """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" @@ -526,48 +433,11 @@ def set_cpm_for_coord_alignment(self) -> None: self.cpm_for_coord_alignment, skip_reproject=self.cpm_for_coord_alignment_path_converted, ) - # if self.cpm_for_coord_alignment_path_converted: - # if isinstance(self.cpm_for_coord_alignment, Dataset): - # logger.info("Using 'self.cpm_for_coord_alignment'...") - # elif isinstance(self.cpm_for_coord_alignment, PathLike): - # logger.info( - # f"Loading 'self.cpm_for_coord_alignment' from " - # f"'{self.cpm_for_coord_alignment}'..." - # ) - # self.cpm_for_coord_alignment, _ = check_xarray_path_and_var_name( - # self.cpm_for_coord_alignment, None - # ) - # else: - # raise ValueError( - # f"Type of 'cpm_for_coord_alingment' not valid for {self}" - # ) - # else: - # self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( - # self.cpm_for_coord_alignment - # ) - - # if isinstance(self.cpm_for_coord_alignment, PathLike): - # if Path(self.cpm_for_coord_alignment).is_dir(): - # self.cpm_for_coord_alignment = next( - # Path(self.cpm_for_coord_alignment).glob("t*.nc") - # ) - # self.cpm_for_coord_alignment = cpm_reproject_with_standard_calendar( - # self.cpm_for_coord_alignment - # ) - # logger.info( - # f"Set 'self.cpm_for_coord_alignment' to: '{self.cpm_for_coord_alignment}'" - # ) - # try: - # assert isinstance(self.cpm_for_coord_alignment, Dataset) - # except AssertionError: - # raise AttributeError( - # f"'cpm_for_coord_alignment' must be a 'Dataset'. " - # f"Currently a {type(self.cpm_for_coord_alignment)} in {self}.") def to_reprojection( self, index: int = 0, - override_export_path: Path | None = None, + # override_export_path: Path | None = None, return_results: bool = False, source_to_index: Sequence | None = None, ) -> Path | T_Dataset: @@ -576,12 +446,8 @@ def to_reprojection( ) path: PathLike = self.output_path self.set_cpm_for_coord_alignment() - # path: PathLike = self._output_path( - # self.resolution_relative_path, override_export_path - # ) return apply_geo_func( source_path=source_path, - # func=interpolate_coords, func=self._resample_func, export_folder=path, # Leaving in case we return to using warp @@ -592,11 +458,6 @@ def to_reprojection( x_dim_name=self.input_file_x_column_name, y_dim_name=self.input_file_y_column_name, cpm_to_match=self.cpm_for_coord_alignment, - # x_grid=self.x, - # y_grid=self.y, - # source_x_coord_column_name=self.input_file_x_column_name, - # source_y_coord_column_name=self.input_file_y_column_name, - # use_reference_grid=self._use_reference_grid, new_path_name_func=reproject_2_2km_filename, return_results=return_results, ) @@ -655,10 +516,8 @@ class CPMResampler(ResamblerBase): input_path: PathLike | None = RAW_CPM_TASMAX_PATH output_path: PathLike = RESAMPLING_OUTPUT_PATH / CPM_OUTPUT_LOCAL_PATH crop_path: PathLike = RESAMPLING_OUTPUT_PATH / CPM_CROP_OUTPUT_LOCAL_PATH - # standard_calendar_relative_path: Path = CPM_STANDARD_CALENDAR_PATH input_file_x_column_name: str = CPM_RAW_X_COLUMN_NAME input_file_y_column_name: str = CPM_RAW_Y_COLUMN_NAME - # resolution_relative_path: Path = CPM_SPATIAL_COORDS_PATH _resample_func: ReprojectFuncType = cpm_reproject_with_standard_calendar @property @@ -668,7 +527,7 @@ def cpm_variable_name(self) -> str: def to_reprojection( self, index: int = 0, - override_export_path: Path | None = None, + # override_export_path: Path | None = None, return_results: bool = False, source_to_index: Sequence | None = None, ) -> Path | T_Dataset: @@ -676,9 +535,6 @@ def to_reprojection( index=index, source_to_index=source_to_index ) path: PathLike = self.output_path - # path: PathLike = self._output_path( - # self.resolution_relative_path, override_export_path - # ) result: Path | T_Dataset | GDALDataset = apply_geo_func( source_path=source_path, func=self._resample_func, @@ -787,19 +643,6 @@ def __repr__(self) -> str: f"input_paths_count={len(self.input_paths) if isinstance(self.input_paths, Sequence) else 1})>" ) - # def _gen_input_folder_paths( - # self, - # path: PathLike, - # append_var_path_dict: bool = False, - # ) -> Iterator[Path]: - # """Yield input paths of `self.variables` and `self.runs`.""" - # var_path: Path - # for var in self.variables: - # var_path = Path(path) / var / self.sub_path - # if append_var_path_dict: - # self._path_dict[var_path] = var - # yield var_path - def _gen_resample_folder_paths( self, path: PathLike, @@ -822,7 +665,6 @@ def check_paths( """Check and set `input`, `resample` and `crop` paths.""" if run_set_data_paths: - # self.set_input_paths() self.set_resample_paths() if run_set_crop_paths: self.set_crop_paths() @@ -898,11 +740,10 @@ def set_crop_paths(self) -> None: ) ) - def yield_configs(self) -> Iterable[HADsResampler]: + def yield_configs(self) -> Iterable[ResamblerBase]: """Generate a `CPMResampler` or `HADsResampler` for `self.input_paths`.""" self.check_paths() assert isinstance(self.resample_paths, Iterable) - # assert isinstance(self.crop_paths, Iterable) for index, var_path in enumerate(self._input_path_dict.items()): yield self.resampler_class( input_path=var_path[0], @@ -913,14 +754,13 @@ def yield_configs(self) -> Iterable[HADsResampler]: **self.config_default_kwargs, ) - def yield_crop_configs(self) -> Iterable[HADsResampler]: + def yield_crop_configs(self) -> Iterable[ResamblerBase]: """Generate a `CPMResampler` or `HADsResampler` for `self.input_paths`.""" self.check_paths() assert isinstance(self.input_paths, Iterable) assert isinstance(self.resample_paths, Iterable) assert isinstance(self.crop_paths, Iterable) for index, input_resample_paths in enumerate(self._resampled_path_dict.items()): - # for crop_path, region in self._cropped_path_dict.items(): for crop_path, region in self._cropped_path_dict.items(): yield self.resampler_class( input_path=input_resample_paths[0], @@ -968,7 +808,7 @@ def __getitem__(self, key: int | slice) -> Path | tuple[Path, ...] | None: def execute_resample_configs( self, multiprocess: bool = False, cpus: int | None = None - ) -> tuple[CPMResampler | HADsResampler, ...]: + ) -> tuple[ResamblerBase, ...]: """Run all resampler configurations Parameters @@ -978,9 +818,7 @@ def execute_resample_configs( cpus Number of `cpus` to pass to `multiprocess_execute`. """ - resamplers: tuple[CPMResampler | HADsResampler, ...] = tuple( - self.yield_configs() - ) + resamplers: tuple[ResamblerBase, ...] = tuple(self.yield_configs()) results: list[list[Path] | None] = [] if multiprocess: cpus = cpus or self.cpus @@ -995,7 +833,7 @@ def execute_resample_configs( def execute_crop_configs( self, multiprocess: bool = False, cpus: int | None = None - ) -> tuple[CPMResampler | HADsResampler, ...]: + ) -> tuple[ResamblerBase, ...]: """Run all resampler configurations Parameters @@ -1005,12 +843,7 @@ def execute_crop_configs( cpus Number of `cpus` to pass to `multiprocess_execute`. """ - croppers: tuple[CPMResampler | HADsResampler, ...] = tuple( - # self.yield_configs( - # input_path=self.resample_paths, output_path=self.crop_path - # ) - self.yield_crop_configs() - ) + croppers: tuple[ResamblerBase, ...] = tuple(self.yield_crop_configs()) results: list[list[Path] | None] = [] if multiprocess: cpus = cpus or self.cpus @@ -1084,14 +917,10 @@ class HADsResamplerManager(ResamblerManagerBase): resample_paths: PathLike | Sequence[PathLike] = ( RESAMPLING_OUTPUT_PATH / HADS_OUTPUT_LOCAL_PATH ) - # variables: Sequence[VariableOptions | str] = (VariableOptions.default(),) - # crop_regions: tuple[RegionOptions | str, ...] | None = RegionOptions.all() crop_paths: Sequence[PathLike] | PathLike = ( RESAMPLING_OUTPUT_PATH / HADS_CROP_OUTPUT_LOCAL_PATH ) sub_path: Path = HADS_SUB_PATH - # start_index: int = 0 - # stop_index: int | None = None start_date: date = HADS_START_DATE end_date: date = HADS_END_DATE configs: list[HADsResampler] = field(default_factory=list) @@ -1127,21 +956,12 @@ def _gen_crop_folder_paths( self._cropped_path_dict[crop_path] = region yield crop_path - # def __post_init__(self) -> None: - # """Ensure `self.cpm_for_coord_alignment` is set.""" - # super().__post_init__() - # # self.set_cpm_for_coord_alignment() - def set_cpm_for_coord_alignment(self) -> None: """Check if `cpm_for_coord_alignment` is a `Dataset`, process if a `Path`.""" self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( self.cpm_for_coord_alignment, skip_reproject=self.cpm_for_coord_alignment_path_converted, ) - # if not self.cpm_for_coord_alignment_path_converted: - # self.cpm_for_coord_alignment = get_cpm_for_coord_alignment( - # self.cpm_for_coord_alignment - # ) def yield_configs(self) -> Iterable[HADsResampler]: """Generate a `CPMResampler` or `HADsResampler` for `self.input_paths`.""" diff --git a/python/clim_recal/utils/data.py b/python/clim_recal/utils/data.py index d129b310..274a8526 100644 --- a/python/clim_recal/utils/data.py +++ b/python/clim_recal/utils/data.py @@ -144,9 +144,6 @@ def rioxarry_epsg(self) -> str: DEFAULT_CALENDAR_ALIGN: Final[ConvertCalendarAlignOptions] = "year" NETCDF4_XARRAY_ENGINE: Final[str] = "netcdf4" -# DEFAULT_RELATIVE_GRID_DATA_PATH: Final[Path] = ( -# Path().absolute() / "../data/rcp85_land-cpm_uk_2.2km_grid.nc" -# ) TIME_COLUMN_NAME: Final[str] = "time" GLASGOW_GEOM_LOCAL_PATH: Final[Path] = Path( diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 4d5baa22..79d03e5a 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -22,7 +22,6 @@ WarpOptions, ) from osgeo.gdal import config_option as config_GDAL_option -from pandas import DatetimeIndex, date_range from rasterio.enums import Resampling from tqdm import tqdm from xarray import CFTimeIndex, DataArray, Dataset, cftime_range, open_dataset @@ -83,19 +82,8 @@ FINAL_CONVERTED_CPM_WIDTH: Final[int] = 493 FINAL_CONVERTED_CPM_HEIGHT: Final[int] = 607 -# MONTH_DAY_DROP: DropDayType = {(1, 31), (4, 1), (6, 1), (8, 1), (10, 1), (12, 1)} -# """A `set` of tuples of month and day numbers for `enforce_date_changes`.""" - - -# HADS_RAW_X_COLUMN_NAME: Final[str] = "projection_x_coordinate" -# HADS_RAW_Y_COLUMN_NAME: Final[str] = "projection_y_coordinate" HADS_DROP_VARS_AFTER_PROJECTION: Final[tuple[str, ...]] = ("longitude", "latitude") -# CPM_RESOLUTION_METERS: Final[int] = 2200 -# CPM_RAW_X_COLUMN_NAME: Final[str] = "grid_longitude" -# CPM_RAW_Y_COLUMN_NAME: Final[str] = "grid_latitude" - -# TODO: CHECK IF THESE ARE BACKWARDS FINAL_RESAMPLE_LON_COL: Final[str] = "x" FINAL_RESAMPLE_LAT_COL: Final[str] = "y" @@ -473,98 +461,6 @@ def error_message(method: str) -> str: raise ValueError(error_message(method)) -# def interpolate_coords( -# xr_time_series: T_Dataset, -# variable_name: str, -# x_grid: NDArray | None = None, -# y_grid: NDArray | None = None, -# x_coord_column_name: str = HADS_RAW_X_COLUMN_NAME, -# y_coord_column_name: str = HADS_RAW_Y_COLUMN_NAME, -# reference_coords: T_Dataset | PathLike = DEFAULT_RELATIVE_GRID_DATA_PATH, -# reference_coord_x_column_name: str = HADS_RAW_X_COLUMN_NAME, -# reference_coord_y_column_name: str = HADS_RAW_Y_COLUMN_NAME, -# method: str = "linear", -# engine: XArrayEngineType = NETCDF4_XARRAY_ENGINE, -# use_reference_grid: bool = True, -# **kwargs, -# ) -> T_Dataset: -# """Reproject `xr_time_series` to `x_resolution`/`y_resolution`. -# -# Notes -# ----- -# The `rio.reproject` approach commented out below raises -# `ValueError: IndexVariable objects must be 1-dimensional` -# See https://github.com/corteva/rioxarray/discussions/762 -# """ -# if isinstance(xr_time_series, PathLike | str): -# xr_time_series = open_dataset( -# xr_time_series, decode_coords="all", engine=engine -# ) -# -# try: -# assert isinstance(xr_time_series, Dataset) -# except: -# ValueError(f"'xr_time_series' must be an 'xr.Dataset' instance.") -# -# if use_reference_grid or (x_grid is None or y_grid is None): -# if isinstance(reference_coords, PathLike | str): -# reference_coords = open_dataset( -# reference_coords, decode_coords="all", engine=engine -# ) -# try: -# assert isinstance(reference_coords, Dataset) -# except: -# ValueError(f"'reference_coords' must be an 'xr.Dataset' instance.") -# try: -# assert reference_coord_x_column_name in reference_coords.coords -# assert reference_coord_y_column_name in reference_coords.coords -# assert x_coord_column_name in xr_time_series.coords -# assert y_coord_column_name in xr_time_series.coords -# except AssertionError: -# raise ValueError( -# f"At least one of\n" -# f"'reference_coord_x_column_name': '{reference_coord_x_column_name}'\n" -# f"'reference_coord_y_column_name': '{reference_coord_y_column_name}'\n" -# f"'x_coord_column_name': '{x_coord_column_name}'\n" -# f"'y_coord_column_name': '{y_coord_column_name}'\n" -# f"not in 'reference_coords' and/or 'xr_time_series'." -# ) -# -# x_grid = ( -# reference_coords[reference_coord_x_column_name].values -# if x_grid is None -# else x_grid -# ) -# y_grid = ( -# reference_coords[reference_coord_y_column_name].values -# if y_grid is None -# else y_grid -# ) -# use_reference_grid = True -# -# try: -# assert isinstance(x_grid, ndarray) -# assert isinstance(y_grid, ndarray) -# except: -# raise ValueError( -# f"Both must be 'ndarray' instances.\n" -# f"'x_grid': {x_grid}\n'y_grid': {y_grid}" -# ) -# kwargs[x_coord_column_name] = x_grid -# kwargs[y_coord_column_name] = y_grid -# reprojected_data_array: T_DataArray = xr_time_series[variable_name].interp( -# method=method, **kwargs -# ) -# -# # Ensure original `rio.crs` is kept in returned `Dataset` -# if use_reference_grid: -# reprojected_data_array.rio.write_crs(reference_coords.rio.crs, inplace=True) -# else: -# reprojected_data_array.rio.write_crs(xr_time_series.rio.crs, inplace=True) -# reprojected: T_Dataset = Dataset({variable_name: reprojected_data_array}) -# return reprojected - - def hads_resample_and_reproject( hads_xr_time_series: T_Dataset | PathLike, variable_name: str, @@ -758,10 +654,12 @@ def convert_xr_calendar( keep_attrs: bool = True, limit: int = 1, engine: XArrayEngineType = NETCDF4_XARRAY_ENGINE, - extrapolate_fill_value: bool = True, + # This may need removing, including in docs + # extrapolate_fill_value: bool = True, check_cftime_cols: tuple[str] | None = None, cftime_range_gen_kwargs: dict[str, Any] | None = None, - **kwargs, + # This may need to be removed + # **kwargs, ) -> T_DataArrayOrSet: """Convert cpm 360 day time series to a standard 365/366 day time series. @@ -1285,53 +1183,6 @@ def generate_360_to_standard(array_to_expand: T_DataArray) -> T_DataArray: return DataArray(expanded_index) -def correct_int_time_datafile( - xr_dataset_path: Path, - new_index_name: str = "time", - replace_index: str | None = "band", - data_attribute_name: str = "band_data", -) -> T_Dataset: - """Load a `Dataset` from path and generate `time` index. - - Notes - ----- - This is not finished and may be removed in future. - - Examples - -------- - >>> pytest.skip(reason="Not finished implementing") - >>> rainfall_dataset = correct_int_time_datafile( - ... glasgow_example_cropped_cpm_rainfall_path) - >>> assert False - """ - xr_dataset: T_Dataset = open_dataset(xr_dataset_path) - metric_name: str = str(xr_dataset_path).split("_")[0] - start_date, end_date = file_name_to_start_end_dates(xr_dataset_path) - dates_index: DatetimeIndex = date_range(start_date, end_date) - intermediate_new_index: str = new_index_name + "_standard" - # xr_intermediate_date = xr_dataset.assign_coords({intermediate_new_index: dates_index}) - xr_dataset[intermediate_new_index]: T_Dataset = dates_index - xr_360_datetime = xr_dataset[intermediate_new_index].convert_calendar( - "360_day", align_on="year", dim=intermediate_new_index - ) - if len(xr_360_datetime[intermediate_new_index]) == 361: - # If the range overlaps a leap and non leap year, - # it is possible to have 361 days - # See https://docs.xarray.dev/en/stable/generated/xarray.Dataset.convert_calendar.html - # Assuming first date is a December 1 - xr_360_datetime = xr_360_datetime[intermediate_new_index][1:] - assert len(xr_360_datetime[intermediate_new_index]) == 360 - # xr_with_datetime['time'] = xr_360_datetime - assert False - xr_bands_time_indexed: T_DataArray = xr_intermediate_date[ - data_attribute_name - ].expand_dims(dim={new_index_name: xr_intermediate_date[new_index_name]}) - # xr_365_data_array: T_DataArray = convert_xr_calendar(xr_bands_time_indexed) - xr_365_dataset: T_Dataset = Dataset({metric_name: xr_bands_time_indexed}) - partial_fix_365_dataset: T_Dataset = convert_xr_calendar(xr_365_dataset.time) - assert False - - def cftime_range_gen(time_data_array: T_DataArray, **kwargs) -> NDArray: """Convert a banded time index a banded standard (Gregorian).""" assert hasattr(time_data_array, "time") diff --git a/python/tests/test_resample.py b/python/tests/test_resample.py index 238e1ca8..fc6d9557 100644 --- a/python/tests/test_resample.py +++ b/python/tests/test_resample.py @@ -37,96 +37,12 @@ ["19800101", "19800102", "19800103", "19800104", "19800105"] ) -# FINAL_CONVERTED_CPM_WIDTH: Final[int] = 410 -# FINAL_CONVERTED_CPM_HEIGHT: Final[int] = 660 -# FINAL_CONVERTED_CPM_WIDTH: Final[int] = 493 -# FINAL_CONVERTED_CPM_HEIGHT: Final[int] = 607 -# -# FINAL_CONVERTED_HADS_WIDTH: Final[int] = 410 -# FINAL_CONVERTED_HADS_HEIGHT: Final[int] = 660 - -# RAW_CPM_TASMAX_1980_FIRST_5: Final[NDArray] = np.array( -# [12.654932, 12.63711, 12.616358, 12.594385, 12.565821], dtype="float32" -# ) -# RAW_CPM_TASMAX_1980_DEC_30_FIRST_5: Final[NDArray] = np.array( -# [13.832666, 13.802149, 13.788477, 13.777491, 13.768946], dtype="float32" -# ) - - -# FINAL_HADS_JAN_10_430_X_230_250_Y: Final[NDArray] = np.array( -# ( -# np.nan, -# np.nan, -# np.nan, -# np.nan, -# np.nan, -# np.nan, -# np.nan, -# np.nan, -# np.nan, -# np.nan, -# np.nan, -# 3.61614943, -# 3.22494448, -# 2.87045363, -# 2.62269053, -# 2.79705005, -# 2.73883926, -# 2.48555346, -# 2.46462528, -# 2.61303118, -# ) -# ) - -# FINAL_HADS_JAN_10_430_X_200_210_Y: Final[NDArray] = np.array( -# ( -# np.nan, -# np.nan, -# np.nan, -# np.nan, -# 7.57977839, -# 7.47138044, -# 7.27587694, -# 7.27587694, -# 7.07294578, -# 7.04533059, -# ) -# ) -# - -# FINAL_CPM_DEC_10_X_2_Y_200_210: Final[NDArray] = np.array( -# ( -# np.nan, -# np.nan, -# 9.637598, -# 9.646631, -# 9.636621, -# 9.622217, -# 9.625147, -# 9.640039, -# 9.6349125, -# 9.509668, -# ) -# ) -# - -# @pytest.fixture(scope="session") -# def reference_final_coord_grid() -> T_Dataset: -# return open_dataset(DEFAULT_RELATIVE_GRID_DATA_PATH, decode_coords="all") - @pytest.fixture def cpm_tasmax_raw_mount_path(data_mount_path: Path) -> Path: return data_mount_path / CPM_TASMAX_DAY_SERVER_PATH -# -# @pytest.fixture -# def cpm_tasmax_raw_5_years_paths(cpm_tasmax_raw_path: Path) -> tuple[Path, ...]: -# """Return a `tuple` of valid paths for 5 years of""" -# return tuple(annual_data_paths_generator(parent_path=cpm_tasmax_raw_path)) - - @pytest.fixture def hads_tasmax_raw_mount_path(data_mount_path: Path) -> Path: return data_mount_path / HADS_UK_TASMAX_DAY_SERVER_PATH @@ -142,415 +58,6 @@ def cpm_tasmax_local_test_path(data_fixtures_path: Path) -> Path: return data_fixtures_path / CPM_TASMAX_LOCAL_TEST_PATH -# def test_leap_year_days() -> None: -# """Test covering a leap year of 366 days.""" -# start_date_str: str = "2024-03-01" -# end_date_str: str = "2025-03-01" -# xarray_2024_2025: T_DataArray = xarray_example( -# start_date=start_date_str, -# end_date=end_date_str, -# inclusive=True, -# ) -# assert len(xarray_2024_2025) == year_days_count(leap_years=1) -# -# -# # This is roughly what I had in mind for -# # https://github.com/alan-turing-institute/clim-recal/issues/132 -# # This tests converting from a standard calendar to a 360_day calendar. -# @pytest.mark.parametrize( -# # Only one of start_date and end_date are included the day counts -# "start_date, end_date, gen_date_count, days_360, converted_days, align_on", -# [ -# pytest.param( -# # 4 years, including a leap year -# "2024-03-02", -# "2028-03-02", -# year_days_count(standard_years=3, leap_years=1), -# year_days_count(xarray_360_day_years=4), -# year_days_count(standard_years=3, leap_years=1), -# "year", -# id="years_4_annual_align", -# ), -# pytest.param( -# # A whole year, most of which is in a leap year, but avoids the leap day -# "2024-03-02", -# "2025-03-02", -# year_days_count(standard_years=1), -# year_days_count(xarray_360_day_years=1) - 1, -# year_days_count(standard_years=1), -# "year", -# id="leap_year_but_no_leap_day_annual_align", -# ), -# pytest.param( -# # A whole year, the same date range as the previous test, -# # but includes the leap day and the majority of the days are in a non-leap year -# # Note: the current final export configuration *adds* a day -# "2023-03-02", -# "2024-03-02", -# year_days_count(leap_years=1), -# year_days_count(xarray_360_day_years=1) + 1, -# year_days_count(leap_years=1) + 1, -# "year", -# id="leap_year_with_leap_day_annual_align", -# ), -# pytest.param( -# # An exact calendar year which *IS NOT* a leap year -# "2023-01-01", -# "2024-01-01", -# year_days_count(standard_years=1), -# year_days_count(xarray_360_day_years=1), -# year_days_count(standard_years=1), -# "year", -# id="non_leap_year_annual_align", -# ), -# pytest.param( -# # A leap day (just the days either side, in a leap year) -# "2024-02-28", -# "2024-03-01", -# 2, -# 2, -# 2, -# "year", -# id="leap_day", -# ), -# pytest.param( -# # A non-leap day (just the days either side, in a non-leap year) -# "2023-02-28", -# "2023-03-01", -# 1, -# 1, -# 1, -# "year", -# id="non_leap_day_date_align", -# ), -# # Add more test cases to cover the different scenarios and edge cases -# pytest.param( -# # 4 years, including a leap year -# # WARNING: the intermittent year days seems a week short -# "2024-03-02", -# "2028-03-02", -# year_days_count(standard_years=3, leap_years=1), -# year_days_count(xarray_360_day_years=4) - 7, -# year_days_count(standard_years=3, leap_years=1), -# "date", -# id="years_4_date_align", -# marks=pytest.mark.xfail(reason="raises `date_range_like` error"), -# ), -# pytest.param( -# # A whole year, most of which is in a leap year, but avoids the leap day -# "2024-03-02", -# "2025-03-02", -# year_days_count(standard_years=1), -# year_days_count(xarray_360_day_years=1) - 2, -# year_days_count(standard_years=1), -# "date", -# id="leap_year_but_no_leap_day_date_align", -# marks=pytest.mark.xfail(reason="raises `date_range_like` error"), -# ), -# pytest.param( -# # A whole year, the same date range as the previous test, -# # but includes the leap day and the majority of the days are in a non-leap year -# # Note: the current final export configuration *adds* a day -# "2023-03-02", -# "2024-03-02", -# year_days_count(leap_years=1), -# year_days_count(xarray_360_day_years=1) - 1, -# year_days_count(leap_years=1) + 1, -# "date", -# id="leap_year_with_leap_day_date_align", -# marks=pytest.mark.xfail(reason="raises `date_range_like` error"), -# ), -# pytest.param( -# # An exact calendar year which *IS NOT* a leap year -# "2023-01-01", -# "2024-01-01", -# year_days_count(standard_years=1), -# year_days_count(xarray_360_day_years=1) - 2, -# year_days_count(standard_years=1), -# "date", -# id="non_leap_year_date_align", -# marks=pytest.mark.xfail(reason="raises `date_range_like` error"), -# ), -# pytest.param( -# # A leap day (just the days either side, in a leap year) -# "2024-02-28", -# "2024-03-01", -# 2, -# 2, -# 2, -# "date", -# id="leap_day", -# ), -# pytest.param( -# # A non-leap day (just the days either side, in a non-leap year) -# "2023-02-28", -# "2023-03-01", -# 1, -# 1, -# 1, -# "date", -# id="non_leap_day_date_align", -# ), -# ], -# ) -# def test_time_gaps_360_to_standard_calendar( -# start_date: DateType, -# end_date: DateType, -# gen_date_count: int, -# days_360: int, -# converted_days: int, -# align_on: ConvertCalendarAlignOptions, -# ): -# """Test `convert_xr_calendar` call of `360_day` `DataArray` to `standard` calendar.""" -# # Potential paramaterized variables -# inclusive_date_range: bool = False # includes the last day specified -# use_cftime: bool = True # Whether to enforece using `cftime` over `datetime64` -# # align_on: ConvertCalendarAlignOptions = 'date' -# -# # Create a base -# base: T_Dataset = xarray_example( -# start_date, end_date, as_dataset=True, inclusive=inclusive_date_range -# ) -# -# # Ensure the generated date range matches for later checks -# # This occurs for a sigle leap year -# assert len(base.time) == gen_date_count -# -# # Convert to `360_day` calendar example -# dates_360: T_Dataset = base.convert_calendar( -# calendar="360_day", -# align_on=align_on, -# use_cftime=use_cftime, -# ) -# -# # Check the total number of days are as expected -# assert len(dates_360.time) == days_360 -# -# if converted_days < 5: -# with pytest.raises(ValueError): -# convert_xr_calendar(dates_360, align_on=align_on, use_cftime=use_cftime) -# else: -# dates_converted: T_Dataset = convert_xr_calendar( -# dates_360, align_on=align_on, use_cftime=use_cftime -# ) -# assert len(dates_converted.time) == converted_days -# -# # Optionally now check which dates have been dropped and added -# # Add more assertions here... -# assert all(base.time == dates_converted.time) -# assert all(base.time != dates_360.time) -# - -# @pytest.mark.slow -# @pytest.mark.mount -# @pytest.mark.parametrize("interpolate_na", (True, False)) -# def test_convert_cpm_calendar(interpolate_na: bool) -> None: -# """Test `convert_calendar` on mounted `cpm` data. -# -# Notes -# ----- -# If `interpolate_na` is `True`, there shouldn't be `tasmax` `nan` values, hence -# creating the `na_values` `bool` as the inverse of `interpolate_na`. -# """ -# any_na_values_in_tasmax: bool = not interpolate_na -# raw_nc: T_Dataset = open_dataset( -# CPM_RAW_TASMAX_EXAMPLE_PATH, decode_coords="all", engine=NETCDF4_XARRAY_ENGINE -# ) -# assert len(raw_nc.time) == 360 -# assert len(raw_nc.time_bnds) == 360 -# converted: T_Dataset = convert_xr_calendar(raw_nc, interpolate_na=interpolate_na) -# assert len(converted.time) == 365 -# assert len(converted.time_bnds) == 365 -# assert ( -# np.isnan(converted.tasmax.head()[0][0][0].values).all() -# == any_na_values_in_tasmax -# ) - - -# @pytest.mark.localcache -# @pytest.mark.mount -# @pytest.mark.slow -# @pytest.mark.parametrize("include_bnds_index", (True, False)) -# def test_cpm_xarray_to_standard_calendar( -# tasmax_cpm_1980_raw: T_Dataset, -# include_bnds_index: bool, -# ) -> None: -# """Test 360 raw to 365/366 calendar conversion. -# -# Notes -# ----- -# Indexing differs between `include_bnds_index` ``bool`. -# ``` -# """ -# CORRECT_PROJ4: Final[str] = ( -# "+proj=ob_tran +o_proj=longlat +o_lon_p=0 +o_lat_p=37.5 +lon_0=357.5 +R=6371229 +no_defs=True" -# ) -# test_converted = cpm_xarray_to_standard_calendar( -# tasmax_cpm_1980_raw, include_bnds_index=include_bnds_index -# ) -# assert test_converted.rio.width == CALENDAR_CONVERTED_CPM_WIDTH -# assert test_converted.rio.height == CALENDAR_CONVERTED_CPM_HEIGHT -# assert test_converted.rio.crs.to_proj4() == CORRECT_PROJ4 -# assert test_converted.tasmax.rio.crs.to_proj4() == CORRECT_PROJ4 -# assert len(test_converted.time) == 365 -# -# tasmax_data_subset: NDArray -# if include_bnds_index: -# assert len(test_converted.tasmax.data) == 2 # second band -# assert len(test_converted.tasmax.data[0][0]) == 365 # first band -# assert len(test_converted.tasmax.data[1][0]) == 365 # second band -# tasmax_data_subset = test_converted.tasmax.data[0][0] # first band -# else: -# assert len(test_converted.tasmax.data) == 1 # no band index -# tasmax_data_subset = test_converted.tasmax.data[0] -# assert len(tasmax_data_subset) == 365 -# -# # By default December 1 in a 360 to 365 projection would -# # be null. The values matching below should indicate the -# # projection has interpolated null values on the first date -# assert ( -# tasmax_data_subset[0][0][:5] -# == PROJECTED_CPM_TASMAX_1980_FIRST_5 -# # test_converted.tasmax.data[0][0][0][0][:5] == PROJECTED_CPM_TASMAX_1980_FIRST_5 -# ).all() -# # Check December 31 1980, which wouldn't be included in 360 day calendar -# assert ( -# # test_converted.tasmax.data[0][0][31][0][:5] -# tasmax_data_subset[31][0][:5] -# == PROJECTED_CPM_TASMAX_1980_DEC_31_FIRST_5 -# ).all() - - -# @pytest.mark.localcache -# @pytest.mark.mount -# @pytest.mark.slow -# def test_cpm_reproject_with_standard_calendar( -# tasmax_cpm_1980_raw_path: Path, -# test_runs_output_path: Path, -# variable_name: str = "tasmax", -# ) -> None: -# """Test all steps around calendar and warping CPM RAW data.""" -# output_path: Path = results_path( -# "test-cpm-warp", -# path=test_runs_output_path, -# mkdir=True, -# extension=NETCDF_EXTENSION_STR, -# ) -# plot_path: Path = output_path.parent / (output_path.stem + ".png") -# projected: T_Dataset = cpm_reproject_with_standard_calendar( -# tasmax_cpm_1980_raw_path, -# ) -# assert projected.rio.crs == BRITISH_NATIONAL_GRID_EPSG -# projected.to_netcdf(output_path) -# results: T_Dataset = open_dataset(output_path, decode_coords="all") -# assert (results.time == projected.time).all() -# assert results.dims == { -# FINAL_RESAMPLE_LON_COL: FINAL_CONVERTED_CPM_WIDTH, -# FINAL_RESAMPLE_LAT_COL: FINAL_CONVERTED_CPM_HEIGHT, -# "time": 365, -# } -# assert results.rio.crs == BRITISH_NATIONAL_GRID_EPSG -# assert len(results.data_vars) == 1 -# assert_allclose( -# results[variable_name][10][2][200:210], FINAL_CPM_DEC_10_X_2_Y_200_210 -# ) -# plot_xarray(results.tasmax[0], plot_path, time_stamp=True) -# -# -# @pytest.mark.xfail(reason="test not complete") -# def test_cpm_tif_to_standard_calendar( -# glasgow_example_cropped_cpm_rainfall_path: Path, -# ) -> None: -# test_converted: tuple[date, ...] = tuple( -# date_range_generator( -# *file_name_to_start_end_dates(glasgow_example_cropped_cpm_rainfall_path) -# ) -# ) -# assert len(test_converted) == 366 -# assert False -# -# -# # @pytest.mark.xfail(reason="not finished writing, will need refactor") -# @pytest.mark.localcache -# @pytest.mark.slow -# @pytest.mark.mount -# @pytest.mark.parametrize("region", ("Glasgow", "Manchester", "London", "Scotland")) -# @pytest.mark.parametrize("data_type", (UKCPLocalProjections, HadUKGrid)) -# @pytest.mark.parametrize( -# # "config", ("direct", "range", "direct_provided", "range_provided") -# "config", -# ("direct", "range"), -# ) -# def test_crop_xarray( -# tasmax_cpm_1980_raw_path, -# tasmax_hads_1980_raw_path, -# resample_test_cpm_output_path, -# resample_test_hads_output_path, -# config: str, -# data_type: str, -# region: str, -# ): -# """Test `cropping` `DataArray` to `standard` calendar.""" -# CPM_FIRST_DATES: np.array = np.array( -# ["19801201", "19801202", "19801203", "19801204", "19801205"] -# ) -# test_config: CPMResampler | HADsResampler -# if data_type == HadUKGrid: -# output_path: Path = resample_test_hads_output_path / config -# crop_path: Path = ( -# resample_test_hads_output_path / config / HADS_CROP_OUTPUT_LOCAL_PATH -# ) -# -# test_config = HADsResampler( -# input_path=tasmax_hads_1980_raw_path.parent, -# output_path=output_path, -# crop_path=crop_path, -# ) -# else: -# assert data_type == UKCPLocalProjections -# output_path: Path = resample_test_cpm_output_path / config -# crop_path: Path = ( -# resample_test_cpm_output_path / config / CPM_CROP_OUTPUT_LOCAL_PATH -# ) -# test_config = CPMResampler( -# input_path=tasmax_cpm_1980_raw_path.parent, -# output_path=output_path, -# crop_path=crop_path, -# ) -# paths: list[Path] -# try: -# reproject_result: GDALDataset = test_config.to_reprojection() -# except FileExistsError: -# test_config._sync_reprojected_paths(overwrite_output_path=output_path) -# -# match config: -# case "direct": -# paths = [test_config.crop_projection(region=region)] -# case "range": -# paths = test_config.range_crop_projection(stop=1) -# # case "direct_provided": -# # paths = [ -# # test_config.to_reprojection(index=0, source_to_index=tuple(test_config)) -# # ] -# # case "range_provided": -# # paths = test_config.range_to_reprojection( -# # stop=1, source_to_index=tuple(test_config) -# # ) -# crop: T_Dataset = open_dataset(paths[0]) -# # assert crop.dims[FINAL_RESAMPLE_LON_COL] == FINAL_CONVERTED_CPM_WIDTH -# # assert_allclose(export.tasmax[10][5][:10].values, FINAL_CPM_DEC_10_5_X_0_10_Y) -# if data_type == UKCPLocalProjections: -# assert crop.dims["time"] == 365 -# assert ( -# CPM_FIRST_DATES == crop.time.dt.strftime(CLI_DATE_FORMAT_STR).head().values -# ).all() -# plot_xarray( -# crop.tasmax[0], -# path=crop_path / region / f"config-{config}.png", -# time_stamp=True, -# ) - - @pytest.mark.localcache @pytest.mark.slow @pytest.mark.mount @@ -597,7 +104,6 @@ def test_cpm_manager( ) -# @pytest.mark.xfail(reason="checking `export.tasmax` values currently yields `nan`") @pytest.mark.localcache @pytest.mark.slow @pytest.mark.mount @@ -629,135 +135,6 @@ def test_hads_manager( ) -# @pytest.mark.localcache -# @pytest.mark.mount -# @pytest.mark.slow -# @pytest.mark.parametrize("data_type", ("hads", "cpm")) -# @pytest.mark.parametrize("use_reference_grid", (True, False)) -# def test_interpolate_coords( -# data_type: str, -# reference_final_coord_grid: T_Dataset, -# tasmax_cpm_1980_raw: T_Dataset, -# tasmax_hads_1980_raw: T_Dataset, -# use_reference_grid: bool, -# ) -> None: -# """Test reprojecting raw spatial files. -# -# Notes -# ----- -# Still seems to run even when `-m "not mount"` is specified. -# """ -# reprojected_xr_time_series: T_Dataset -# kwargs: dict[str, Any] = dict( -# variable_name="tasmax", -# x_grid=reference_final_coord_grid.projection_x_coordinate.values, -# y_grid=reference_final_coord_grid.projection_y_coordinate.values, -# ) -# x_col_name: str = HADS_XDIM -# y_col_name: str = HADS_YDIM -# if data_type == "hads": -# reprojected_xr_time_series = interpolate_coords( -# tasmax_hads_1980_raw, -# x_coord_column_name=x_col_name, -# y_coord_column_name=y_col_name, -# use_reference_grid=use_reference_grid, -# **kwargs, -# ) -# assert reprojected_xr_time_series.dims["time"] == 31 -# assert_allclose( -# reprojected_xr_time_series.tasmax[10][430][200:210], -# FINAL_HADS_JAN_10_430_X_200_210_Y, -# ) -# if use_reference_grid: -# assert reprojected_xr_time_series.rio.crs == BRITISH_NATIONAL_GRID_EPSG -# else: -# assert reprojected_xr_time_series.rio.crs == tasmax_hads_1980_raw.rio.crs -# else: -# x_col_name = CPRUK_XDIM -# y_col_name = CPRUK_YDIM -# # We are now using gdal_warp_wrapper. See test_cpm_warp_steps -# reprojected_xr_time_series = interpolate_coords( -# tasmax_cpm_1980_raw, -# x_coord_column_name=x_col_name, -# y_coord_column_name=y_col_name, -# use_reference_grid=use_reference_grid, -# **kwargs, -# ) -# # Note: this test is to a raw file without 365 day projection -# assert reprojected_xr_time_series.dims["time"] == 360 -# assert np.isnan(reprojected_xr_time_series.tasmax[0][10][5][:10].values).all() -# if use_reference_grid: -# assert reprojected_xr_time_series.rio.crs == BRITISH_NATIONAL_GRID_EPSG -# else: -# assert reprojected_xr_time_series.rio.crs == tasmax_cpm_1980_raw.rio.crs -# assert reprojected_xr_time_series.dims[x_col_name] == 528 -# assert reprojected_xr_time_series.dims[y_col_name] == 651 - - -# @pytest.mark.slow -# @pytest.mark.localcache -# @pytest.mark.mount -# def test_hads_resample_and_reproject( -# tasmax_hads_1980_raw: T_Dataset, -# tasmax_cpm_1980_raw: T_Dataset, -# ) -> None: -# variable_name: str = "tasmax" -# output_path: Path = Path("tests/runs/reample-hads") -# # First index is for month, in this case January 1980 -# # The following could be replaced by a cached fixture -# cpm_to_match: T_Dataset = cpm_reproject_with_standard_calendar(tasmax_cpm_1980_raw) -# plot_xarray( -# tasmax_hads_1980_raw.tasmax[0], -# path=output_path / "tasmas-1980-JAN-1-raw.png", -# time_stamp=True, -# ) -# -# assert tasmax_hads_1980_raw.dims["time"] == 31 -# assert tasmax_hads_1980_raw.dims[HADS_RAW_X_COLUMN_NAME] == 900 -# assert tasmax_hads_1980_raw.dims[HADS_RAW_Y_COLUMN_NAME] == 1450 -# reprojected: T_Dataset = hads_resample_and_reproject( -# tasmax_hads_1980_raw, -# variable_name=variable_name, -# cpm_to_match=tasmax_cpm_1980_raw, -# ) -# -# assert reprojected.rio.crs.to_epsg() == int(BRITISH_NATIONAL_GRID_EPSG[5:]) -# export_netcdf_path: Path = results_path( -# "tasmax-1980-converted", path=output_path, extension="nc" -# ) -# reprojected.to_netcdf(export_netcdf_path) -# read_from_export: T_Dataset = open_dataset(export_netcdf_path, decode_coords="all") -# plot_xarray( -# read_from_export.tasmax[0], -# path=output_path / "tasmax-1980-JAN-1-resampled.png", -# time_stamp=True, -# ) -# assert_allclose( -# read_from_export.tasmax[10][430][200:210], FINAL_HADS_JAN_10_430_X_200_210_Y -# ) -# assert read_from_export.dims["time"] == 31 -# assert ( -# read_from_export.dims[FINAL_RESAMPLE_LON_COL] == FINAL_CONVERTED_CPM_WIDTH -# ) # replaces projection_x_coordinate -# assert ( -# read_from_export.dims[FINAL_RESAMPLE_LAT_COL] == FINAL_CONVERTED_CPM_HEIGHT -# ) # replaces projection_y_coordinate -# assert reprojected.rio.crs == read_from_export.rio.crs == BRITISH_NATIONAL_GRID_EPSG -# # Check projection coordinates match for CPM and HADs -# assert ( -# reprojected.tasmax.rio.crs -# == read_from_export.tasmax.rio.crs -# == BRITISH_NATIONAL_GRID_EPSG -# ) -# # Check projection coordinates are set at the variable level -# assert all(cpm_to_match.x == read_from_export.x) -# assert all(cpm_to_match.y == read_from_export.y) -# assert ( -# read_from_export.spatial_ref.attrs["spatial_ref"] -# == cpm_to_match.spatial_ref.attrs["spatial_ref"] -# ) - - @pytest.mark.localcache @pytest.mark.mount @pytest.mark.parametrize("strict_fail_bool", (True, False)) @@ -808,29 +185,11 @@ def test_execute_resample_configs( ).all() -# -# @pytest.mark.localcache -# @pytest.mark.slow -# @pytest.mark.mount -# @pytest.mark.parametrize("skip_reproject", (True, False)) -# def test_set_cpm_for_coord_alignment( -# skip_reproject: bool, -# tasmax_cpm_1980_raw_path: Path, -# tasmax_cpm_1980_converted_path: Path, -# ) -> None: -# """Test using `set_cpm_for_coord_alignment` to manage coord alignment.""" -# path: Path = tasmax_cpm_1980_converted_path if skip_reproject else tasmax_cpm_1980_raw_path -# assert False -# test_result: T_Dataset = set_cpm_for_coord_alignment(path, skip_reproject) -# assert isinstance(test_result, Dataset) - - @pytest.mark.localcache @pytest.mark.slow @pytest.mark.mount @pytest.mark.parametrize("manager", (CPMResamplerManager, HADsResamplerManager)) # @pytest.mark.parametrize("multiprocess", (False, True)) -# @pytest.mark.parametrize("multiprocess", (False, False)) def test_execute_crop_configs( manager: ResamblerManagerBase, # multiprocess: bool, From 88c4ddaa0f325c854a331ce86a43241f70086dc1 Mon Sep 17 00:00:00 2001 From: Dr Griffith Rees Date: Tue, 10 Sep 2024 02:39:20 +0100 Subject: [PATCH 92/92] fix: `file_name_to_start_end_dates` `doctest` --- python/clim_recal/utils/xarray.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/clim_recal/utils/xarray.py b/python/clim_recal/utils/xarray.py index 79d03e5a..f5264f08 100644 --- a/python/clim_recal/utils/xarray.py +++ b/python/clim_recal/utils/xarray.py @@ -1146,6 +1146,7 @@ def file_name_to_start_end_dates( >>> tif_366_path: Path = (Path('some') / ... 'folder' / ... 'pr_rcp85_land-cpm_uk_2.2km_06_day_20791201-20801130.tif') + >>> from pandas import date_range >>> dates = date_range(*file_name_to_start_end_dates(tif_366_path)) >>> len(dates) 366