lamindb_setup 0.76.7__py2.py3-none-any.whl → 0.77.0__py2.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.
Files changed (47) hide show
  1. lamindb_setup/__init__.py +6 -7
  2. lamindb_setup/_cache.py +34 -34
  3. lamindb_setup/_check.py +7 -7
  4. lamindb_setup/_check_setup.py +79 -79
  5. lamindb_setup/_close.py +35 -35
  6. lamindb_setup/_connect_instance.py +440 -433
  7. lamindb_setup/_delete.py +137 -137
  8. lamindb_setup/_django.py +41 -41
  9. lamindb_setup/_exportdb.py +68 -68
  10. lamindb_setup/_importdb.py +50 -50
  11. lamindb_setup/_init_instance.py +374 -374
  12. lamindb_setup/_migrate.py +239 -239
  13. lamindb_setup/_register_instance.py +36 -36
  14. lamindb_setup/_schema.py +27 -27
  15. lamindb_setup/_schema_metadata.py +411 -391
  16. lamindb_setup/_set_managed_storage.py +55 -55
  17. lamindb_setup/_setup_user.py +134 -118
  18. lamindb_setup/_silence_loggers.py +44 -44
  19. lamindb_setup/core/__init__.py +21 -21
  20. lamindb_setup/core/_aws_credentials.py +151 -151
  21. lamindb_setup/core/_aws_storage.py +48 -48
  22. lamindb_setup/core/_deprecated.py +55 -55
  23. lamindb_setup/core/_docs.py +14 -14
  24. lamindb_setup/core/_hub_client.py +173 -164
  25. lamindb_setup/core/_hub_core.py +524 -473
  26. lamindb_setup/core/_hub_crud.py +211 -211
  27. lamindb_setup/core/_hub_utils.py +109 -109
  28. lamindb_setup/core/_private_django_api.py +88 -88
  29. lamindb_setup/core/_settings.py +138 -138
  30. lamindb_setup/core/_settings_instance.py +461 -461
  31. lamindb_setup/core/_settings_load.py +105 -100
  32. lamindb_setup/core/_settings_save.py +81 -81
  33. lamindb_setup/core/_settings_storage.py +393 -393
  34. lamindb_setup/core/_settings_store.py +73 -72
  35. lamindb_setup/core/_settings_user.py +53 -51
  36. lamindb_setup/core/_setup_bionty_sources.py +101 -99
  37. lamindb_setup/core/cloud_sqlite_locker.py +232 -232
  38. lamindb_setup/core/django.py +113 -113
  39. lamindb_setup/core/exceptions.py +12 -12
  40. lamindb_setup/core/hashing.py +114 -114
  41. lamindb_setup/core/types.py +19 -19
  42. lamindb_setup/core/upath.py +779 -779
  43. {lamindb_setup-0.76.7.dist-info → lamindb_setup-0.77.0.dist-info}/METADATA +1 -1
  44. lamindb_setup-0.77.0.dist-info/RECORD +46 -0
  45. {lamindb_setup-0.76.7.dist-info → lamindb_setup-0.77.0.dist-info}/WHEEL +1 -1
  46. lamindb_setup-0.76.7.dist-info/RECORD +0 -46
  47. {lamindb_setup-0.76.7.dist-info → lamindb_setup-0.77.0.dist-info}/LICENSE +0 -0
@@ -1,55 +1,55 @@
1
- from __future__ import annotations
2
-
3
- from typing import TYPE_CHECKING
4
-
5
- from lamin_utils import logger
6
-
7
- from ._init_instance import register_storage_in_instance
8
- from .core._hub_core import delete_storage_record
9
- from .core._settings import settings
10
- from .core._settings_storage import init_storage
11
-
12
- if TYPE_CHECKING:
13
- from lamindb_setup.core.types import UPathStr
14
-
15
-
16
- def set_managed_storage(root: UPathStr, **fs_kwargs):
17
- """Add or switch to another managed storage location.
18
-
19
- Args:
20
- root: `UPathStr` - The new storage root, e.g., an S3 bucket.
21
- **fs_kwargs: Additional fsspec arguments for cloud root, e.g., profile.
22
-
23
- """
24
- if settings.instance.dialect == "sqlite":
25
- raise ValueError(
26
- "Can't add additional managed storage locations for sqlite instances."
27
- )
28
- if not settings.instance.is_on_hub:
29
- raise ValueError(
30
- "Can't add additional managed storage locations for instances that aren't managed through the hub."
31
- )
32
- # here the storage is registered in the hub
33
- # hub_record_status="hub-record-created" if a new record is created
34
- # "hub-record-retireved" if the storage is in the hub already
35
- ssettings, hub_record_status = init_storage(
36
- root=root, instance_id=settings.instance._id, register_hub=True
37
- )
38
- if ssettings._instance_id is None:
39
- raise ValueError(
40
- f"Cannot manage storage without write access: {ssettings.root}"
41
- )
42
-
43
- # here the storage is saved in the instance
44
- # if any error happens the record in the hub is deleted
45
- # if it was created earlier and not retrieved
46
- try:
47
- register_storage_in_instance(ssettings)
48
- except Exception as e:
49
- if hub_record_status == "hub-record-created" and ssettings._uuid is not None:
50
- delete_storage_record(ssettings._uuid) # type: ignore
51
- raise e
52
-
53
- settings.instance._storage = ssettings
54
- settings.instance._persist() # this also updates the settings object
55
- settings.storage._set_fs_kwargs(**fs_kwargs)
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from lamin_utils import logger
6
+
7
+ from ._init_instance import register_storage_in_instance
8
+ from .core._hub_core import delete_storage_record
9
+ from .core._settings import settings
10
+ from .core._settings_storage import init_storage
11
+
12
+ if TYPE_CHECKING:
13
+ from lamindb_setup.core.types import UPathStr
14
+
15
+
16
+ def set_managed_storage(root: UPathStr, **fs_kwargs):
17
+ """Add or switch to another managed storage location.
18
+
19
+ Args:
20
+ root: `UPathStr` - The new storage root, e.g., an S3 bucket.
21
+ **fs_kwargs: Additional fsspec arguments for cloud root, e.g., profile.
22
+
23
+ """
24
+ if settings.instance.dialect == "sqlite":
25
+ raise ValueError(
26
+ "Can't add additional managed storage locations for sqlite instances."
27
+ )
28
+ if not settings.instance.is_on_hub:
29
+ raise ValueError(
30
+ "Can't add additional managed storage locations for instances that aren't managed through the hub."
31
+ )
32
+ # here the storage is registered in the hub
33
+ # hub_record_status="hub-record-created" if a new record is created
34
+ # "hub-record-retireved" if the storage is in the hub already
35
+ ssettings, hub_record_status = init_storage(
36
+ root=root, instance_id=settings.instance._id, register_hub=True
37
+ )
38
+ if ssettings._instance_id is None:
39
+ raise ValueError(
40
+ f"Cannot manage storage without write access: {ssettings.root}"
41
+ )
42
+
43
+ # here the storage is saved in the instance
44
+ # if any error happens the record in the hub is deleted
45
+ # if it was created earlier and not retrieved
46
+ try:
47
+ register_storage_in_instance(ssettings)
48
+ except Exception as e:
49
+ if hub_record_status == "hub-record-created" and ssettings._uuid is not None:
50
+ delete_storage_record(ssettings._uuid) # type: ignore
51
+ raise e
52
+
53
+ settings.instance._storage = ssettings
54
+ settings.instance._persist() # this also updates the settings object
55
+ settings.storage._set_fs_kwargs(**fs_kwargs)
@@ -1,118 +1,134 @@
1
- from __future__ import annotations
2
-
3
- from typing import Optional, Union
4
-
5
- from lamin_utils import logger
6
-
7
- from ._check_setup import _check_instance_setup
8
- from ._init_instance import register_user
9
- from .core._settings import settings
10
- from .core._settings_load import load_or_create_user_settings, load_user_settings
11
- from .core._settings_save import save_user_settings
12
- from .core._settings_store import (
13
- current_user_settings_file,
14
- user_settings_file_email,
15
- user_settings_file_handle,
16
- )
17
-
18
-
19
- def load_user(email: str | None = None, handle: str | None = None) -> str | None:
20
- if email is not None:
21
- settings_file = user_settings_file_email(email)
22
- if handle is not None:
23
- settings_file = user_settings_file_handle(handle)
24
- if settings_file.exists():
25
- user_settings = load_user_settings(settings_file)
26
- save_user_settings(user_settings) # needed to save to current_user.env
27
- assert user_settings.email is not None
28
- else:
29
- user_settings = load_or_create_user_settings()
30
- if email is None:
31
- raise RuntimeError(
32
- "Use your email for your first login in a compute environment. "
33
- "After that, you can use your handle."
34
- )
35
- user_settings.email = email
36
- user_settings.handle = handle
37
- save_user_settings(user_settings)
38
-
39
- from .core._settings import settings
40
-
41
- settings._user_settings = None # this is to refresh a settings instance
42
-
43
- return None
44
-
45
-
46
- def login(
47
- user: str,
48
- *,
49
- key: str | None = None,
50
- password: str | None = None, # for backward compat
51
- ) -> None:
52
- """Log in user.
53
-
54
- Args:
55
- user: handle or email
56
- key: API key or legacy passward
57
- password: Backward compat, will be removed
58
- """
59
- if "@" in user:
60
- email, handle = user, None
61
- else:
62
- email, handle = None, user
63
- load_user(email, handle)
64
-
65
- user_settings = load_or_create_user_settings()
66
-
67
- if password is not None:
68
- logger.warning(
69
- "please use --key instead of --password, "
70
- "passwords are deprecated and replaced with API keys"
71
- )
72
- key = password
73
-
74
- if key is not None:
75
- # within UserSettings, we still call it "password" for a while
76
- user_settings.password = key
77
-
78
- if user_settings.email is None:
79
- raise RuntimeError("No stored user email, please call: lamin login {user}")
80
-
81
- if user_settings.password is None:
82
- raise RuntimeError(
83
- "No stored API key, please call: lamin login <your-email> --key <API-key>"
84
- )
85
-
86
- from .core._hub_core import sign_in_hub
87
-
88
- response = sign_in_hub(
89
- user_settings.email, user_settings.password, user_settings.handle
90
- )
91
- if isinstance(response, Exception):
92
- raise response
93
- else:
94
- user_uuid, user_id, user_handle, user_name, access_token = response
95
- if handle is None:
96
- logger.success(f"logged in with handle {user_handle} (uid: {user_id})")
97
- else:
98
- logger.success(f"logged in with email {user_settings.email} (uid: {user_id})")
99
- user_settings.uid = user_id
100
- user_settings.handle = user_handle
101
- user_settings.name = user_name
102
- user_settings._uuid = user_uuid
103
- user_settings.access_token = access_token
104
- save_user_settings(user_settings)
105
-
106
- if settings._instance_exists and _check_instance_setup():
107
- register_user(user_settings)
108
-
109
- settings._user_settings = None
110
- return None
111
-
112
-
113
- def logout():
114
- if current_user_settings_file().exists():
115
- current_user_settings_file().unlink()
116
- logger.success("logged out")
117
- else:
118
- logger.important("already logged out")
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ from typing import TYPE_CHECKING, Optional, Union
5
+
6
+ from lamin_utils import logger
7
+
8
+ from ._check_setup import _check_instance_setup
9
+ from ._init_instance import register_user
10
+ from .core._settings import settings
11
+ from .core._settings_load import load_or_create_user_settings, load_user_settings
12
+ from .core._settings_save import save_user_settings
13
+ from .core._settings_store import (
14
+ current_user_settings_file,
15
+ user_settings_file_email,
16
+ user_settings_file_handle,
17
+ )
18
+
19
+ if TYPE_CHECKING:
20
+ from lamindb_setup.core._settings_save import UserSettings
21
+
22
+
23
+ def load_user(email: str | None = None, handle: str | None = None) -> UserSettings:
24
+ if email is not None:
25
+ settings_file = user_settings_file_email(email)
26
+ if handle is not None:
27
+ settings_file = user_settings_file_handle(handle)
28
+ if settings_file.exists():
29
+ user_settings = load_user_settings(settings_file)
30
+ save_user_settings(user_settings) # needed to save to current_user.env
31
+ assert user_settings.email is not None
32
+ else:
33
+ user_settings = load_or_create_user_settings()
34
+ if email is None:
35
+ raise SystemExit(
36
+ "✗ Use your email for your first login in a compute environment. "
37
+ "After that, you can use your handle."
38
+ )
39
+ user_settings.email = email
40
+ user_settings.handle = handle
41
+ save_user_settings(user_settings)
42
+
43
+ from .core._settings import settings
44
+
45
+ settings._user_settings = None # this is to refresh a settings instance
46
+
47
+ return user_settings
48
+
49
+
50
+ def login(
51
+ user: str | None = None, *, key: str | None = None, api_key: str | None = None
52
+ ) -> None:
53
+ """Log in user.
54
+
55
+ Args:
56
+ user: handle or email
57
+ key: API key
58
+ api_key: Beta API key
59
+ """
60
+ if user is None and api_key is None:
61
+ if "LAMIN_API_KEY" in os.environ:
62
+ api_key = os.environ["LAMIN_API_KEY"]
63
+ else:
64
+ raise ValueError("Both `user` and `api_key` should not be `None`.")
65
+
66
+ if api_key is None:
67
+ if "@" in user: # type: ignore
68
+ email, handle = user, None
69
+ else:
70
+ email, handle = None, user
71
+ user_settings = load_user(email, handle)
72
+
73
+ if key is not None:
74
+ # within UserSettings, we still call it "password" for a while
75
+ user_settings.password = key
76
+
77
+ if user_settings.email is None:
78
+ raise SystemExit(f"✗ No stored user email, please call: lamin login {user}")
79
+
80
+ if user_settings.password is None:
81
+ raise SystemExit(
82
+ "✗ No stored API key, please call: lamin login <your-email> --key <API-key>"
83
+ )
84
+ else:
85
+ user_settings = load_or_create_user_settings()
86
+
87
+ from .core._hub_core import sign_in_hub, sign_in_hub_api_key
88
+
89
+ if api_key is None:
90
+ response = sign_in_hub(
91
+ user_settings.email, # type: ignore
92
+ user_settings.password, # type: ignore
93
+ user_settings.handle,
94
+ )
95
+ else:
96
+ response = sign_in_hub_api_key(api_key)
97
+
98
+ if isinstance(response, Exception):
99
+ raise response
100
+ elif isinstance(response, str):
101
+ raise SystemExit(f"✗ Unsuccessful login: {response}.")
102
+ else:
103
+ user_uuid, user_id, user_handle, user_name, access_token = response
104
+ if api_key is not None:
105
+ logger.success(
106
+ f"logged in with API key (handle: {user_handle}, uid: {user_id})"
107
+ )
108
+ elif handle is None:
109
+ logger.success(f"logged in with handle {user_handle} (uid: {user_id})")
110
+ else:
111
+ logger.success(f"logged in with email {user_settings.email} (uid: {user_id})")
112
+ user_settings.uid = user_id
113
+ user_settings.handle = user_handle
114
+ user_settings.name = user_name
115
+ user_settings._uuid = user_uuid
116
+ user_settings.access_token = access_token
117
+ user_settings.api_key = api_key
118
+ save_user_settings(user_settings)
119
+
120
+ if settings._instance_exists and _check_instance_setup():
121
+ register_user(user_settings)
122
+
123
+ settings._user_settings = None
124
+ return None
125
+
126
+
127
+ def logout():
128
+ if current_user_settings_file().exists():
129
+ current_user_settings_file().unlink()
130
+ # update user info
131
+ settings._user_settings = None
132
+ logger.success("logged out")
133
+ else:
134
+ logger.important("already logged out")
@@ -1,44 +1,44 @@
1
- from __future__ import annotations
2
-
3
- import logging
4
-
5
- silenced = False
6
-
7
-
8
- # from https://github.com/boto/boto3/blob/8c6e641bed8130a9d8cb4d97b4acbe7aa0d0657a/boto3/__init__.py#L37
9
- def set_stream_logger(name, level):
10
- logger = logging.getLogger(name)
11
- logger.setLevel(level)
12
- handler = logging.StreamHandler()
13
- handler.setLevel(level)
14
- logger.addHandler(handler)
15
-
16
-
17
- def silence_loggers():
18
- global silenced
19
-
20
- if not silenced:
21
- # this gets logged 6 times
22
- set_stream_logger(name="botocore.credentials", level=logging.WARNING)
23
- set_stream_logger(name="botocore.hooks", level=logging.WARNING)
24
- set_stream_logger(name="botocore.utils", level=logging.WARNING)
25
- set_stream_logger(name="botocore.auth", level=logging.WARNING)
26
- set_stream_logger(name="botocore.endpoint", level=logging.WARNING)
27
- set_stream_logger(name="httpx", level=logging.WARNING)
28
- try:
29
- import aiobotocore
30
-
31
- # the 7th logging message of credentials came from aiobotocore
32
- set_stream_logger(name="aiobotocore.credentials", level=logging.WARNING)
33
- except ImportError:
34
- pass
35
- try:
36
- # google also aggressively logs authentication related warnings
37
- # in cases where users access public data
38
- set_stream_logger(name="google.auth._default", level=logging.ERROR)
39
- set_stream_logger(
40
- name="google.auth.compute_engine._metadata", level=logging.ERROR
41
- )
42
- except Exception:
43
- pass
44
- silenced = True
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+
5
+ silenced = False
6
+
7
+
8
+ # from https://github.com/boto/boto3/blob/8c6e641bed8130a9d8cb4d97b4acbe7aa0d0657a/boto3/__init__.py#L37
9
+ def set_stream_logger(name, level):
10
+ logger = logging.getLogger(name)
11
+ logger.setLevel(level)
12
+ handler = logging.StreamHandler()
13
+ handler.setLevel(level)
14
+ logger.addHandler(handler)
15
+
16
+
17
+ def silence_loggers():
18
+ global silenced
19
+
20
+ if not silenced:
21
+ # this gets logged 6 times
22
+ set_stream_logger(name="botocore.credentials", level=logging.WARNING)
23
+ set_stream_logger(name="botocore.hooks", level=logging.WARNING)
24
+ set_stream_logger(name="botocore.utils", level=logging.WARNING)
25
+ set_stream_logger(name="botocore.auth", level=logging.WARNING)
26
+ set_stream_logger(name="botocore.endpoint", level=logging.WARNING)
27
+ set_stream_logger(name="httpx", level=logging.WARNING)
28
+ try:
29
+ import aiobotocore
30
+
31
+ # the 7th logging message of credentials came from aiobotocore
32
+ set_stream_logger(name="aiobotocore.credentials", level=logging.WARNING)
33
+ except ImportError:
34
+ pass
35
+ try:
36
+ # google also aggressively logs authentication related warnings
37
+ # in cases where users access public data
38
+ set_stream_logger(name="google.auth._default", level=logging.ERROR)
39
+ set_stream_logger(
40
+ name="google.auth.compute_engine._metadata", level=logging.ERROR
41
+ )
42
+ except Exception:
43
+ pass
44
+ silenced = True
@@ -1,21 +1,21 @@
1
- """Core setup library.
2
-
3
- Settings:
4
-
5
- .. autosummary::
6
- :toctree:
7
-
8
- SetupSettings
9
- UserSettings
10
- InstanceSettings
11
- StorageSettings
12
-
13
- """
14
-
15
- from . import django, types, upath
16
- from ._deprecated import deprecated
17
- from ._docs import doc_args
18
- from ._settings import SetupSettings
19
- from ._settings_instance import InstanceSettings
20
- from ._settings_storage import StorageSettings
21
- from ._settings_user import UserSettings
1
+ """Core setup library.
2
+
3
+ Settings:
4
+
5
+ .. autosummary::
6
+ :toctree:
7
+
8
+ SetupSettings
9
+ UserSettings
10
+ InstanceSettings
11
+ StorageSettings
12
+
13
+ """
14
+
15
+ from . import django, types, upath
16
+ from ._deprecated import deprecated
17
+ from ._docs import doc_args
18
+ from ._settings import SetupSettings
19
+ from ._settings_instance import InstanceSettings
20
+ from ._settings_storage import StorageSettings
21
+ from ._settings_user import UserSettings