lamindb_setup 0.76.2__tar.gz → 0.76.4__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 (92) hide show
  1. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/PKG-INFO +1 -1
  2. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/__init__.py +1 -1
  3. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_schema_metadata.py +7 -3
  4. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_hub_core.py +3 -3
  5. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_hub_crud.py +22 -5
  6. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_settings_load.py +2 -7
  7. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/upath.py +10 -13
  8. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/hub-local/conftest.py +5 -3
  9. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/storage/test_storage_basis.py +1 -1
  10. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/storage/test_storage_stats.py +15 -1
  11. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/.github/workflows/build.yml +0 -0
  12. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/.github/workflows/doc-changes.yml +0 -0
  13. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/.gitignore +0 -0
  14. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/.pre-commit-config.yaml +0 -0
  15. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/LICENSE +0 -0
  16. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/README.md +0 -0
  17. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/changelog.md +0 -0
  18. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-cloud/01-init-local-instance.ipynb +0 -0
  19. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-cloud/02-connect-local-instance.ipynb +0 -0
  20. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-cloud/03-add-managed-storage.ipynb +0 -0
  21. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-cloud/04-test-bionty.ipynb +0 -0
  22. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-cloud/05-init-hosted-instance.ipynb +0 -0
  23. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-cloud/06-connect-hosted-instance.ipynb +0 -0
  24. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-cloud/07-keep-artifacts-local.ipynb +0 -0
  25. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-cloud/test-multi-session.ipynb +0 -0
  26. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-cloud/test_notebooks.py +0 -0
  27. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-prod/test-cache-management.ipynb +0 -0
  28. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-prod/test-cloud-sync.ipynb +0 -0
  29. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-prod/test-connect-anonymously.ipynb +0 -0
  30. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-prod/test-empty-init.ipynb +0 -0
  31. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-prod/test-import-schema.ipynb +0 -0
  32. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-prod/test-insufficient-user-info.ipynb +0 -0
  33. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-prod/test-invalid-schema.ipynb +0 -0
  34. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-prod/test-sqlite-lock.ipynb +0 -0
  35. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/hub-prod/test_notebooks2.py +0 -0
  36. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/index.md +0 -0
  37. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/notebooks.md +0 -0
  38. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/docs/reference.md +0 -0
  39. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_cache.py +0 -0
  40. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_check.py +0 -0
  41. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_check_setup.py +0 -0
  42. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_close.py +0 -0
  43. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_connect_instance.py +0 -0
  44. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_delete.py +0 -0
  45. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_django.py +0 -0
  46. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_exportdb.py +0 -0
  47. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_importdb.py +0 -0
  48. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_init_instance.py +0 -0
  49. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_migrate.py +0 -0
  50. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_register_instance.py +0 -0
  51. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_schema.py +0 -0
  52. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_set_managed_storage.py +0 -0
  53. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_setup_user.py +0 -0
  54. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/_silence_loggers.py +0 -0
  55. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/__init__.py +0 -0
  56. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_aws_credentials.py +0 -0
  57. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_aws_storage.py +0 -0
  58. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_deprecated.py +0 -0
  59. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_docs.py +0 -0
  60. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_hub_client.py +0 -0
  61. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_hub_utils.py +0 -0
  62. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_private_django_api.py +0 -0
  63. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_settings.py +0 -0
  64. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_settings_instance.py +0 -0
  65. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_settings_save.py +0 -0
  66. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_settings_storage.py +0 -0
  67. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_settings_store.py +0 -0
  68. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_settings_user.py +0 -0
  69. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/_setup_bionty_sources.py +0 -0
  70. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/cloud_sqlite_locker.py +0 -0
  71. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/django.py +0 -0
  72. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/exceptions.py +0 -0
  73. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/hashing.py +0 -0
  74. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/lamindb_setup/core/types.py +0 -0
  75. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/noxfile.py +0 -0
  76. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/pyproject.toml +0 -0
  77. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/hub-cloud/test_connect_instance.py +0 -0
  78. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/hub-cloud/test_delete_instance.py +0 -0
  79. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/hub-cloud/test_init_instance.py +0 -0
  80. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/hub-cloud/test_login.py +0 -0
  81. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/hub-cloud/test_migrate.py +0 -0
  82. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/hub-cloud/test_set_storage.py +0 -0
  83. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/hub-local/test_all.py +0 -0
  84. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/hub-local/test_update_schema_in_hub.py +0 -0
  85. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/hub-prod/conftest.py +0 -0
  86. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/hub-prod/test_django.py +0 -0
  87. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/hub-prod/test_global_settings.py +0 -0
  88. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/hub-prod/test_switch_and_fallback_env.py +0 -0
  89. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/hub-prod/test_upath.py +0 -0
  90. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/storage/test_hashing.py +0 -0
  91. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/storage/test_storage_access.py +0 -0
  92. {lamindb_setup-0.76.2 → lamindb_setup-0.76.4}/tests/storage/test_to_url.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lamindb_setup
3
- Version: 0.76.2
3
+ Version: 0.76.4
4
4
  Summary: Setup & configure LaminDB.
5
5
  Author-email: Lamin Labs <open-source@lamin.ai>
6
6
  Description-Content-Type: text/markdown
@@ -34,7 +34,7 @@ Modules & settings:
34
34
 
35
35
  """
36
36
 
37
- __version__ = "0.76.2" # denote a release candidate for 0.1.0 with 0.1rc1
37
+ __version__ = "0.76.4" # denote a release candidate for 0.1.0 with 0.1rc1
38
38
 
39
39
  import sys
40
40
  from os import name as _os_name
@@ -356,7 +356,9 @@ class _SchemaHandler:
356
356
  return self.to_dict(include_django_objects=False)
357
357
 
358
358
  def _get_modules_metadata(self):
359
- return {
359
+ from lnschema_core.models import Record, Registry
360
+
361
+ all_models = {
360
362
  module_name: {
361
363
  model._meta.model_name: _ModelHandler(
362
364
  model, module_name, self.included_modules
@@ -364,13 +366,15 @@ class _SchemaHandler:
364
366
  for model in self._get_schema_module(
365
367
  module_name
366
368
  ).models.__dict__.values()
367
- if model.__class__.__name__ == "RecordMeta"
368
- and model.__name__ not in ["Record", "ORM"]
369
+ if model.__class__ is Registry
370
+ and model is not Record
369
371
  and not model._meta.abstract
370
372
  and model.__get_schema_name__() == module_name
371
373
  }
372
374
  for module_name in self.included_modules
373
375
  }
376
+ assert all_models
377
+ return all_models
374
378
 
375
379
  def _get_module_set_info(self):
376
380
  # TODO: rely on schemamodule table for this
@@ -19,10 +19,10 @@ from ._hub_crud import (
19
19
  _delete_instance_record,
20
20
  select_account_by_handle,
21
21
  select_db_user_by_instance,
22
+ select_default_storage_by_instance_id,
22
23
  select_instance_by_id_with_storage,
23
24
  select_instance_by_name,
24
25
  select_instance_by_owner_name,
25
- select_storage,
26
26
  )
27
27
  from ._hub_crud import update_instance as _update_instance_record
28
28
  from ._hub_utils import (
@@ -338,7 +338,7 @@ def _connect_instance(
338
338
  if instance is None:
339
339
  return "instance-not-found"
340
340
  # get default storage
341
- storage = select_storage(instance["storage_id"], client)
341
+ storage = select_default_storage_by_instance_id(instance["id"], client)
342
342
  if storage is None:
343
343
  return "storage-does-not-exist-on-hub"
344
344
  else:
@@ -364,7 +364,7 @@ def _connect_instance(
364
364
  database=instance["db_database"],
365
365
  )
366
366
  instance["db"] = db_dsn
367
- return instance, storage
367
+ return instance, storage # type: ignore
368
368
 
369
369
 
370
370
  def access_aws(storage_root: str, access_token: str | None = None) -> dict[str, dict]:
@@ -17,10 +17,11 @@ def select_instance_by_owner_name(
17
17
  client.table("instance")
18
18
  .select(
19
19
  "*, account!inner!instance_account_id_28936e8f_fk_account_id(*),"
20
- " storage!instance_storage_id_87963cc8_fk_storage_id(*)"
20
+ " storage!inner!storage_instance_id_359fca71_fk_instance_id(*)"
21
21
  )
22
- .eq("account.handle", owner)
23
22
  .eq("name", name)
23
+ .eq("account.handle", owner)
24
+ .eq("storage.is_default", True)
24
25
  .execute()
25
26
  .data
26
27
  )
@@ -28,7 +29,11 @@ def select_instance_by_owner_name(
28
29
  return None
29
30
  if len(data) == 0:
30
31
  return None
31
- return data[0]
32
+ result = data[0]
33
+ # this is now a list
34
+ # assume only one default storage
35
+ result["storage"] = result["storage"][0]
36
+ return result
32
37
 
33
38
 
34
39
  # --------------- ACCOUNT ----------------------
@@ -131,8 +136,20 @@ def select_collaborator(
131
136
  # --------------- STORAGE ----------------------
132
137
 
133
138
 
134
- def select_storage(id: str, client: Client):
135
- data = client.table("storage").select("*").eq("id", id).execute().data
139
+ def select_default_storage_by_instance_id(
140
+ instance_id: str, client: Client
141
+ ) -> dict | None:
142
+ try:
143
+ data = (
144
+ client.table("storage")
145
+ .select("*")
146
+ .eq("instance_id", instance_id)
147
+ .eq("is_default", True)
148
+ .execute()
149
+ .data
150
+ )
151
+ except Exception:
152
+ return None
136
153
  if len(data) == 0:
137
154
  return None
138
155
  return data[0]
@@ -36,14 +36,9 @@ def load_instance_settings(instance_settings_file: Path | None = None):
36
36
  content = f.read()
37
37
  raise SettingsEnvFileOutdated(
38
38
  f"\n\n{error}\n\nYour instance settings file with\n\n{content}\nis invalid"
39
- f" (likely outdated), please delete {instance_settings_file} &"
40
- " re-initialize (local) or re-connect to the instance (remote)"
39
+ f" (likely outdated), see validation error. Please delete {instance_settings_file} &"
40
+ " reload (remote) or re-initialize (local) the instance with the same name & storage location."
41
41
  ) from error
42
- if settings_store.id == "null":
43
- raise ValueError(
44
- "Your instance._id is undefined, please either load your instance from the"
45
- f" hub or update {instance_settings_file} with a new id: {uuid4().hex}"
46
- )
47
42
  isettings = setup_instance_from_store(settings_store)
48
43
  return isettings
49
44
 
@@ -18,7 +18,7 @@ from upath.implementations.cloud import CloudPath, S3Path # keep CloudPath!
18
18
  from upath.implementations.local import LocalPath, PosixUPath, WindowsUPath
19
19
 
20
20
  from ._aws_credentials import HOSTED_BUCKETS, get_aws_credentials_manager
21
- from .hashing import b16_to_b64, hash_md5s_from_dir
21
+ from .hashing import HASH_LENGTH, b16_to_b64, hash_md5s_from_dir
22
22
 
23
23
  if TYPE_CHECKING:
24
24
  from .types import UPathStr
@@ -28,7 +28,7 @@ LocalPathClasses = (PosixUPath, WindowsUPath, LocalPath)
28
28
  # also see https://gist.github.com/securifera/e7eed730cbe1ce43d0c29d7cd2d582f4
29
29
  # ".gz" is not listed here as it typically occurs with another suffix
30
30
  # the complete list is at lamindb.core.storage._suffixes
31
- VALID_SUFFIXES = {
31
+ VALID_SIMPLE_SUFFIXES = {
32
32
  #
33
33
  # without readers
34
34
  #
@@ -56,11 +56,8 @@ VALID_SUFFIXES = {
56
56
  ".zarr",
57
57
  ".json",
58
58
  }
59
- VALID_COMPOSITE_SUFFIXES = {
60
- ".anndata.zarr",
61
- ".spatialdata.zarr",
62
- ".ome.zarr",
63
- }
59
+ # below gets updated within lamindb because it's frequently changing
60
+ VALID_COMPOSITE_SUFFIXES = {".anndata.zarr"}
64
61
 
65
62
  TRAILING_SEP = (os.sep, os.altsep) if os.altsep is not None else os.sep
66
63
 
@@ -76,7 +73,7 @@ def extract_suffix_from_path(path: Path, arg_name: str | None = None) -> str:
76
73
  return process_digits(path.suffix)
77
74
 
78
75
  total_suffix = "".join(path.suffixes)
79
- if total_suffix in VALID_SUFFIXES:
76
+ if total_suffix in VALID_SIMPLE_SUFFIXES:
80
77
  return total_suffix
81
78
  elif total_suffix.endswith(tuple(VALID_COMPOSITE_SUFFIXES)):
82
79
  # below seems slow but OK for now
@@ -94,7 +91,7 @@ def extract_suffix_from_path(path: Path, arg_name: str | None = None) -> str:
94
91
  # in COMPRESSION_SUFFIXES to detect something like .random.gz and then
95
92
  # add ".random.gz" but concluded it's too dangerous it's safer to just
96
93
  # use ".gz" in such a case
97
- if path.suffixes[-2] in VALID_SUFFIXES:
94
+ if path.suffixes[-2] in VALID_SIMPLE_SUFFIXES:
98
95
  suffix = "".join(path.suffixes[-2:])
99
96
  msg += f"inferring: '{suffix}'"
100
97
  # do not print a warning for things like .tar.gz, .fastq.gz
@@ -105,7 +102,7 @@ def extract_suffix_from_path(path: Path, arg_name: str | None = None) -> str:
105
102
  msg += (
106
103
  f"using only last suffix: '{suffix}' - if you want your composite"
107
104
  " suffix to be recognized add it to"
108
- " lamindb.core.storage.VALID_SUFFIXES.add()"
105
+ " lamindb.core.storage.VALID_SIMPLE_SUFFIXES.add()"
109
106
  )
110
107
  if print_hint:
111
108
  logger.hint(msg)
@@ -710,9 +707,9 @@ def get_stat_file_cloud(stat: dict) -> tuple[int, str, str]:
710
707
  else:
711
708
  stripped_etag, suffix = etag.split("-")
712
709
  suffix = suffix.strip('"')
713
- hash = f"{b16_to_b64(stripped_etag)}-{suffix}"
714
- hash_type = "md5-n" # this is the S3 chunk-hashing strategy
715
- return size, hash, hash_type
710
+ hash = b16_to_b64(stripped_etag)
711
+ hash_type = f"md5-{suffix}" # this is the S3 chunk-hashing strategy
712
+ return size, hash[:HASH_LENGTH], hash_type
716
713
 
717
714
 
718
715
  def get_stat_dir_cloud(path: UPath) -> tuple[int, str, str, int]:
@@ -2,9 +2,11 @@ from __future__ import annotations
2
2
 
3
3
  import os
4
4
 
5
- from laminhub_rest.dev._seed import seed_local_test
6
- from laminhub_rest.dev._supabase import SupabaseResources
7
- from laminhub_rest.dev._utils import remove_lamin_local_settings
5
+ from laminhub_rest.dev import (
6
+ SupabaseResources,
7
+ remove_lamin_local_settings,
8
+ seed_local_test,
9
+ )
8
10
 
9
11
  supabase_resources = SupabaseResources()
10
12
 
@@ -19,7 +19,7 @@ def test_extract_suffix_from_path():
19
19
  ("logs/date.log.123", ""), # digits are no valid suffixes
20
20
  ("salmon.merged.gene_counts.tsv", ".tsv"),
21
21
  ("salmon.merged.gene_counts.tsv.gz", ".tsv.gz"),
22
- ("filename.v1.1.0.spatialdata.zarr", ".spatialdata.zarr"),
22
+ ("filename.v1.1.0.anndata.zarr", ".anndata.zarr"),
23
23
  ]
24
24
  for path, suffix in collection:
25
25
  filepath = Path(path)
@@ -2,7 +2,21 @@ from __future__ import annotations
2
2
 
3
3
  from lamindb_setup.core._aws_credentials import HOSTED_REGIONS
4
4
  from lamindb_setup.core._settings_storage import get_storage_region
5
- from lamindb_setup.core.upath import UPath, compute_file_tree, get_stat_dir_cloud
5
+ from lamindb_setup.core.upath import (
6
+ UPath,
7
+ compute_file_tree,
8
+ get_stat_dir_cloud,
9
+ get_stat_file_cloud,
10
+ )
11
+
12
+
13
+ def test_get_stat_file_cloud_aws():
14
+ string_path = "s3://bionty-assets/df_all__ncbitaxon__2023-06-20__Organism.parquet"
15
+ path = UPath(string_path, anon=True)
16
+ size, hash, hash_type = get_stat_file_cloud(path.stat().as_info())
17
+ assert hash == "zQxieeCkNGNJWhPl3OfM8A"
18
+ assert hash_type == "md5-5"
19
+ assert size == 78148228
6
20
 
7
21
 
8
22
  def test_get_stat_dir_cloud_aws():
File without changes
File without changes