diff --git a/generated/known_airflow_exceptions.txt b/generated/known_airflow_exceptions.txt index 1fb461854905d..66ee6590bc84e 100644 --- a/generated/known_airflow_exceptions.txt +++ b/generated/known_airflow_exceptions.txt @@ -85,7 +85,7 @@ providers/amazon/src/airflow/providers/amazon/aws/operators/neptune.py::4 providers/amazon/src/airflow/providers/amazon/aws/operators/rds.py::4 providers/amazon/src/airflow/providers/amazon/aws/operators/redshift_cluster.py::9 providers/amazon/src/airflow/providers/amazon/aws/operators/redshift_data.py::2 -providers/amazon/src/airflow/providers/amazon/aws/operators/s3.py::5 +providers/amazon/src/airflow/providers/amazon/aws/operators/s3.py::4 providers/amazon/src/airflow/providers/amazon/aws/operators/sagemaker.py::22 providers/amazon/src/airflow/providers/amazon/aws/operators/sagemaker_unified_studio.py::2 providers/amazon/src/airflow/providers/amazon/aws/operators/step_function.py::2 diff --git a/providers/amazon/src/airflow/providers/amazon/aws/operators/s3.py b/providers/amazon/src/airflow/providers/amazon/aws/operators/s3.py index b74fb60a1b763..164777c78c136 100644 --- a/providers/amazon/src/airflow/providers/amazon/aws/operators/s3.py +++ b/providers/amazon/src/airflow/providers/amazon/aws/operators/s3.py @@ -697,8 +697,12 @@ def __init__( self._keys: str | list[str] = "" - if not exactly_one(keys is None, all(var is None for var in [prefix, from_datetime, to_datetime])): - raise AirflowException( + # Checked here and again in execute(): this guard keeps a plain authoring mistake a + # parse-time error, while execute() catches a templated `keys` that renders to None + # (which would otherwise list — and delete from — the whole bucket). + by_scan = prefix is not None or from_datetime is not None or to_datetime is not None + if not exactly_one(keys is not None, by_scan): + raise ValueError( "Either keys or at least one of prefix, from_datetime, to_datetime should be set." ) diff --git a/providers/amazon/tests/unit/amazon/aws/operators/test_s3.py b/providers/amazon/tests/unit/amazon/aws/operators/test_s3.py index cd907171927e4..9d062caa4ace8 100644 --- a/providers/amazon/tests/unit/amazon/aws/operators/test_s3.py +++ b/providers/amazon/tests/unit/amazon/aws/operators/test_s3.py @@ -1120,7 +1120,7 @@ def test_s3_delete_empty_string(self): ) def test_validate_keys_and_filters_in_constructor(self, keys, prefix, from_datetime, to_datetime): with pytest.raises( - AirflowException, + ValueError, match=r"Either keys or at least one of prefix, from_datetime, to_datetime should be set.", ): S3DeleteObjectsOperator( diff --git a/scripts/ci/prek/validate_operators_init_exemptions.txt b/scripts/ci/prek/validate_operators_init_exemptions.txt index 7ff6497cf73f0..fd83af9d572c3 100644 --- a/scripts/ci/prek/validate_operators_init_exemptions.txt +++ b/scripts/ci/prek/validate_operators_init_exemptions.txt @@ -14,7 +14,6 @@ providers/amazon/src/airflow/providers/amazon/aws/operators/emr.py::EmrAddStepsO providers/amazon/src/airflow/providers/amazon/aws/operators/glue.py::GlueDataQualityOperator providers/amazon/src/airflow/providers/amazon/aws/operators/neptune.py::NeptuneStartDbClusterOperator providers/amazon/src/airflow/providers/amazon/aws/operators/neptune.py::NeptuneStopDbClusterOperator -providers/amazon/src/airflow/providers/amazon/aws/operators/s3.py::S3DeleteObjectsOperator providers/amazon/src/airflow/providers/amazon/aws/operators/sagemaker.py::SageMakerCreateNotebookOperator providers/amazon/src/airflow/providers/amazon/aws/operators/sagemaker.py::SageMakerProcessingOperator providers/amazon/src/airflow/providers/amazon/aws/operators/step_function.py::StepFunctionStartExecutionOperator