ashb commented on a change in pull request #15425:
URL: https://github.com/apache/airflow/pull/15425#discussion_r629299429
##########
File path: airflow/models/connection.py
##########
@@ -377,3 +378,50 @@ def get_connection_from_secrets(cls, conn_id: str) ->
'Connection':
if conn:
return conn
raise AirflowNotFoundException(f"The conn_id `{conn_id}` isn't
defined")
+
+ @classmethod
+ def get_connection_parameter_names(cls) -> Set[str]:
+ """Returns :class:`airflow.models.connection.Connection` constructor
parameters."""
+ return {k for k in signature(cls.__init__).parameters.keys() if k !=
"self"}
+
+ @classmethod
+ def from_dict(cls, conn_id: str, conn_dict: Dict) -> 'Connection':
+ """
+ Create a connection from a dictionary.
+
+ :param conn_dict: dictionary representing a connection's attributes
+ e.g., {'conn_id': '', 'conn_type': '', 'login': '', ...}
+ :return: connection
+ """
+ if not isinstance(conn_dict, dict):
+ raise AirflowException(
+ f"Unexpected conn_dict type: {type(conn_dict)}. "
+ "The connection must be defined as a dictionary."
+ )
+
+ connection_parameter_names = cls.get_connection_parameter_names() |
{"extra_dejson"}
+ current_keys = set(conn_dict.keys())
+ if not current_keys.issubset(connection_parameter_names):
+ illegal_keys = current_keys - connection_parameter_names
+ illegal_keys_list = ", ".join(sorted(illegal_keys))
+ raise AirflowException(
+ f"The object have illegal keys: {illegal_keys_list}. "
Review comment:
```suggestion
f"The connection dict has illegal keys: {illegal_keys_list}.
"
```
##########
File path: airflow/models/connection.py
##########
@@ -377,3 +378,50 @@ def get_connection_from_secrets(cls, conn_id: str) ->
'Connection':
if conn:
return conn
raise AirflowNotFoundException(f"The conn_id `{conn_id}` isn't
defined")
+
+ @classmethod
+ def get_connection_parameter_names(cls) -> Set[str]:
+ """Returns :class:`airflow.models.connection.Connection` constructor
parameters."""
+ return {k for k in signature(cls.__init__).parameters.keys() if k !=
"self"}
+
+ @classmethod
+ def from_dict(cls, conn_id: str, conn_dict: Dict) -> 'Connection':
+ """
+ Create a connection from a dictionary.
+
+ :param conn_dict: dictionary representing a connection's attributes
+ e.g., {'conn_id': '', 'conn_type': '', 'login': '', ...}
+ :return: connection
+ """
+ if not isinstance(conn_dict, dict):
+ raise AirflowException(
+ f"Unexpected conn_dict type: {type(conn_dict)}. "
+ "The connection must be defined as a dictionary."
+ )
+
+ connection_parameter_names = cls.get_connection_parameter_names() |
{"extra_dejson"}
+ current_keys = set(conn_dict.keys())
+ if not current_keys.issubset(connection_parameter_names):
+ illegal_keys = current_keys - connection_parameter_names
+ illegal_keys_list = ", ".join(sorted(illegal_keys))
+ raise AirflowException(
Review comment:
```suggestion
raise TypeError(
```
##########
File path: airflow/models/connection.py
##########
@@ -377,3 +378,50 @@ def get_connection_from_secrets(cls, conn_id: str) ->
'Connection':
if conn:
return conn
raise AirflowNotFoundException(f"The conn_id `{conn_id}` isn't
defined")
+
+ @classmethod
+ def get_connection_parameter_names(cls) -> Set[str]:
+ """Returns :class:`airflow.models.connection.Connection` constructor
parameters."""
+ return {k for k in signature(cls.__init__).parameters.keys() if k !=
"self"}
+
+ @classmethod
+ def from_dict(cls, conn_id: str, conn_dict: Dict) -> 'Connection':
+ """
+ Create a connection from a dictionary.
+
+ :param conn_dict: dictionary representing a connection's attributes
+ e.g., {'conn_id': '', 'conn_type': '', 'login': '', ...}
+ :return: connection
+ """
+ if not isinstance(conn_dict, dict):
+ raise AirflowException(
+ f"Unexpected conn_dict type: {type(conn_dict)}. "
Review comment:
```suggestion
raise TypeError(
f"Unexpected conn_dict type: {type(conn_dict).__name__}. "
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]