apache-airflow-providers-fab 2.0.2rc1__py3-none-any.whl → 2.0.2rc2__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.
@@ -566,7 +566,7 @@ class FabAuthManager(BaseAuthManager[User]):
566
566
 
567
567
  if details and details.id:
568
568
  # Check whether the user has permissions to access a specific DAG
569
- resource_dag_name = self._resource_name(details.id, RESOURCE_DAG)
569
+ resource_dag_name = permissions.resource_name(details.id, RESOURCE_DAG)
570
570
  return self._is_authorized(method=method, resource_type=resource_dag_name, user=user)
571
571
 
572
572
  return False
@@ -592,7 +592,7 @@ class FabAuthManager(BaseAuthManager[User]):
592
592
 
593
593
  if details and details.id:
594
594
  # Check whether the user has permissions to access a specific DAG Run permission on a DAG Level
595
- resource_dag_name = self._resource_name(details.id, RESOURCE_DAG_RUN)
595
+ resource_dag_name = permissions.resource_name(details.id, RESOURCE_DAG_RUN)
596
596
  return self._is_authorized(method=method, resource_type=resource_dag_name, user=user)
597
597
 
598
598
  return False
@@ -624,19 +624,6 @@ class FabAuthManager(BaseAuthManager[User]):
624
624
  raise AirflowException(f"Unknown DAG access entity: {dag_access_entity}")
625
625
  return _MAP_DAG_ACCESS_ENTITY_TO_FAB_RESOURCE_TYPE[dag_access_entity]
626
626
 
627
- def _resource_name(self, dag_id: str, resource_type: str) -> str:
628
- """
629
- Return the FAB resource name for a DAG id.
630
-
631
- :param dag_id: the DAG id
632
-
633
- :meta private:
634
- """
635
- root_dag_id = self._get_root_dag_id(dag_id)
636
- if hasattr(permissions, "resource_name"):
637
- return getattr(permissions, "resource_name")(root_dag_id, resource_type)
638
- return getattr(permissions, "resource_name_for_dag")(root_dag_id)
639
-
640
627
  @staticmethod
641
628
  def _get_user_permissions(user: User):
642
629
  """
@@ -651,23 +638,6 @@ class FabAuthManager(BaseAuthManager[User]):
651
638
  return []
652
639
  return getattr(user, "perms") or []
653
640
 
654
- def _get_root_dag_id(self, dag_id: str) -> str:
655
- """
656
- Return the root DAG id in case of sub DAG, return the DAG id otherwise.
657
-
658
- :param dag_id: the DAG id
659
-
660
- :meta private:
661
- """
662
- if not self.appbuilder:
663
- raise AirflowException("AppBuilder is not initialized.")
664
-
665
- if "." in dag_id and hasattr(DagModel, "root_dag_id"):
666
- return self.appbuilder.get_session.scalar(
667
- select(DagModel.dag_id, DagModel.root_dag_id).where(DagModel.dag_id == dag_id).limit(1)
668
- )
669
- return dag_id
670
-
671
641
  def _sync_appbuilder_roles(self):
672
642
  """
673
643
  Sync appbuilder roles to DB.
@@ -921,15 +921,14 @@ class FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
921
921
  dags = dagbag.dags.values()
922
922
 
923
923
  for dag in dags:
924
- root_dag_id = dag.dag_id
925
924
  for resource_name, resource_values in self.RESOURCE_DETAILS_MAP.items():
926
- dag_resource_name = self._resource_name(root_dag_id, resource_name)
925
+ dag_resource_name = permissions.resource_name(dag.dag_id, resource_name)
927
926
  for action_name in resource_values["actions"]:
928
927
  if (action_name, dag_resource_name) not in perms:
929
928
  self._merge_perm(action_name, dag_resource_name)
930
929
 
931
930
  if dag.access_control is not None:
932
- self.sync_perm_for_dag(root_dag_id, dag.access_control)
931
+ self.sync_perm_for_dag(dag.dag_id, dag.access_control)
933
932
 
934
933
  def sync_perm_for_dag(
935
934
  self,
@@ -949,7 +948,7 @@ class FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
949
948
  :return:
950
949
  """
951
950
  for resource_name, resource_values in self.RESOURCE_DETAILS_MAP.items():
952
- dag_resource_name = self._resource_name(dag_id, resource_name)
951
+ dag_resource_name = permissions.resource_name(dag_id, resource_name)
953
952
  for dag_action_name in resource_values["actions"]:
954
953
  self.create_permission(dag_action_name, dag_resource_name)
955
954
 
@@ -962,17 +961,6 @@ class FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
962
961
  dag_id,
963
962
  )
964
963
 
965
- def _resource_name(self, dag_id: str, resource_name: str) -> str:
966
- """
967
- Get the resource name from permissions.
968
-
969
- This method is to keep compatibility with new FAB versions
970
- running with old airflow versions.
971
- """
972
- if hasattr(permissions, "resource_name"):
973
- return getattr(permissions, "resource_name")(dag_id, resource_name)
974
- return getattr(permissions, "resource_name_for_dag")(dag_id)
975
-
976
964
  def _sync_dag_view_permissions(
977
965
  self,
978
966
  dag_id: str,
@@ -1000,7 +988,7 @@ class FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
1000
988
 
1001
989
  # Revoking stale permissions for all possible DAG level resources
1002
990
  for resource_name in self.RESOURCE_DETAILS_MAP.keys():
1003
- dag_resource_name = self._resource_name(dag_id, resource_name)
991
+ dag_resource_name = permissions.resource_name(dag_id, resource_name)
1004
992
  if resource := self.get_resource(dag_resource_name):
1005
993
  existing_dag_perms = self.get_resource_permissions(resource)
1006
994
  for perm in existing_dag_perms:
@@ -1043,7 +1031,7 @@ class FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
1043
1031
  f"The set of valid resource names is: {self.RESOURCE_DETAILS_MAP.keys()}"
1044
1032
  )
1045
1033
 
1046
- dag_resource_name = self._resource_name(dag_id, resource_name)
1034
+ dag_resource_name = permissions.resource_name(dag_id, resource_name)
1047
1035
  self.log.debug("Syncing DAG-level permissions for DAG '%s'", dag_resource_name)
1048
1036
 
1049
1037
  invalid_actions = set(actions) - self.RESOURCE_DETAILS_MAP[resource_name]["actions"]
@@ -33,10 +33,10 @@
33
33
  "moment": "^2.29.4",
34
34
  "moment-locales-webpack-plugin": "^1.2.0",
35
35
  "prettier": "^3.5.3",
36
- "stylelint": "^16.19.0",
36
+ "stylelint": "^16.19.1",
37
37
  "terser-webpack-plugin": "<6.0.0",
38
38
  "url-loader": "4.1.1",
39
- "webpack": "^5.99.6",
39
+ "webpack": "^5.99.7",
40
40
  "webpack-cli": "^6.0.1",
41
41
  "webpack-license-plugin": "^4.2.1",
42
42
  "webpack-manifest-plugin": "^5.0.1"
@@ -7445,9 +7445,9 @@
7445
7445
  "dev": true
7446
7446
  },
7447
7447
  "node_modules/schema-utils": {
7448
- "version": "4.3.0",
7449
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
7450
- "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
7448
+ "version": "4.3.2",
7449
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz",
7450
+ "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
7451
7451
  "dev": true,
7452
7452
  "license": "MIT",
7453
7453
  "dependencies": {
@@ -7882,9 +7882,9 @@
7882
7882
  }
7883
7883
  },
7884
7884
  "node_modules/stylelint": {
7885
- "version": "16.19.0",
7886
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.19.0.tgz",
7887
- "integrity": "sha512-BJzc5mo/ez0H/ZSl3UbxGdkK/s0kFGsF5/k6IGu4z8wJ1qp49WrOS9RxswvcN6HMirt0g/iiJqOwLHTbWv49IQ==",
7885
+ "version": "16.19.1",
7886
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.19.1.tgz",
7887
+ "integrity": "sha512-C1SlPZNMKl+d/C867ZdCRthrS+6KuZ3AoGW113RZCOL0M8xOGpgx7G70wq7lFvqvm4dcfdGFVLB/mNaLFChRKw==",
7888
7888
  "dev": true,
7889
7889
  "funding": [
7890
7890
  {
@@ -8603,14 +8603,15 @@
8603
8603
  }
8604
8604
  },
8605
8605
  "node_modules/webpack": {
8606
- "version": "5.99.6",
8607
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.6.tgz",
8608
- "integrity": "sha512-TJOLrJ6oeccsGWPl7ujCYuc0pIq2cNsuD6GZDma8i5o5Npvcco/z+NKvZSFsP0/x6SShVb0+X2JK/JHUjKY9dQ==",
8606
+ "version": "5.99.7",
8607
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.7.tgz",
8608
+ "integrity": "sha512-CNqKBRMQjwcmKR0idID5va1qlhrqVUKpovi+Ec79ksW8ux7iS1+A6VqzfZXgVYCFRKl7XL5ap3ZoMpwBJxcg0w==",
8609
8609
  "dev": true,
8610
8610
  "license": "MIT",
8611
8611
  "dependencies": {
8612
8612
  "@types/eslint-scope": "^3.7.7",
8613
8613
  "@types/estree": "^1.0.6",
8614
+ "@types/json-schema": "^7.0.15",
8614
8615
  "@webassemblyjs/ast": "^1.14.1",
8615
8616
  "@webassemblyjs/wasm-edit": "^1.14.1",
8616
8617
  "@webassemblyjs/wasm-parser": "^1.14.1",
@@ -8627,7 +8628,7 @@
8627
8628
  "loader-runner": "^4.2.0",
8628
8629
  "mime-types": "^2.1.27",
8629
8630
  "neo-async": "^2.6.2",
8630
- "schema-utils": "^4.3.0",
8631
+ "schema-utils": "^4.3.2",
8631
8632
  "tapable": "^2.1.1",
8632
8633
  "terser-webpack-plugin": "^5.3.11",
8633
8634
  "watchpack": "^2.4.1",
@@ -59,10 +59,10 @@
59
59
  "moment": "^2.29.4",
60
60
  "moment-locales-webpack-plugin": "^1.2.0",
61
61
  "prettier": "^3.5.3",
62
- "stylelint": "^16.19.0",
62
+ "stylelint": "^16.19.1",
63
63
  "terser-webpack-plugin": "<6.0.0",
64
64
  "url-loader": "4.1.1",
65
- "webpack": "^5.99.6",
65
+ "webpack": "^5.99.7",
66
66
  "webpack-cli": "^6.0.1",
67
67
  "webpack-license-plugin": "^4.2.1",
68
68
  "webpack-manifest-plugin": "^5.0.1"
@@ -101,16 +101,3 @@ def resource_name(root_dag_id: str, resource: str) -> str:
101
101
  if root_dag_id.startswith(tuple(PREFIX_RESOURCES_MAP.keys())):
102
102
  return root_dag_id
103
103
  return f"{RESOURCE_DETAILS_MAP[resource]['prefix']}{root_dag_id}"
104
-
105
-
106
- def resource_name_for_dag(root_dag_id: str) -> str:
107
- """
108
- Return the resource name for a DAG id.
109
-
110
- Note: This function is kept for backwards compatibility.
111
- """
112
- if root_dag_id == RESOURCE_DAG:
113
- return root_dag_id
114
- if root_dag_id.startswith(RESOURCE_DAG_PREFIX):
115
- return root_dag_id
116
- return f"{RESOURCE_DAG_PREFIX}{root_dag_id}"
@@ -70,7 +70,7 @@ class FabIndexView(IndexView):
70
70
  token = get_auth_manager().generate_jwt(g.user)
71
71
  response = make_response(redirect(f"{conf.get('api', 'base_url', fallback='/')}", code=302))
72
72
 
73
- secure = conf.has_option("api", "ssl_cert")
73
+ secure = bool(conf.get("api", "ssl_cert", fallback=""))
74
74
  response.set_cookie(COOKIE_NAME_JWT_TOKEN, token, secure=secure)
75
75
 
76
76
  return response
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-fab
3
- Version: 2.0.2rc1
3
+ Version: 2.0.2rc2
4
4
  Summary: Provider package apache-airflow-providers-fab for Apache Airflow
5
5
  Keywords: airflow-provider,fab,airflow,integration
6
6
  Author-email: Apache Software Foundation <dev@airflow.apache.org>
@@ -22,8 +22,8 @@ Classifier: Programming Language :: Python :: 3.12
22
22
  Classifier: Topic :: System :: Monitoring
23
23
  License-File: 3rd-party-licenses/LICENSES-ui.txt
24
24
  License-File: NOTICE
25
- Requires-Dist: apache-airflow>=3.0.0rc0
26
- Requires-Dist: apache-airflow-providers-common-compat>=1.2.1rc0
25
+ Requires-Dist: apache-airflow>=3.0.0rc1
26
+ Requires-Dist: apache-airflow-providers-common-compat>=1.2.1rc1
27
27
  Requires-Dist: blinker>=1.6.2
28
28
  Requires-Dist: flask>=2.2.1,<2.3
29
29
  Requires-Dist: flask-appbuilder==4.5.3
@@ -3,7 +3,7 @@ airflow/providers/fab/__init__.py,sha256=FhqpesgH8rXzZCFWzwQHU_EyIobGCvZ_SWN2Sbv
3
3
  airflow/providers/fab/alembic.ini,sha256=_1SvObfjMAkuD7DN5VR2S6Rd7_F81pORZT-w7GJldIA,4461
4
4
  airflow/providers/fab/get_provider_info.py,sha256=I1fRKp4u-vUmSjoVyFmdD_spXfWhmdIqtlnWe2F5m40,5149
5
5
  airflow/providers/fab/auth_manager/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
6
- airflow/providers/fab/auth_manager/fab_auth_manager.py,sha256=4auEloL69uQOkeD1FmNHEqNcgoXm_pjNeyOvQHuTPXc,25779
6
+ airflow/providers/fab/auth_manager/fab_auth_manager.py,sha256=i86cabdyA22N6qtmE0YDhDeBZTVoYhzEJHLS20aYfZU,24749
7
7
  airflow/providers/fab/auth_manager/api/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
8
8
  airflow/providers/fab/auth_manager/api/auth/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
9
9
  airflow/providers/fab/auth_manager/api/auth/backend/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
@@ -39,7 +39,7 @@ airflow/providers/fab/auth_manager/schemas/role_and_permission_schema.py,sha256=
39
39
  airflow/providers/fab/auth_manager/schemas/user_schema.py,sha256=MLnZotQqAg_BFvJunrSwbwur5CaTjk1ww3eCI3aPT6Y,2401
40
40
  airflow/providers/fab/auth_manager/security_manager/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
41
41
  airflow/providers/fab/auth_manager/security_manager/constants.py,sha256=x1Sjl_Mu3wmaSy3NFZlHxK2z-juzWmMs1SrzJ0aiBBQ,907
42
- airflow/providers/fab/auth_manager/security_manager/override.py,sha256=oHNQiDxbDIUYbeZ3JBt_W1V0qLwKdG__z4gT6Ul6Fzo,97105
42
+ airflow/providers/fab/auth_manager/security_manager/override.py,sha256=FJASD5Bi9USIjNDqMgal_PW7zwQ0weCc3hLTbngcAJ4,96637
43
43
  airflow/providers/fab/auth_manager/views/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
44
44
  airflow/providers/fab/auth_manager/views/permissions.py,sha256=CT6jMCDHtirs0Qe4Penb6VwQq1yZeZ1lOLZITIlVqm4,2904
45
45
  airflow/providers/fab/auth_manager/views/roles_list.py,sha256=DwJ1iOCfpbxsWTEFWjW5_Jo3fmrZwxj1rPeflTaSg7A,1512
@@ -57,13 +57,13 @@ airflow/providers/fab/www/airflow_flask_app.py,sha256=-JPQ-mS1kKEj5adENnoVSD4LaF
57
57
  airflow/providers/fab/www/app.py,sha256=RhUCSxS4Sivwu7aeLOqIVADszBh9uWOs1oni99FY9Rk,4951
58
58
  airflow/providers/fab/www/auth.py,sha256=1oLlJybsjOqxhcmD_Rbtcg5nQySmfArJnIw7jq09V18,12615
59
59
  airflow/providers/fab/www/constants.py,sha256=VUg48B-EZAUZ2IIdmL31Iv0lRlP0yLNPNTufB7rsWr0,1352
60
- airflow/providers/fab/www/package-lock.json,sha256=dgIF_T3YGq6ADZI5dN2eeSXP7hONiZqB0YlCPdV0QXw,328252
61
- airflow/providers/fab/www/package.json,sha256=UaH_5jXLcgRDEVZ5F58agdwk9cW4CQqnML3pVP8bdtg,2357
60
+ airflow/providers/fab/www/package-lock.json,sha256=3y4hjd70s6mN4F2BL2uj-TUFju-iOslcKeOFGhWcnb4,328293
61
+ airflow/providers/fab/www/package.json,sha256=0iBaCW_DfhW3OBDyeuytFOyOn1VsjLPkquPguT9rw8E,2357
62
62
  airflow/providers/fab/www/security_appless.py,sha256=J0OJGRPq6NK2vY6qfMRvyMUEc-E59vXucquQdjgsndY,1655
63
63
  airflow/providers/fab/www/security_manager.py,sha256=Zr6xqjego7Z1-1h2HHyWLt1ZBKG8yHHmNPfEXNxXaRY,4850
64
64
  airflow/providers/fab/www/session.py,sha256=qyy8ipXLe4qH7D52tH3aKY6hyJNJ5tUfHel7_1S4BGg,1741
65
65
  airflow/providers/fab/www/utils.py,sha256=9D_ESPV6ar5GOenD2Jm-lS7pW78yzxCWC5N-3kgMem8,9982
66
- airflow/providers/fab/www/views.py,sha256=dB7kPNxFhT6nwrPuRbp5Wwebuc0DJemmO2oiCFR_oRI,4746
66
+ airflow/providers/fab/www/views.py,sha256=tVQ9PTcafyoTdMQ5mvmp0kjlVrkC6Zof4yfB9nlz8tE,4758
67
67
  airflow/providers/fab/www/webpack.config.js,sha256=_TYJ8cnmJW0vxb87xY4eNr9ZE7G5NFUPuiXvpF6SKys,6124
68
68
  airflow/providers/fab/www/api_connexion/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
69
69
  airflow/providers/fab/www/api_connexion/exceptions.py,sha256=j0S90JH6Q5hnkshfiZot7Yb9hAvFs1JON0EYjW2bxW0,5783
@@ -78,7 +78,7 @@ airflow/providers/fab/www/extensions/init_security.py,sha256=sDwMjNMMQgyn2tsQAVk
78
78
  airflow/providers/fab/www/extensions/init_session.py,sha256=y8zUVSngawNhkO4egEkhrQ_2v03wCeDjm8LUaNY0sZ8,2637
79
79
  airflow/providers/fab/www/extensions/init_views.py,sha256=4zFnPwFhO3wfqnDDvsRgeU5jjy2JImgMia-flg6BZgQ,6411
80
80
  airflow/providers/fab/www/security/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
81
- airflow/providers/fab/www/security/permissions.py,sha256=ILDlhM1Q64OrxSaBgM----gZdQyzID3edGVZKsw3NBM,4107
81
+ airflow/providers/fab/www/security/permissions.py,sha256=A9WTtY7uUDOOEwIQyVu6h6ql3uFBx2HTxZ10itHJwL4,3741
82
82
  airflow/providers/fab/www/static/sort_asc.png,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
83
  airflow/providers/fab/www/static/sort_both.png,sha256=PgFsI65RQXOCtkCuLRnrSAR1MsN61TiUvRhVhlWcz_s,201
84
84
  airflow/providers/fab/www/static/sort_desc.png,sha256=0I7Q4h8YfdMJAw1GUiTagIURmhWhfWFroOR3u1DG8Q0,158
@@ -119,9 +119,9 @@ airflow/providers/fab/www/templates/appbuilder/index.html,sha256=ZaZsNdD8fCENqdn
119
119
  airflow/providers/fab/www/templates/appbuilder/navbar.html,sha256=1Q8u90aONY_PKTBtApwyp0EeudSsJyysW2UYo9Fa1cc,10215
120
120
  airflow/providers/fab/www/templates/appbuilder/navbar_menu.html,sha256=WWQ-_QLMqcW4Cpx_1_yulaQO-soD6ztnY2zfmBAUAGI,2034
121
121
  airflow/providers/fab/www/templates/appbuilder/navbar_right.html,sha256=qrwZDBbzLi4yhLrfai842MJDdQ4C31Xz9hJ3NoG5mo0,2488
122
- apache_airflow_providers_fab-2.0.2rc1.dist-info/entry_points.txt,sha256=m05kASp7vFi0ZmQ--CFp7GeJpPL7UT2RQF8EEP5XRX8,99
123
- apache_airflow_providers_fab-2.0.2rc1.dist-info/licenses/3rd-party-licenses/LICENSES-ui.txt,sha256=C9vBr_KiUhI3jjCS754n_SPi-ylD8SiJgXlOWuNOO98,3688
124
- apache_airflow_providers_fab-2.0.2rc1.dist-info/licenses/NOTICE,sha256=GrKwLaFNGIn3J86ucRfNIExRSCD6-7nty84-84F2ad4,448
125
- apache_airflow_providers_fab-2.0.2rc1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
126
- apache_airflow_providers_fab-2.0.2rc1.dist-info/METADATA,sha256=p8L7qB-RbD5VmhKJVhlI_9kivp03ak2TRTk5E4nkylE,6156
127
- apache_airflow_providers_fab-2.0.2rc1.dist-info/RECORD,,
122
+ apache_airflow_providers_fab-2.0.2rc2.dist-info/entry_points.txt,sha256=m05kASp7vFi0ZmQ--CFp7GeJpPL7UT2RQF8EEP5XRX8,99
123
+ apache_airflow_providers_fab-2.0.2rc2.dist-info/licenses/3rd-party-licenses/LICENSES-ui.txt,sha256=C9vBr_KiUhI3jjCS754n_SPi-ylD8SiJgXlOWuNOO98,3688
124
+ apache_airflow_providers_fab-2.0.2rc2.dist-info/licenses/NOTICE,sha256=GrKwLaFNGIn3J86ucRfNIExRSCD6-7nty84-84F2ad4,448
125
+ apache_airflow_providers_fab-2.0.2rc2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
126
+ apache_airflow_providers_fab-2.0.2rc2.dist-info/METADATA,sha256=JD8KwsxWzkrNXJbAGAR28Btz7eQpYzZON0z-ZpI-IWc,6156
127
+ apache_airflow_providers_fab-2.0.2rc2.dist-info/RECORD,,