apache-airflow-providers-openlineage 1.8.0rc1__py3-none-any.whl → 1.9.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-openlineage might be problematic. Click here for more details.
- airflow/providers/openlineage/LICENSE +4 -4
- airflow/providers/openlineage/__init__.py +1 -1
- airflow/providers/openlineage/conf.py +16 -1
- airflow/providers/openlineage/extractors/base.py +6 -3
- airflow/providers/openlineage/facets/AirflowJobFacet.json +40 -0
- airflow/providers/openlineage/facets/AirflowRunFacet.json +261 -0
- airflow/providers/openlineage/facets/AirflowStateRunFacet.json +34 -0
- airflow/providers/openlineage/facets/__init__.py +16 -0
- airflow/providers/openlineage/get_provider_info.py +11 -3
- airflow/providers/openlineage/plugins/adapter.py +69 -15
- airflow/providers/openlineage/plugins/facets.py +46 -4
- airflow/providers/openlineage/plugins/listener.py +128 -33
- airflow/providers/openlineage/plugins/macros.py +1 -1
- airflow/providers/openlineage/sqlparser.py +16 -6
- airflow/providers/openlineage/utils/selective_enable.py +6 -3
- airflow/providers/openlineage/utils/sql.py +11 -3
- airflow/providers/openlineage/utils/utils.py +191 -22
- {apache_airflow_providers_openlineage-1.8.0rc1.dist-info → apache_airflow_providers_openlineage-1.9.0.dist-info}/METADATA +12 -12
- apache_airflow_providers_openlineage-1.9.0.dist-info/RECORD +28 -0
- apache_airflow_providers_openlineage-1.8.0rc1.dist-info/RECORD +0 -24
- {apache_airflow_providers_openlineage-1.8.0rc1.dist-info → apache_airflow_providers_openlineage-1.9.0.dist-info}/WHEEL +0 -0
- {apache_airflow_providers_openlineage-1.8.0rc1.dist-info → apache_airflow_providers_openlineage-1.9.0.dist-info}/entry_points.txt +0 -0
|
@@ -20,20 +20,27 @@ from __future__ import annotations
|
|
|
20
20
|
import datetime
|
|
21
21
|
import json
|
|
22
22
|
import logging
|
|
23
|
-
|
|
23
|
+
import re
|
|
24
|
+
from contextlib import redirect_stdout, suppress
|
|
24
25
|
from functools import wraps
|
|
26
|
+
from io import StringIO
|
|
25
27
|
from typing import TYPE_CHECKING, Any, Iterable
|
|
26
28
|
|
|
27
29
|
import attrs
|
|
28
30
|
from deprecated import deprecated
|
|
29
31
|
from openlineage.client.utils import RedactMixin
|
|
32
|
+
from packaging.version import Version
|
|
30
33
|
|
|
34
|
+
from airflow import __version__ as AIRFLOW_VERSION
|
|
31
35
|
from airflow.exceptions import AirflowProviderDeprecationWarning # TODO: move this maybe to Airflow's logic?
|
|
32
36
|
from airflow.models import DAG, BaseOperator, MappedOperator
|
|
33
37
|
from airflow.providers.openlineage import conf
|
|
34
38
|
from airflow.providers.openlineage.plugins.facets import (
|
|
39
|
+
AirflowJobFacet,
|
|
35
40
|
AirflowMappedTaskRunFacet,
|
|
36
41
|
AirflowRunFacet,
|
|
42
|
+
AirflowStateRunFacet,
|
|
43
|
+
BaseFacet,
|
|
37
44
|
UnknownOperatorAttributeRunFacet,
|
|
38
45
|
UnknownOperatorInstance,
|
|
39
46
|
)
|
|
@@ -41,6 +48,7 @@ from airflow.providers.openlineage.utils.selective_enable import (
|
|
|
41
48
|
is_dag_lineage_enabled,
|
|
42
49
|
is_task_lineage_enabled,
|
|
43
50
|
)
|
|
51
|
+
from airflow.serialization.serialized_objects import SerializedBaseOperator
|
|
44
52
|
from airflow.utils.context import AirflowContextDeprecationWarning
|
|
45
53
|
from airflow.utils.log.secrets_masker import Redactable, Redacted, SecretsMasker, should_hide_value_for_key
|
|
46
54
|
from airflow.utils.module_loading import import_string
|
|
@@ -51,6 +59,7 @@ if TYPE_CHECKING:
|
|
|
51
59
|
|
|
52
60
|
log = logging.getLogger(__name__)
|
|
53
61
|
_NOMINAL_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ"
|
|
62
|
+
_IS_AIRFLOW_2_10_OR_HIGHER = Version(Version(AIRFLOW_VERSION).base_version) >= Version("2.10.0")
|
|
54
63
|
|
|
55
64
|
|
|
56
65
|
def try_import_from_string(string: str) -> Any:
|
|
@@ -78,7 +87,11 @@ def get_custom_facets(task_instance: TaskInstance | None = None) -> dict[str, An
|
|
|
78
87
|
|
|
79
88
|
|
|
80
89
|
def get_fully_qualified_class_name(operator: BaseOperator | MappedOperator) -> str:
|
|
81
|
-
|
|
90
|
+
if isinstance(operator, (MappedOperator, SerializedBaseOperator)):
|
|
91
|
+
# as in airflow.api_connexion.schemas.common_schema.ClassReferenceSchema
|
|
92
|
+
return operator._task_module + "." + operator._task_type # type: ignore
|
|
93
|
+
op_class = get_operator_class(operator)
|
|
94
|
+
return op_class.__module__ + "." + op_class.__name__
|
|
82
95
|
|
|
83
96
|
|
|
84
97
|
def is_operator_disabled(operator: BaseOperator | MappedOperator) -> bool:
|
|
@@ -135,7 +148,9 @@ class InfoJsonEncodable(dict):
|
|
|
135
148
|
def _cast_basic_types(value):
|
|
136
149
|
if isinstance(value, datetime.datetime):
|
|
137
150
|
return value.isoformat()
|
|
138
|
-
if isinstance(value,
|
|
151
|
+
if isinstance(value, datetime.timedelta):
|
|
152
|
+
return f"{value.total_seconds()} seconds"
|
|
153
|
+
if isinstance(value, (set, tuple)):
|
|
139
154
|
return str(list(value))
|
|
140
155
|
return value
|
|
141
156
|
|
|
@@ -168,7 +183,7 @@ class InfoJsonEncodable(dict):
|
|
|
168
183
|
class DagInfo(InfoJsonEncodable):
|
|
169
184
|
"""Defines encoding DAG object to JSON."""
|
|
170
185
|
|
|
171
|
-
includes = ["dag_id", "
|
|
186
|
+
includes = ["dag_id", "description", "owner", "schedule_interval", "start_date", "tags"]
|
|
172
187
|
casts = {"timetable": lambda dag: dag.timetable.serialize() if getattr(dag, "timetable", None) else None}
|
|
173
188
|
renames = {"_dag_id": "dag_id"}
|
|
174
189
|
|
|
@@ -191,14 +206,20 @@ class DagRunInfo(InfoJsonEncodable):
|
|
|
191
206
|
class TaskInstanceInfo(InfoJsonEncodable):
|
|
192
207
|
"""Defines encoding TaskInstance object to JSON."""
|
|
193
208
|
|
|
194
|
-
includes = ["duration", "try_number", "pool"]
|
|
209
|
+
includes = ["duration", "try_number", "pool", "queued_dttm"]
|
|
195
210
|
casts = {
|
|
196
|
-
"map_index": lambda ti:
|
|
197
|
-
|
|
198
|
-
|
|
211
|
+
"map_index": lambda ti: (
|
|
212
|
+
ti.map_index if hasattr(ti, "map_index") and getattr(ti, "map_index") != -1 else None
|
|
213
|
+
)
|
|
199
214
|
}
|
|
200
215
|
|
|
201
216
|
|
|
217
|
+
class DatasetInfo(InfoJsonEncodable):
|
|
218
|
+
"""Defines encoding Airflow Dataset object to JSON."""
|
|
219
|
+
|
|
220
|
+
includes = ["uri", "extra"]
|
|
221
|
+
|
|
222
|
+
|
|
202
223
|
class TaskInfo(InfoJsonEncodable):
|
|
203
224
|
"""Defines encoding BaseOperator/AbstractOperator object to JSON."""
|
|
204
225
|
|
|
@@ -225,7 +246,11 @@ class TaskInfo(InfoJsonEncodable):
|
|
|
225
246
|
"retries",
|
|
226
247
|
"retry_exponential_backoff",
|
|
227
248
|
"run_as_user",
|
|
249
|
+
"sla",
|
|
228
250
|
"task_id",
|
|
251
|
+
"trigger_dag_id",
|
|
252
|
+
"external_dag_id",
|
|
253
|
+
"external_task_id",
|
|
229
254
|
"trigger_rule",
|
|
230
255
|
"upstream_task_ids",
|
|
231
256
|
"wait_for_downstream",
|
|
@@ -234,9 +259,13 @@ class TaskInfo(InfoJsonEncodable):
|
|
|
234
259
|
]
|
|
235
260
|
casts = {
|
|
236
261
|
"operator_class": lambda task: task.task_type,
|
|
237
|
-
"task_group": lambda task:
|
|
238
|
-
|
|
239
|
-
|
|
262
|
+
"task_group": lambda task: (
|
|
263
|
+
TaskGroupInfo(task.task_group)
|
|
264
|
+
if hasattr(task, "task_group") and getattr(task.task_group, "_group_id", None)
|
|
265
|
+
else None
|
|
266
|
+
),
|
|
267
|
+
"inlets": lambda task: [DatasetInfo(inlet) for inlet in task.inlets],
|
|
268
|
+
"outlets": lambda task: [DatasetInfo(outlet) for outlet in task.outlets],
|
|
240
269
|
}
|
|
241
270
|
|
|
242
271
|
|
|
@@ -262,20 +291,158 @@ def get_airflow_run_facet(
|
|
|
262
291
|
task_instance: TaskInstance,
|
|
263
292
|
task: BaseOperator,
|
|
264
293
|
task_uuid: str,
|
|
265
|
-
):
|
|
294
|
+
) -> dict[str, BaseFacet]:
|
|
266
295
|
return {
|
|
267
|
-
"airflow":
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
taskUuid=task_uuid,
|
|
274
|
-
)
|
|
296
|
+
"airflow": AirflowRunFacet(
|
|
297
|
+
dag=DagInfo(dag),
|
|
298
|
+
dagRun=DagRunInfo(dag_run),
|
|
299
|
+
taskInstance=TaskInstanceInfo(task_instance),
|
|
300
|
+
task=TaskInfo(task),
|
|
301
|
+
taskUuid=task_uuid,
|
|
275
302
|
)
|
|
276
303
|
}
|
|
277
304
|
|
|
278
305
|
|
|
306
|
+
def get_airflow_job_facet(dag_run: DagRun) -> dict[str, BaseFacet]:
|
|
307
|
+
if not dag_run.dag:
|
|
308
|
+
return {}
|
|
309
|
+
return {
|
|
310
|
+
"airflow": AirflowJobFacet(
|
|
311
|
+
taskTree=_get_parsed_dag_tree(dag_run.dag),
|
|
312
|
+
taskGroups=_get_task_groups_details(dag_run.dag),
|
|
313
|
+
tasks=_get_tasks_details(dag_run.dag),
|
|
314
|
+
)
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
def get_airflow_state_run_facet(dag_run: DagRun) -> dict[str, BaseFacet]:
|
|
319
|
+
return {
|
|
320
|
+
"airflowState": AirflowStateRunFacet(
|
|
321
|
+
dagRunState=dag_run.get_state(),
|
|
322
|
+
tasksState={ti.task_id: ti.state for ti in dag_run.get_task_instances()},
|
|
323
|
+
)
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
def _safe_get_dag_tree_view(dag: DAG) -> list[str]:
|
|
328
|
+
# get_tree_view() has been added in Airflow 2.8.2
|
|
329
|
+
if hasattr(dag, "get_tree_view"):
|
|
330
|
+
return dag.get_tree_view().splitlines()
|
|
331
|
+
|
|
332
|
+
with redirect_stdout(StringIO()) as stdout:
|
|
333
|
+
dag.tree_view()
|
|
334
|
+
return stdout.getvalue().splitlines()
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
def _get_parsed_dag_tree(dag: DAG) -> dict:
|
|
338
|
+
"""
|
|
339
|
+
Get DAG's tasks hierarchy representation.
|
|
340
|
+
|
|
341
|
+
While the task dependencies are defined as following:
|
|
342
|
+
task >> [task_2, task_4] >> task_7
|
|
343
|
+
task_3 >> task_5
|
|
344
|
+
task_6 # has no dependencies, it's a root and a leaf
|
|
345
|
+
|
|
346
|
+
The result of this function will look like:
|
|
347
|
+
{
|
|
348
|
+
"task": {
|
|
349
|
+
"task_2": {
|
|
350
|
+
"task_7": {}
|
|
351
|
+
},
|
|
352
|
+
"task_4": {
|
|
353
|
+
"task_7": {}
|
|
354
|
+
}
|
|
355
|
+
},
|
|
356
|
+
"task_3": {
|
|
357
|
+
"task_5": {}
|
|
358
|
+
},
|
|
359
|
+
"task_6": {}
|
|
360
|
+
}
|
|
361
|
+
"""
|
|
362
|
+
lines = _safe_get_dag_tree_view(dag)
|
|
363
|
+
task_dict: dict[str, dict] = {}
|
|
364
|
+
parent_map: dict[int, tuple[str, dict]] = {}
|
|
365
|
+
|
|
366
|
+
for line in lines:
|
|
367
|
+
stripped_line = line.strip()
|
|
368
|
+
if not stripped_line:
|
|
369
|
+
continue
|
|
370
|
+
|
|
371
|
+
# Determine the level by counting the leading spaces, assuming 4 spaces per level
|
|
372
|
+
# as defined in airflow.models.dag.DAG._generate_tree_view()
|
|
373
|
+
level = (len(line) - len(stripped_line)) // 4
|
|
374
|
+
# airflow.models.baseoperator.BaseOperator.__repr__ is used in DAG tree
|
|
375
|
+
# <Task({op_class}): {task_id}>
|
|
376
|
+
match = re.match(r"^<Task\((.+)\): (.*?)>$", stripped_line)
|
|
377
|
+
if not match:
|
|
378
|
+
return {}
|
|
379
|
+
current_task_id = match[2]
|
|
380
|
+
|
|
381
|
+
if level == 0: # It's a root task
|
|
382
|
+
task_dict[current_task_id] = {}
|
|
383
|
+
parent_map[level] = (current_task_id, task_dict[current_task_id])
|
|
384
|
+
else:
|
|
385
|
+
# Find the immediate parent task
|
|
386
|
+
parent_task, parent_dict = parent_map[(level - 1)]
|
|
387
|
+
# Create new dict for the current task
|
|
388
|
+
parent_dict[current_task_id] = {}
|
|
389
|
+
# Update this task in the parent map
|
|
390
|
+
parent_map[level] = (current_task_id, parent_dict[current_task_id])
|
|
391
|
+
|
|
392
|
+
return task_dict
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
def _get_tasks_details(dag: DAG) -> dict:
|
|
396
|
+
tasks = {
|
|
397
|
+
single_task.task_id: {
|
|
398
|
+
"operator": get_fully_qualified_class_name(single_task),
|
|
399
|
+
"task_group": single_task.task_group.group_id if single_task.task_group else None,
|
|
400
|
+
"emits_ol_events": _emits_ol_events(single_task),
|
|
401
|
+
"ui_color": single_task.ui_color,
|
|
402
|
+
"ui_fgcolor": single_task.ui_fgcolor,
|
|
403
|
+
"ui_label": single_task.label,
|
|
404
|
+
"is_setup": single_task.is_setup,
|
|
405
|
+
"is_teardown": single_task.is_teardown,
|
|
406
|
+
}
|
|
407
|
+
for single_task in dag.tasks
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
return tasks
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
def _get_task_groups_details(dag: DAG) -> dict:
|
|
414
|
+
return {
|
|
415
|
+
tg_id: {
|
|
416
|
+
"parent_group": tg.parent_group.group_id,
|
|
417
|
+
"tooltip": tg.tooltip,
|
|
418
|
+
"ui_color": tg.ui_color,
|
|
419
|
+
"ui_fgcolor": tg.ui_fgcolor,
|
|
420
|
+
"ui_label": tg.label,
|
|
421
|
+
}
|
|
422
|
+
for tg_id, tg in dag.task_group_dict.items()
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
def _emits_ol_events(task: BaseOperator | MappedOperator) -> bool:
|
|
427
|
+
config_selective_enabled = is_selective_lineage_enabled(task)
|
|
428
|
+
config_disabled_for_operators = is_operator_disabled(task)
|
|
429
|
+
# empty operators without callbacks/outlets are skipped for optimization by Airflow
|
|
430
|
+
# in airflow.models.taskinstance.TaskInstance._schedule_downstream_tasks
|
|
431
|
+
is_skipped_as_empty_operator = all(
|
|
432
|
+
(
|
|
433
|
+
task.inherits_from_empty_operator,
|
|
434
|
+
not task.on_execute_callback,
|
|
435
|
+
not task.on_success_callback,
|
|
436
|
+
not task.outlets,
|
|
437
|
+
)
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
emits_ol_events = all(
|
|
441
|
+
(config_selective_enabled, not config_disabled_for_operators, not is_skipped_as_empty_operator)
|
|
442
|
+
)
|
|
443
|
+
return emits_ol_events
|
|
444
|
+
|
|
445
|
+
|
|
279
446
|
def get_unknown_source_attribute_run_facet(task: BaseOperator, name: str | None = None):
|
|
280
447
|
if not name:
|
|
281
448
|
name = get_operator_class(task).__name__
|
|
@@ -405,5 +572,7 @@ def normalize_sql(sql: str | Iterable[str]):
|
|
|
405
572
|
|
|
406
573
|
|
|
407
574
|
def should_use_external_connection(hook) -> bool:
|
|
408
|
-
#
|
|
409
|
-
|
|
575
|
+
# If we're at Airflow 2.10, the execution is process-isolated, so we can safely run those again.
|
|
576
|
+
if not _IS_AIRFLOW_2_10_OR_HIGHER:
|
|
577
|
+
return hook.__class__.__name__ not in ["SnowflakeHook", "SnowflakeSqlApiHook", "RedshiftSQLHook"]
|
|
578
|
+
return True
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: apache-airflow-providers-openlineage
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.9.0
|
|
4
4
|
Summary: Provider package apache-airflow-providers-openlineage for Apache Airflow
|
|
5
5
|
Keywords: airflow-provider,openlineage,airflow,integration
|
|
6
6
|
Author-email: Apache Software Foundation <dev@airflow.apache.org>
|
|
@@ -21,15 +21,15 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.11
|
|
22
22
|
Classifier: Programming Language :: Python :: 3.12
|
|
23
23
|
Classifier: Topic :: System :: Monitoring
|
|
24
|
-
Requires-Dist: apache-airflow-providers-common-sql>=1.6.
|
|
25
|
-
Requires-Dist: apache-airflow>=2.7.
|
|
24
|
+
Requires-Dist: apache-airflow-providers-common-sql>=1.6.0
|
|
25
|
+
Requires-Dist: apache-airflow>=2.7.0
|
|
26
26
|
Requires-Dist: attrs>=22.2
|
|
27
|
-
Requires-Dist: openlineage-integration-common>=
|
|
28
|
-
Requires-Dist: openlineage-python>=
|
|
27
|
+
Requires-Dist: openlineage-integration-common>=1.16.0
|
|
28
|
+
Requires-Dist: openlineage-python>=1.16.0
|
|
29
29
|
Requires-Dist: apache-airflow-providers-common-sql ; extra == "common.sql"
|
|
30
30
|
Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
|
|
31
|
-
Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-openlineage/1.
|
|
32
|
-
Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-openlineage/1.
|
|
31
|
+
Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-openlineage/1.9.0/changelog.html
|
|
32
|
+
Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-openlineage/1.9.0
|
|
33
33
|
Project-URL: Slack Chat, https://s.apache.org/airflow-slack
|
|
34
34
|
Project-URL: Source Code, https://github.com/apache/airflow
|
|
35
35
|
Project-URL: Twitter, https://twitter.com/ApacheAirflow
|
|
@@ -80,7 +80,7 @@ Provides-Extra: common.sql
|
|
|
80
80
|
|
|
81
81
|
Package ``apache-airflow-providers-openlineage``
|
|
82
82
|
|
|
83
|
-
Release: ``1.
|
|
83
|
+
Release: ``1.9.0``
|
|
84
84
|
|
|
85
85
|
|
|
86
86
|
`OpenLineage <https://openlineage.io/>`__
|
|
@@ -93,7 +93,7 @@ This is a provider package for ``openlineage`` provider. All classes for this pr
|
|
|
93
93
|
are in ``airflow.providers.openlineage`` python package.
|
|
94
94
|
|
|
95
95
|
You can find package information and changelog for the provider
|
|
96
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-openlineage/1.
|
|
96
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-openlineage/1.9.0/>`_.
|
|
97
97
|
|
|
98
98
|
Installation
|
|
99
99
|
------------
|
|
@@ -113,8 +113,8 @@ PIP package Version required
|
|
|
113
113
|
``apache-airflow`` ``>=2.7.0``
|
|
114
114
|
``apache-airflow-providers-common-sql`` ``>=1.6.0``
|
|
115
115
|
``attrs`` ``>=22.2``
|
|
116
|
-
``openlineage-integration-common`` ``>=
|
|
117
|
-
``openlineage-python`` ``>=
|
|
116
|
+
``openlineage-integration-common`` ``>=1.16.0``
|
|
117
|
+
``openlineage-python`` ``>=1.16.0``
|
|
118
118
|
======================================= ==================
|
|
119
119
|
|
|
120
120
|
Cross provider package dependencies
|
|
@@ -137,4 +137,4 @@ Dependent package
|
|
|
137
137
|
============================================================================================================ ==============
|
|
138
138
|
|
|
139
139
|
The changelog for the provider package can be found in the
|
|
140
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-openlineage/1.
|
|
140
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-openlineage/1.9.0/changelog.html>`_.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
airflow/providers/openlineage/LICENSE,sha256=FFb4jd2AXnOOf7XLP04pQW6jbdhG49TxlGY6fFpCV1Y,13609
|
|
2
|
+
airflow/providers/openlineage/__init__.py,sha256=wyNzY61gCpS2r6Wx-q-JiM8TbOKgTbDVngFZmcVmqOc,1498
|
|
3
|
+
airflow/providers/openlineage/conf.py,sha256=ZHUZF3wjFGupfFa40F1DjZSkOQJCUtWFyQM3nvz6Bq4,5099
|
|
4
|
+
airflow/providers/openlineage/get_provider_info.py,sha256=v-KK3oIOhEr-LE1WE8J6MaduGde709qiUmbkOklREn4,7472
|
|
5
|
+
airflow/providers/openlineage/sqlparser.py,sha256=qX2ID75PH11-youFvRdRHqZbYzLdbm95H3STvbBzGb8,15667
|
|
6
|
+
airflow/providers/openlineage/extractors/__init__.py,sha256=I0X4f6zUniclyD9zT0DFHRImpCpJVP4MkPJT3cd7X5I,1081
|
|
7
|
+
airflow/providers/openlineage/extractors/base.py,sha256=D-ll2cz_WWv1XYh2_UfzmpCl8S5iC2aptFTy2sWZeHY,5499
|
|
8
|
+
airflow/providers/openlineage/extractors/bash.py,sha256=m4hLvDV4-zX4gp8apRuhpAR3Uakr8UOUxf-thTWmOxw,2563
|
|
9
|
+
airflow/providers/openlineage/extractors/manager.py,sha256=9TyszMLAsgPS9NETWq7fPJjxcbTFk47x4kd1NRGCvsw,10315
|
|
10
|
+
airflow/providers/openlineage/extractors/python.py,sha256=EQXCj2aHr2XXw0pNxeX-ii8UQFCoqkdf40ozqmA5d58,3151
|
|
11
|
+
airflow/providers/openlineage/facets/AirflowJobFacet.json,sha256=rS9PuPWOi1Jc5B4a5qLxS_Az7Q9Eb3jVYQnN41iXDC0,1187
|
|
12
|
+
airflow/providers/openlineage/facets/AirflowRunFacet.json,sha256=Mk85_KKwBOEcn_ptiQuoo9ucP-coAHfkAnilws2XMl4,5867
|
|
13
|
+
airflow/providers/openlineage/facets/AirflowStateRunFacet.json,sha256=xhHQEKD9Jopw-oqbkCCrrwFjfXnxvuJAritsmegKjuQ,937
|
|
14
|
+
airflow/providers/openlineage/facets/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
|
15
|
+
airflow/providers/openlineage/plugins/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
|
16
|
+
airflow/providers/openlineage/plugins/adapter.py,sha256=s0-eQw7cqzlUbznHdnLWihmdLKczHjuDj1TYYmJSK04,18720
|
|
17
|
+
airflow/providers/openlineage/plugins/facets.py,sha256=kNxxnibLurcv8SV0qXPkwXxpKWhByo745vcqzWGNMIs,4450
|
|
18
|
+
airflow/providers/openlineage/plugins/listener.py,sha256=q6r63SS3ZKdZKyTlEhw8c12onHh7kQCQ-_G1kA67btw,17952
|
|
19
|
+
airflow/providers/openlineage/plugins/macros.py,sha256=hgFA3ZdQibyn4KXIOsKYBm4WRKDLA5q6Asscx5rvNfM,3076
|
|
20
|
+
airflow/providers/openlineage/plugins/openlineage.py,sha256=rsRUW_zpXVAglzsgQRv5T9VWYY7CMQl0qRWm8-3oqDA,1678
|
|
21
|
+
airflow/providers/openlineage/utils/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
|
22
|
+
airflow/providers/openlineage/utils/selective_enable.py,sha256=dFJ7wK7J_-BFwcOKp9tqFOSrASV3lmLv7HtRkEuMk3Q,3087
|
|
23
|
+
airflow/providers/openlineage/utils/sql.py,sha256=5K3qFhevq-R4CDUZbq-XfFKPLWixIOtaypRem3jiHvw,9534
|
|
24
|
+
airflow/providers/openlineage/utils/utils.py,sha256=Tx4YZ-Ap-P27YCmZ3ivNX-f6Wiw7RU9FdeteV9zrQRA,19852
|
|
25
|
+
apache_airflow_providers_openlineage-1.9.0.dist-info/entry_points.txt,sha256=GAx0_i2OeZzqaiiiYuA-xchICDXiCT5kVqpKSxsOjt4,214
|
|
26
|
+
apache_airflow_providers_openlineage-1.9.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
|
27
|
+
apache_airflow_providers_openlineage-1.9.0.dist-info/METADATA,sha256=lhhju2QyGDIlIcT2_rnT4-JZIipJ-TCxlPJuTsopesI,6368
|
|
28
|
+
apache_airflow_providers_openlineage-1.9.0.dist-info/RECORD,,
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
airflow/providers/openlineage/LICENSE,sha256=ywUBpKZc7Jb96rVt5I3IDbg7dIJAbUSHkuoDcF3jbH4,13569
|
|
2
|
-
airflow/providers/openlineage/__init__.py,sha256=Y_3EiIS_TiqaVpc68HfekILHQRlsSGQLhs72joO7THg,1498
|
|
3
|
-
airflow/providers/openlineage/conf.py,sha256=wozXzU5Do9S0mtjjGc5ruF556G2-ZT4GJa3YLT_-Phg,4693
|
|
4
|
-
airflow/providers/openlineage/get_provider_info.py,sha256=ypUFlQXsC6s-cA7OdslwUaxhjaYIslbP_OILdb9CVNQ,7072
|
|
5
|
-
airflow/providers/openlineage/sqlparser.py,sha256=-FGWWK0Xu6XkGSXcfn7PXsWIe0Y0fwe-3hivHg7emLA,15308
|
|
6
|
-
airflow/providers/openlineage/extractors/__init__.py,sha256=I0X4f6zUniclyD9zT0DFHRImpCpJVP4MkPJT3cd7X5I,1081
|
|
7
|
-
airflow/providers/openlineage/extractors/base.py,sha256=o6z8bXwNor1hwcUzezJ8LIPynR_BqXkP-qtwEgLtD2Q,5476
|
|
8
|
-
airflow/providers/openlineage/extractors/bash.py,sha256=m4hLvDV4-zX4gp8apRuhpAR3Uakr8UOUxf-thTWmOxw,2563
|
|
9
|
-
airflow/providers/openlineage/extractors/manager.py,sha256=9TyszMLAsgPS9NETWq7fPJjxcbTFk47x4kd1NRGCvsw,10315
|
|
10
|
-
airflow/providers/openlineage/extractors/python.py,sha256=EQXCj2aHr2XXw0pNxeX-ii8UQFCoqkdf40ozqmA5d58,3151
|
|
11
|
-
airflow/providers/openlineage/plugins/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
|
12
|
-
airflow/providers/openlineage/plugins/adapter.py,sha256=d_HczG_nXMwAHdGD-CO4baVfCc9ROcY0zQUWIZRF_Sw,16917
|
|
13
|
-
airflow/providers/openlineage/plugins/facets.py,sha256=Z6dsz0rv-3VbRaGZJxW_T7Dak2k0ROGF0YrR_1awxZ0,2644
|
|
14
|
-
airflow/providers/openlineage/plugins/listener.py,sha256=LrqvvGL4nzMNeha6PVbtylxp8gru3iKrkQltuQD2k8o,14092
|
|
15
|
-
airflow/providers/openlineage/plugins/macros.py,sha256=QowPc9cc_unV-NLxBwm32OmWETA9pOucWguSeK92SSc,3076
|
|
16
|
-
airflow/providers/openlineage/plugins/openlineage.py,sha256=rsRUW_zpXVAglzsgQRv5T9VWYY7CMQl0qRWm8-3oqDA,1678
|
|
17
|
-
airflow/providers/openlineage/utils/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
|
18
|
-
airflow/providers/openlineage/utils/selective_enable.py,sha256=JVTmXdQknBL-9N0drFDkVMf1HCf8C6nbITVaP4-5ba4,3072
|
|
19
|
-
airflow/providers/openlineage/utils/sql.py,sha256=7tEK0zVfIe7v3NI6oyv62x0KAS3sl8Ajfhqob8MdiX8,9366
|
|
20
|
-
airflow/providers/openlineage/utils/utils.py,sha256=WFMdRsuArqqrgjsmFGb_ljIWV6ry-EGkTPZzy5aiG4Q,14036
|
|
21
|
-
apache_airflow_providers_openlineage-1.8.0rc1.dist-info/entry_points.txt,sha256=GAx0_i2OeZzqaiiiYuA-xchICDXiCT5kVqpKSxsOjt4,214
|
|
22
|
-
apache_airflow_providers_openlineage-1.8.0rc1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
|
23
|
-
apache_airflow_providers_openlineage-1.8.0rc1.dist-info/METADATA,sha256=ljCFvcM-Hj_8eX0og8NVnFDxfQHfPPZYnzEa85ov8tI,6381
|
|
24
|
-
apache_airflow_providers_openlineage-1.8.0rc1.dist-info/RECORD,,
|
|
File without changes
|