quollio-core 0.4.7__py3-none-any.whl → 0.4.10__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.
@@ -28,6 +28,12 @@ class SnowflakeQueryExecutor:
28
28
  def __init__(self, config: SnowflakeConnectionConfig) -> None:
29
29
  self.conn = self.__initialize(config)
30
30
 
31
+ def __enter__(self):
32
+ return self
33
+
34
+ def __exit__(self, exc_type, exc_value, traceback):
35
+ self.conn.close()
36
+
31
37
  def __initialize(self, config: SnowflakeConnectionConfig) -> SnowflakeConnection:
32
38
  conn: SnowflakeConnection = connect(
33
39
  user=config.account_user,
@@ -41,7 +47,6 @@ class SnowflakeQueryExecutor:
41
47
  return conn
42
48
 
43
49
  def get_query_results(self, query: str) -> List[Dict[str, str]]:
44
- logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(name)s - %(message)s")
45
50
  with self.conn.cursor(DictCursor) as cur:
46
51
  try:
47
52
  cur.execute(query)
quollio_core/snowflake.py CHANGED
@@ -4,6 +4,7 @@ import os
4
4
 
5
5
  from quollio_core.helper.core import setup_dbt_profile
6
6
  from quollio_core.helper.env_default import env_default
7
+ from quollio_core.helper.log import set_log_level
7
8
  from quollio_core.profilers.snowflake import (
8
9
  snowflake_column_to_column_lineage,
9
10
  snowflake_table_level_sqllineage,
@@ -21,7 +22,6 @@ def build_view(
21
22
  target_tables: str = "",
22
23
  log_level: str = "info",
23
24
  ) -> None:
24
- logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(name)s - %(message)s")
25
25
 
26
26
  logger.info("Build profiler views using dbt")
27
27
  # set parameters
@@ -72,22 +72,27 @@ def load_lineage(
72
72
  conn: snowflake.SnowflakeConnectionConfig,
73
73
  qdc_client: qdc.QDCExternalAPIClient,
74
74
  tenant_id: str,
75
+ enable_column_lineage: bool = False,
75
76
  ) -> None:
76
- logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(name)s - %(message)s")
77
-
78
77
  logger.info("Generate Snowflake table to table lineage.")
78
+
79
79
  snowflake_table_to_table_lineage(
80
80
  conn=conn,
81
81
  qdc_client=qdc_client,
82
82
  tenant_id=tenant_id,
83
83
  )
84
84
 
85
- logger.info("Generate Snowflake column to column lineage.")
86
- snowflake_column_to_column_lineage(
87
- conn=conn,
88
- qdc_client=qdc_client,
89
- tenant_id=tenant_id,
90
- )
85
+ if enable_column_lineage:
86
+ logger.info(
87
+ f"enable_column_lineage is set to {enable_column_lineage}.Generate Snowflake column to column lineage."
88
+ )
89
+ snowflake_column_to_column_lineage(
90
+ conn=conn,
91
+ qdc_client=qdc_client,
92
+ tenant_id=tenant_id,
93
+ )
94
+ else:
95
+ logger.info("Skip column lineage ingestion. Set enable_column_lineage to True if you ingest column lineage.")
91
96
 
92
97
  logger.info("Lineage data is successfully loaded.")
93
98
 
@@ -99,7 +104,6 @@ def load_stats(
99
104
  qdc_client: qdc.QDCExternalAPIClient,
100
105
  tenant_id: str,
101
106
  ) -> None:
102
- logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(name)s - %(message)s")
103
107
 
104
108
  logger.info("Generate Snowflake stats.")
105
109
  snowflake_table_stats(
@@ -118,7 +122,6 @@ def load_sqllineage(
118
122
  qdc_client: qdc.QDCExternalAPIClient,
119
123
  tenant_id: str,
120
124
  ) -> None:
121
- logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(name)s - %(message)s")
122
125
 
123
126
  logger.info("Generate Snowflake sqllineage.")
124
127
  snowflake_table_level_sqllineage(
@@ -264,7 +267,17 @@ if __name__ == "__main__":
264
267
  required=False,
265
268
  help="The client secrete that is created on Quollio console to let clients access Quollio External API",
266
269
  )
270
+ parser.add_argument(
271
+ "--enable_column_lineage",
272
+ type=bool,
273
+ action=env_default("ENABLE_COLUMN_LINEAGE", store_true=True),
274
+ default=False,
275
+ required=False,
276
+ help="Whether to ingest column lineage into QDIC or not. Default value is False",
277
+ )
267
278
  args = parser.parse_args()
279
+ set_log_level(level=args.log_level)
280
+
268
281
  conn = snowflake.SnowflakeConnectionConfig(
269
282
  account_id=args.account_id,
270
283
  account_user=args.user,
@@ -296,6 +309,7 @@ if __name__ == "__main__":
296
309
  conn=conn,
297
310
  qdc_client=qdc_client,
298
311
  tenant_id=args.tenant_id,
312
+ enable_column_lineage=args.enable_column_lineage,
299
313
  )
300
314
  if "load_stats" in args.commands:
301
315
  qdc_client = qdc.QDCExternalAPIClient(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: quollio-core
3
- Version: 0.4.7
3
+ Version: 0.4.10
4
4
  Summary: Quollio Core
5
5
  Author-email: quollio-dev <qt.dev@quollio.com>
6
6
  Maintainer-email: RyoAriyama <ryo.arym@gmail.com>, tharuta <35373297+TakumiHaruta@users.noreply.github.com>
@@ -79,7 +79,7 @@ To see available commands and options, please run the following command. (ex: Sn
79
79
  コマンドやオプションの詳細については、下記のコマンドを実行してください。(例: Snowflake)
80
80
 
81
81
  ```
82
- $ python3 -m quollio_core.snowflake -h
82
+ $ python -m quollio_core.snowflake -h
83
83
  ```
84
84
 
85
85
  Then run commands with the options provided.
@@ -1,8 +1,8 @@
1
- quollio_core/__init__.py,sha256=NxY4NXjq-cDnk10OtHZG-Gx7f8ZIkLwMASW4OojpfSQ,83
2
- quollio_core/bigquery.py,sha256=2DrUMo4evcH4BHiUtnY48IjmsdAsQMoPGtNx8SRoyzQ,3528
3
- quollio_core/bricks.py,sha256=3nxX5hul03Ac3r5BeoeHyK2XaSQq-tBsB9kMeiQ-A7k,8591
4
- quollio_core/redshift.py,sha256=wap7QmV-YuHZAomIrHXytGUuxhQ5MFEb38QDY3XrThQ,10167
5
- quollio_core/snowflake.py,sha256=8IMbdTjCDBIiS_GF8APWRTVWNj6EM3ZT8MRN12T-1v0,10266
1
+ quollio_core/__init__.py,sha256=MhFw5RS_znNS5UBo8a0yTwpAdCcNqqmg_G1rdQ4mDLE,84
2
+ quollio_core/bigquery.py,sha256=RguUznaY5YjROzJtXimoS8yCNH9jgGphpzd5v_JgSQM,3884
3
+ quollio_core/bricks.py,sha256=Lehv-qsBSMNNE9BGVvidGOXJsxLSSsbNtmiEZH4lSUg,9458
4
+ quollio_core/redshift.py,sha256=1d-mHnalB1jtiGPgzsGd3lRwLHCxaBJlUMEV2dh4f60,9882
5
+ quollio_core/snowflake.py,sha256=G3tImWbZgMlycYuw1b5WnNBp3zWo3hyrbOX5ARLIs7A,10585
6
6
  quollio_core/dbt_projects/databricks/.gitignore,sha256=1jJAyXSzJ3YUm0nx3i7wUSE4RjQMX3ad6F8O88UbtzI,29
7
7
  quollio_core/dbt_projects/databricks/README.md,sha256=ZpRQyhFAODAiS8dc1Kb_ndkul4cu4o4udN_EMa49CU4,440
8
8
  quollio_core/dbt_projects/databricks/dbt_project.yml,sha256=3sH98RNk7TnphvI3yEdXDstb92kW5BNxr-cT0tXhwzk,480
@@ -13,25 +13,25 @@ quollio_core/dbt_projects/databricks/macros/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5
13
13
  quollio_core/dbt_projects/databricks/models/quollio_lineage_column_level.sql,sha256=mZ4mDCEZTwiSgCUr-w2QGze2-NQapt45EyQNQkCOI5I,2171
14
14
  quollio_core/dbt_projects/databricks/models/quollio_lineage_column_level.yml,sha256=tidAK_FMhYYuPTxFoactwcXYQPSMZwQTxWrGBly4-1o,450
15
15
  quollio_core/dbt_projects/databricks/models/quollio_lineage_table_level.sql,sha256=K63J7n7NIM2Jc7c4IF21JcW8AYOm9HxBNDiveUE4kzU,1558
16
- quollio_core/dbt_projects/databricks/models/quollio_lineage_table_level.yml,sha256=ZGjz6C2bguDJxJyA7LhCHbuyZSRPEaRMXln9rxcotuo,344
16
+ quollio_core/dbt_projects/databricks/models/quollio_lineage_table_level.yml,sha256=0nQhdU5gBlHLAJHwsPotgCVrm6tReBdEdczvnxnvmpo,343
17
17
  quollio_core/dbt_projects/databricks/models/sources.yml,sha256=JXU-8lNsKm8dxIjmWos1vbTsWiea-9-pXnntik63ZpA,2231
18
18
  quollio_core/dbt_projects/databricks/profiles/profiles_template.yml,sha256=Dw1RuTrE04yvGIaPQL7uc6pgSWloKHhu0KrduzJ1Z6M,353
19
19
  quollio_core/dbt_projects/databricks/seeds/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  quollio_core/dbt_projects/databricks/snapshots/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  quollio_core/dbt_projects/redshift/README.md,sha256=55nDkX5uQXWmawpQbgG1hbyn64j_CegDBQddQ2C85C8,571
22
- quollio_core/dbt_projects/redshift/dbt_project.yml,sha256=WVCmT-2usdGSm6EBM6MCdzEeEFwv9ANsyknreoNXgBc,405
22
+ quollio_core/dbt_projects/redshift/dbt_project.yml,sha256=QhrNorlI8f2XjapyR-BZ5fYHGNKiPdk28hab9LObO1s,409
23
23
  quollio_core/dbt_projects/redshift/package-lock.yml,sha256=Gef3zDCLF41j_FL-_h3sIZOUVj6j7nTTvxXrQPLcBP0,109
24
24
  quollio_core/dbt_projects/redshift/packages.yml,sha256=p9Bl2C44gdC6iYTUkz_15yq3xahSJf2IA3WOXLF_ahA,61
25
25
  quollio_core/dbt_projects/redshift/analyses/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
26
  quollio_core/dbt_projects/redshift/macros/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- quollio_core/dbt_projects/redshift/macros/materialization/divided_view.sql,sha256=3tRQeXXdjn3aSZ94DgMN6A6yMlTCE8aMKXeIdcZVDIM,3998
27
+ quollio_core/dbt_projects/redshift/macros/materialization/divided_view.sql,sha256=rSKZJHpdU7vy0HvrI10nmnjFMkB5OI3oRmHfAvkjlyk,5686
28
28
  quollio_core/dbt_projects/redshift/models/quollio_lineage_table_level.sql,sha256=AVPcNXfVYHwyutJzg61QT_VF9umfoC4i8C2HecAU4d4,2042
29
29
  quollio_core/dbt_projects/redshift/models/quollio_lineage_table_level.yml,sha256=UcrXpUTT3ihBHKPljvjw8xHz-ND60PfvMJaXqGKOEic,236
30
30
  quollio_core/dbt_projects/redshift/models/quollio_lineage_view_level.sql,sha256=A0CTgQwlz8InabA0cHuygV2GMZGYuAa7Zd5DIUOYzQI,1289
31
31
  quollio_core/dbt_projects/redshift/models/quollio_lineage_view_level.yml,sha256=7Npwo3svL9715HpNU2MKzRI014Da4tIStLzAHmd0UaU,235
32
32
  quollio_core/dbt_projects/redshift/models/quollio_sqllineage_sources.sql,sha256=e0A_Wqv_OcC8gG_yzTbI59vT-4vCI3JiAzFlmkvLnMk,1049
33
33
  quollio_core/dbt_projects/redshift/models/quollio_sqllineage_sources.yml,sha256=qgazupx3ca4P8R0loY5F9hyCz2fmAcWqZ6iOySo_NoY,377
34
- quollio_core/dbt_projects/redshift/models/quollio_stats_columns.sql,sha256=lH8xPmAzSW-6wi_g1y_LFVhtFgHzBvTweVX-MKeJzUQ,302
34
+ quollio_core/dbt_projects/redshift/models/quollio_stats_columns.sql,sha256=BzvP9gKMFItmwqEQ4bDgtS-Invxhhe6L73Qe1ucxfHo,284
35
35
  quollio_core/dbt_projects/redshift/models/quollio_stats_columns.yml,sha256=V_BESPk6IqE52ExT26-78As9l9AlWW86-Geb5PIhThU,67
36
36
  quollio_core/dbt_projects/redshift/models/quollio_stats_profiling_columns.sql,sha256=IPmHf51Er2jE9cMQHybT4adRxwwi2CEmgrBSv1Oeduc,1592
37
37
  quollio_core/dbt_projects/redshift/models/quollio_stats_profiling_columns.yml,sha256=s-p9F44TdwoFYlQN-b9gHzcFYOMqhqDGA9ORS_M4lhs,523
@@ -46,14 +46,14 @@ quollio_core/dbt_projects/snowflake/package-lock.yml,sha256=Gef3zDCLF41j_FL-_h3s
46
46
  quollio_core/dbt_projects/snowflake/packages.yml,sha256=p9Bl2C44gdC6iYTUkz_15yq3xahSJf2IA3WOXLF_ahA,61
47
47
  quollio_core/dbt_projects/snowflake/analyses/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
48
  quollio_core/dbt_projects/snowflake/macros/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
- quollio_core/dbt_projects/snowflake/macros/materialization/divided_view.sql,sha256=340zvlJLDc_rE3W0GOuronKa42gqIElsHy41midkqyM,2783
49
+ quollio_core/dbt_projects/snowflake/macros/materialization/divided_view.sql,sha256=BC4fPMw2qEc39WeJbimalHeIj-klcDk1EF-zbcYfk0w,3704
50
50
  quollio_core/dbt_projects/snowflake/models/quollio_lineage_column_level.sql,sha256=Cxt2U2aXNG_LUm63jwTyxUkapkrB7_uHmesx1PTcMJM,4721
51
51
  quollio_core/dbt_projects/snowflake/models/quollio_lineage_column_level.yml,sha256=a2uNIAh-xw51eu-GmHVuAnGnTbwK7h8-DjDeQtK3KaQ,711
52
52
  quollio_core/dbt_projects/snowflake/models/quollio_lineage_table_level.sql,sha256=Q_7vY1N1Hi1LFv5CxkkdR3gQw8fTDnoKECTLSK4gd3o,5112
53
53
  quollio_core/dbt_projects/snowflake/models/quollio_lineage_table_level.yml,sha256=QXlMBIkHo1Y-ANveKVx1FwyoYTMRXKgE2Z-PNouhQTw,325
54
54
  quollio_core/dbt_projects/snowflake/models/quollio_sqllineage_sources.sql,sha256=gd6JhQO13xBIvOoeXcce1I7amNGytwE8pwUApXehwqM,1520
55
55
  quollio_core/dbt_projects/snowflake/models/quollio_sqllineage_sources.yml,sha256=qgazupx3ca4P8R0loY5F9hyCz2fmAcWqZ6iOySo_NoY,377
56
- quollio_core/dbt_projects/snowflake/models/quollio_stats_columns.sql,sha256=lH8xPmAzSW-6wi_g1y_LFVhtFgHzBvTweVX-MKeJzUQ,302
56
+ quollio_core/dbt_projects/snowflake/models/quollio_stats_columns.sql,sha256=BzvP9gKMFItmwqEQ4bDgtS-Invxhhe6L73Qe1ucxfHo,284
57
57
  quollio_core/dbt_projects/snowflake/models/quollio_stats_columns.yml,sha256=V_BESPk6IqE52ExT26-78As9l9AlWW86-Geb5PIhThU,67
58
58
  quollio_core/dbt_projects/snowflake/models/quollio_stats_profiling_columns.sql,sha256=ex5ax-KJoM_P1QspkolOUOQg9BazTdZO1Jllp08PQo8,2265
59
59
  quollio_core/dbt_projects/snowflake/models/quollio_stats_profiling_columns.yml,sha256=W39VAmFnnX6RBoW7B_4CConC1lm0Jm9o50Jsz9bYZzY,538
@@ -62,24 +62,25 @@ quollio_core/dbt_projects/snowflake/profiles/profiles_template.yml,sha256=gcZsgd
62
62
  quollio_core/dbt_projects/snowflake/seeds/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
63
  quollio_core/dbt_projects/snowflake/snapshots/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
64
  quollio_core/helper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
- quollio_core/helper/core.py,sha256=-3vCDlKExWPHJmWuZQNpYnvPP55uoGwRpTtnFvsDxIo,1127
66
- quollio_core/helper/env_default.py,sha256=YIL9hfrPs1ViL1AXohnbWEjVBUDXbVVakH0ZoSZWOlc,1202
65
+ quollio_core/helper/core.py,sha256=wbu4FWI7YiFEttXGSuj3tMyAhtPAFlHOjDpWJGNXOHA,1202
66
+ quollio_core/helper/env_default.py,sha256=H6gbSGUPrEDZr4YDrL49hbOpw6RntI4U82kX1q6vUnI,2148
67
+ quollio_core/helper/log.py,sha256=flxyZZ44G79l1TaUp3OT58uCHcnE5z_pCduwoeI6IUs,645
67
68
  quollio_core/profilers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
69
  quollio_core/profilers/bigquery.py,sha256=e1Y8cZR-LxI9mSsYb0DurQyy0eCjM_kAKLfvl4IuQLE,3262
69
- quollio_core/profilers/databricks.py,sha256=SAahPj1mbEuI3UI42J9ermrAyyZcl-a6ax0lqo71JDQ,7281
70
+ quollio_core/profilers/databricks.py,sha256=DkT7cLl7XvAfZ_vkgiiXIt6yoKpov4MAbgpzq-i1m1g,7282
70
71
  quollio_core/profilers/lineage.py,sha256=4FyxIuPBrUFihqZryqTQBcfB0Z7634lKl_WwkD82vzE,6865
71
- quollio_core/profilers/redshift.py,sha256=obdHVIsOM1bwHGdvYKalsJcTXwLK02kAKQMSBzSvsDo,7862
72
- quollio_core/profilers/snowflake.py,sha256=C1LC19ZaUMwNoXjsbnez0xANydJYs8oNRt6tixWKDq8,9090
73
- quollio_core/profilers/sqllineage.py,sha256=oCyl4tpXL5bkfguXAzTHSB9kZBL3tQK_rfcJ4XQMrLo,5177
72
+ quollio_core/profilers/redshift.py,sha256=6_4amsBL4QW0ZajWhS-TW3f_cjKKa6TpXClMgBC-fZo,6440
73
+ quollio_core/profilers/snowflake.py,sha256=nitlP5pmDm2RhLGO4f_WTzkw41EmOTY2uWN1HZkCHbI,8465
74
+ quollio_core/profilers/sqllineage.py,sha256=XkF7hwDWIGNtyEP5cv2wETBgMfdQxeHolv7qPIkntSQ,5066
74
75
  quollio_core/profilers/stats.py,sha256=PG1NbbUSpc1JuEYvBzD66rd24tp0C13_Y5Y7vRjYG1c,4720
75
76
  quollio_core/repository/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
77
  quollio_core/repository/bigquery.py,sha256=KMJTeF4OUxtaJt0ymoJ4tkrMKq8yLyMYaMxNvU5yd_Y,2271
77
- quollio_core/repository/databricks.py,sha256=m68tja5N-QxH3VqEq-mOJKBeR2qldSgj_L9iIxvWwm0,1945
78
- quollio_core/repository/dbt.py,sha256=HXqW_xa4xYPh9CnKkg4L1gwG3SGjj2BAYoWgzWMFU4U,770
79
- quollio_core/repository/qdc.py,sha256=VCmzAUvjLemw1os5TaPtfBFkMCOMuPeftjZmUPhFj2Y,4702
80
- quollio_core/repository/redshift.py,sha256=UVHIpYzDQ2AbBTAGa8DgmEenG0NZsHfYroR1MmEPQGA,2991
81
- quollio_core/repository/snowflake.py,sha256=1YVMDfb9euJKvikv1pk_IxVF6SVsiemSvZ-WMTSbY7E,1874
82
- quollio_core-0.4.7.dist-info/LICENSE,sha256=V8j_M8nAz8PvAOZQocyRDX7keai8UJ9skgmnwqETmdY,34520
83
- quollio_core-0.4.7.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
84
- quollio_core-0.4.7.dist-info/METADATA,sha256=GeVZJsz_V5scOtet3glilzvJsK30V4GH3T0bz5MBwaE,6804
85
- quollio_core-0.4.7.dist-info/RECORD,,
78
+ quollio_core/repository/databricks.py,sha256=9Cgdv8qBnVaHqu3RA-IUBieAqb69moQ-KAAMVSf5Ds4,1877
79
+ quollio_core/repository/dbt.py,sha256=cnLwJPywLi8VowVW7zfIBa9jxVwDWO7xzzNRn1vWiuw,659
80
+ quollio_core/repository/qdc.py,sha256=qEpMF6rKdic23dPJoDYmbIcyCKDuSFqbDF2_jqmqoZw,4369
81
+ quollio_core/repository/redshift.py,sha256=p2ouEuYcDCjx1oBhc6H1ekQsvEqHGd3bFu3PW0ngYBc,2880
82
+ quollio_core/repository/snowflake.py,sha256=J9rHshfWdOSnjQWxwGEYPpAU2lY7Tu5UFB_BNakkAX0,1892
83
+ quollio_core-0.4.10.dist-info/LICENSE,sha256=V8j_M8nAz8PvAOZQocyRDX7keai8UJ9skgmnwqETmdY,34520
84
+ quollio_core-0.4.10.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
85
+ quollio_core-0.4.10.dist-info/METADATA,sha256=QeostnBm-yqx48bVtcEaB6C-zIy9dCFwkVnm4sDIhlA,6804
86
+ quollio_core-0.4.10.dist-info/RECORD,,