Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -89,12 +89,8 @@ def __init__(
super().__init__(**kwargs)
self.parameters = parameters

if not input_nb:
raise ValueError("Input notebook is not specified")
self.input_nb = input_nb

if not output_nb:
raise ValueError("Output notebook is not specified")
self.output_nb = output_nb

self.kernel_name = kernel_name
Expand All @@ -105,6 +101,10 @@ def __init__(
self.nbconvert_args = nbconvert_args

def execute(self, context: Context):
if not self.input_nb:
raise ValueError("Input notebook is not specified")
if not self.output_nb:
raise ValueError("Output notebook is not specified")
if not isinstance(self.input_nb, NoteBook):
self.input_nb = NoteBook(url=self.input_nb, parameters=self.parameters)
if not isinstance(self.output_nb, NoteBook):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,20 @@ def test_templated_fields(self):
class TestPapermillOperator:
"""Test PapermillOperator."""

def test_init_does_not_validate_notebooks(self):
"""__init__ must not validate template fields; input_nb/output_nb are rendered after construction."""
op = PapermillOperator(task_id="missing_input_nb", output_nb="foo-bar")
assert op.input_nb is None
op = PapermillOperator(task_id="missing_output_nb", input_nb="foo-bar")
assert op.output_nb is None

def test_mandatory_attributes(self):
"""Test missing Input or Output notebooks."""
"""Test missing Input or Output notebooks are validated at execute() time, after templating."""
with pytest.raises(ValueError, match="Input notebook is not specified"):
PapermillOperator(task_id="missing_input_nb", output_nb="foo-bar")
PapermillOperator(task_id="missing_input_nb", output_nb="foo-bar").execute(context={})

with pytest.raises(ValueError, match="Output notebook is not specified"):
PapermillOperator(task_id="missing_input_nb", input_nb="foo-bar")
PapermillOperator(task_id="missing_output_nb", input_nb="foo-bar").execute(context={})

@pytest.mark.parametrize(
("output_nb_url", "output_as_object"),
Expand Down
1 change: 0 additions & 1 deletion scripts/ci/prek/validate_operators_init_exemptions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/gcs_to
providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/oracle_to_azure_data_lake.py::OracleToAzureDataLakeOperator
providers/microsoft/psrp/src/airflow/providers/microsoft/psrp/operators/psrp.py::PsrpOperator
providers/oracle/src/airflow/providers/oracle/transfers/oracle_to_oracle.py::OracleToOracleOperator
providers/papermill/src/airflow/providers/papermill/operators/papermill.py::PapermillOperator
providers/standard/src/airflow/providers/standard/operators/bash.py::BashOperator
providers/standard/src/airflow/providers/standard/operators/trigger_dagrun.py::TriggerDagRunOperator
providers/standard/src/airflow/providers/standard/sensors/date_time.py::DateTimeSensor