mlrun 1.10.0rc32__py3-none-any.whl → 1.10.0rc33__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 mlrun might be problematic. Click here for more details.

@@ -18,7 +18,7 @@ import pydantic.v1
18
18
 
19
19
 
20
20
  class PipelinesPagination(str):
21
- default_page_size = 20
21
+ default_page_size = 200
22
22
  # https://github.com/kubeflow/pipelines/blob/master/backend/src/apiserver/list/list.go#L363
23
23
  max_page_size = 200
24
24
 
@@ -182,7 +182,7 @@ def run_function(
182
182
  The `count` field in the `Retry` object specifies the number of retry attempts.
183
183
  If `count=0`, the run will not be retried.
184
184
  The `backoff` field specifies the retry backoff strategy between retry attempts.
185
- If not provided, no backoff is applied.
185
+ If not provided, the default backoff delay is 30 seconds.
186
186
  :return: MLRun RunObject or PipelineNodeWrapper
187
187
  """
188
188
  if artifact_path:
mlrun/projects/project.py CHANGED
@@ -4109,7 +4109,7 @@ class MlrunProject(ModelObj):
4109
4109
  The `count` field in the `Retry` object specifies the number of retry attempts.
4110
4110
  If `count=0`, the run will not be retried.
4111
4111
  The `backoff` field specifies the retry backoff strategy between retry attempts.
4112
- If not provided, no backoff is applied.
4112
+ If not provided, the default backoff delay is 30 seconds.
4113
4113
  :return: MLRun RunObject or PipelineNodeWrapper
4114
4114
  """
4115
4115
  if artifact_path:
mlrun/runtimes/base.py CHANGED
@@ -381,7 +381,7 @@ class BaseRuntime(ModelObj):
381
381
  The `count` field in the `Retry` object specifies the number of retry attempts.
382
382
  If `count=0`, the run will not be retried.
383
383
  The `backoff` field specifies the retry backoff strategy between retry attempts.
384
- If not provided, no backoff is applied.
384
+ If not provided, the default backoff delay is 30 seconds.
385
385
  :return: Run context object (RunObject) with run metadata, results and status
386
386
  """
387
387
  if artifact_path or out_path:
mlrun/runtimes/utils.py CHANGED
@@ -448,22 +448,45 @@ def enrich_function_from_dict(function, function_dict):
448
448
  return function
449
449
 
450
450
 
451
+ def resolve_owner(
452
+ labels: dict,
453
+ owner_to_enrich: Optional[str] = None,
454
+ ):
455
+ """
456
+ Resolve the owner label value
457
+ :param labels: The run labels dict
458
+ :param auth_username: The authenticated username
459
+ :return: The resolved owner label value
460
+ """
461
+
462
+ if owner_to_enrich and (
463
+ labels.get("job-type") == mlrun.common.constants.JOB_TYPE_WORKFLOW_RUNNER
464
+ or labels.get("job-type")
465
+ == mlrun.common.constants.JOB_TYPE_RERUN_WORKFLOW_RUNNER
466
+ ):
467
+ return owner_to_enrich
468
+ else:
469
+ return os.environ.get("V3IO_USERNAME") or getpass.getuser()
470
+
471
+
451
472
  def enrich_run_labels(
452
473
  labels: dict,
453
474
  labels_to_enrich: Optional[list[mlrun_constants.MLRunInternalLabels]] = None,
475
+ owner_to_enrich: Optional[str] = None,
454
476
  ):
455
477
  """
456
- Enrich the run labels with the internal labels and the labels enrichment extension
478
+ Enrich the run labels with the internal labels and the labels enrichment extension.
457
479
  :param labels: The run labels dict
458
480
  :param labels_to_enrich: The label keys to enrich from MLRunInternalLabels.default_run_labels_to_enrich
481
+ :param owner_to_enrich: Optional owner to enrich the labels with, if not provided will try to resolve it.
459
482
  :return: The enriched labels dict
460
483
  """
461
484
  # Merge the labels with the labels enrichment extension
462
485
  labels_enrichment = {
463
- mlrun_constants.MLRunInternalLabels.owner: os.environ.get("V3IO_USERNAME")
464
- or getpass.getuser(),
486
+ mlrun_constants.MLRunInternalLabels.owner: resolve_owner(
487
+ labels, owner_to_enrich
488
+ ),
465
489
  }
466
-
467
490
  # Resolve which label keys to enrich
468
491
  if labels_to_enrich is None:
469
492
  labels_to_enrich = (
mlrun/utils/helpers.py CHANGED
@@ -45,7 +45,6 @@ import pytz
45
45
  import semver
46
46
  import yaml
47
47
  from dateutil import parser
48
- from orjson import orjson
49
48
  from pandas import Timedelta, Timestamp
50
49
  from yaml.representer import RepresenterError
51
50
 
@@ -503,9 +502,14 @@ def get_in(obj, keys, default=None):
503
502
  if isinstance(keys, str):
504
503
  keys = keys.split(".")
505
504
  for key in keys:
506
- if not obj or key not in obj:
505
+ if obj is None:
507
506
  return default
508
- obj = obj[key]
507
+ if isinstance(obj, dict):
508
+ if key not in obj:
509
+ return default
510
+ obj = obj[key]
511
+ else:
512
+ obj = getattr(obj, key, default)
509
513
  return obj
510
514
 
511
515
 
@@ -1218,61 +1222,6 @@ def get_workflow_url(
1218
1222
  return url
1219
1223
 
1220
1224
 
1221
- def get_kfp_list_runs_filter(
1222
- start_date: Optional[str] = None,
1223
- end_date: Optional[str] = None,
1224
- filter_: Optional[str] = None,
1225
- experiment_ids: Optional[list[str]] = None,
1226
- ) -> str:
1227
- """
1228
- Generate a filter for KFP runs based on start and end dates, and experiment IDs.
1229
- """
1230
- existing_filter_object = json.loads(filter_) if filter_ else {"predicates": []}
1231
- preserved_predicates = [
1232
- predicate
1233
- for predicate in existing_filter_object.get("predicates", [])
1234
- if predicate.get("key") != "name"
1235
- ]
1236
-
1237
- new_predicates = []
1238
- if end_date:
1239
- new_predicates.append(
1240
- {
1241
- "key": mlrun_pipelines.models.FilterFields.CREATED_AT,
1242
- "op": mlrun_pipelines.models.FilterOperations.LESS_THAN_EQUALS.value,
1243
- "timestamp_value": end_date,
1244
- }
1245
- )
1246
-
1247
- if start_date:
1248
- new_predicates.append(
1249
- {
1250
- "key": mlrun_pipelines.models.FilterFields.CREATED_AT,
1251
- "op": mlrun_pipelines.models.FilterOperations.GREATER_THAN_EQUALS.value,
1252
- "timestamp_value": start_date,
1253
- }
1254
- )
1255
-
1256
- if experiment_ids and all(experiment_ids):
1257
- new_predicates.append(
1258
- {
1259
- "key": mlrun_pipelines.models.FilterFields.EXPERIMENT_ID,
1260
- "op": mlrun_pipelines.models.FilterOperations.IN.value,
1261
- "string_values": {"values": experiment_ids},
1262
- }
1263
- )
1264
-
1265
- final_filter_object = {"predicates": preserved_predicates + new_predicates}
1266
- if not final_filter_object["predicates"]:
1267
- return ""
1268
-
1269
- logger.debug(
1270
- "Generated KFP runs filter",
1271
- filter_object_with_predicates=final_filter_object,
1272
- )
1273
- return orjson.dumps(final_filter_object).decode()
1274
-
1275
-
1276
1225
  def validate_and_convert_date(date_input: str) -> str:
1277
1226
  """
1278
1227
  Converts any recognizable date string into a standardized RFC 3339 format.
@@ -1,4 +1,4 @@
1
1
  {
2
- "git_commit": "3aef2d331a6fdb0ab3c8584cc05f50ae58053cb9",
3
- "version": "1.10.0-rc32"
2
+ "git_commit": "f4d56eca3901844a2deda33bff864e8cf20cf032",
3
+ "version": "1.10.0-rc33"
4
4
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mlrun
3
- Version: 1.10.0rc32
3
+ Version: 1.10.0rc33
4
4
  Summary: Tracking and config of machine learning runs
5
5
  Home-page: https://github.com/mlrun/mlrun
6
6
  Author: Yaron Haviv
@@ -91,10 +91,10 @@ Requires-Dist: databricks-sdk~=0.20.0; extra == "databricks-sdk"
91
91
  Provides-Extra: sqlalchemy
92
92
  Requires-Dist: sqlalchemy~=2.0; extra == "sqlalchemy"
93
93
  Provides-Extra: dask
94
- Requires-Dist: dask>=2023.12.1; python_version < "3.11" and extra == "dask"
95
- Requires-Dist: dask>=2024.8; python_version >= "3.11" and extra == "dask"
96
- Requires-Dist: distributed>=2023.12.1; python_version < "3.11" and extra == "dask"
97
- Requires-Dist: distributed>=2024.8; python_version >= "3.11" and extra == "dask"
94
+ Requires-Dist: dask~=2023.12.1; python_version < "3.11" and extra == "dask"
95
+ Requires-Dist: dask==2024.8; python_version >= "3.11" and extra == "dask"
96
+ Requires-Dist: distributed~=2023.12.1; python_version < "3.11" and extra == "dask"
97
+ Requires-Dist: distributed==2024.8; python_version >= "3.11" and extra == "dask"
98
98
  Provides-Extra: alibaba-oss
99
99
  Requires-Dist: ossfs==2025.5.0; extra == "alibaba-oss"
100
100
  Requires-Dist: oss2==2.18.4; extra == "alibaba-oss"
@@ -132,11 +132,11 @@ Requires-Dist: azure-core~=1.24; extra == "all"
132
132
  Requires-Dist: azure-identity~=1.5; extra == "all"
133
133
  Requires-Dist: azure-keyvault-secrets~=4.2; extra == "all"
134
134
  Requires-Dist: boto3<1.36,>=1.28.0; extra == "all"
135
- Requires-Dist: dask>=2023.12.1; python_version < "3.11" and extra == "all"
136
- Requires-Dist: dask>=2024.8; python_version >= "3.11" and extra == "all"
135
+ Requires-Dist: dask==2024.8; python_version >= "3.11" and extra == "all"
136
+ Requires-Dist: dask~=2023.12.1; python_version < "3.11" and extra == "all"
137
137
  Requires-Dist: databricks-sdk~=0.20.0; extra == "all"
138
- Requires-Dist: distributed>=2023.12.1; python_version < "3.11" and extra == "all"
139
- Requires-Dist: distributed>=2024.8; python_version >= "3.11" and extra == "all"
138
+ Requires-Dist: distributed==2024.8; python_version >= "3.11" and extra == "all"
139
+ Requires-Dist: distributed~=2023.12.1; python_version < "3.11" and extra == "all"
140
140
  Requires-Dist: gcsfs<=2025.7.0,>=2025.5.1; extra == "all"
141
141
  Requires-Dist: google-cloud-bigquery-storage~=2.17; extra == "all"
142
142
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas]==3.14.1; extra == "all"
@@ -163,11 +163,11 @@ Requires-Dist: azure-core~=1.24; extra == "complete"
163
163
  Requires-Dist: azure-identity~=1.5; extra == "complete"
164
164
  Requires-Dist: azure-keyvault-secrets~=4.2; extra == "complete"
165
165
  Requires-Dist: boto3<1.36,>=1.28.0; extra == "complete"
166
- Requires-Dist: dask>=2023.12.1; python_version < "3.11" and extra == "complete"
167
- Requires-Dist: dask>=2024.8; python_version >= "3.11" and extra == "complete"
166
+ Requires-Dist: dask==2024.8; python_version >= "3.11" and extra == "complete"
167
+ Requires-Dist: dask~=2023.12.1; python_version < "3.11" and extra == "complete"
168
168
  Requires-Dist: databricks-sdk~=0.20.0; extra == "complete"
169
- Requires-Dist: distributed>=2023.12.1; python_version < "3.11" and extra == "complete"
170
- Requires-Dist: distributed>=2024.8; python_version >= "3.11" and extra == "complete"
169
+ Requires-Dist: distributed==2024.8; python_version >= "3.11" and extra == "complete"
170
+ Requires-Dist: distributed~=2023.12.1; python_version < "3.11" and extra == "complete"
171
171
  Requires-Dist: gcsfs<=2025.7.0,>=2025.5.1; extra == "complete"
172
172
  Requires-Dist: google-cloud-bigquery-storage~=2.17; extra == "complete"
173
173
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas]==3.14.1; extra == "complete"
@@ -198,11 +198,11 @@ Requires-Dist: azure-identity~=1.5; extra == "complete-api"
198
198
  Requires-Dist: azure-keyvault-secrets~=4.2; extra == "complete-api"
199
199
  Requires-Dist: boto3<1.36,>=1.28.0; extra == "complete-api"
200
200
  Requires-Dist: dask-kubernetes~=0.11.0; extra == "complete-api"
201
- Requires-Dist: dask>=2023.12.1; python_version < "3.11" and extra == "complete-api"
202
- Requires-Dist: dask>=2024.8; python_version >= "3.11" and extra == "complete-api"
201
+ Requires-Dist: dask==2024.8; python_version >= "3.11" and extra == "complete-api"
202
+ Requires-Dist: dask~=2023.12.1; python_version < "3.11" and extra == "complete-api"
203
203
  Requires-Dist: databricks-sdk~=0.20.0; extra == "complete-api"
204
- Requires-Dist: distributed>=2023.12.1; python_version < "3.11" and extra == "complete-api"
205
- Requires-Dist: distributed>=2024.8; python_version >= "3.11" and extra == "complete-api"
204
+ Requires-Dist: distributed==2024.8; python_version >= "3.11" and extra == "complete-api"
205
+ Requires-Dist: distributed~=2023.12.1; python_version < "3.11" and extra == "complete-api"
206
206
  Requires-Dist: fastapi~=0.116.0; extra == "complete-api"
207
207
  Requires-Dist: gcsfs<=2025.7.0,>=2025.5.1; extra == "complete-api"
208
208
  Requires-Dist: google-cloud-bigquery-storage~=2.17; extra == "complete-api"
@@ -63,7 +63,7 @@ mlrun/common/schemas/notification.py,sha256=Q-tBaU_V7YZiuj3ankuACf3_-hb874_osxq0
63
63
  mlrun/common/schemas/object.py,sha256=9g2bK3KUXmzhaGavbmpVf6rxDhquYogp8bb12dzP4XE,1982
64
64
  mlrun/common/schemas/pagination.py,sha256=8NEmiIkCXw5_sv-lE0MWgWz-WpxhSSn-vBtbPDBOGXc,899
65
65
  mlrun/common/schemas/partition.py,sha256=8T-1nfA-SdzkS8dv48NaYHVEUQOcZpaxE7mWrD8Ra68,6357
66
- mlrun/common/schemas/pipeline.py,sha256=lzaNHudyOiSMpNsoKoNMZhJJa2R4wdA4TR8A98L_yIo,996
66
+ mlrun/common/schemas/pipeline.py,sha256=0hG2Nb__VdQBXK2dKgSCX5u_a7Cv8qQQwon3WzygeHg,997
67
67
  mlrun/common/schemas/project.py,sha256=9O9Wa2PkRy74WzwiLd7A6jBXf4FJxQMJj9wh2VpsZao,6138
68
68
  mlrun/common/schemas/regex.py,sha256=r-phg_9ge1lFraPCQd_wpnYGQ1oOCj3xChycJxZtIQY,775
69
69
  mlrun/common/schemas/runs.py,sha256=yKY29ByTS4SruWQyPpDNFGulMrcT9Ms-3lnwBUDp3us,751
@@ -279,11 +279,11 @@ mlrun/package/utils/type_hint_utils.py,sha256=Ic3A7C9KnbfdLe-nUgzGoefBnsvOJJP9ip
279
279
  mlrun/platforms/__init__.py,sha256=QgtpAt1lpfTKk0mLtesB1P8szK9cpNDPeYzu2qDbPCM,3580
280
280
  mlrun/platforms/iguazio.py,sha256=32_o95Ntx9z3ciowt2NcnX7tAiLBwX3VB0mbTQ-KrIQ,13848
281
281
  mlrun/projects/__init__.py,sha256=hdCOA6_fp8X4qGGGT7Bj7sPbkM1PayWuaVZL0DkpuZw,1240
282
- mlrun/projects/operations.py,sha256=dax9HGvs3S7FzZ2Hok1ixFoToIZI2mkUo0EhNUtsHGk,21020
282
+ mlrun/projects/operations.py,sha256=Oo7h0TMztI_RVmj0rQxNS1igS_c94HpQZwMIFjiWt0E,21038
283
283
  mlrun/projects/pipelines.py,sha256=ZOfuIEHOXfuc4qAkuWvbWhCjP6kqpLkv-yBBaY9RXhg,52219
284
- mlrun/projects/project.py,sha256=BwUCZTQr4YPr_s2dNh0-IKZo93ipp8sR-PJGslSkuz0,256818
284
+ mlrun/projects/project.py,sha256=aADGuuGz47OIBQAu_11mPf8jXLl-W6mHBnlfwSPW6uk,256836
285
285
  mlrun/runtimes/__init__.py,sha256=8cqrYKy1a0_87XG7V_p96untQ4t8RocadM4LVEEN1JM,9029
286
- mlrun/runtimes/base.py,sha256=pagMAvF0nEElptqLnBiGx9fpFenEq052B80GaLzR8Y8,38895
286
+ mlrun/runtimes/base.py,sha256=txynS-hiNLR97PBd49mc5q9ZX3gMf3VdJ2rJ-fz5bZU,38913
287
287
  mlrun/runtimes/daskjob.py,sha256=IN6gKKrmCIjWooj5FgFm-pAb2i7ra1ERRzClfu_rYGI,20102
288
288
  mlrun/runtimes/funcdoc.py,sha256=zRFHrJsV8rhDLJwoUhcfZ7Cs0j-tQ76DxwUqdXV_Wyc,9810
289
289
  mlrun/runtimes/function_reference.py,sha256=fnMKUEieKgy4JyVLhFpDtr6JvKgOaQP8F_K2H3-Pk9U,5030
@@ -293,7 +293,7 @@ mlrun/runtimes/local.py,sha256=R72VdrXnFdAhLsKJiWPOcfsi4jS-W5E1FnkT2Xllt8M,22150
293
293
  mlrun/runtimes/mounts.py,sha256=Q6oN1ilVcsFaVM1DAS-mfCD7vGWa7Wa9aEhRrctJPyk,19292
294
294
  mlrun/runtimes/pod.py,sha256=HtSnhdfaT_rvYwybXjLowl3eOZSrRSyWqW7HYXuUT40,58252
295
295
  mlrun/runtimes/remotesparkjob.py,sha256=BalAea66GleaKeoYTw6ZL1Qr4wf1yRxfgk1-Fkc9Pqg,7864
296
- mlrun/runtimes/utils.py,sha256=iRL0U0L56RW26hfjo2n_pRof5XgCAtWSO3YYxPt_2NI,16982
296
+ mlrun/runtimes/utils.py,sha256=b0T5Qm0WmbHk_I4d14ikzhhjymjIVedaifBi-ymKwOc,17733
297
297
  mlrun/runtimes/databricks_job/__init__.py,sha256=kXGBqhLN0rlAx0kTXhozGzFsIdSqW0uTSKMmsLgq_is,569
298
298
  mlrun/runtimes/databricks_job/databricks_cancel_task.py,sha256=ufjcLKA5E6FSDF5CXm5l8uP_mUSFppwr5krLHln1kAU,2243
299
299
  mlrun/runtimes/databricks_job/databricks_runtime.py,sha256=ceX0umkNMHvxuXZic4QulWOfJyhPKHVo3T-oPhKTO8Y,12874
@@ -332,7 +332,7 @@ mlrun/utils/async_http.py,sha256=8Olx8TNNeXB07nEGwlqhEgFgnFAD71vBU_bqaA9JW-w,122
332
332
  mlrun/utils/azure_vault.py,sha256=IEFizrDGDbAaoWwDr1WoA88S_EZ0T--vjYtY-i0cvYQ,3450
333
333
  mlrun/utils/clones.py,sha256=qbAGyEbSvlewn3Tw_DpQZP9z6MGzFhSaZfI1CblX8Fg,7515
334
334
  mlrun/utils/condition_evaluator.py,sha256=-nGfRmZzivn01rHTroiGY4rqEv8T1irMyhzxEei-sKc,1897
335
- mlrun/utils/helpers.py,sha256=wiFZ8E6Ony4eV4N_pGDPfLtDZNAuyIYL_zv6bEqTSk8,83666
335
+ mlrun/utils/helpers.py,sha256=k2uce80yYNcWPZPe7tz6ufDpZqR2xVZesfzcXAsv5RY,81983
336
336
  mlrun/utils/http.py,sha256=5ZU2VpokaUM_DT3HBSqTm8xjUqTPjZN5fKkSIvKlTl0,8704
337
337
  mlrun/utils/logger.py,sha256=uaCgI_ezzaXf7nJDCy-1Nrjds8vSXqDbzmjmb3IyCQo,14864
338
338
  mlrun/utils/regex.py,sha256=FcRwWD8x9X3HLhCCU2F0AVKTFah784Pr7ZAe3a02jw8,5199
@@ -351,11 +351,11 @@ mlrun/utils/notifications/notification/mail.py,sha256=ZyJ3eqd8simxffQmXzqd3bgbAq
351
351
  mlrun/utils/notifications/notification/slack.py,sha256=wSu_7W0EnGLBNwIgWCYEeTP8j9SPAMPDBnfUcPnVZYA,7299
352
352
  mlrun/utils/notifications/notification/webhook.py,sha256=FM5-LQAKAVJKp37MRzR3SsejalcnpM6r_9Oe7znxZEA,5313
353
353
  mlrun/utils/version/__init__.py,sha256=YnzE6tlf24uOQ8y7Z7l96QLAI6-QEii7-77g8ynmzy0,613
354
- mlrun/utils/version/version.json,sha256=j4SaTft98gfBfeSZ8hkeGUNgaedfuQHGalP9AUUmW6Y,90
354
+ mlrun/utils/version/version.json,sha256=yQnd9vqR-aQNoTvniro-ODetJzw2TOR-g7HitydZtAE,90
355
355
  mlrun/utils/version/version.py,sha256=M2hVhRrgkN3SxacZHs3ZqaOsqAA7B6a22ne324IQ1HE,1877
356
- mlrun-1.10.0rc32.dist-info/licenses/LICENSE,sha256=zTiv1CxWNkOk1q8eJS1G_8oD4gWpWLwWxj_Agcsi8Os,11337
357
- mlrun-1.10.0rc32.dist-info/METADATA,sha256=R2DqTgp-gYojqVO_b1I1zXQdReggmicO8dxP26a6M0w,26104
358
- mlrun-1.10.0rc32.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
359
- mlrun-1.10.0rc32.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
360
- mlrun-1.10.0rc32.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
361
- mlrun-1.10.0rc32.dist-info/RECORD,,
356
+ mlrun-1.10.0rc33.dist-info/licenses/LICENSE,sha256=zTiv1CxWNkOk1q8eJS1G_8oD4gWpWLwWxj_Agcsi8Os,11337
357
+ mlrun-1.10.0rc33.dist-info/METADATA,sha256=DVCMqUdd9RFMsFeR1kDeftSg47qMaV7UrB9boa9HqXA,26104
358
+ mlrun-1.10.0rc33.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
359
+ mlrun-1.10.0rc33.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
360
+ mlrun-1.10.0rc33.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
361
+ mlrun-1.10.0rc33.dist-info/RECORD,,