apache-airflow-providers-sftp 5.4.2__tar.gz → 5.5.1rc1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/PKG-INFO +11 -11
  2. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/README.rst +5 -5
  3. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/docs/changelog.rst +32 -2
  4. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/docs/index.rst +6 -6
  5. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/provider.yaml +3 -1
  6. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/pyproject.toml +6 -6
  7. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/__init__.py +3 -3
  8. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/exceptions.py +1 -1
  9. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/hooks/sftp.py +20 -14
  10. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/operators/sftp.py +1 -2
  11. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/sensors/sftp.py +1 -2
  12. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/triggers/sftp.py +1 -1
  13. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/unit/sftp/hooks/test_sftp.py +62 -1
  14. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/unit/sftp/operators/test_sftp.py +1 -1
  15. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/unit/sftp/sensors/test_sftp.py +1 -1
  16. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/unit/sftp/triggers/test_sftp.py +1 -1
  17. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/LICENSE +0 -0
  18. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/NOTICE +0 -0
  19. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/docs/.latest-doc-only-change.txt +0 -0
  20. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/docs/commits.rst +0 -0
  21. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/docs/conf.py +0 -0
  22. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/docs/connections/sftp.rst +0 -0
  23. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/docs/installing-providers-from-sources.rst +0 -0
  24. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/docs/integration-logos/SFTP.png +0 -0
  25. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/docs/security.rst +0 -0
  26. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/docs/sensors/sftp_sensor.rst +0 -0
  27. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/__init__.py +0 -0
  28. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/__init__.py +0 -0
  29. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/decorators/__init__.py +0 -0
  30. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/decorators/sensors/__init__.py +0 -0
  31. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/decorators/sensors/sftp.py +0 -0
  32. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/get_provider_info.py +0 -0
  33. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/hooks/__init__.py +0 -0
  34. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/operators/__init__.py +0 -0
  35. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/sensors/__init__.py +0 -0
  36. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/triggers/__init__.py +0 -0
  37. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/src/airflow/providers/sftp/version_compat.py +0 -0
  38. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/conftest.py +0 -0
  39. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/system/__init__.py +0 -0
  40. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/system/sftp/__init__.py +0 -0
  41. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/system/sftp/example_sftp_sensor.py +0 -0
  42. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/unit/__init__.py +0 -0
  43. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/unit/sftp/__init__.py +0 -0
  44. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/unit/sftp/decorators/__init__.py +0 -0
  45. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/unit/sftp/decorators/sensors/__init__.py +0 -0
  46. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/unit/sftp/decorators/sensors/test_sftp.py +0 -0
  47. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/unit/sftp/hooks/__init__.py +0 -0
  48. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/unit/sftp/operators/__init__.py +0 -0
  49. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/unit/sftp/sensors/__init__.py +0 -0
  50. {apache_airflow_providers_sftp-5.4.2 → apache_airflow_providers_sftp-5.5.1rc1}/tests/unit/sftp/triggers/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-sftp
3
- Version: 5.4.2
3
+ Version: 5.5.1rc1
4
4
  Summary: Provider package apache-airflow-providers-sftp for Apache Airflow
5
5
  Keywords: airflow-provider,sftp,airflow,integration
6
6
  Author-email: Apache Software Foundation <dev@airflow.apache.org>
@@ -22,16 +22,16 @@ Classifier: Programming Language :: Python :: 3.13
22
22
  Classifier: Topic :: System :: Monitoring
23
23
  License-File: LICENSE
24
24
  License-File: NOTICE
25
- Requires-Dist: apache-airflow>=2.10.0
26
- Requires-Dist: apache-airflow-providers-ssh>=4.0.0
27
- Requires-Dist: apache-airflow-providers-common-compat>=1.8.0
25
+ Requires-Dist: apache-airflow>=2.11.0rc1
26
+ Requires-Dist: apache-airflow-providers-ssh>=4.0.0rc1
27
+ Requires-Dist: apache-airflow-providers-common-compat>=1.10.1rc1
28
28
  Requires-Dist: paramiko>=2.9.0,<4.0.0
29
29
  Requires-Dist: asyncssh>=2.12.0
30
30
  Requires-Dist: apache-airflow-providers-common-compat ; extra == "common-compat"
31
31
  Requires-Dist: apache-airflow-providers-openlineage ; extra == "openlineage"
32
32
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
33
- Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.4.2/changelog.html
34
- Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.4.2
33
+ Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-sftp/5.5.1/changelog.html
34
+ Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-sftp/5.5.1
35
35
  Project-URL: Mastodon, https://fosstodon.org/@airflow
36
36
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
37
37
  Project-URL: Source Code, https://github.com/apache/airflow
@@ -64,7 +64,7 @@ Provides-Extra: openlineage
64
64
 
65
65
  Package ``apache-airflow-providers-sftp``
66
66
 
67
- Release: ``5.4.2``
67
+ Release: ``5.5.1``
68
68
 
69
69
 
70
70
  `SSH File Transfer Protocol (SFTP) <https://tools.ietf.org/wg/secsh/draft-ietf-secsh-filexfer/>`__
@@ -77,7 +77,7 @@ This is a provider package for ``sftp`` provider. All classes for this provider
77
77
  are in ``airflow.providers.sftp`` python package.
78
78
 
79
79
  You can find package information and changelog for the provider
80
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.4.2/>`_.
80
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.5.1/>`_.
81
81
 
82
82
  Installation
83
83
  ------------
@@ -94,9 +94,9 @@ Requirements
94
94
  ========================================== ==================
95
95
  PIP package Version required
96
96
  ========================================== ==================
97
- ``apache-airflow`` ``>=2.10.0``
97
+ ``apache-airflow`` ``>=2.11.0``
98
98
  ``apache-airflow-providers-ssh`` ``>=4.0.0``
99
- ``apache-airflow-providers-common-compat`` ``>=1.8.0``
99
+ ``apache-airflow-providers-common-compat`` ``>=1.10.1``
100
100
  ``paramiko`` ``>=2.9.0,<4.0.0``
101
101
  ``asyncssh`` ``>=2.12.0``
102
102
  ========================================== ==================
@@ -133,5 +133,5 @@ Extra Dependencies
133
133
  ================= ==========================================
134
134
 
135
135
  The changelog for the provider package can be found in the
136
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.4.2/changelog.html>`_.
136
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.5.1/changelog.html>`_.
137
137
 
@@ -23,7 +23,7 @@
23
23
 
24
24
  Package ``apache-airflow-providers-sftp``
25
25
 
26
- Release: ``5.4.2``
26
+ Release: ``5.5.1``
27
27
 
28
28
 
29
29
  `SSH File Transfer Protocol (SFTP) <https://tools.ietf.org/wg/secsh/draft-ietf-secsh-filexfer/>`__
@@ -36,7 +36,7 @@ This is a provider package for ``sftp`` provider. All classes for this provider
36
36
  are in ``airflow.providers.sftp`` python package.
37
37
 
38
38
  You can find package information and changelog for the provider
39
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.4.2/>`_.
39
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.5.1/>`_.
40
40
 
41
41
  Installation
42
42
  ------------
@@ -53,9 +53,9 @@ Requirements
53
53
  ========================================== ==================
54
54
  PIP package Version required
55
55
  ========================================== ==================
56
- ``apache-airflow`` ``>=2.10.0``
56
+ ``apache-airflow`` ``>=2.11.0``
57
57
  ``apache-airflow-providers-ssh`` ``>=4.0.0``
58
- ``apache-airflow-providers-common-compat`` ``>=1.8.0``
58
+ ``apache-airflow-providers-common-compat`` ``>=1.10.1``
59
59
  ``paramiko`` ``>=2.9.0,<4.0.0``
60
60
  ``asyncssh`` ``>=2.12.0``
61
61
  ========================================== ==================
@@ -92,4 +92,4 @@ Extra Dependencies
92
92
  ================= ==========================================
93
93
 
94
94
  The changelog for the provider package can be found in the
95
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.4.2/changelog.html>`_.
95
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.5.1/changelog.html>`_.
@@ -27,6 +27,38 @@
27
27
  Changelog
28
28
  ---------
29
29
 
30
+ 5.5.1
31
+ .....
32
+
33
+ Bug Fixes
34
+ ~~~~~~~~~
35
+
36
+ * ``fix(sftp): add default port to SFTPHookAsync (#58945)``
37
+
38
+ Misc
39
+ ~~~~
40
+
41
+ * ``Add backcompat for exceptions in providers (#58727)``
42
+
43
+ .. Below changes are excluded from the changelog. Move them to
44
+ appropriate section above if needed. Do not delete the lines(!):
45
+
46
+ 5.5.0
47
+ .....
48
+
49
+ .. note::
50
+ This release of provider is only available for Airflow 2.11+ as explained in the
51
+ Apache Airflow providers support policy <https://github.com/apache/airflow/blob/main/PROVIDERS.rst#minimum-supported-version-of-airflow-for-community-managed-providers>_.
52
+
53
+ Misc
54
+ ~~~~
55
+
56
+ * ``Bump minimum Airflow version in providers to Airflow 2.11.0 (#58612)``
57
+
58
+ .. Below changes are excluded from the changelog. Move them to
59
+ appropriate section above if needed. Do not delete the lines(!):
60
+ * ``Updates to release process of providers (#58316)``
61
+
30
62
  5.4.2
31
63
  .....
32
64
 
@@ -77,8 +109,6 @@ Bug Fixes
77
109
  .. Below changes are excluded from the changelog. Move them to
78
110
  appropriate section above if needed. Do not delete the lines(!):
79
111
  * ``Switch pre-commit to prek (#54258)``
80
-
81
- .. Review and move the new changes to one of the sections above:
82
112
  * ``Fix Airflow 2 reference in README/index of providers (#55240)``
83
113
 
84
114
  5.3.4
@@ -70,7 +70,7 @@ apache-airflow-providers-sftp package
70
70
  `SSH File Transfer Protocol (SFTP) <https://tools.ietf.org/wg/secsh/draft-ietf-secsh-filexfer/>`__
71
71
 
72
72
 
73
- Release: 5.4.2
73
+ Release: 5.5.1
74
74
 
75
75
  Provider package
76
76
  ----------------
@@ -88,14 +88,14 @@ For the minimum Airflow version supported, see ``Requirements`` below.
88
88
  Requirements
89
89
  ------------
90
90
 
91
- The minimum Apache Airflow version supported by this provider distribution is ``2.10.0``.
91
+ The minimum Apache Airflow version supported by this provider distribution is ``2.11.0``.
92
92
 
93
93
  ========================================== ==================
94
94
  PIP package Version required
95
95
  ========================================== ==================
96
- ``apache-airflow`` ``>=2.10.0``
96
+ ``apache-airflow`` ``>=2.11.0``
97
97
  ``apache-airflow-providers-ssh`` ``>=4.0.0``
98
- ``apache-airflow-providers-common-compat`` ``>=1.8.0``
98
+ ``apache-airflow-providers-common-compat`` ``>=1.10.1``
99
99
  ``paramiko`` ``>=2.9.0,<4.0.0``
100
100
  ``asyncssh`` ``>=2.12.0``
101
101
  ========================================== ==================
@@ -127,5 +127,5 @@ Downloading official packages
127
127
  You can download officially released packages and verify their checksums and signatures from the
128
128
  `Official Apache Download site <https://downloads.apache.org/airflow/providers/>`_
129
129
 
130
- * `The apache-airflow-providers-sftp 5.4.2 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.4.2.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.4.2.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.4.2.tar.gz.sha512>`__)
131
- * `The apache-airflow-providers-sftp 5.4.2 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.4.2-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.4.2-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.4.2-py3-none-any.whl.sha512>`__)
130
+ * `The apache-airflow-providers-sftp 5.5.1 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.5.1.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.5.1.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.5.1.tar.gz.sha512>`__)
131
+ * `The apache-airflow-providers-sftp 5.5.1 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.5.1-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.5.1-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.5.1-py3-none-any.whl.sha512>`__)
@@ -22,12 +22,14 @@ description: |
22
22
  `SSH File Transfer Protocol (SFTP) <https://tools.ietf.org/wg/secsh/draft-ietf-secsh-filexfer/>`__
23
23
 
24
24
  state: ready
25
- source-date-epoch: 1763070330
25
+ source-date-epoch: 1765299399
26
26
  # Note that those versions are maintained by release manager - do not update them manually
27
27
  # with the exception of case where other provider in sources has >= new provider version.
28
28
  # In such case adding >= NEW_VERSION and bumping to NEW_VERSION in a provider have
29
29
  # to be done in the same PR
30
30
  versions:
31
+ - 5.5.1
32
+ - 5.5.0
31
33
  - 5.4.2
32
34
  - 5.4.1
33
35
  - 5.4.0
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
25
25
 
26
26
  [project]
27
27
  name = "apache-airflow-providers-sftp"
28
- version = "5.4.2"
28
+ version = "5.5.1rc1"
29
29
  description = "Provider package apache-airflow-providers-sftp for Apache Airflow"
30
30
  readme = "README.rst"
31
31
  license = "Apache-2.0"
@@ -58,9 +58,9 @@ requires-python = ">=3.10"
58
58
  # Make sure to run ``prek update-providers-dependencies --all-files``
59
59
  # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
60
60
  dependencies = [
61
- "apache-airflow>=2.10.0",
62
- "apache-airflow-providers-ssh>=4.0.0",
63
- "apache-airflow-providers-common-compat>=1.8.0",
61
+ "apache-airflow>=2.11.0rc1",
62
+ "apache-airflow-providers-ssh>=4.0.0rc1",
63
+ "apache-airflow-providers-common-compat>=1.10.1rc1",
64
64
  # TODO: Bump to >= 4.0.0 once https://github.com/apache/airflow/issues/54079 is handled
65
65
  "paramiko>=2.9.0,<4.0.0",
66
66
  "asyncssh>=2.12.0",
@@ -113,8 +113,8 @@ apache-airflow-providers-common-sql = {workspace = true}
113
113
  apache-airflow-providers-standard = {workspace = true}
114
114
 
115
115
  [project.urls]
116
- "Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.4.2"
117
- "Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.4.2/changelog.html"
116
+ "Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-sftp/5.5.1"
117
+ "Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-sftp/5.5.1/changelog.html"
118
118
  "Bug Tracker" = "https://github.com/apache/airflow/issues"
119
119
  "Source Code" = "https://github.com/apache/airflow"
120
120
  "Slack Chat" = "https://s.apache.org/airflow-slack"
@@ -29,11 +29,11 @@ from airflow import __version__ as airflow_version
29
29
 
30
30
  __all__ = ["__version__"]
31
31
 
32
- __version__ = "5.4.2"
32
+ __version__ = "5.5.1"
33
33
 
34
34
  if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
35
- "2.10.0"
35
+ "2.11.0"
36
36
  ):
37
37
  raise RuntimeError(
38
- f"The package `apache-airflow-providers-sftp:{__version__}` needs Apache Airflow 2.10.0+"
38
+ f"The package `apache-airflow-providers-sftp:{__version__}` needs Apache Airflow 2.11.0+"
39
39
  )
@@ -16,7 +16,7 @@
16
16
  # under the License.
17
17
  from __future__ import annotations
18
18
 
19
- from airflow.exceptions import AirflowException
19
+ from airflow.providers.common.compat.sdk import AirflowException
20
20
 
21
21
 
22
22
  class ConnectionNotOpenedException(AirflowException):
@@ -34,12 +34,10 @@ from typing import IO, TYPE_CHECKING, Any, cast
34
34
 
35
35
  import asyncssh
36
36
  from asgiref.sync import sync_to_async
37
+ from paramiko.config import SSH_PORT
37
38
 
38
- from airflow.exceptions import (
39
- AirflowException,
40
- AirflowProviderDeprecationWarning,
41
- )
42
- from airflow.providers.common.compat.sdk import BaseHook, Connection
39
+ from airflow.exceptions import AirflowProviderDeprecationWarning
40
+ from airflow.providers.common.compat.sdk import AirflowException, BaseHook, Connection
43
41
  from airflow.providers.sftp.exceptions import ConnectionNotOpenedException
44
42
  from airflow.providers.ssh.hooks.ssh import SSHHook
45
43
 
@@ -703,10 +701,10 @@ class SFTPHookAsync(BaseHook):
703
701
  def __init__( # nosec: B107
704
702
  self,
705
703
  sftp_conn_id: str = default_conn_name,
706
- host: str = "",
707
- port: int = 22,
708
- username: str = "",
709
- password: str = "",
704
+ host: str | None = None,
705
+ port: int | None = None,
706
+ username: str | None = None,
707
+ password: str | None = None,
710
708
  known_hosts: str = default_known_hosts,
711
709
  key_file: str = "",
712
710
  passphrase: str = "",
@@ -762,11 +760,19 @@ class SFTPHookAsync(BaseHook):
762
760
  if conn.extra is not None:
763
761
  self._parse_extras(conn) # type: ignore[arg-type]
764
762
 
765
- conn_config: dict[str, Any] = {
766
- "host": conn.host,
767
- "port": conn.port,
768
- "username": conn.login,
769
- "password": conn.password,
763
+ def _get_value(self_val, conn_val, default=None):
764
+ """Return the first non-None value among self, conn, default."""
765
+ if self_val is not None:
766
+ return self_val
767
+ if conn_val is not None:
768
+ return conn_val
769
+ return default
770
+
771
+ conn_config = {
772
+ "host": _get_value(self.host, conn.host),
773
+ "port": _get_value(self.port, conn.port, SSH_PORT),
774
+ "username": _get_value(self.username, conn.login),
775
+ "password": _get_value(self.password, conn.password),
770
776
  }
771
777
  if self.key_file:
772
778
  conn_config.update(client_keys=self.key_file)
@@ -27,8 +27,7 @@ from typing import Any
27
27
 
28
28
  import paramiko
29
29
 
30
- from airflow.exceptions import AirflowException
31
- from airflow.providers.common.compat.sdk import BaseOperator
30
+ from airflow.providers.common.compat.sdk import AirflowException, BaseOperator
32
31
  from airflow.providers.sftp.hooks.sftp import SFTPHook
33
32
 
34
33
 
@@ -27,8 +27,7 @@ from typing import TYPE_CHECKING, Any
27
27
  from paramiko.sftp import SFTP_NO_SUCH_FILE
28
28
 
29
29
  from airflow.configuration import conf
30
- from airflow.exceptions import AirflowException
31
- from airflow.providers.common.compat.sdk import BaseSensorOperator, PokeReturnValue
30
+ from airflow.providers.common.compat.sdk import AirflowException, BaseSensorOperator, PokeReturnValue
32
31
  from airflow.providers.sftp.hooks.sftp import SFTPHook
33
32
  from airflow.providers.sftp.triggers.sftp import SFTPTrigger
34
33
  from airflow.utils.timezone import convert_to_utc, parse
@@ -24,7 +24,7 @@ from typing import Any
24
24
 
25
25
  from dateutil.parser import parse as parse_date
26
26
 
27
- from airflow.exceptions import AirflowException
27
+ from airflow.providers.common.compat.sdk import AirflowException
28
28
  from airflow.providers.sftp.hooks.sftp import SFTPHookAsync
29
29
  from airflow.triggers.base import BaseTrigger, TriggerEvent
30
30
  from airflow.utils.timezone import convert_to_utc
@@ -31,8 +31,8 @@ from asyncssh.sftp import SFTPName
31
31
  from paramiko.client import SSHClient
32
32
  from paramiko.sftp_client import SFTPClient
33
33
 
34
- from airflow.exceptions import AirflowException
35
34
  from airflow.models import Connection
35
+ from airflow.providers.common.compat.sdk import AirflowException
36
36
  from airflow.providers.sftp.hooks.sftp import SFTPHook, SFTPHookAsync
37
37
 
38
38
 
@@ -886,6 +886,67 @@ class TestSFTPHookAsync:
886
886
 
887
887
  mock_connect.assert_called_with(**expected_connection_details)
888
888
 
889
+ @pytest.mark.asyncio
890
+ @patch("asyncssh.connect", new_callable=AsyncMock)
891
+ @patch("airflow.providers.sftp.hooks.sftp.SFTPHookAsync.get_connection")
892
+ async def test_connection_port_default_to_22(self, mock_get_connection, mock_connect):
893
+ from unittest.mock import Mock, call
894
+
895
+ mock_get_connection.return_value = Mock(
896
+ host="localhost",
897
+ port=None,
898
+ login="username",
899
+ password="password",
900
+ extra="{}",
901
+ extra_dejson={},
902
+ )
903
+
904
+ hook = SFTPHookAsync()
905
+ await hook._get_conn()
906
+ assert mock_connect.mock_calls == [
907
+ call(
908
+ host="localhost",
909
+ # Even if the port is not specified in conn_config, it should still default to 22.
910
+ # This behavior is consistent with STPHook.
911
+ port=22,
912
+ username="username",
913
+ password="password",
914
+ known_hosts=None,
915
+ ),
916
+ ]
917
+
918
+ @pytest.mark.asyncio
919
+ @patch("asyncssh.connect", new_callable=AsyncMock)
920
+ @patch("airflow.providers.sftp.hooks.sftp.SFTPHookAsync.get_connection")
921
+ async def test_init_argument_not_ignored(self, mock_get_connection, mock_connect):
922
+ from unittest.mock import Mock, call
923
+
924
+ mock_get_connection.return_value = Mock(
925
+ host="localhost",
926
+ port=None,
927
+ login="username",
928
+ password="password",
929
+ extra="{}",
930
+ extra_dejson={},
931
+ )
932
+
933
+ hook = SFTPHookAsync(
934
+ host="localhost-from-init",
935
+ port=25,
936
+ username="username-from-init",
937
+ password="password-from-init",
938
+ )
939
+ await hook._get_conn()
940
+ assert mock_connect.mock_calls == [
941
+ call(
942
+ host="localhost-from-init",
943
+ port=25,
944
+ username="username-from-init",
945
+ password="password-from-init",
946
+ known_hosts=None,
947
+ ),
948
+ ]
949
+
889
950
  @patch("airflow.providers.sftp.hooks.sftp.SFTPHookAsync._get_conn")
890
951
  @pytest.mark.asyncio
891
952
  async def test_list_directory_path_does_not_exist(self, mock_hook_get_conn):
@@ -26,9 +26,9 @@ from unittest import mock
26
26
  import paramiko
27
27
  import pytest
28
28
 
29
- from airflow.exceptions import AirflowException
30
29
  from airflow.models import DAG, Connection
31
30
  from airflow.providers.common.compat.openlineage.facet import Dataset
31
+ from airflow.providers.common.compat.sdk import AirflowException
32
32
  from airflow.providers.sftp.hooks.sftp import SFTPHook
33
33
  from airflow.providers.sftp.operators.sftp import SFTPOperation, SFTPOperator
34
34
  from airflow.providers.ssh.hooks.ssh import SSHHook
@@ -25,7 +25,7 @@ import pytest
25
25
  from paramiko.sftp import SFTP_FAILURE
26
26
  from pendulum import datetime as pendulum_datetime, timezone
27
27
 
28
- from airflow.exceptions import AirflowException
28
+ from airflow.providers.common.compat.sdk import AirflowException
29
29
  from airflow.providers.sftp.sensors.sftp import SFTPSensor
30
30
  from airflow.sensors.base import PokeReturnValue
31
31
 
@@ -24,7 +24,7 @@ from unittest import mock
24
24
  import pytest
25
25
  from asyncssh.sftp import SFTPAttrs, SFTPName
26
26
 
27
- from airflow.exceptions import AirflowException
27
+ from airflow.providers.common.compat.sdk import AirflowException
28
28
  from airflow.providers.sftp.triggers.sftp import SFTPTrigger
29
29
  from airflow.triggers.base import TriggerEvent
30
30