From 5c8e69603fcc192f39b26c39fca34234c31b1d7a Mon Sep 17 00:00:00 2001 From: Feda Curic Date: Thu, 21 Sep 2023 15:38:04 +0200 Subject: [PATCH] Replace flake8 and isort with ruff --- .github/workflows/style.yml | 9 ++----- pyproject.toml | 24 +++++++------------ src/_ert_job_runner/cli.py | 2 +- src/ert/__main__.py | 4 ++-- src/ert/analysis/_es_update.py | 6 ++--- src/ert/config/analysis_module.py | 4 ++-- src/ert/config/ert_config.py | 9 +++++-- src/ert/config/ert_script.py | 7 ++---- src/ert/config/ext_job.py | 2 +- src/ert/config/gen_kw_config.py | 6 +++-- src/ert/config/model_config.py | 2 +- src/ert/config/parsing/config_schema_item.py | 8 +++---- src/ert/config/parsing/lark_parser.py | 4 ++-- src/ert/config/parsing/observations_parser.py | 2 +- src/ert/dark_storage/common.py | 5 +--- src/ert/data/_measured_data.py | 6 +++-- src/ert/data/record/_record.py | 6 ++--- .../ensemble_evaluator/_wait_for_evaluator.py | 17 +++++++------ src/ert/gui/ertwidgets/listeditbox.py | 5 +--- src/ert/gui/ertwidgets/pathchooser.py | 5 +--- src/ert/gui/model/snapshot.py | 19 +++++---------- src/ert/gui/plottery/plots/distribution.py | 5 +--- src/ert/gui/plottery/plots/histogram.py | 10 ++------ src/ert/gui/simulation/view/realization.py | 5 +--- src/ert/gui/tools/load_results/__init__.py | 6 ++--- .../manage_cases/case_init_configuration.py | 5 +--- src/ert/gui/tools/plot/plot_api.py | 4 ++-- src/ert/libres_facade.py | 9 +++---- .../run_models/multiple_data_assimilation.py | 4 ++-- src/ert/shared/feature_toggling.py | 4 ++-- src/ert/shared/plugins/plugin_manager.py | 4 ++-- src/ert/shared/port_handler.py | 6 +++-- .../forward-models/res/script/ecl_config.py | 13 ++++------ .../ert/forward-models/res/script/ecl_run.py | 5 +--- .../ert/forward-models/res/script/rms.py | 4 ++-- .../share/ert/shell_scripts/make_directory.py | 2 +- src/ert/storage/local_ensemble.py | 6 ++--- src/ert/storage/local_storage.py | 9 +++---- style-requirements.txt | 7 ++---- tests/unit_tests/analysis/test_row_scaling.py | 2 +- .../config/test_forward_model_data_to_json.py | 2 +- tests/unit_tests/conftest.py | 2 +- .../test_ensemble_evaluator.py | 2 +- tests/unit_tests/gui/model/test_job_list.py | 14 +++++------ .../gui/model/test_progress_proxy.py | 12 +++++++--- tests/unit_tests/gui/model/test_real_list.py | 8 +++++-- tests/unit_tests/gui/model/test_snapshot.py | 4 ++-- .../unit_tests/services/test_base_service.py | 2 +- .../unit_tests/storage/test_local_storage.py | 3 +-- 49 files changed, 133 insertions(+), 178 deletions(-) diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml index 40e31c49c07..91533ff498e 100644 --- a/.github/workflows/style.yml +++ b/.github/workflows/style.yml @@ -45,15 +45,10 @@ jobs: if: ${{ always() }} run: ./script/cmake-format --check - - name: Run isort + - name: Run ruff if: ${{ always() }} run: | - isort --check script/ src/ tests/ test-data/ - - - name: Lint with flake8 - if: ${{ always() }} - run: | - flake8 + ruff check . - name: Run black if: ${{ always() }} diff --git a/pyproject.toml b/pyproject.toml index 52d5353b0e9..8e469069052 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,26 +29,18 @@ markers = [ log_cli = "false" asyncio_mode = "auto" -[tool.isort] -profile = "black" - [tool.black] include = '(\.pyi?|\.ipynb|\.py\.j2)$' [tool.setuptools_scm] write_to = "src/ert/shared/version.py" -[tool.flake8] -per-file-ignores = [ - # Ignore all protobuf v2 files - "*_pb2.py: E" -] -ignore = [ - # whitespace before ':', solved by black: - "E203", - # line break before binary operator, solved by black: - "W503", - # The minimal set of ignores that makes flake8 pass when flake8-bugbear is installed: - "B019" +[tool.ruff] +src = ["src"] +select = [ + "W", # pycodestyle + "I", # isort + "B", # flake-8-bugbear + "SIM", # flake-8-simplify ] -max-line-length = 88 +line-length = 88 diff --git a/src/_ert_job_runner/cli.py b/src/_ert_job_runner/cli.py index 58d7bcc809e..29c96b77f51 100644 --- a/src/_ert_job_runner/cli.py +++ b/src/_ert_job_runner/cli.py @@ -101,7 +101,7 @@ def main(args): ee_cert_path = jobs_data.get("ee_cert_path") dispatch_url = jobs_data.get("dispatch_url") except ValueError as e: - raise IOError(f"Job Runner cli failed to load JSON-file.{e}") + raise IOError("Job Runner cli failed to load JSON-file.") from e is_interactive_run = len(parsed_args.job) > 0 reporters = _setup_reporters( diff --git a/src/ert/__main__.py b/src/ert/__main__.py index 6a5416e0f13..b315c13e7bd 100755 --- a/src/ert/__main__.py +++ b/src/ert/__main__.py @@ -167,8 +167,8 @@ def valid_num_iterations(user_input: str) -> str: def attemp_int_conversion(val: str) -> int: try: return int(val) - except ValueError: - raise ArgumentTypeError(f"{val} is not a valid integer") + except ValueError as e: + raise ArgumentTypeError(f"{val} is not a valid integer") from e def convert_port(val: str) -> int: diff --git a/src/ert/analysis/_es_update.py b/src/ert/analysis/_es_update.py index 5a95908312d..384813b5834 100644 --- a/src/ert/analysis/_es_update.py +++ b/src/ert/analysis/_es_update.py @@ -308,11 +308,11 @@ def _get_obs_and_measure_data( ds = source_fs.load_response(group, ens_active_list) try: filtered_ds = observation.merge(ds, join="left") - except KeyError: + except KeyError as e: raise ErtAnalysisError( f"Mismatched index for: " f"Observation: {obs_key} attached to response: {group}" - ) + ) from e observation_keys.append([obs_key] * len(filtered_ds.observations.data.ravel())) observation_values.append(filtered_ds["observations"].data.ravel()) @@ -525,7 +525,7 @@ def analysis_IES( update_step.observation_config(), ) except IndexError as e: - raise ErtAnalysisError(e) + raise ErtAnalysisError(str(e)) from e # pylint: disable=unsupported-assignment-operation smoother_snapshot.update_step_snapshots[update_step.name] = update_snapshot if len(observation_values) == 0: diff --git a/src/ert/config/analysis_module.py b/src/ert/config/analysis_module.py index e73a9362462..51a25f2ee96 100644 --- a/src/ert/config/analysis_module.py +++ b/src/ert/config/analysis_module.py @@ -188,12 +188,12 @@ def set_var(self, var_name: str, value: Union[float, int, bool, str]) -> None: else: var["value"] = new_value - except ValueError: + except ValueError as e: raise ConfigValidationError( f"Variable {var_name!r} with value {value!r} has incorrect type." f" Expected type {var['type'].__name__!r} but received" f" value {value!r} of type {type(value).__name__!r}" - ) + ) from e else: raise ConfigValidationError( f"Variable {var_name!r} not found in {self.name!r} analysis module" diff --git a/src/ert/config/ert_config.py b/src/ert/config/ert_config.py index 835a891d05f..3e902cde699 100644 --- a/src/ert/config/ert_config.py +++ b/src/ert/config/ert_config.py @@ -286,13 +286,18 @@ def check_non_utf_chars(file_path: str) -> None: hex_str = error_words[error_words.index("byte") + 1] try: unknown_char = chr(int(hex_str, 16)) - except ValueError: + except ValueError as ve: unknown_char = f"hex:{hex_str}" + raise ConfigValidationError( + f"Unsupported non UTF-8 character {unknown_char!r} " + f"found in file: {file_path!r}", + config_file=file_path, + ) from ve raise ConfigValidationError( f"Unsupported non UTF-8 character {unknown_char!r} " f"found in file: {file_path!r}", config_file=file_path, - ) + ) from e @classmethod def _read_templates(cls, config_dict) -> List[Tuple[str, str]]: diff --git a/src/ert/config/ert_script.py b/src/ert/config/ert_script.py index 6b3cca7d2a7..e155d1a1070 100644 --- a/src/ert/config/ert_script.py +++ b/src/ert/config/ert_script.py @@ -86,13 +86,10 @@ def initializeAndRun( ) -> Any: arguments = [] for index, arg_value in enumerate(argument_values): - if index < len(argument_types): - arg_type = argument_types[index] - else: - arg_type = str + arg_type = argument_types[index] if index < len(argument_types) else str if arg_value is not None: - arguments.append(arg_type(arg_value)) + arguments.append(arg_type(arg_value)) # type: ignore else: arguments.append(None) diff --git a/src/ert/config/ext_job.py b/src/ert/config/ext_job.py index 0c94d105e75..3888d734627 100644 --- a/src/ert/config/ext_job.py +++ b/src/ert/config/ext_job.py @@ -110,4 +110,4 @@ def from_config_file(cls, config_file: str, name: Optional[str] = None) -> "ExtJ help_text=content_dict.get("HELP_TEXT", ""), ) except IOError as err: - raise ConfigValidationError.with_context(str(err), config_file) + raise ConfigValidationError.with_context(str(err), config_file) from err diff --git a/src/ert/config/gen_kw_config.py b/src/ert/config/gen_kw_config.py index 9d3639eff25..8745840535c 100644 --- a/src/ert/config/gen_kw_config.py +++ b/src/ert/config/gen_kw_config.py @@ -370,8 +370,10 @@ def _parse_transfer_function(param_string: str) -> TransferFunction: for p in param_args[2:]: try: param_floats.append(float(p)) - except ValueError: - raise ConfigValidationError(f"Unable to convert float number: {p}") + except ValueError as e: + raise ConfigValidationError( + f"Unable to convert float number: {p}" + ) from e params = dict(zip(param_names, param_floats)) diff --git a/src/ert/config/model_config.py b/src/ert/config/model_config.py index 20acd09475a..471e4848527 100644 --- a/src/ert/config/model_config.py +++ b/src/ert/config/model_config.py @@ -79,7 +79,7 @@ def __init__( # pylint: disable=too-many-arguments except (ValueError, IOError) as err: raise ConfigValidationError.with_context( f"Could not read timemap file {time_map_file}: {err}", time_map_file - ) + ) from err @no_type_check @classmethod diff --git a/src/ert/config/parsing/config_schema_item.py b/src/ert/config/parsing/config_schema_item.py index dcfb0483b20..bdcf23cabe9 100644 --- a/src/ert/config/parsing/config_schema_item.py +++ b/src/ert/config/parsing/config_schema_item.py @@ -111,19 +111,19 @@ def token_to_value_with_context( if val_type == SchemaItemType.INT: try: return ContextInt(int(token), token, keyword) - except ValueError: + except ValueError as e: raise ConfigValidationError.with_context( f"{self.kw!r} must have an integer value" f" as argument {index + 1!r}", token, - ) + ) from e if val_type == SchemaItemType.FLOAT: try: return ContextFloat(float(token), token, keyword) - except ValueError: + except ValueError as e: raise ConfigValidationError.with_context( f"{self.kw!r} must have a number as argument {index + 1!r}", token - ) + ) from e path: Optional[str] = str(token) if val_type in [ diff --git a/src/ert/config/parsing/lark_parser.py b/src/ert/config/parsing/lark_parser.py index 9815443b28e..9f451851b4d 100644 --- a/src/ert/config/parsing/lark_parser.py +++ b/src/ert/config/parsing/lark_parser.py @@ -434,7 +434,7 @@ def _parse_file(file: str) -> Tree[Instruction]: end_column=e.column + 1, filename=file, ) - ) + ) from e except UnicodeDecodeError as e: error_words = str(e).split(" ") hex_str = error_words[error_words.index("byte") + 1] @@ -476,7 +476,7 @@ def _parse_file(file: str) -> Tree[Instruction]: ) for bad_line in bad_byte_lines ] - ) + ) from e def parse( diff --git a/src/ert/config/parsing/observations_parser.py b/src/ert/config/parsing/observations_parser.py index 112695a9b42..00c2e679c4c 100644 --- a/src/ert/config/parsing/observations_parser.py +++ b/src/ert/config/parsing/observations_parser.py @@ -138,7 +138,7 @@ def _parse_content( column=e.column, end_column=e.column + 1, ) - ) + ) from e observations_parser = Lark( diff --git a/src/ert/dark_storage/common.py b/src/ert/dark_storage/common.py index f02d8fd3105..51121ab88f8 100644 --- a/src/ert/dark_storage/common.py +++ b/src/ert/dark_storage/common.py @@ -50,10 +50,7 @@ def data_for_key( elif key in res.get_gen_data_keys(): key_parts = key.split("@") key = key_parts[0] - if len(key_parts) > 1: - report_step = int(key_parts[1]) - else: - report_step = 0 + report_step = int(key_parts[1]) if len(key_parts) > 1 else 0 try: data = res.load_gen_data( diff --git a/src/ert/data/_measured_data.py b/src/ert/data/_measured_data.py index c928396b08e..712a2f516ba 100644 --- a/src/ert/data/_measured_data.py +++ b/src/ert/data/_measured_data.py @@ -105,8 +105,10 @@ def _get_data( response = ensemble.load_response( group, tuple(range(self._facade.get_ensemble_size())) ) - except KeyError: - raise ResponseError(f"No response loaded for observation key: {key}") + except KeyError as e: + raise ResponseError( + f"No response loaded for observation key: {key}" + ) from e ds = obs.merge( response, join="left", diff --git a/src/ert/data/record/_record.py b/src/ert/data/record/_record.py index 0db96a0de3c..f2f6647746e 100644 --- a/src/ert/data/record/_record.py +++ b/src/ert/data/record/_record.py @@ -115,7 +115,7 @@ def __init__(self, data: blob_record_data) -> None: try: self._data = self._validate_data(data) except BeartypeException as e: - raise RecordValidationError(str(e)) + raise RecordValidationError(str(e)) from e @beartype def _validate_data(self, data: blob_record_data) -> blob_record_data: @@ -167,7 +167,7 @@ def __init__( try: self._validate_data(data) except BeartypeException as e: - raise RecordValidationError(str(e)) + raise RecordValidationError(str(e)) from e self._data: numerical_record_data if isinstance(data, int): @@ -296,7 +296,7 @@ def __init__(self, record_dict: Dict[str, Any]) -> None: try: self._validate_data(self._flat_record_dict) except BeartypeException as e: - raise RecordValidationError(str(e)) + raise RecordValidationError(str(e)) from e @beartype def _validate_data(self, flat_record_dict: Dict[str, RecordGen]) -> None: diff --git a/src/ert/ensemble_evaluator/_wait_for_evaluator.py b/src/ert/ensemble_evaluator/_wait_for_evaluator.py index b7a3e63a98e..4dfbf13ad69 100644 --- a/src/ert/ensemble_evaluator/_wait_for_evaluator.py +++ b/src/ert/ensemble_evaluator/_wait_for_evaluator.py @@ -27,15 +27,14 @@ async def attempt_connection( ) -> None: timeout = aiohttp.ClientTimeout(connect=connection_timeout) headers = {} if token is None else {"token": token} - async with aiohttp.ClientSession() as session: - async with session.request( - method="get", - url=url, - ssl=get_ssl_context(cert), - headers=headers, - timeout=timeout, - ) as resp: - resp.raise_for_status() + async with aiohttp.ClientSession() as session, session.request( + method="get", + url=url, + ssl=get_ssl_context(cert), + headers=headers, + timeout=timeout, + ) as resp: + resp.raise_for_status() async def wait_for_evaluator( # pylint: disable=too-many-arguments diff --git a/src/ert/gui/ertwidgets/listeditbox.py b/src/ert/gui/ertwidgets/listeditbox.py index 777627e97bb..c2cb75e6f12 100644 --- a/src/ert/gui/ertwidgets/listeditbox.py +++ b/src/ert/gui/ertwidgets/listeditbox.py @@ -139,10 +139,7 @@ def validateList(self): validity_type = ValidationSupport.WARNING - if not valid: - color = ValidationSupport.ERROR_COLOR - else: - color = self._valid_color + color = ValidationSupport.ERROR_COLOR if not valid else self._valid_color self._validation_support.setValidationMessage(message, validity_type) self._list_edit_line.setToolTip(message) diff --git a/src/ert/gui/ertwidgets/pathchooser.py b/src/ert/gui/ertwidgets/pathchooser.py index 8240e2b7275..1efc8d65aab 100644 --- a/src/ert/gui/ertwidgets/pathchooser.py +++ b/src/ert/gui/ertwidgets/pathchooser.py @@ -107,10 +107,7 @@ def validatePath(self): validity_type = ValidationSupport.WARNING - if not valid: - color = ValidationSupport.ERROR_COLOR - else: - color = self.valid_color + color = ValidationSupport.ERROR_COLOR if not valid else self.valid_color self._validation_support.setValidationMessage(message, validity_type) self._path_line.setToolTip(message) diff --git a/src/ert/gui/model/snapshot.py b/src/ert/gui/model/snapshot.py index fdca6bfc8b4..a9ccf6acdf1 100644 --- a/src/ert/gui/model/snapshot.py +++ b/src/ert/gui/model/snapshot.py @@ -8,9 +8,8 @@ from qtpy.QtCore import QAbstractItemModel, QModelIndex, QSize, Qt, QVariant from qtpy.QtGui import QColor, QFont -from ert.ensemble_evaluator import PartialSnapshot, Snapshot +from ert.ensemble_evaluator import PartialSnapshot, Snapshot, state from ert.ensemble_evaluator import identifiers as ids -from ert.ensemble_evaluator import state from ert.gui.model.node import Node, NodeType from ert.shared.status.utils import byte_with_unit @@ -114,9 +113,9 @@ def prerender( snapshot.data()[ids.REALS].keys(), key=int ) metadata[SORTED_JOB_IDS] = {} - for real_id in snapshot.reals.keys(): + for real_id in snapshot.reals: metadata[SORTED_JOB_IDS][real_id] = {} - for step_id in snapshot.steps(real_id).keys(): + for step_id in snapshot.steps(real_id): indices = [ (job.index, job_id) for job_id, job in snapshot.jobs(real_id, step_id).items() @@ -136,7 +135,7 @@ def prerender( for step in real[ids.STEPS].values(): if ids.JOBS not in step: continue - for job_id in step[ids.JOBS].keys(): + for job_id in step[ids.JOBS]: status = step[ids.JOBS][job_id][ids.STATUS] color = _QCOLORS[state.JOB_STATE_TO_COLOR[status]] metadata[REAL_JOB_STATUS_AGGREGATED][real_id][job_id] = color @@ -328,10 +327,7 @@ def columnCount(self, parent: QModelIndex = None): def rowCount(self, parent: QModelIndex = None): if parent is None: parent = QModelIndex() - if not parent.isValid(): - parentItem = self.root - else: - parentItem = parent.internalPointer() + parentItem = self.root if not parent.isValid() else parent.internalPointer() if parent.column() > 0: return 0 @@ -476,10 +472,7 @@ def index(self, row: int, column: int, parent: QModelIndex = None) -> QModelInde if not self.hasIndex(row, column, parent): return QModelIndex() - if not parent.isValid(): - parent_item = self.root - else: - parent_item = parent.internalPointer() + parent_item = self.root if not parent.isValid() else parent.internalPointer() child_item = None try: diff --git a/src/ert/gui/plottery/plots/distribution.py b/src/ert/gui/plottery/plots/distribution.py index 3f3450143e3..a31150aef1b 100644 --- a/src/ert/gui/plottery/plots/distribution.py +++ b/src/ert/gui/plottery/plots/distribution.py @@ -66,10 +66,7 @@ def _plotDistribution( index, previous_data, ): - if data.empty: - data = pd.Series(dtype="float64") - else: - data = data[0] + data = pd.Series(dtype="float64") if data.empty else data[0] axes.set_xlabel(plot_config.xLabel()) axes.set_ylabel(plot_config.yLabel()) diff --git a/src/ert/gui/plottery/plots/histogram.py b/src/ert/gui/plottery/plots/histogram.py index 7c9dc32409f..46a15c0589d 100644 --- a/src/ert/gui/plottery/plots/histogram.py +++ b/src/ert/gui/plottery/plots/histogram.py @@ -72,15 +72,9 @@ def plotHistogram( else: current_min = data[case].min() current_max = data[case].max() - if minimum is None: - minimum = current_min - else: - minimum = min(minimum, current_min) + minimum = current_min if minimum is None else min(minimum, current_min) - if maximum is None: - maximum = current_max - else: - maximum = max(maximum, current_max) + maximum = current_max if maximum is None else max(maximum, current_max) max_element_count = max(max_element_count, len(data[case].index)) diff --git a/src/ert/gui/simulation/view/realization.py b/src/ert/gui/simulation/view/realization.py index 134129de2bc..1f185f53b2d 100644 --- a/src/ert/gui/simulation/view/realization.py +++ b/src/ert/gui/simulation/view/realization.py @@ -129,10 +129,7 @@ def _paint_inner_grid(self, painter: QPainter, rect: QRect, colors) -> None: for y in range(grid_dim): for x in range(grid_dim): - if k >= job_nr: - color = QColorConstants.Gray - else: - color = colors[k] + color = QColorConstants.Gray if k >= job_nr else colors[k] foreground_image.setPixel(x, y, color.rgb()) k += 1 _image_cache[colors_hash] = foreground_image diff --git a/src/ert/gui/tools/load_results/__init__.py b/src/ert/gui/tools/load_results/__init__.py index 340991fcac2..96ae16001a6 100644 --- a/src/ert/gui/tools/load_results/__init__.py +++ b/src/ert/gui/tools/load_results/__init__.py @@ -1,4 +1,2 @@ -# flake8: noqa F401 - -from .load_results_panel import LoadResultsPanel -from .load_results_tool import LoadResultsTool +from .load_results_panel import LoadResultsPanel # noqa: F401 +from .load_results_tool import LoadResultsTool # noqa: F401 diff --git a/src/ert/gui/tools/manage_cases/case_init_configuration.py b/src/ert/gui/tools/manage_cases/case_init_configuration.py index 58dfd397305..fee79b0ed6d 100644 --- a/src/ert/gui/tools/manage_cases/case_init_configuration.py +++ b/src/ert/gui/tools/manage_cases/case_init_configuration.py @@ -161,10 +161,7 @@ def _showInfoForCase(self, index=None): states = [] else: ensemble = self.show_case_info_case_selector.itemData(index) - if ensemble is not None: - states = ensemble.state_map - else: - states = [] + states = ensemble.state_map if ensemble is not None else [] html = "" for state_index, value in enumerate(states): diff --git a/src/ert/gui/tools/plot/plot_api.py b/src/ert/gui/tools/plot/plot_api.py index b407fc877dc..20e9ddbabe2 100644 --- a/src/ert/gui/tools/plot/plot_api.py +++ b/src/ert/gui/tools/plot/plot_api.py @@ -184,8 +184,8 @@ def observations_for_key(self, case_name, key): self._check_response(response) try: obs = response.json()[0] - except (KeyError, IndexError, JSONDecodeError): - raise httpx.RequestError("Observation schema might have changed") + except (KeyError, IndexError, JSONDecodeError) as e: + raise httpx.RequestError("Observation schema might have changed") from e try: int(obs["x_axis"][0]) key_index = [int(v) for v in obs["x_axis"]] diff --git a/src/ert/libres_facade.py b/src/ert/libres_facade.py index a67962afc9f..a7e0e5f4cf2 100644 --- a/src/ert/libres_facade.py +++ b/src/ert/libres_facade.py @@ -219,8 +219,8 @@ def load_gen_data( vals = ensemble.load_response(key, tuple(realizations)).sel( report_step=report_step, drop=True ) - except KeyError: - raise KeyError(f"Missing response: {key}") + except KeyError as e: + raise KeyError(f"Missing response: {key}") from e index = pd.Index(vals.index.values, name="axis") return pd.DataFrame( data=vals["values"].values.reshape(len(vals.realization), -1).T, @@ -235,10 +235,7 @@ def observation_keys(self, key: str) -> List[str]: if key in self.get_gen_data_keys(): key_parts = key.split("@") data_key = key_parts[0] - if len(key_parts) > 1: - data_report_step = int(key_parts[1]) - else: - data_report_step = 0 + data_report_step = int(key_parts[1]) if len(key_parts) > 1 else 0 obs_key = None diff --git a/src/ert/run_models/multiple_data_assimilation.py b/src/ert/run_models/multiple_data_assimilation.py index 278a8758204..0fb7f32550f 100644 --- a/src/ert/run_models/multiple_data_assimilation.py +++ b/src/ert/run_models/multiple_data_assimilation.py @@ -208,8 +208,8 @@ def parseWeights(weights: str) -> List[float]: logger.info("Warning: 0 weight, will ignore") else: result.append(f) - except ValueError: - raise ValueError(f"Warning: cannot parse weight {element}") + except ValueError as e: + raise ValueError(f"Warning: cannot parse weight {element}") from e return result diff --git a/src/ert/shared/feature_toggling.py b/src/ert/shared/feature_toggling.py index b206e3a52d4..158abe1a4ff 100644 --- a/src/ert/shared/feature_toggling.py +++ b/src/ert/shared/feature_toggling.py @@ -38,7 +38,7 @@ def is_enabled(feature_name: str) -> bool: @staticmethod def add_feature_toggling_args(parser: ArgumentParser) -> None: - for feature_name in FeatureToggling._conf.keys(): + for feature_name in FeatureToggling._conf: parser.add_argument( f"--{FeatureToggling._get_arg_name(feature_name)}", action="store_true", @@ -49,7 +49,7 @@ def add_feature_toggling_args(parser: ArgumentParser) -> None: @staticmethod def update_from_args(args: Namespace) -> None: args_dict = vars(args) - for feature_name in FeatureToggling._conf.keys(): + for feature_name in FeatureToggling._conf: arg_name = FeatureToggling._get_arg_name(feature_name) feature_name_escaped = arg_name.replace("-", "_") diff --git a/src/ert/shared/plugins/plugin_manager.py b/src/ert/shared/plugins/plugin_manager.py index 447ab8f1fa8..640362ccf36 100644 --- a/src/ert/shared/plugins/plugin_manager.py +++ b/src/ert/shared/plugins/plugin_manager.py @@ -266,7 +266,7 @@ def get_documentation_for_jobs(self) -> Dict[str, Any]: self.hook.installable_jobs(), include_plugin_data=True ).items() } - for k in job_docs.keys(): + for k in job_docs: job_docs[k].update( ErtPluginManager._evaluate_job_doc_hook( self.hook.job_documentation, @@ -349,7 +349,7 @@ def _setup_temp_environment_if_not_already_set( ) def _reset_environment(self) -> None: - for name in self.env.keys(): + for name in self.env: if self.backup_env.get(name) is None and name in os.environ: logging.debug(f"Resetting environment variable {name}") del os.environ[name] diff --git a/src/ert/shared/port_handler.py b/src/ert/shared/port_handler.py index 0b33f58ffd5..bb2b1bffa47 100644 --- a/src/ert/shared/port_handler.py +++ b/src/ert/shared/port_handler.py @@ -99,10 +99,12 @@ def _bind_socket( f"an invalid hostname ({host}). " f"Actual " f"error msg is: {err_info.strerror}" - ) + ) from err_info except OSError as err_info: if err_info.errno in (48, 98): - raise PortAlreadyInUseException(f"Port {port} already in use.") + raise PortAlreadyInUseException( + f"Port {port} already in use." + ) from err_info raise OSError(f"Unknown `OSError` while binding port {port}") from err_info diff --git a/src/ert/shared/share/ert/forward-models/res/script/ecl_config.py b/src/ert/shared/share/ert/forward-models/res/script/ecl_config.py index 6a49dea7509..c46a5854046 100644 --- a/src/ert/shared/share/ert/forward-models/res/script/ecl_config.py +++ b/src/ert/shared/share/ert/forward-models/res/script/ecl_config.py @@ -83,8 +83,8 @@ def __init__(self, config_file: str, simulator_name: str = "not_set"): with open(config_file, encoding="utf-8") as f: try: config = yaml.safe_load(f) - except yaml.YAMLError: - raise ValueError(f"Failed parse: {config_file} as yaml") + except yaml.YAMLError as e: + raise ValueError(f"Failed parse: {config_file} as yaml") from e self._config: dict = config self._config_file: str = os.path.abspath(config_file) @@ -133,10 +133,7 @@ def _get_env(self, version: str, exe_type: str) -> Dict[str, str]: def _get_sim(self, version: Optional[str], exe_type: str) -> Simulator: version = self._get_version(version) binaries: Dict[str, str] = self._config[Keys.versions][version][exe_type] - if exe_type == Keys.mpi: - mpirun = binaries[Keys.mpirun] - else: - mpirun = None + mpirun = binaries[Keys.mpirun] if exe_type == Keys.mpi else None return Simulator( version, binaries[Keys.executable], @@ -160,8 +157,8 @@ def mpi_sim(self, version: Optional[str] = None) -> Simulator: def simulators(self, strict: bool = True) -> List[Simulator]: simulators = [] - for version in self._config[Keys.versions].keys(): - for exe_type in self._config[Keys.versions][version].keys(): + for version in self._config[Keys.versions]: + for exe_type in self._config[Keys.versions][version]: if strict: sim = self._get_sim(version, exe_type) else: diff --git a/src/ert/shared/share/ert/forward-models/res/script/ecl_run.py b/src/ert/shared/share/ert/forward-models/res/script/ecl_run.py index d59b7601278..17564180c70 100644 --- a/src/ert/shared/share/ert/forward-models/res/script/ecl_run.py +++ b/src/ert/shared/share/ert/forward-models/res/script/ecl_run.py @@ -90,10 +90,7 @@ def _expand_SLURM_task_count(task_count_string): print(match_dict) count = int(match_dict["count"]) mult_string = match_dict["mult"] - if mult_string is None: - mult = 1 - else: - mult = int(mult_string) + mult = 1 if mult_string is None else int(mult_string) return [count] * mult else: diff --git a/src/ert/shared/share/ert/forward-models/res/script/rms.py b/src/ert/shared/share/ert/forward-models/res/script/rms.py index 43b053570d7..18eb355069b 100755 --- a/src/ert/shared/share/ert/forward-models/res/script/rms.py +++ b/src/ert/shared/share/ert/forward-models/res/script/rms.py @@ -21,8 +21,8 @@ def __init__(self): with open(config_file, encoding="utf-8") as f: try: config = yaml.safe_load(f) - except yaml.YAMLError: - raise ValueError(f"Failed to parse: {config_file} as yaml") + except yaml.YAMLError as e: + raise ValueError(f"Failed to parse: {config_file} as yaml") from e self._config = config diff --git a/src/ert/shared/share/ert/shell_scripts/make_directory.py b/src/ert/shared/share/ert/shell_scripts/make_directory.py index 22e24b26821..58a370a2d9e 100755 --- a/src/ert/shared/share/ert/shell_scripts/make_directory.py +++ b/src/ert/shared/share/ert/shell_scripts/make_directory.py @@ -15,7 +15,7 @@ def mkdir(path): # synchronization issues? if not os.path.isdir(path): msg = f'ERROR: Failed to create directory "{path}": {error}.' - raise OSError(msg) + raise OSError(msg) from error if __name__ == "__main__": diff --git a/src/ert/storage/local_ensemble.py b/src/ert/storage/local_ensemble.py index 8202eabdedf..7d39e199fb2 100644 --- a/src/ert/storage/local_ensemble.py +++ b/src/ert/storage/local_ensemble.py @@ -170,10 +170,10 @@ def _load_single_dataset( self.mount_point / f"realization-{realization}" / f"{group}.nc", engine="scipy", ) - except FileNotFoundError: + except FileNotFoundError as e: raise KeyError( f"No dataset '{group}' in storage for realization {realization}" - ) + ) from e def _load_dataset( self, @@ -203,7 +203,7 @@ def load_parameters( ) -> xr.DataArray: return self._load_dataset(group, realizations)[var] - @lru_cache + @lru_cache # noqa: B019 def load_response(self, key: str, realizations: Tuple[int, ...]) -> xr.Dataset: loaded = [] for realization in realizations: diff --git a/src/ert/storage/local_storage.py b/src/ert/storage/local_storage.py index 63c8d0aeec8..ed0d64bfbf9 100644 --- a/src/ert/storage/local_storage.py +++ b/src/ert/storage/local_storage.py @@ -197,12 +197,12 @@ def __init__( self._lock = FileLock(self.path / "storage.lock") try: self._lock.acquire(timeout=self.LOCK_TIMEOUT) - except Timeout: + except Timeout as e: raise TimeoutError( f"Not able to acquire lock for: {self.path}." " You may already be running ERT," " or another user is using the same ENSPATH." - ) + ) from e super().__init__(path) @@ -238,10 +238,7 @@ def create_ensemble( name: Optional[str] = None, prior_ensemble: Optional[Union[LocalEnsembleReader, UUID]] = None, ) -> LocalEnsembleAccessor: - if isinstance(experiment, UUID): - experiment_id = experiment - else: - experiment_id = experiment.id + experiment_id = experiment if isinstance(experiment, UUID) else experiment.id uuid = uuid4() path = self._ensemble_path(uuid) diff --git a/style-requirements.txt b/style-requirements.txt index d220450e301..5d44a4eb8c9 100644 --- a/style-requirements.txt +++ b/style-requirements.txt @@ -1,8 +1,5 @@ cmake-format -Flake8-pyproject -flake8 -flake8-bugbear -flake8-simplify -isort +black +ruff pylint pylint-protobuf diff --git a/tests/unit_tests/analysis/test_row_scaling.py b/tests/unit_tests/analysis/test_row_scaling.py index 7ea4fe84ee3..c4178d1d873 100644 --- a/tests/unit_tests/analysis/test_row_scaling.py +++ b/tests/unit_tests/analysis/test_row_scaling.py @@ -88,7 +88,7 @@ def test_row_scaling_factor_0_for_all_parameters(): ((A, row_scaling),) = ensemble_smoother_update_step_row_scaling( S, [(A, row_scaling)], np.full(observations.shape, 0.5), observations ) - assert np.all(A == A_copy) + assert np.all(A_copy == A) def test_row_scaling_factor_1_for_either_parameter(): diff --git a/tests/unit_tests/config/test_forward_model_data_to_json.py b/tests/unit_tests/config/test_forward_model_data_to_json.py index 8d4665f7f6c..60e3fcca8d1 100644 --- a/tests/unit_tests/config/test_forward_model_data_to_json.py +++ b/tests/unit_tests/config/test_forward_model_data_to_json.py @@ -211,7 +211,7 @@ def validate_ext_job(ext_job, ext_job_config): assert ext_job.environment == ExtJob.default_env else: assert ext_job.environment.keys() == ext_job_config["environment"].keys() - for key in ext_job_config["environment"].keys(): + for key in ext_job_config["environment"]: assert ext_job.environment[key] == ext_job_config["environment"][key] diff --git a/tests/unit_tests/conftest.py b/tests/unit_tests/conftest.py index 523410fc8dc..39cde24c85d 100644 --- a/tests/unit_tests/conftest.py +++ b/tests/unit_tests/conftest.py @@ -16,7 +16,7 @@ def log_check(): logger_after = logging.getLogger() level_after = logger_after.getEffectiveLevel() assert ( - logging.WARNING == level_after + level_after == logging.WARNING ), f"Detected differences in log environment: Changed to {level_after}" diff --git a/tests/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py b/tests/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py index 66fe820ca8b..387891a0af7 100644 --- a/tests/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py +++ b/tests/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py @@ -324,4 +324,4 @@ def exploding_handler(events): # drain the monitor list(monitor.track()) - assert ENSEMBLE_STATE_FAILED == evaluator.ensemble.snapshot.status + assert evaluator.ensemble.snapshot.status == ENSEMBLE_STATE_FAILED diff --git a/tests/unit_tests/gui/model/test_job_list.py b/tests/unit_tests/gui/model/test_job_list.py index e7c9012cae5..99a3046bee1 100644 --- a/tests/unit_tests/gui/model/test_job_list.py +++ b/tests/unit_tests/gui/model/test_job_list.py @@ -35,9 +35,9 @@ def test_using_qt_model_tester(qtmodeltester, full_snapshot): model.setSourceModel(source_model) reporting_mode = qt_api.QtTest.QAbstractItemModelTester.FailureReportingMode.Warning - tester = qt_api.QtTest.QAbstractItemModelTester( # noqa, prevent GC + tester = qt_api.QtTest.QAbstractItemModelTester( model, reporting_mode - ) + ) # noqa: F841, prevent GC source_model._add_snapshot(SnapshotModel.prerender(full_snapshot), 0) source_model._add_snapshot(SnapshotModel.prerender(full_snapshot), 1) @@ -56,9 +56,9 @@ def test_changes(full_snapshot): model.setSourceModel(source_model) reporting_mode = qt_api.QtTest.QAbstractItemModelTester.FailureReportingMode.Warning - tester = qt_api.QtTest.QAbstractItemModelTester( # noqa, prevent GC + tester = qt_api.QtTest.QAbstractItemModelTester( model, reporting_mode - ) + ) # noqa: F841, prevent GC source_model._add_snapshot(SnapshotModel.prerender(full_snapshot), 0) assert ( @@ -98,9 +98,9 @@ def test_duration(mock_datetime, timezone, full_snapshot): model.setSourceModel(source_model) reporting_mode = qt_api.QtTest.QAbstractItemModelTester.FailureReportingMode.Warning - tester = qt_api.QtTest.QAbstractItemModelTester( # noqa, prevent GC + tester = qt_api.QtTest.QAbstractItemModelTester( model, reporting_mode - ) + ) # noqa: F841, prevent GC source_model._add_snapshot(SnapshotModel.prerender(full_snapshot), 0) assert ( @@ -146,7 +146,7 @@ def test_no_cross_talk(full_snapshot): model.setSourceModel(source_model) reporting_mode = qt_api.QtTest.QAbstractItemModelTester.FailureReportingMode.Warning - qt_api.QtTest.QAbstractItemModelTester(model, reporting_mode) # noqa, prevent GC + qt_api.QtTest.QAbstractItemModelTester(model, reporting_mode) # noqa: F841 source_model._add_snapshot(SnapshotModel.prerender(full_snapshot), 0) source_model._add_snapshot(SnapshotModel.prerender(full_snapshot), 1) diff --git a/tests/unit_tests/gui/model/test_progress_proxy.py b/tests/unit_tests/gui/model/test_progress_proxy.py index ae0046a85fb..00ff726fcc8 100644 --- a/tests/unit_tests/gui/model/test_progress_proxy.py +++ b/tests/unit_tests/gui/model/test_progress_proxy.py @@ -20,7 +20,9 @@ def test_using_qt_model_tester(qtmodeltester, full_snapshot): reporting_mode = qt_api.QtTest.QAbstractItemModelTester.FailureReportingMode.Warning # pylint: disable=unused-variable - tester = qt_api.QtTest.QAbstractItemModelTester(model, reporting_mode) # noqa: F841 + tester = qt_api.QtTest.QAbstractItemModelTester( + model, reporting_mode + ) # noqa: F841, prevent GC source_model._add_snapshot(SnapshotModel.prerender(full_snapshot), 0) source_model._add_snapshot(SnapshotModel.prerender(full_snapshot), 1) @@ -39,7 +41,9 @@ def test_progression(full_snapshot): reporting_mode = qt_api.QtTest.QAbstractItemModelTester.FailureReportingMode.Warning # pylint: disable=unused-variable - tester = qt_api.QtTest.QAbstractItemModelTester(model, reporting_mode) # noqa: F841 + tester = qt_api.QtTest.QAbstractItemModelTester( + model, reporting_mode + ) # noqa: F841, prevent GC source_model._add_snapshot(SnapshotModel.prerender(full_snapshot), 0) @@ -65,7 +69,9 @@ def test_progression_start_iter_not_zero(full_snapshot): reporting_mode = qt_api.QtTest.QAbstractItemModelTester.FailureReportingMode.Warning # pylint: disable=unused-variable - tester = qt_api.QtTest.QAbstractItemModelTester(model, reporting_mode) # noqa: F841 + tester = qt_api.QtTest.QAbstractItemModelTester( + model, reporting_mode + ) # noqa: F841, prevent GC source_model._add_snapshot(SnapshotModel.prerender(full_snapshot), 1) diff --git a/tests/unit_tests/gui/model/test_real_list.py b/tests/unit_tests/gui/model/test_real_list.py index 02b93322bfb..adbe3bc2b17 100644 --- a/tests/unit_tests/gui/model/test_real_list.py +++ b/tests/unit_tests/gui/model/test_real_list.py @@ -19,7 +19,9 @@ def test_using_qt_model_tester(qtmodeltester, full_snapshot): reporting_mode = qt_api.QtTest.QAbstractItemModelTester.FailureReportingMode.Warning # pylint: disable=unused-variable - tester = qt_api.QtTest.QAbstractItemModelTester(model, reporting_mode) # noqa: F841 + tester = qt_api.QtTest.QAbstractItemModelTester( + model, reporting_mode + ) # noqa: F841, prevent GC source_model._add_snapshot(SnapshotModel.prerender(full_snapshot), 0) source_model._add_snapshot(SnapshotModel.prerender(full_snapshot), 1) @@ -39,7 +41,9 @@ def test_change_iter(full_snapshot): reporting_mode = qt_api.QtTest.QAbstractItemModelTester.FailureReportingMode.Warning # pylint: disable=unused-variable - tester = qt_api.QtTest.QAbstractItemModelTester(model, reporting_mode) # noqa: F841 + tester = qt_api.QtTest.QAbstractItemModelTester( + model, reporting_mode + ) # noqa: F841, prevent GC source_model._add_snapshot(SnapshotModel.prerender(full_snapshot), 0) diff --git a/tests/unit_tests/gui/model/test_snapshot.py b/tests/unit_tests/gui/model/test_snapshot.py index f2acd184ad5..1814c8e9be7 100644 --- a/tests/unit_tests/gui/model/test_snapshot.py +++ b/tests/unit_tests/gui/model/test_snapshot.py @@ -13,9 +13,9 @@ def test_using_qt_model_tester(qtmodeltester, full_snapshot): model = SnapshotModel() reporting_mode = qt_api.QtTest.QAbstractItemModelTester.FailureReportingMode.Warning - tester = qt_api.QtTest.QAbstractItemModelTester( # noqa, prevent GC + tester = qt_api.QtTest.QAbstractItemModelTester( model, reporting_mode - ) + ) # noqa: F841, prevent GC model._add_snapshot(SnapshotModel.prerender(full_snapshot), 0) model._add_snapshot(SnapshotModel.prerender(full_snapshot), 1) diff --git a/tests/unit_tests/services/test_base_service.py b/tests/unit_tests/services/test_base_service.py index ff7df4eb072..b0191dd6e0a 100644 --- a/tests/unit_tests/services/test_base_service.py +++ b/tests/unit_tests/services/test_base_service.py @@ -22,7 +22,7 @@ class _DummyService(BaseService): service_name = "dummy" def __init__(self, exec_args, *args, **kwargs): - super().__init__(exec_args=exec_args, timeout=10, *args, **kwargs) + super().__init__(exec_args=exec_args, timeout=10, *args, **kwargs) # noqa: B026 def start(self): """Helper function for non-singleton testing""" diff --git a/tests/unit_tests/storage/test_local_storage.py b/tests/unit_tests/storage/test_local_storage.py index f4ce92a1dd4..0f85e692ff2 100644 --- a/tests/unit_tests/storage/test_local_storage.py +++ b/tests/unit_tests/storage/test_local_storage.py @@ -1,8 +1,7 @@ import pytest -from ert.storage import StorageReader +from ert.storage import StorageReader, open_storage from ert.storage import local_storage as local -from ert.storage import open_storage def _cases(storage):