From dce6f5dd7dd7fdcec41c6c029bedfbec5bf89110 Mon Sep 17 00:00:00 2001 From: Jacob Cook Date: Mon, 13 Jan 2025 14:26:28 +0000 Subject: [PATCH 1/4] Updated ruff to a version that uses the 2025 stable style --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2310aed30..344a97cc7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,7 @@ repos: - id: check-merge-conflict - id: debug-statements - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.8.6 + rev: v0.9.1 hooks: - id: ruff # Run the linter. args: [--fix, --exit-non-zero-on-fix] From 17ec94d400f1a91f0870527f0f853a3ce72eae26 Mon Sep 17 00:00:00 2001 From: Jacob Cook Date: Mon, 13 Jan 2025 14:44:38 +0000 Subject: [PATCH 2/4] Reformatted files to match new ruff stable style --- tests/core/test_data.py | 4 +- tests/core/test_registry.py | 3 +- tests/models/animals/test_animal_cohorts.py | 42 ++++++----- tests/models/animals/test_animal_model.py | 72 +++++++++---------- tests/models/animals/test_decay.py | 6 +- tests/models/animals/test_plant_resources.py | 13 ++-- .../models/animals/test_scaling_functions.py | 24 +++---- .../models/hydrology/test_hydrology_model.py | 2 +- tests/models/litter/test_litter_model.py | 4 +- virtual_ecosystem/core/base_model.py | 3 +- virtual_ecosystem/core/constants_class.py | 4 +- virtual_ecosystem/core/variables.py | 2 +- virtual_ecosystem/models/soil/soil_model.py | 3 +- 13 files changed, 89 insertions(+), 93 deletions(-) diff --git a/tests/core/test_data.py b/tests/core/test_data.py index cb7cbdfbd..e42729295 100644 --- a/tests/core/test_data.py +++ b/tests/core/test_data.py @@ -376,7 +376,7 @@ def fixture_load_data_grids(request): ["__any__"], "cellid_coords_too_few.nc", pytest.raises(ValueError), - "The data cell ids do not provide a one-to-one map onto grid " "cell ids.", + "The data cell ids do not provide a one-to-one map onto grid cell ids.", ( (INFO, "Loading variable 'temp' from file:"), (INFO, "Adding data array for 'temp'"), @@ -393,7 +393,7 @@ def fixture_load_data_grids(request): ["__any__"], "cellid_coords_bad_cellid.nc", pytest.raises(ValueError), - "The data cell ids do not provide a one-to-one map onto grid " "cell ids.", + "The data cell ids do not provide a one-to-one map onto grid cell ids.", ( (INFO, "Loading variable 'temp' from file:"), (INFO, "Adding data array for 'temp'"), diff --git a/tests/core/test_registry.py b/tests/core/test_registry.py index 82e58bd13..9a40d2b35 100644 --- a/tests/core/test_registry.py +++ b/tests/core/test_registry.py @@ -19,8 +19,7 @@ (INFO, "Schema registered for virtual_ecosystem.core:"), ( INFO, - "Constants class registered for " - "virtual_ecosystem.core: CoreConsts", + "Constants class registered for virtual_ecosystem.core: CoreConsts", ), ), id="core_import_good", diff --git a/tests/models/animals/test_animal_cohorts.py b/tests/models/animals/test_animal_cohorts.py index 5fcec097e..4e8ba7ad8 100644 --- a/tests/models/animals/test_animal_cohorts.py +++ b/tests/models/animals/test_animal_cohorts.py @@ -797,9 +797,9 @@ def test_calculate_alpha( result = cohort_instance.calculate_alpha() # Assert that the result matches the expected outcome for the given scenario - assert ( - result == expected_alpha - ), f"Failed scenario: alpha_0_herb={alpha_0_herb}, mass_current={mass_current}" + assert result == expected_alpha, ( + f"Failed scenario: alpha_0_herb={alpha_0_herb}, mass_current={mass_current}" + ) @pytest.mark.parametrize( "alpha, mass_current, phi_herb_t, expected_biomass", @@ -983,9 +983,9 @@ def test_calculate_theta_opt_i(self, mocker, herbivore_cohort_instance): result = herbivore_cohort_instance.calculate_theta_opt_i() # Assert the result matches the mocked return value - assert ( - result == 0.5 - ), "The result does not match the expected return value from sf.theta_opt_i" + assert result == 0.5, ( + "The result does not match the expected return value from sf.theta_opt_i" + ) # Assert sf.theta_opt_i was called with the correct parameters theta_opt_i_mock.assert_called_once_with( @@ -1125,10 +1125,7 @@ def test_F_i_j_individual( return_value=0.8, ) mock_theta_i_j = mocker.patch( - ( - "virtual_ecosystem.models.animal.animal_cohorts." - "AnimalCohort.theta_i_j" - ), + ("virtual_ecosystem.models.animal.animal_cohorts.AnimalCohort.theta_i_j"), return_value=0.7, ) mock_potential_prey = mocker.patch( @@ -1162,9 +1159,9 @@ def test_F_i_j_individual( N_i = predator_cohort_instance.individuals N_target = target_animal.individuals expected_rate = N_i * (10 / (1 + 2)) * (1 / N_target) - assert rate == pytest.approx( - expected_rate - ), "F_i_j_individual did not return the expected predation rate." + assert rate == pytest.approx(expected_rate), ( + "F_i_j_individual did not return the expected predation rate." + ) def test_theta_i_j(self, predator_cohort_instance, animal_list_instance): """Test theta_i_j.""" @@ -1285,9 +1282,9 @@ def test_delta_mass_herbivory( expected_delta_mass = 10.0 * len(plant_list_instance) # Assert the calculated delta_mass matches the expected value - assert delta_mass == pytest.approx( - expected_delta_mass - ), "Calculated change in mass due to herbivory did not match expected value." + assert delta_mass == pytest.approx(expected_delta_mass), ( + "Calculated change in mass due to herbivory did not match expected value." + ) def test_forage_cohort( self, @@ -1391,9 +1388,9 @@ def test_migrate_juvenile_probability( probability_of_dispersal = cohort.migrate_juvenile_probability() # Assertion to check if the method returns the correct probability - assert ( - probability_of_dispersal == expected_probability - ), "The probability calculated did not match the expected probability." + assert probability_of_dispersal == expected_probability, ( + "The probability calculated did not match the expected probability." + ) @pytest.mark.parametrize( "is_mature, u_bg, lambda_se, t_to_maturity, t_since_maturity, lambda_max, J_st," @@ -1519,6 +1516,7 @@ def test_inflict_non_predation_mortality( ) # Verify - assert ( - cohort.individuals == 100 - expected_dead - ), "The calculated number of dead individuals doesn't match the expected value." + assert cohort.individuals == 100 - expected_dead, ( + "The calculated number of dead individuals doesn't match the expected " + "value." + ) diff --git a/tests/models/animals/test_animal_model.py b/tests/models/animals/test_animal_model.py index bb44908cd..0ae57b8c2 100644 --- a/tests/models/animals/test_animal_model.py +++ b/tests/models/animals/test_animal_model.py @@ -185,9 +185,9 @@ def test_update_method_sequence(self, mocker, prepared_animal_model_instance): called_methods.append(method_name) # Ensure the methods were called in the expected order - assert ( - called_methods == method_names - ), f"Methods called in wrong order: {called_methods}" + assert called_methods == method_names, ( + f"Methods called in wrong order: {called_methods}" + ) def test_update_method_time_index_argument( self, @@ -209,9 +209,9 @@ def test_setup_initializes_total_animal_respiration( from xarray import DataArray # Check if 'total_animal_respiration' is in the data object - assert ( - "total_animal_respiration" in prepared_animal_model_instance.data - ), "'total_animal_respiration' should be initialized in the data object." + assert "total_animal_respiration" in prepared_animal_model_instance.data, ( + "'total_animal_respiration' should be initialized in the data object." + ) # Retrieve the total_animal_respiration DataArray from the model's data object total_animal_respiration = prepared_animal_model_instance.data[ @@ -219,22 +219,22 @@ def test_setup_initializes_total_animal_respiration( ] # Check that total_animal_respiration is an instance of xarray.DataArray - assert isinstance( - total_animal_respiration, DataArray - ), "'total_animal_respiration' should be an instance of xarray.DataArray." + assert isinstance(total_animal_respiration, DataArray), ( + "'total_animal_respiration' should be an instance of xarray.DataArray." + ) # Check the initial values of total_animal_respiration are all zeros - assert np.all( - total_animal_respiration.values == 0 - ), "Initial values of 'total_animal_respiration' should be all zeros." + assert np.all(total_animal_respiration.values == 0), ( + "Initial values of 'total_animal_respiration' should be all zeros." + ) # Optionally, you can also check the dimensions and coordinates # This is useful if your setup method is supposed to initialize the data # variable with specific dimensions or coordinates based on your model's # structure - assert ( - "cell_id" in total_animal_respiration.dims - ), "'cell_id' should be a dimension of 'total_animal_respiration'." + assert "cell_id" in total_animal_respiration.dims, ( + "'cell_id' should be a dimension of 'total_animal_respiration'." + ) def test_population_density_initialization( self, @@ -254,9 +254,9 @@ def test_population_density_initialization( # Check dimensions expected_dims = ["community_id", "functional_group_id"] - assert all( - dim in population_densities.dims for dim in expected_dims - ), f"Expected dimensions {expected_dims} not found in 'population_densities'." + assert all(dim in population_densities.dims for dim in expected_dims), ( + f"Expected dimensions {expected_dims} not found in 'population_densities'." + ) # Check coordinates # you should adjust according to actual community IDs and functional group names @@ -276,9 +276,9 @@ def test_population_density_initialization( # Assuming densities have been updated, check if densities are greater than or # equal to zero - assert np.all( - population_densities.values >= 0 - ), "Population densities should be greater than or equal to zero." + assert np.all(population_densities.values >= 0), ( + "Population densities should be greater than or equal to zero." + ) def test_update_population_densities(self, prepared_animal_model_instance): """Test that the update_population_densities method correctly updates.""" @@ -925,15 +925,15 @@ def test_birth( if is_semelparous: # For semelparous organisms, the parent dies and the offspring cohort # replaces it - assert ( - len(animal_model_instance.cohorts) == initial_num_cohorts - ), f"Expected {initial_num_cohorts} cohorts but" + assert len(animal_model_instance.cohorts) == initial_num_cohorts, ( + f"Expected {initial_num_cohorts} cohorts but" + ) " found {len(animal_model_instance.cohorts)}" else: # For iteroparous organisms, the parent survives and the offspring is added - assert ( - len(animal_model_instance.cohorts) == initial_num_cohorts + 1 - ), f"Expected {initial_num_cohorts + 1} cohorts but" + assert len(animal_model_instance.cohorts) == initial_num_cohorts + 1, ( + f"Expected {initial_num_cohorts + 1} cohorts but" + ) " found {len(animal_model_instance.cohorts)}" # Get the offspring cohort (assuming it was added correctly) @@ -1236,9 +1236,9 @@ def test_metamorphose( ) # Ensure the butterfly functional group is found - assert ( - butterfly_functional_group is not None - ), "Butterfly functional group not found" + assert butterfly_functional_group is not None, ( + "Butterfly functional group not found" + ) # Run the metamorphose method on the caterpillar cohort animal_model_instance.metamorphose(caterpillar_cohort_instance) @@ -1260,14 +1260,14 @@ def test_metamorphose( assert adult_cohort is not None, "Butterfly cohort was not created" # Assert that the number of individuals in the butterfly cohort is correct - assert ( - adult_cohort.individuals == caterpillar_cohort_instance.individuals - ), "Butterfly cohort's individuals count does not match the expected value" + assert adult_cohort.individuals == caterpillar_cohort_instance.individuals, ( + "Butterfly cohort's individuals count does not match the expected value" + ) # Assert that the caterpillar cohort is marked as dead and removed - assert ( - not caterpillar_cohort_instance.is_alive - ), "Caterpillar cohort should be marked as dead" + assert not caterpillar_cohort_instance.is_alive, ( + "Caterpillar cohort should be marked as dead" + ) assert ( caterpillar_cohort_instance not in animal_model_instance.cohorts.values() ), "Caterpillar cohort should be removed from the model" diff --git a/tests/models/animals/test_decay.py b/tests/models/animals/test_decay.py index 8dc9b46e7..37069fdf0 100644 --- a/tests/models/animals/test_decay.py +++ b/tests/models/animals/test_decay.py @@ -180,9 +180,9 @@ def test_get_eaten(self, litter_pool_instance, herbivore_cohort_instance): * herbivore_cohort_instance.functional_group.mechanical_efficiency * herbivore_cohort_instance.functional_group.conversion_efficiency ) - assert actual_mass_gain == pytest.approx( - expected_mass_gain - ), "Actual mass gain should match expected value after efficiency adjustments." + assert actual_mass_gain == pytest.approx(expected_mass_gain), ( + "Actual mass gain should match expected value after efficiency adjustments." + ) # Check that carbon:nitrogen and carbon:phosphorus ratios remain unchanged assert initial_c_n_ratio == pytest.approx( diff --git a/tests/models/animals/test_plant_resources.py b/tests/models/animals/test_plant_resources.py index d3957154e..7b33fa698 100644 --- a/tests/models/animals/test_plant_resources.py +++ b/tests/models/animals/test_plant_resources.py @@ -28,14 +28,15 @@ def test_get_eaten(self, plant_instance, herbivore_cohort_instance): * herbivore_cohort_instance.functional_group.mechanical_efficiency * herbivore_cohort_instance.functional_group.conversion_efficiency ) - assert actual_mass_gain == pytest.approx( - expected_mass_gain - ), "Actual mass gain should match expected value after efficiency adjustments." + assert actual_mass_gain == pytest.approx(expected_mass_gain), ( + "Actual mass gain should match expected value after efficiency adjustments." + ) # Check if the excess mass has been calculated correctly expected_excess_mass = consumed_mass * ( 1 - herbivore_cohort_instance.functional_group.mechanical_efficiency ) - assert excess_mass == pytest.approx( - expected_excess_mass - ), "Excess mass should match the expected value based on mechanical efficiency." + assert excess_mass == pytest.approx(expected_excess_mass), ( + "Excess mass should match the expected value based on mechanical " + "efficiency." + ) diff --git a/tests/models/animals/test_scaling_functions.py b/tests/models/animals/test_scaling_functions.py index 4118c7a17..67d5d56bb 100644 --- a/tests/models/animals/test_scaling_functions.py +++ b/tests/models/animals/test_scaling_functions.py @@ -17,9 +17,9 @@ def test_damuths_law(mass, population_density, terms, scenario_id): from virtual_ecosystem.models.animal.scaling_functions import damuths_law testing_pop = damuths_law(mass, terms) - assert testing_pop == pytest.approx( - population_density - ), f"Scenario {scenario_id} failed: Expect {population_density}, got {testing_pop}" + assert testing_pop == pytest.approx(population_density), ( + f"Scenario {scenario_id} failed: Expect {population_density}, got {testing_pop}" + ) @pytest.mark.parametrize( @@ -154,9 +154,9 @@ def test_background_mortality(input_value, expected_output): """Test the background_mortality function returns the correct mortality rate.""" from virtual_ecosystem.models.animal.scaling_functions import background_mortality - assert ( - background_mortality(input_value) == expected_output - ), "The mortality rate returned did not match the expected value." + assert background_mortality(input_value) == expected_output, ( + "The mortality rate returned did not match the expected value." + ) @pytest.mark.parametrize( @@ -188,9 +188,9 @@ def test_senescence_mortality( senescence_mortality(lambda_se, t_to_maturity, t_since_maturity) else: result = senescence_mortality(lambda_se, t_to_maturity, t_since_maturity) - assert result == pytest.approx( - expected_mortality - ), "The calculated mortality did not match the expected value." + assert result == pytest.approx(expected_mortality), ( + "The calculated mortality did not match the expected value." + ) @pytest.mark.parametrize( @@ -399,9 +399,9 @@ def test_w_bar_i_j( w_bar_i_j(mass_predator, mass_prey, theta_opt_i, sigma_opt_pred_prey) else: result = w_bar_i_j(mass_predator, mass_prey, theta_opt_i, sigma_opt_pred_prey) - assert ( - 0.0 <= result <= 1.0 - ), "Result is outside the expected probability range [0.0, 1.0]" + assert 0.0 <= result <= 1.0, ( + "Result is outside the expected probability range [0.0, 1.0]" + ) @pytest.mark.parametrize( diff --git a/tests/models/hydrology/test_hydrology_model.py b/tests/models/hydrology/test_hydrology_model.py index 509f923a9..7ed287ed4 100644 --- a/tests/models/hydrology/test_hydrology_model.py +++ b/tests/models/hydrology/test_hydrology_model.py @@ -164,7 +164,7 @@ def test_hydrology_model_initialization( None, pytest.raises(ConfigurationError), ( - (ERROR, "Unknown names supplied for HydroConsts: " "soilm_cap"), + (ERROR, "Unknown names supplied for HydroConsts: soilm_cap"), (INFO, "Valid names are: "), (CRITICAL, "Could not initialise hydrology.HydroConsts from config"), ), diff --git a/tests/models/litter/test_litter_model.py b/tests/models/litter/test_litter_model.py index 8ba88dbd6..758c31b7e 100644 --- a/tests/models/litter/test_litter_model.py +++ b/tests/models/litter/test_litter_model.py @@ -100,7 +100,7 @@ def test_litter_model_initialization_no_data(caplog, fixture_core_components): ), ( ERROR, - "litter model: init data missing required var " "'litter_pool_woody'", + "litter model: init data missing required var 'litter_pool_woody'", ), ( ERROR, @@ -119,7 +119,7 @@ def test_litter_model_initialization_no_data(caplog, fixture_core_components): ), ( ERROR, - "litter model: init data missing required var " "'lignin_woody'", + "litter model: init data missing required var 'lignin_woody'", ), ( ERROR, diff --git a/virtual_ecosystem/core/base_model.py b/virtual_ecosystem/core/base_model.py index e803acebd..0f7777529 100644 --- a/virtual_ecosystem/core/base_model.py +++ b/virtual_ecosystem/core/base_model.py @@ -512,8 +512,7 @@ def _check_model_update_bounds( # Check lower less than upper bound if model_update_bounds_pint[0] >= model_update_bounds_pint[1]: to_raise = ValueError( - f"Lower time bound for {cls.__name__} is not less than the upper " - f"bound." + f"Lower time bound for {cls.__name__} is not less than the upper bound." ) LOGGER.error(to_raise) raise to_raise diff --git a/virtual_ecosystem/core/constants_class.py b/virtual_ecosystem/core/constants_class.py index f4adaae02..5e1bfb890 100644 --- a/virtual_ecosystem/core/constants_class.py +++ b/virtual_ecosystem/core/constants_class.py @@ -82,7 +82,7 @@ def from_config(cls, config: dict[str, Any]) -> ConstantsDataclass: if unconfigurable_names: msg = ( f"Constant in {cls.__name__} " - f'not configurable: {", ".join(unconfigurable_names)}' + f"not configurable: {', '.join(unconfigurable_names)}" ) LOGGER.error(msg) LOGGER.info("Valid names are: {}".format(", ".join(valid_names))) @@ -91,7 +91,7 @@ def from_config(cls, config: dict[str, Any]) -> ConstantsDataclass: if unexpected_names: msg = ( "Unknown names supplied " - f'for {cls.__name__}: {", ".join(unexpected_names)}' + f"for {cls.__name__}: {', '.join(unexpected_names)}" ) LOGGER.error(msg) LOGGER.info("Valid names are: {}".format(", ".join(valid_names))) diff --git a/virtual_ecosystem/core/variables.py b/virtual_ecosystem/core/variables.py index 75dcd5a06..52ef7b6c1 100644 --- a/virtual_ecosystem/core/variables.py +++ b/virtual_ecosystem/core/variables.py @@ -221,7 +221,7 @@ def _format_variables_list(vars: dict[str, dict]) -> str: """ out = [] for i, v in enumerate(vars.values()): - title = f"{i+1}- {v['name']}" + title = f"{i + 1}- {v['name']}" out.append(title) out.append(f"{'=' * len(title)}") out.append("") diff --git a/virtual_ecosystem/models/soil/soil_model.py b/virtual_ecosystem/models/soil/soil_model.py index be664d2d5..3af17c0ab 100644 --- a/virtual_ecosystem/models/soil/soil_model.py +++ b/virtual_ecosystem/models/soil/soil_model.py @@ -144,8 +144,7 @@ def from_config( static = config["soil"]["static"] LOGGER.info( - "Information required to initialise the soil model successfully " - "extracted." + "Information required to initialise the soil model successfully extracted." ) return cls( From 2cacbfdb138008ab606fa9cbb960a5104f38ec6b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 14:56:42 +0000 Subject: [PATCH 3/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- docs/source/virtual_ecosystem/implementation/var_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/virtual_ecosystem/implementation/var_generator.py b/docs/source/virtual_ecosystem/implementation/var_generator.py index 7b0a12f54..f8e6306bf 100644 --- a/docs/source/virtual_ecosystem/implementation/var_generator.py +++ b/docs/source/virtual_ecosystem/implementation/var_generator.py @@ -91,7 +91,7 @@ def generate_all_variable_markdown( # Add the variables formatted as list table rows for v in variables.KNOWN_VARIABLES.values(): table_rows.append( - "* - " + " - ".join([f"{getattr(v,fld)}\n" for fld in fields_to_display]) + "* - " + " - ".join([f"{getattr(v, fld)}\n" for fld in fields_to_display]) ) # Wrap the variable rows in the rest of the list table syntax From fb0801c95d18a39a1db573bb9a031219772f6298 Mon Sep 17 00:00:00 2001 From: Jacob Cook Date: Tue, 14 Jan 2025 10:49:50 +0000 Subject: [PATCH 4/4] added ruff as a devenv dependancy --- poetry.lock | 31 +++++++++++++++++++++++++++++-- pyproject.toml | 1 + 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7228ca8c0..1a26b08f4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "alabaster" @@ -3673,6 +3673,33 @@ files = [ {file = "ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f"}, ] +[[package]] +name = "ruff" +version = "0.9.1" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.9.1-py3-none-linux_armv6l.whl", hash = "sha256:84330dda7abcc270e6055551aca93fdde1b0685fc4fd358f26410f9349cf1743"}, + {file = "ruff-0.9.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3cae39ba5d137054b0e5b472aee3b78a7c884e61591b100aeb544bcd1fc38d4f"}, + {file = "ruff-0.9.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:50c647ff96f4ba288db0ad87048257753733763b409b2faf2ea78b45c8bb7fcb"}, + {file = "ruff-0.9.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0c8b149e9c7353cace7d698e1656ffcf1e36e50f8ea3b5d5f7f87ff9986a7ca"}, + {file = "ruff-0.9.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:beb3298604540c884d8b282fe7625651378e1986c25df51dec5b2f60cafc31ce"}, + {file = "ruff-0.9.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39d0174ccc45c439093971cc06ed3ac4dc545f5e8bdacf9f067adf879544d969"}, + {file = "ruff-0.9.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:69572926c0f0c9912288915214ca9b2809525ea263603370b9e00bed2ba56dbd"}, + {file = "ruff-0.9.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:937267afce0c9170d6d29f01fcd1f4378172dec6760a9f4dface48cdabf9610a"}, + {file = "ruff-0.9.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:186c2313de946f2c22bdf5954b8dd083e124bcfb685732cfb0beae0c47233d9b"}, + {file = "ruff-0.9.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f94942a3bb767675d9a051867c036655fe9f6c8a491539156a6f7e6b5f31831"}, + {file = "ruff-0.9.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:728d791b769cc28c05f12c280f99e8896932e9833fef1dd8756a6af2261fd1ab"}, + {file = "ruff-0.9.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2f312c86fb40c5c02b44a29a750ee3b21002bd813b5233facdaf63a51d9a85e1"}, + {file = "ruff-0.9.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ae017c3a29bee341ba584f3823f805abbe5fe9cd97f87ed07ecbf533c4c88366"}, + {file = "ruff-0.9.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5dc40a378a0e21b4cfe2b8a0f1812a6572fc7b230ef12cd9fac9161aa91d807f"}, + {file = "ruff-0.9.1-py3-none-win32.whl", hash = "sha256:46ebf5cc106cf7e7378ca3c28ce4293b61b449cd121b98699be727d40b79ba72"}, + {file = "ruff-0.9.1-py3-none-win_amd64.whl", hash = "sha256:342a824b46ddbcdddd3abfbb332fa7fcaac5488bf18073e841236aadf4ad5c19"}, + {file = "ruff-0.9.1-py3-none-win_arm64.whl", hash = "sha256:1cd76c7f9c679e6e8f2af8f778367dca82b95009bc7b1a85a47f1521ae524fa7"}, + {file = "ruff-0.9.1.tar.gz", hash = "sha256:fd2b25ecaf907d6458fa842675382c8597b3c746a2dde6717fe3415425df0c17"}, +] + [[package]] name = "scipy" version = "1.15.1" @@ -4708,4 +4735,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "1aef5db5f7af6f5712a02e8a5b67a8ca427839246a5a10ea727ff9966b470063" +content-hash = "9a4ec2b0a7509c70a540b2aa317423ef706ff1bcd3b90c9a40b82b95a2df364d" diff --git a/pyproject.toml b/pyproject.toml index 70e4bc148..12b0f52b5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,6 +70,7 @@ mdformat_frontmatter = ">=0.4.1,<2.1.0" mdformat_tables = ">=0.4.1,<1.1.0" mypy = "^1.5.1" pre-commit = ">=3,<5" +ruff = "^0.9.1" [tool.poetry.group.docs.dependencies] autodocsumm = "^0.2.8"