apache-airflow-providers-standard 1.7.0rc1__py3-none-any.whl → 1.8.0__py3-none-any.whl

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.

Potentially problematic release.


This version of apache-airflow-providers-standard might be problematic. Click here for more details.

@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
29
29
 
30
30
  __all__ = ["__version__"]
31
31
 
32
- __version__ = "1.7.0"
32
+ __version__ = "1.8.0"
33
33
 
34
34
  if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
35
35
  "2.10.0"
@@ -105,6 +105,7 @@ def example_bash_decorator():
105
105
  from shlex import join
106
106
 
107
107
  files = _get_files_in_cwd()
108
+ files = files if files else ["."]
108
109
  cmd = join(["stat", *files])
109
110
 
110
111
  return cmd
@@ -140,6 +140,7 @@ with DAG(
140
140
  notifiers=[hitl_request_callback],
141
141
  on_success_callback=hitl_success_callback,
142
142
  on_failure_callback=hitl_failure_callback,
143
+ assigned_users=[{"id": "admin", "name": "admin"}],
143
144
  )
144
145
  # [END howto_hitl_approval_operator]
145
146
 
@@ -57,9 +57,13 @@ class DuplicateStateError(AirflowExternalTaskSensorException):
57
57
  """Raised when duplicate states are provided across allowed, skipped and failed states."""
58
58
 
59
59
 
60
- class HITLTriggerEventError(AirflowException):
60
+ class HITLTriggerEventError(Exception):
61
61
  """Raised when TriggerEvent contains error."""
62
62
 
63
63
 
64
64
  class HITLTimeoutError(HITLTriggerEventError):
65
65
  """Raised when HITLOperator timeouts."""
66
+
67
+
68
+ class HITLRejectException(AirflowException):
69
+ """Raised when an ApprovalOperator receives a "Reject" response when fail_on_reject is set to True."""
@@ -29,7 +29,7 @@ from typing import TYPE_CHECKING, Any
29
29
  from urllib.parse import ParseResult, urlencode, urlparse, urlunparse
30
30
 
31
31
  from airflow.configuration import conf
32
- from airflow.providers.standard.exceptions import HITLTimeoutError, HITLTriggerEventError
32
+ from airflow.providers.standard.exceptions import HITLRejectException, HITLTimeoutError, HITLTriggerEventError
33
33
  from airflow.providers.standard.operators.branch import BranchMixIn
34
34
  from airflow.providers.standard.triggers.hitl import HITLTrigger, HITLTriggerEventSuccessPayload
35
35
  from airflow.providers.standard.utils.skipmixin import SkipMixin
@@ -41,6 +41,7 @@ from airflow.sdk.timezone import utcnow
41
41
 
42
42
  if TYPE_CHECKING:
43
43
  from airflow.sdk.definitions.context import Context
44
+ from airflow.sdk.execution_time.hitl import HITLUser
44
45
  from airflow.sdk.types import RuntimeTaskInstanceProtocol
45
46
 
46
47
 
@@ -70,7 +71,7 @@ class HITLOperator(BaseOperator):
70
71
  multiple: bool = False,
71
72
  params: ParamsDict | dict[str, Any] | None = None,
72
73
  notifiers: Sequence[BaseNotifier] | BaseNotifier | None = None,
73
- respondents: str | list[str] | None = None,
74
+ assigned_users: HITLUser | list[HITLUser] | None = None,
74
75
  **kwargs,
75
76
  ) -> None:
76
77
  super().__init__(**kwargs)
@@ -86,7 +87,7 @@ class HITLOperator(BaseOperator):
86
87
  self.notifiers: Sequence[BaseNotifier] = (
87
88
  [notifiers] if isinstance(notifiers, BaseNotifier) else notifiers or []
88
89
  )
89
- self.respondents = [respondents] if isinstance(respondents, str) else respondents
90
+ self.assigned_users = [assigned_users] if isinstance(assigned_users, dict) else assigned_users
90
91
 
91
92
  self.validate_options()
92
93
  self.validate_params()
@@ -138,7 +139,7 @@ class HITLOperator(BaseOperator):
138
139
  defaults=self.defaults,
139
140
  multiple=self.multiple,
140
141
  params=self.serialized_params,
141
- respondents=self.respondents,
142
+ assigned_users=self.assigned_users,
142
143
  )
143
144
 
144
145
  if self.execution_timeout:
@@ -178,10 +179,12 @@ class HITLOperator(BaseOperator):
178
179
  return HITLTriggerEventSuccessPayload(
179
180
  chosen_options=chosen_options,
180
181
  params_input=params_input,
182
+ responded_at=event["responded_at"],
183
+ responded_by_user=event["responded_by_user"],
181
184
  )
182
185
 
183
186
  def process_trigger_event_error(self, event: dict[str, Any]) -> None:
184
- if "error_type" == "timeout":
187
+ if event["error_type"] == "timeout":
185
188
  raise HITLTimeoutError(event)
186
189
 
187
190
  raise HITLTriggerEventError(event)
@@ -300,12 +303,42 @@ class ApprovalOperator(HITLOperator, SkipMixin):
300
303
  APPROVE = "Approve"
301
304
  REJECT = "Reject"
302
305
 
303
- def __init__(self, ignore_downstream_trigger_rules: bool = False, **kwargs) -> None:
306
+ def __init__(
307
+ self,
308
+ *,
309
+ ignore_downstream_trigger_rules: bool = False,
310
+ fail_on_reject: bool = False,
311
+ **kwargs,
312
+ ) -> None:
313
+ """
314
+ Human-in-the-loop Operator for simple approval workflows.
315
+
316
+ This operator presents the user with two fixed options: "Approve" and "Reject".
317
+
318
+ Behavior:
319
+ - "Approve": Downstream tasks execute as normal.
320
+ - "Reject":
321
+ - Downstream tasks are skipped according to the `ignore_downstream_trigger_rules` setting.
322
+ - If `fail_on_reject=True`, the task fails instead of only skipping downstream tasks.
323
+
324
+ Warning:
325
+ Using `fail_on_reject=True` is generally discouraged. A HITLOperator's role is to collect
326
+ human input, and receiving any response—including "Reject"—indicates the task succeeded.
327
+ Treating "Reject" as a task failure mixes human decision outcomes with Airflow task
328
+ success/failure states.
329
+ Only use this option if you explicitly intend for a "Reject" response to fail the task.
330
+
331
+ Args:
332
+ ignore_downstream_trigger_rules: If True, skips all downstream tasks regardless of trigger rules.
333
+ fail_on_reject: If True, the task fails when "Reject" is selected. Generally discouraged.
334
+ Read the warning carefully before using.
335
+ """
304
336
  for arg in self.FIXED_ARGS:
305
337
  if arg in kwargs:
306
338
  raise ValueError(f"Passing {arg} to ApprovalOperator is not allowed.")
307
339
 
308
340
  self.ignore_downstream_trigger_rules = ignore_downstream_trigger_rules
341
+ self.fail_on_reject = fail_on_reject
309
342
 
310
343
  super().__init__(
311
344
  options=[self.APPROVE, self.REJECT],
@@ -321,6 +354,9 @@ class ApprovalOperator(HITLOperator, SkipMixin):
321
354
  self.log.info("Approved. Proceeding with downstream tasks...")
322
355
  return ret
323
356
 
357
+ if self.fail_on_reject and chosen_option == self.REJECT:
358
+ raise HITLRejectException('Receive "Reject"')
359
+
324
360
  if not self.downstream_task_ids:
325
361
  self.log.info("No downstream tasks; nothing to do.")
326
362
  return ret
@@ -25,12 +25,13 @@ if not AIRFLOW_V_3_1_PLUS:
25
25
  import asyncio
26
26
  from collections.abc import AsyncIterator
27
27
  from datetime import datetime
28
- from typing import Any, Literal, TypedDict
28
+ from typing import TYPE_CHECKING, Any, Literal, TypedDict
29
29
  from uuid import UUID
30
30
 
31
31
  from asgiref.sync import sync_to_async
32
32
 
33
33
  from airflow.sdk.execution_time.hitl import (
34
+ HITLUser,
34
35
  get_hitl_detail_content_detail,
35
36
  update_hitl_detail_response,
36
37
  )
@@ -43,6 +44,8 @@ class HITLTriggerEventSuccessPayload(TypedDict, total=False):
43
44
 
44
45
  chosen_options: list[str]
45
46
  params_input: dict[str, Any]
47
+ responded_by_user: HITLUser | None
48
+ responded_at: datetime
46
49
  timedout: bool
47
50
 
48
51
 
@@ -98,6 +101,35 @@ class HITLTrigger(BaseTrigger):
98
101
  """Loop until the Human-in-the-loop response received or timeout reached."""
99
102
  while True:
100
103
  if self.timeout_datetime and self.timeout_datetime < utcnow():
104
+ # Fetch latest HITL detail before fallback
105
+ resp = await sync_to_async(get_hitl_detail_content_detail)(ti_id=self.ti_id)
106
+ # Response already received, yield success and exit
107
+ if resp.response_received and resp.chosen_options:
108
+ if TYPE_CHECKING:
109
+ assert resp.responded_by_user is not None
110
+ assert resp.responded_at is not None
111
+
112
+ self.log.info(
113
+ "[HITL] responded_by=%s (id=%s) options=%s at %s (timeout fallback skipped)",
114
+ resp.responded_by_user.name,
115
+ resp.responded_by_user.id,
116
+ resp.chosen_options,
117
+ resp.responded_at,
118
+ )
119
+ yield TriggerEvent(
120
+ HITLTriggerEventSuccessPayload(
121
+ chosen_options=resp.chosen_options,
122
+ params_input=resp.params_input or {},
123
+ responded_at=resp.responded_at,
124
+ responded_by_user=HITLUser(
125
+ id=resp.responded_by_user.id,
126
+ name=resp.responded_by_user.name,
127
+ ),
128
+ timedout=False,
129
+ )
130
+ )
131
+ return
132
+
101
133
  if self.defaults is None:
102
134
  yield TriggerEvent(
103
135
  HITLTriggerEventFailurePayload(
@@ -107,11 +139,13 @@ class HITLTrigger(BaseTrigger):
107
139
  )
108
140
  return
109
141
 
110
- await sync_to_async(update_hitl_detail_response)(
142
+ resp = await sync_to_async(update_hitl_detail_response)(
111
143
  ti_id=self.ti_id,
112
144
  chosen_options=self.defaults,
113
145
  params_input=self.params,
114
146
  )
147
+ if TYPE_CHECKING:
148
+ assert resp.responded_at is not None
115
149
  self.log.info(
116
150
  "[HITL] timeout reached before receiving response, fallback to default %s", self.defaults
117
151
  )
@@ -119,6 +153,8 @@ class HITLTrigger(BaseTrigger):
119
153
  HITLTriggerEventSuccessPayload(
120
154
  chosen_options=self.defaults,
121
155
  params_input=self.params,
156
+ responded_by_user=None,
157
+ responded_at=resp.responded_at,
122
158
  timedout=True,
123
159
  )
124
160
  )
@@ -126,17 +162,25 @@ class HITLTrigger(BaseTrigger):
126
162
 
127
163
  resp = await sync_to_async(get_hitl_detail_content_detail)(ti_id=self.ti_id)
128
164
  if resp.response_received and resp.chosen_options:
165
+ if TYPE_CHECKING:
166
+ assert resp.responded_by_user is not None
167
+ assert resp.responded_at is not None
129
168
  self.log.info(
130
169
  "[HITL] responded_by=%s (id=%s) options=%s at %s",
131
- resp.responded_user_name,
132
- resp.responded_user_id,
170
+ resp.responded_by_user.name,
171
+ resp.responded_by_user.id,
133
172
  resp.chosen_options,
134
- resp.response_at,
173
+ resp.responded_at,
135
174
  )
136
175
  yield TriggerEvent(
137
176
  HITLTriggerEventSuccessPayload(
138
177
  chosen_options=resp.chosen_options,
139
178
  params_input=resp.params_input or {},
179
+ responded_at=resp.responded_at,
180
+ responded_by_user=HITLUser(
181
+ id=resp.responded_by_user.id,
182
+ name=resp.responded_by_user.name,
183
+ ),
140
184
  timedout=False,
141
185
  )
142
186
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-standard
3
- Version: 1.7.0rc1
3
+ Version: 1.8.0
4
4
  Summary: Provider package apache-airflow-providers-standard for Apache Airflow
5
5
  Keywords: airflow-provider,standard,airflow,integration
6
6
  Author-email: Apache Software Foundation <dev@airflow.apache.org>
@@ -20,10 +20,10 @@ Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
22
  Classifier: Topic :: System :: Monitoring
23
- Requires-Dist: apache-airflow>=2.10.0rc1
23
+ Requires-Dist: apache-airflow>=2.10.0
24
24
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
25
- Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-standard/1.7.0/changelog.html
26
- Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-standard/1.7.0
25
+ Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-standard/1.8.0/changelog.html
26
+ Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-standard/1.8.0
27
27
  Project-URL: Mastodon, https://fosstodon.org/@airflow
28
28
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
29
29
  Project-URL: Source Code, https://github.com/apache/airflow
@@ -54,7 +54,7 @@ Project-URL: YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/
54
54
 
55
55
  Package ``apache-airflow-providers-standard``
56
56
 
57
- Release: ``1.7.0``
57
+ Release: ``1.8.0``
58
58
 
59
59
 
60
60
  Airflow Standard Provider
@@ -67,7 +67,7 @@ This is a provider package for ``standard`` provider. All classes for this provi
67
67
  are in ``airflow.providers.standard`` python package.
68
68
 
69
69
  You can find package information and changelog for the provider
70
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.7.0/>`_.
70
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.8.0/>`_.
71
71
 
72
72
  Installation
73
73
  ------------
@@ -88,5 +88,5 @@ PIP package Version required
88
88
  ================== ==================
89
89
 
90
90
  The changelog for the provider package can be found in the
91
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.7.0/changelog.html>`_.
91
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.8.0/changelog.html>`_.
92
92
 
@@ -1,6 +1,6 @@
1
1
  airflow/providers/standard/LICENSE,sha256=gXPVwptPlW1TJ4HSuG5OMPg-a3h43OGMkZRR1rpwfJA,10850
2
- airflow/providers/standard/__init__.py,sha256=078RBvCMj07zXJOm392G_z8EFWs_t7BgZmXNmw-tdow,1497
3
- airflow/providers/standard/exceptions.py,sha256=866ohBix8CtwCv0Dzr1p1tMHq0tNqDH1tMEAmC6BdwE,2269
2
+ airflow/providers/standard/__init__.py,sha256=LOW3Un9JxsKQy3ZmcKa-xKq5MZnEhCNCBzws_pLaAeI,1497
3
+ airflow/providers/standard/exceptions.py,sha256=m2Ryv36yrzAk8xMIA4lhR11n1gA1CKPFwRok8ksl_tk,2416
4
4
  airflow/providers/standard/get_provider_info.py,sha256=jhENLvqCXj0mzBPmJeAvPj7XWaaNuxPLhHVVA-9rqzs,7132
5
5
  airflow/providers/standard/version_compat.py,sha256=pWRfOwwGUd_uIfch0eiT5vOgwaA5rvohtW5Q46orG98,2891
6
6
  airflow/providers/standard/decorators/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
@@ -14,7 +14,7 @@ airflow/providers/standard/decorators/python_virtualenv.py,sha256=_8Ir-9tt1Ru5rH
14
14
  airflow/providers/standard/decorators/sensor.py,sha256=BEcTdFUrfiFnLLZN6Uqtiqqq6ScGRVg9JkZYZk4sc-U,3230
15
15
  airflow/providers/standard/decorators/short_circuit.py,sha256=zUZgcVDrZXXU_cOhvkxGJrSUsC0oD1HAGPNVDD3U2QM,2533
16
16
  airflow/providers/standard/example_dags/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
17
- airflow/providers/standard/example_dags/example_bash_decorator.py,sha256=uNnzOlKqHcpFQcFjiIh6VgZR60dtvs__4I2PIt6veCg,4025
17
+ airflow/providers/standard/example_dags/example_bash_decorator.py,sha256=B2F_AHzdjucrm0zx7osc4JQjWklXgmY7jps8Y1r5fbI,4067
18
18
  airflow/providers/standard/example_dags/example_bash_operator.py,sha256=tAS4cBsKW9B1nUukmYTpUw5Vf63476v_-tYjffyAtd4,2352
19
19
  airflow/providers/standard/example_dags/example_branch_datetime_operator.py,sha256=6sGzn1xlMaF3I-HMI7bvx78oyxZUw5WAF_Gja_ZUch0,3765
20
20
  airflow/providers/standard/example_dags/example_branch_day_of_week_operator.py,sha256=75ncMaGfkjxN0ULszqeXrSL5rHauUTNOhGiGAGPm3pw,2362
@@ -23,7 +23,7 @@ airflow/providers/standard/example_dags/example_branch_operator_decorator.py,sha
23
23
  airflow/providers/standard/example_dags/example_external_task_child_deferrable.py,sha256=o-ji3leJTBjiChEWoqVu4ykz1YVYUd8-ApmZwHFcNc8,1233
24
24
  airflow/providers/standard/example_dags/example_external_task_marker_dag.py,sha256=gssBjlfrGMDLZxTYOxo8ihXLbJ-3Uu31QodINGFWYNU,3650
25
25
  airflow/providers/standard/example_dags/example_external_task_parent_deferrable.py,sha256=8R1EqL0x1SgxcJtOb2EO4_NXmFgxiM-a0wPilDf7fis,2172
26
- airflow/providers/standard/example_dags/example_hitl_operator.py,sha256=izEvpOU7f_I63e46rakmk8KnoAQpgSeKDaD3LZ2fgwU,5962
26
+ airflow/providers/standard/example_dags/example_hitl_operator.py,sha256=sAgD5nXFUt6MreNkUdmAB6N2Hl2gd0vr0cS0OAw7Pso,6021
27
27
  airflow/providers/standard/example_dags/example_latest_only.py,sha256=ac9WpLMWLzyuxZks74t3HojS7vRG2gynmQfGm13gwOI,1456
28
28
  airflow/providers/standard/example_dags/example_python_decorator.py,sha256=jveqPOw1GZzD3Z37_rYc8Q8hcyx8vCNjgetpO_P6qmg,4281
29
29
  airflow/providers/standard/example_dags/example_python_operator.py,sha256=3L6CZHK2Fb7zmA9tDhZ5QaEe38WJYlS4l35Gc7xJAoE,4761
@@ -44,7 +44,7 @@ airflow/providers/standard/operators/bash.py,sha256=yzNbi20dp6PWJzXZqJ05gyMsdb6-
44
44
  airflow/providers/standard/operators/branch.py,sha256=hiaTvIvHuN6-6dhdxJEot1FOTUmld1fr0c9lUVoCouo,4243
45
45
  airflow/providers/standard/operators/datetime.py,sha256=bYDdbfAyAlEXRRHjOgB06UhgDum6SPdd5I3u-ylPSaw,5005
46
46
  airflow/providers/standard/operators/empty.py,sha256=BTeZ4KRykaEHLZigSBkevcStCrbPdQpWDMnO3ZdtZqw,1338
47
- airflow/providers/standard/operators/hitl.py,sha256=MZ-61THumncfT6BcJ0xUUOW7sVqYsvRrHwgaNYlMbtI,16329
47
+ airflow/providers/standard/operators/hitl.py,sha256=nUFsM7OQS2iknd0-9-oJU9I--C_8dXegnPhE_b3VXf8,18018
48
48
  airflow/providers/standard/operators/latest_only.py,sha256=VkU-nAI8QbIrmeiv4wYXBcZF0yKMkcFapormg0J5-As,5110
49
49
  airflow/providers/standard/operators/python.py,sha256=zRtonsvdBdUNIGjYQjrMkvz6eh0IZFwcQoFEekBe6Ys,53765
50
50
  airflow/providers/standard/operators/smooth.py,sha256=IMs5GjM42XEiroksIZ5flGQgxfRUbXZXCWxpshVinYQ,1396
@@ -62,7 +62,7 @@ airflow/providers/standard/sensors/weekday.py,sha256=sKDQ7xC9c32DZxaGNIjqmW6HXE4
62
62
  airflow/providers/standard/triggers/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
63
63
  airflow/providers/standard/triggers/external_task.py,sha256=R2Wsd21pw9_gGTs9XuHafylt65hMVPisz2g6vnpLJ4o,11521
64
64
  airflow/providers/standard/triggers/file.py,sha256=2i8-RwSjEgdOwQNcHCqLmSdpE3Ehqg4GQJ8nE3-fHxo,4886
65
- airflow/providers/standard/triggers/hitl.py,sha256=w4j91SsXOXBdWI1iDIQHAio7MzBjf8vlMovot9IvW3s,5266
65
+ airflow/providers/standard/triggers/hitl.py,sha256=MXAwMPlMcil1EBRnck9hjakicK93QfLTBEyKKmGucV0,7403
66
66
  airflow/providers/standard/triggers/temporal.py,sha256=rqUMRsKTO46JvUbIXgReei5p9cnEd8PV4zJkLZWWOUI,4552
67
67
  airflow/providers/standard/utils/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
68
68
  airflow/providers/standard/utils/python_virtualenv.py,sha256=logUzODR5qnUZYyew-ZEbL7rudrkTEtmnU9qTQhg0-0,8532
@@ -70,7 +70,7 @@ airflow/providers/standard/utils/python_virtualenv_script.jinja2,sha256=3Z334hVq
70
70
  airflow/providers/standard/utils/sensor_helper.py,sha256=FwI36sJK-s3Wz0slypF1_tAikQpiXovtTiN__Md00Aw,5049
71
71
  airflow/providers/standard/utils/skipmixin.py,sha256=kHpui_Ag-bwbbwjQOfXEmE4zAWYrhO9H_qKGRkbtqdE,8349
72
72
  airflow/providers/standard/utils/weekday.py,sha256=ySDrIkWv-lqqxURo9E98IGInDqERec2O4y9o2hQTGiQ,2685
73
- apache_airflow_providers_standard-1.7.0rc1.dist-info/entry_points.txt,sha256=mW2YRh3mVdZdaP5-iGSNgmcCh3YYdALIn28BCLBZZ40,104
74
- apache_airflow_providers_standard-1.7.0rc1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
75
- apache_airflow_providers_standard-1.7.0rc1.dist-info/METADATA,sha256=8FvnxMusKWW9rm3_jn1R6rQ_xIa2WJdKy6C5ykBjWdE,3809
76
- apache_airflow_providers_standard-1.7.0rc1.dist-info/RECORD,,
73
+ apache_airflow_providers_standard-1.8.0.dist-info/entry_points.txt,sha256=mW2YRh3mVdZdaP5-iGSNgmcCh3YYdALIn28BCLBZZ40,104
74
+ apache_airflow_providers_standard-1.8.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
75
+ apache_airflow_providers_standard-1.8.0.dist-info/METADATA,sha256=PZ84k0XCMKwQjfkD8wCocLv_bzTYw6__fXmVe5bvuZ0,3789
76
+ apache_airflow_providers_standard-1.8.0.dist-info/RECORD,,