This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 27da663d32 Better message for exception for templated base operator 
fields (#37668)
27da663d32 is described below

commit 27da663d32fcb394fbbb4bf589b6cb8d4b84eae6
Author: Ryan Hatter <[email protected]>
AuthorDate: Sat Feb 24 16:56:24 2024 -0500

    Better message for exception for templated base operator fields (#37668)
    
    * Better message for exception for templated base operator fields
    
    * fix test
---
 airflow/serialization/serialized_objects.py   |  8 +++++++-
 tests/serialization/test_dag_serialization.py | 12 +++++++++++-
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/airflow/serialization/serialized_objects.py 
b/airflow/serialization/serialized_objects.py
index 0c11fc9301..82c4a6bccc 100644
--- a/airflow/serialization/serialized_objects.py
+++ b/airflow/serialization/serialized_objects.py
@@ -26,6 +26,7 @@ import warnings
 import weakref
 from dataclasses import dataclass
 from inspect import signature
+from textwrap import dedent
 from typing import TYPE_CHECKING, Any, Collection, Iterable, Mapping, 
NamedTuple, Union
 
 import attrs
@@ -912,7 +913,12 @@ class SerializedBaseOperator(BaseOperator, 
BaseSerialization):
         if op.template_fields:
             for template_field in op.template_fields:
                 if template_field in forbidden_fields:
-                    raise AirflowException(f"Cannot template BaseOperator 
field: {template_field!r}")
+                    raise AirflowException(
+                        dedent(
+                            f"""Cannot template BaseOperator field:
+                        {template_field!r} {op.__class__.__name__=} 
{op.template_fields=}"""
+                        )
+                    )
                 value = getattr(op, template_field, None)
                 if not cls._is_excluded(value, template_field, op):
                     serialize_op[template_field] = 
serialize_template_field(value)
diff --git a/tests/serialization/test_dag_serialization.py 
b/tests/serialization/test_dag_serialization.py
index 63abaa15bc..959c25c970 100644
--- a/tests/serialization/test_dag_serialization.py
+++ b/tests/serialization/test_dag_serialization.py
@@ -25,9 +25,11 @@ import json
 import multiprocessing
 import os
 import pickle
+import re
 from datetime import datetime, timedelta
 from glob import glob
 from pathlib import Path
+from textwrap import dedent
 from typing import TYPE_CHECKING
 from unittest import mock
 
@@ -2072,7 +2074,15 @@ class TestStringifiedDAGs:
             task.render_template_fields(context={"test_email_list": 
["[email protected]", "[email protected]"]})
             assert task.email == "[email protected],[email protected]"
 
-        with pytest.raises(AirflowException, match="Cannot template 
BaseOperator field: 'execution_timeout'"):
+        with pytest.raises(
+            AirflowException,
+            match=re.escape(
+                dedent(
+                    """Failed to serialize DAG 'test_dag': Cannot template 
BaseOperator field:
+                        'execution_timeout' 
op.__class__.__name__='TestOperator' op.template_fields=('email', 
'execution_timeout')"""
+                )
+            ),
+        ):
             SerializedDAG.to_dict(dag)
 
 

Reply via email to