instance-repo 1.3.5.dev2__tar.gz → 1.3.5.dev4__tar.gz

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.
Files changed (49) hide show
  1. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/PKG-INFO +1 -1
  2. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/__init__.py +1 -1
  3. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/instances.py +4 -2
  4. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/store/oss.py +1 -1
  5. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/transport.py +20 -7
  6. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo.egg-info/PKG-INFO +1 -1
  7. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/pyproject.toml +1 -1
  8. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/README.md +0 -0
  9. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/_routing.py +0 -0
  10. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/_site_defaults.py +0 -0
  11. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/artifacts.py +0 -0
  12. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/bootstrap.py +0 -0
  13. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/cache.py +0 -0
  14. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/cli.py +0 -0
  15. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/__init__.py +0 -0
  16. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/benchmarks.py +0 -0
  17. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/config.py +0 -0
  18. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/datasets.py +0 -0
  19. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/images.py +0 -0
  20. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/reports.py +0 -0
  21. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/scaffold.py +0 -0
  22. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/splits.py +0 -0
  23. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/versions.py +0 -0
  24. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/clients/workflows.py +0 -0
  25. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/concurrency.py +0 -0
  26. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/content.py +0 -0
  27. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/endpoints.py +0 -0
  28. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/errors.py +0 -0
  29. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/image.py +0 -0
  30. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/layout.py +0 -0
  31. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/loader.py +0 -0
  32. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/models.py +0 -0
  33. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/paths.py +0 -0
  34. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/release.py +0 -0
  35. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/repo.py +0 -0
  36. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/retry.py +0 -0
  37. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/store/__init__.py +0 -0
  38. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/store/acr.py +0 -0
  39. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/store/base.py +0 -0
  40. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/store/oss_discovery.py +0 -0
  41. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/store/registry.py +0 -0
  42. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/tasktoml.py +0 -0
  43. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo/validate.py +0 -0
  44. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo.egg-info/SOURCES.txt +0 -0
  45. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo.egg-info/dependency_links.txt +0 -0
  46. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo.egg-info/entry_points.txt +0 -0
  47. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo.egg-info/requires.txt +0 -0
  48. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/instance_repo.egg-info/top_level.txt +0 -0
  49. {instance_repo-1.3.5.dev2 → instance_repo-1.3.5.dev4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: instance-repo
3
- Version: 1.3.5.dev2
3
+ Version: 1.3.5.dev4
4
4
  Summary: InstanceRepo SDK — 评测 Instance 统一存储客户端(SDK-only;控制面由 apiserver 承载)
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -20,7 +20,7 @@ from .errors import (
20
20
  TransportError,
21
21
  )
22
22
 
23
- __version__ = "1.3.5.dev2"
23
+ __version__ = "1.3.5.dev4"
24
24
 
25
25
  __all__ = [
26
26
  "Repo", "load_instances",
@@ -769,9 +769,11 @@ class InstancesClient:
769
769
  put = self._content.put(instance_id, dataset, version, split, tgz,
770
770
  meta.to_canonical_json(), overwrite=overwrite,
771
771
  layout=lay)
772
+ _tgz_size = tgz.stat().st_size
772
773
  skipped = bool(put.get("skipped"))
773
774
  _upload_elapsed = _time.monotonic() - _t0 - _pack_elapsed
774
- _tgz_size = tgz.stat().st_size if not skipped else 0
775
+ if skipped:
776
+ _tgz_size = 0
775
777
  logger.info("push %s: pack=%.1fs (%d bytes) upload=%.1fs skipped=%s",
776
778
  instance_id, _pack_elapsed, _tgz_size,
777
779
  _upload_elapsed, skipped)
@@ -1444,7 +1446,7 @@ class InstancesClient:
1444
1446
  return []
1445
1447
  # path 非空时,LIST 直接用子前缀缩小范围
1446
1448
  list_prefix = asset_prefix + path_prefix if path_prefix else asset_prefix
1447
- keys = list_fn(list_prefix)
1449
+ keys = list_fn(list_prefix, list_only=True, dataset=dataset)
1448
1450
  if not keys:
1449
1451
  return []
1450
1452
  for key in keys:
@@ -629,7 +629,7 @@ class OssContentStore(BaseContentStore):
629
629
  if oss_prefix and not oss_prefix.endswith("/"):
630
630
  oss_prefix += "/"
631
631
 
632
- keys = self.list_objects(oss_prefix)
632
+ keys = self.list_objects(oss_prefix, list_only=True, dataset=dataset)
633
633
 
634
634
  def _download_one(key: str) -> Path:
635
635
  rel = key[len(oss_prefix):]
@@ -327,12 +327,13 @@ class Transport:
327
327
  dataset_id: str | None = None,
328
328
  dataset_name: str | None = None,
329
329
  permission: str | None = None,
330
- list_only: bool = False) -> dict:
330
+ list_only: bool = False,
331
+ dataset_source: str | None = None) -> dict:
331
332
  """换 OSS STS 三元组(收窄到 bucket+prefix)。返回归一化小写字段。
332
333
 
333
- 同 (bucket,prefix,duration,dataset,permission,list_only) 在有效期内复用缓存,
334
- 把 N 次签发降到 ~1 次。dataset_id / dataset_name 至少传一个(细粒度授权场景),
335
- 二者可并存,服务端校验一致性。
334
+ 同 (bucket,prefix,duration,dataset,permission,list_only,dataset_source)
335
+ 在有效期内复用缓存,把 N 次签发降到 ~1 次。dataset_id / dataset_name
336
+ 至少传一个(细粒度授权场景),二者可并存,服务端校验一致性。
336
337
 
337
338
  ``permission``(可选,admin/writer/reader)是**权限封顶**:apiserver 取
338
339
  ``min(调用方真实角色, permission)``,**只能收窄不能提权**——传 admin 不会把
@@ -343,12 +344,20 @@ class Transport:
343
344
  ``list_only`` 是**发现模式开关**(与 permission 封顶正交):True 时签发仅含
344
345
  oss:ListObjects + oss:GetBucketInfo 的令牌,跳过 DatasetRBAC 检查,用于未注册
345
346
  dataset 的 OSS 回退目录探测。二者可并存(list_only 分支优先)。
347
+
348
+ ``dataset_source``(可选,"db"/"oss")指定数据集管理源:
349
+ - 空/"db"(默认):走 MongoDB 注册 + RBAC 授权流程
350
+ - "oss":纯 OSS 模式,跳过 RBAC,dataset_name/dataset_id 可不填,
351
+ 直接按 bucket+prefix 签发 STS
346
352
  """
347
353
  # 空串与 None 一律视为"不封顶"(与 Go 的 Permission == "" 语义对齐)。
348
354
  if permission and permission not in PERMISSION_VALUES:
349
355
  raise SchemaError(
350
356
  f"invalid permission '{permission}'; valid values: "
351
357
  f"{', '.join(PERMISSION_VALUES)}")
358
+ if dataset_source and dataset_source not in ("db", "oss"):
359
+ raise SchemaError(
360
+ f"invalid dataset_source '{dataset_source}'; valid values: db, oss")
352
361
 
353
362
  def sign() -> dict:
354
363
  body: dict[str, Any] = {"resource": "oss",
@@ -363,6 +372,8 @@ class Transport:
363
372
  body["permission"] = permission
364
373
  if list_only:
365
374
  body["list_only"] = True
375
+ if dataset_source:
376
+ body["dataset_source"] = dataset_source
366
377
  r = self.post("/apis/v1/credentials", body, idempotent=True)
367
378
  return {
368
379
  "access_key_id": self._require(r, "OSS_ACCESS_KEY_ID"),
@@ -376,11 +387,13 @@ class Transport:
376
387
  }
377
388
 
378
389
  ttl = float(min(duration_seconds or MIN_STS_DURATION, MAX_STS_DURATION))
379
- # permission 与 list_only 都必须进缓存 key:否则请求 reader 封顶的调用方可能
390
+ # permission、list_only、dataset_source 都必须进缓存 key:否则请求 reader 封顶的调用方可能
380
391
  # 命中此前那份未封顶(可写)的缓存令牌,权限收窄被静默绕过;list-only 令牌
381
- # 也可能被普通请求复用(反之亦然),发现模式与读写模式互相污染。
392
+ # 也可能被普通请求复用(反之亦然),发现模式与读写模式互相污染;
393
+ # oss 模式凭据不能被 db 模式复用(反之亦然)。
382
394
  cache_key = ("oss", bucket, prefix, duration_seconds,
383
- dataset_id, dataset_name, permission or None, list_only)
395
+ dataset_id, dataset_name, permission or None, list_only,
396
+ dataset_source or None)
384
397
  return self._cached_cred(cache_key, sign, fallback_ttl=ttl)
385
398
 
386
399
  def get_acr_credentials(self, acr_registry_url: str, *,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: instance-repo
3
- Version: 1.3.5.dev2
3
+ Version: 1.3.5.dev4
4
4
  Summary: InstanceRepo SDK — 评测 Instance 统一存储客户端(SDK-only;控制面由 apiserver 承载)
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "instance-repo"
7
- version = "1.3.5.dev2"
7
+ version = "1.3.5.dev4"
8
8
  description = "InstanceRepo SDK — 评测 Instance 统一存储客户端(SDK-only;控制面由 apiserver 承载)"
9
9
  requires-python = ">=3.10"
10
10
  readme = "README.md"