apache-airflow-providers-sftp 5.3.3__tar.gz → 5.3.4__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 (48) hide show
  1. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/PKG-INFO +8 -8
  2. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/README.rst +4 -4
  3. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/docs/changelog.rst +16 -0
  4. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/docs/index.rst +4 -4
  5. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/provider.yaml +2 -1
  6. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/pyproject.toml +5 -4
  7. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/__init__.py +1 -1
  8. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/hooks/sftp.py +6 -1
  9. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/operators/sftp.py +4 -0
  10. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/triggers/sftp.py +1 -1
  11. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/unit/sftp/operators/test_sftp.py +16 -2
  12. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/docs/.latest-doc-only-change.txt +0 -0
  13. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/docs/commits.rst +0 -0
  14. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/docs/conf.py +0 -0
  15. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/docs/connections/sftp.rst +0 -0
  16. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/docs/installing-providers-from-sources.rst +0 -0
  17. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/docs/integration-logos/SFTP.png +0 -0
  18. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/docs/security.rst +0 -0
  19. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/docs/sensors/sftp_sensor.rst +0 -0
  20. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/__init__.py +0 -0
  21. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/__init__.py +0 -0
  22. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/LICENSE +0 -0
  23. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/decorators/__init__.py +0 -0
  24. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/decorators/sensors/__init__.py +0 -0
  25. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/decorators/sensors/sftp.py +0 -0
  26. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/get_provider_info.py +0 -0
  27. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/hooks/__init__.py +0 -0
  28. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/operators/__init__.py +0 -0
  29. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/sensors/__init__.py +0 -0
  30. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/sensors/sftp.py +0 -0
  31. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/triggers/__init__.py +0 -0
  32. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/src/airflow/providers/sftp/version_compat.py +0 -0
  33. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/conftest.py +0 -0
  34. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/system/__init__.py +0 -0
  35. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/system/sftp/__init__.py +0 -0
  36. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/system/sftp/example_sftp_sensor.py +0 -0
  37. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/unit/__init__.py +0 -0
  38. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/unit/sftp/__init__.py +0 -0
  39. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/unit/sftp/decorators/__init__.py +0 -0
  40. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/unit/sftp/decorators/sensors/__init__.py +0 -0
  41. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/unit/sftp/decorators/sensors/test_sftp.py +0 -0
  42. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/unit/sftp/hooks/__init__.py +0 -0
  43. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/unit/sftp/hooks/test_sftp.py +0 -0
  44. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/unit/sftp/operators/__init__.py +0 -0
  45. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/unit/sftp/sensors/__init__.py +0 -0
  46. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/unit/sftp/sensors/test_sftp.py +0 -0
  47. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/unit/sftp/triggers/__init__.py +0 -0
  48. {apache_airflow_providers_sftp-5.3.3 → apache_airflow_providers_sftp-5.3.4}/tests/unit/sftp/triggers/test_sftp.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-sftp
3
- Version: 5.3.3
3
+ Version: 5.3.4
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,13 +22,13 @@ Classifier: Programming Language :: Python :: 3.13
22
22
  Classifier: Topic :: System :: Monitoring
23
23
  Requires-Dist: apache-airflow>=2.10.0
24
24
  Requires-Dist: apache-airflow-providers-ssh>=4.0.0
25
- Requires-Dist: paramiko>=2.9.0
25
+ Requires-Dist: paramiko>=2.9.0,<4.0.0
26
26
  Requires-Dist: asyncssh>=2.12.0
27
27
  Requires-Dist: apache-airflow-providers-common-compat ; extra == "common-compat"
28
28
  Requires-Dist: apache-airflow-providers-openlineage ; extra == "openlineage"
29
29
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
30
- Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.3/changelog.html
31
- Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.3
30
+ Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.4/changelog.html
31
+ Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.4
32
32
  Project-URL: Mastodon, https://fosstodon.org/@airflow
33
33
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
34
34
  Project-URL: Source Code, https://github.com/apache/airflow
@@ -61,7 +61,7 @@ Provides-Extra: openlineage
61
61
 
62
62
  Package ``apache-airflow-providers-sftp``
63
63
 
64
- Release: ``5.3.3``
64
+ Release: ``5.3.4``
65
65
 
66
66
  Release Date: ``|PypiReleaseDate|``
67
67
 
@@ -75,7 +75,7 @@ This is a provider package for ``sftp`` provider. All classes for this provider
75
75
  are in ``airflow.providers.sftp`` python package.
76
76
 
77
77
  You can find package information and changelog for the provider
78
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.3/>`_.
78
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.4/>`_.
79
79
 
80
80
  Installation
81
81
  ------------
@@ -94,7 +94,7 @@ PIP package Version required
94
94
  ================================ ==================
95
95
  ``apache-airflow`` ``>=2.10.0``
96
96
  ``apache-airflow-providers-ssh`` ``>=4.0.0``
97
- ``paramiko`` ``>=2.9.0``
97
+ ``paramiko`` ``>=2.9.0,<4.0.0``
98
98
  ``asyncssh`` ``>=2.12.0``
99
99
  ================================ ==================
100
100
 
@@ -120,5 +120,5 @@ Dependent package
120
120
  ================================================================================================================== =================
121
121
 
122
122
  The changelog for the provider package can be found in the
123
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.3/changelog.html>`_.
123
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.4/changelog.html>`_.
124
124
 
@@ -23,7 +23,7 @@
23
23
 
24
24
  Package ``apache-airflow-providers-sftp``
25
25
 
26
- Release: ``5.3.3``
26
+ Release: ``5.3.4``
27
27
 
28
28
  Release Date: ``|PypiReleaseDate|``
29
29
 
@@ -37,7 +37,7 @@ This is a provider package for ``sftp`` provider. All classes for this provider
37
37
  are in ``airflow.providers.sftp`` python package.
38
38
 
39
39
  You can find package information and changelog for the provider
40
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.3/>`_.
40
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.4/>`_.
41
41
 
42
42
  Installation
43
43
  ------------
@@ -56,7 +56,7 @@ PIP package Version required
56
56
  ================================ ==================
57
57
  ``apache-airflow`` ``>=2.10.0``
58
58
  ``apache-airflow-providers-ssh`` ``>=4.0.0``
59
- ``paramiko`` ``>=2.9.0``
59
+ ``paramiko`` ``>=2.9.0,<4.0.0``
60
60
  ``asyncssh`` ``>=2.12.0``
61
61
  ================================ ==================
62
62
 
@@ -82,4 +82,4 @@ Dependent package
82
82
  ================================================================================================================== =================
83
83
 
84
84
  The changelog for the provider package can be found in the
85
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.3/changelog.html>`_.
85
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.4/changelog.html>`_.
@@ -27,6 +27,22 @@
27
27
  Changelog
28
28
  ---------
29
29
 
30
+ 5.3.4
31
+ .....
32
+
33
+ Bug Fixes
34
+ ~~~~~~~~~
35
+
36
+ * ``Fix missing prefetch arg to SFTPOperator (#53906)``
37
+
38
+ Misc
39
+ ~~~~
40
+
41
+ * ``Limit paramiko to '< 4.0.0' till we remove DSS support (#54078)``
42
+
43
+ .. Below changes are excluded from the changelog. Move them to
44
+ appropriate section above if needed. Do not delete the lines(!):
45
+
30
46
  5.3.3
31
47
  .....
32
48
 
@@ -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.3.3
73
+ Release: 5.3.4
74
74
 
75
75
  Release Date: ``|PypiReleaseDate|``
76
76
 
@@ -97,7 +97,7 @@ PIP package Version required
97
97
  ================================ ==================
98
98
  ``apache-airflow`` ``>=2.10.0``
99
99
  ``apache-airflow-providers-ssh`` ``>=4.0.0``
100
- ``paramiko`` ``>=2.9.0``
100
+ ``paramiko`` ``>=2.9.0,<4.0.0``
101
101
  ``asyncssh`` ``>=2.12.0``
102
102
  ================================ ==================
103
103
 
@@ -128,5 +128,5 @@ Downloading official packages
128
128
  You can download officially released packages and verify their checksums and signatures from the
129
129
  `Official Apache Download site <https://downloads.apache.org/airflow/providers/>`_
130
130
 
131
- * `The apache-airflow-providers-sftp 5.3.3 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.3.3.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.3.3.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.3.3.tar.gz.sha512>`__)
132
- * `The apache-airflow-providers-sftp 5.3.3 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.3.3-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.3.3-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.3.3-py3-none-any.whl.sha512>`__)
131
+ * `The apache-airflow-providers-sftp 5.3.4 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.3.4.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.3.4.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.3.4.tar.gz.sha512>`__)
132
+ * `The apache-airflow-providers-sftp 5.3.4 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.3.4-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.3.4-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_sftp-5.3.4-py3-none-any.whl.sha512>`__)
@@ -22,12 +22,13 @@ 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: 1753691894
25
+ source-date-epoch: 1754503469
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.3.4
31
32
  - 5.3.3
32
33
  - 5.3.2
33
34
  - 5.3.1
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
25
25
 
26
26
  [project]
27
27
  name = "apache-airflow-providers-sftp"
28
- version = "5.3.3"
28
+ version = "5.3.4"
29
29
  description = "Provider package apache-airflow-providers-sftp for Apache Airflow"
30
30
  readme = "README.rst"
31
31
  authors = [
@@ -59,7 +59,8 @@ requires-python = ">=3.10"
59
59
  dependencies = [
60
60
  "apache-airflow>=2.10.0",
61
61
  "apache-airflow-providers-ssh>=4.0.0",
62
- "paramiko>=2.9.0",
62
+ # TODO: Bump to >= 4.0.0 once https://github.com/apache/airflow/issues/54079 is handled
63
+ "paramiko>=2.9.0,<4.0.0",
63
64
  "asyncssh>=2.12.0",
64
65
  ]
65
66
 
@@ -110,8 +111,8 @@ apache-airflow-providers-common-sql = {workspace = true}
110
111
  apache-airflow-providers-standard = {workspace = true}
111
112
 
112
113
  [project.urls]
113
- "Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.3"
114
- "Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.3/changelog.html"
114
+ "Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.4"
115
+ "Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-sftp/5.3.4/changelog.html"
115
116
  "Bug Tracker" = "https://github.com/apache/airflow/issues"
116
117
  "Source Code" = "https://github.com/apache/airflow"
117
118
  "Slack Chat" = "https://s.apache.org/airflow-slack"
@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
29
29
 
30
30
  __all__ = ["__version__"]
31
31
 
32
- __version__ = "5.3.3"
32
+ __version__ = "5.3.4"
33
33
 
34
34
  if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
35
35
  "2.10.0"
@@ -358,7 +358,11 @@ class SFTPHook(SSHHook):
358
358
  self.retrieve_file(file_path, new_local_path, prefetch)
359
359
 
360
360
  def retrieve_directory_concurrently(
361
- self, remote_full_path: str, local_full_path: str, workers: int = os.cpu_count() or 2
361
+ self,
362
+ remote_full_path: str,
363
+ local_full_path: str,
364
+ workers: int = os.cpu_count() or 2,
365
+ prefetch: bool = True,
362
366
  ) -> None:
363
367
  """
364
368
  Transfer the remote directory to a local location concurrently.
@@ -405,6 +409,7 @@ class SFTPHook(SSHHook):
405
409
  conns[i],
406
410
  local_file_chunks[i],
407
411
  remote_file_chunks[i],
412
+ prefetch,
408
413
  )
409
414
  for i in range(workers)
410
415
  ]
@@ -76,6 +76,7 @@ class SFTPOperator(BaseOperator):
76
76
  )
77
77
  :param concurrency: Number of threads when transferring directories. Each thread opens a new SFTP connection.
78
78
  This parameter is used only when transferring directories, not individual files. (Default is 1)
79
+ :param prefetch: controls whether prefetch is performed (default: True)
79
80
 
80
81
  """
81
82
 
@@ -93,6 +94,7 @@ class SFTPOperator(BaseOperator):
93
94
  confirm: bool = True,
94
95
  create_intermediate_dirs: bool = False,
95
96
  concurrency: int = 1,
97
+ prefetch: bool = True,
96
98
  **kwargs,
97
99
  ) -> None:
98
100
  super().__init__(**kwargs)
@@ -105,6 +107,7 @@ class SFTPOperator(BaseOperator):
105
107
  self.local_filepath = local_filepath
106
108
  self.remote_filepath = remote_filepath
107
109
  self.concurrency = concurrency
110
+ self.prefetch = prefetch
108
111
 
109
112
  def execute(self, context: Any) -> str | list[str] | None:
110
113
  if self.local_filepath is None:
@@ -173,6 +176,7 @@ class SFTPOperator(BaseOperator):
173
176
  _remote_filepath,
174
177
  _local_filepath,
175
178
  workers=self.concurrency,
179
+ prefetch=self.prefetch,
176
180
  )
177
181
  elif self.concurrency == 1:
178
182
  self.sftp_hook.retrieve_directory(_remote_filepath, _local_filepath)
@@ -84,7 +84,7 @@ class SFTPTrigger(BaseTrigger):
84
84
  check whether the last modified time is greater, if true return file if false it polls again.
85
85
  """
86
86
  hook = self._get_async_hook()
87
- exc = None
87
+
88
88
  if isinstance(self.newer_than, str):
89
89
  self.newer_than = parse_date(self.newer_than)
90
90
  _newer_than = convert_to_utc(self.newer_than) if self.newer_than else None
@@ -96,6 +96,21 @@ class TestSFTPOperator:
96
96
  if os.path.exists(self.test_remote_dir):
97
97
  os.rmdir(self.test_remote_dir)
98
98
 
99
+ def test_default_args(self):
100
+ operator = SFTPOperator(
101
+ task_id="test_default_args",
102
+ remote_filepath="/tmp/remote_file",
103
+ )
104
+ assert operator.operation == SFTPOperation.PUT
105
+ assert operator.confirm is True
106
+ assert operator.create_intermediate_dirs is False
107
+ assert operator.concurrency == 1
108
+ assert operator.prefetch is True
109
+ assert operator.local_filepath is None
110
+ assert operator.sftp_hook is None
111
+ assert operator.ssh_conn_id is None
112
+ assert operator.remote_host is None
113
+
99
114
  @pytest.mark.skipif(AIRFLOW_V_3_0_PLUS, reason="Pickle support is removed in Airflow 3")
100
115
  @conf_vars({("core", "enable_xcom_pickling"): "True"})
101
116
  def test_pickle_file_transfer_put(self, dag_maker):
@@ -442,8 +457,7 @@ class TestSFTPOperator:
442
457
  concurrency=2,
443
458
  ).execute(None)
444
459
  assert mock_get.call_count == 1
445
- args, _ = mock_get.call_args_list[0]
446
- assert args == (remote_dirpath, local_dirpath)
460
+ assert mock_get.call_args == mock.call(remote_dirpath, local_dirpath, workers=2, prefetch=True)
447
461
 
448
462
  @mock.patch("airflow.providers.sftp.operators.sftp.SFTPHook.store_file")
449
463
  def test_str_filepaths_put(self, mock_get):