lamindb 1.6.2__py3-none-any.whl → 1.7.0__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.
- lamindb/__init__.py +1 -3
- lamindb/_finish.py +32 -16
- lamindb/base/types.py +6 -4
- lamindb/core/_context.py +127 -57
- lamindb/core/_mapped_collection.py +1 -1
- lamindb/core/_settings.py +44 -4
- lamindb/core/_track_environment.py +5 -2
- lamindb/core/loaders.py +1 -1
- lamindb/core/storage/_anndata_accessor.py +1 -1
- lamindb/core/storage/_tiledbsoma.py +14 -8
- lamindb/core/storage/_valid_suffixes.py +0 -1
- lamindb/core/storage/_zarr.py +1 -1
- lamindb/core/storage/objects.py +13 -8
- lamindb/core/storage/paths.py +9 -6
- lamindb/core/types.py +1 -1
- lamindb/curators/_legacy.py +2 -1
- lamindb/curators/core.py +106 -105
- lamindb/errors.py +9 -0
- lamindb/examples/fixtures/__init__.py +0 -0
- lamindb/examples/fixtures/sheets.py +224 -0
- lamindb/migrations/0103_remove_writelog_migration_state_and_more.py +1 -1
- lamindb/migrations/0105_record_unique_name.py +20 -0
- lamindb/migrations/0106_transfer_data_migration.py +25 -0
- lamindb/migrations/0107_add_schema_to_record.py +68 -0
- lamindb/migrations/0108_remove_record_sheet_remove_sheetproject_sheet_and_more.py +30 -0
- lamindb/migrations/0109_record_input_of_runs_alter_record_run_and_more.py +123 -0
- lamindb/migrations/0110_rename_values_artifacts_record_linked_artifacts.py +17 -0
- lamindb/migrations/0111_remove_record__sort_order.py +148 -0
- lamindb/migrations/0112_alter_recordartifact_feature_and_more.py +105 -0
- lamindb/migrations/0113_lower_case_branch_and_space_names.py +62 -0
- lamindb/migrations/0114_alter_run__status_code.py +24 -0
- lamindb/migrations/0115_alter_space_uid.py +52 -0
- lamindb/migrations/{0104_squashed.py → 0115_squashed.py} +261 -257
- lamindb/models/__init__.py +4 -3
- lamindb/models/_describe.py +88 -31
- lamindb/models/_feature_manager.py +627 -658
- lamindb/models/_label_manager.py +1 -3
- lamindb/models/artifact.py +214 -99
- lamindb/models/collection.py +7 -1
- lamindb/models/feature.py +288 -60
- lamindb/models/has_parents.py +3 -3
- lamindb/models/project.py +32 -15
- lamindb/models/query_manager.py +7 -1
- lamindb/models/query_set.py +118 -41
- lamindb/models/record.py +140 -94
- lamindb/models/run.py +42 -42
- lamindb/models/save.py +102 -16
- lamindb/models/schema.py +41 -8
- lamindb/models/sqlrecord.py +105 -40
- lamindb/models/storage.py +278 -0
- lamindb/models/transform.py +10 -2
- lamindb/models/ulabel.py +9 -1
- lamindb/py.typed +0 -0
- lamindb/setup/__init__.py +2 -1
- lamindb/setup/_switch.py +16 -0
- lamindb/setup/errors/__init__.py +4 -0
- lamindb/setup/types/__init__.py +4 -0
- {lamindb-1.6.2.dist-info → lamindb-1.7.0.dist-info}/METADATA +5 -5
- {lamindb-1.6.2.dist-info → lamindb-1.7.0.dist-info}/RECORD +61 -44
- lamindb/models/core.py +0 -135
- {lamindb-1.6.2.dist-info → lamindb-1.7.0.dist-info}/LICENSE +0 -0
- {lamindb-1.6.2.dist-info → lamindb-1.7.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,278 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import (
|
4
|
+
TYPE_CHECKING,
|
5
|
+
overload,
|
6
|
+
)
|
7
|
+
|
8
|
+
from django.db import models
|
9
|
+
from lamin_utils import logger
|
10
|
+
from lamindb_setup import settings as setup_settings
|
11
|
+
from lamindb_setup.core._hub_core import (
|
12
|
+
delete_storage_record,
|
13
|
+
get_storage_records_for_instance,
|
14
|
+
)
|
15
|
+
from lamindb_setup.core._settings_storage import StorageSettings, init_storage
|
16
|
+
from lamindb_setup.core.upath import check_storage_is_empty, create_path
|
17
|
+
|
18
|
+
from lamindb.base.fields import (
|
19
|
+
CharField,
|
20
|
+
)
|
21
|
+
|
22
|
+
from ..base.ids import base62_12
|
23
|
+
from .run import TracksRun, TracksUpdates
|
24
|
+
from .sqlrecord import SQLRecord
|
25
|
+
|
26
|
+
if TYPE_CHECKING:
|
27
|
+
from pathlib import Path
|
28
|
+
|
29
|
+
from lamindb_setup.types import StorageType
|
30
|
+
from upath import UPath
|
31
|
+
|
32
|
+
from .artifact import Artifact
|
33
|
+
|
34
|
+
|
35
|
+
class Storage(SQLRecord, TracksRun, TracksUpdates):
|
36
|
+
"""Storage locations of artifacts such as folders and S3 buckets.
|
37
|
+
|
38
|
+
A storage location is either a folder (local or in the cloud) or
|
39
|
+
an entire S3/GCP bucket.
|
40
|
+
|
41
|
+
A LaminDB instance can manage and reference multiple storage locations. But any
|
42
|
+
storage location is managed by *at most one* LaminDB instance.
|
43
|
+
|
44
|
+
.. dropdown:: Managed vs. referenced storage locations
|
45
|
+
|
46
|
+
A LaminDB instance can only write artifacts to its managed storage
|
47
|
+
locations and merely reads artifacts from its referenced storage locations.
|
48
|
+
|
49
|
+
The :attr:`~lamindb.Storage.instance_uid` field defines the managing LaminDB instance of a
|
50
|
+
storage location. Some storage locations may not be managed by any LaminDB
|
51
|
+
instance, in which case the `instance_uid` is `None`. If it matches the
|
52
|
+
:attr:`~lamindb.core.Settings.instance_uid` of the current instance, the storage location
|
53
|
+
is managed by the current instance.
|
54
|
+
|
55
|
+
Here is an example based (`source <https://lamin.ai/laminlabs/lamindata/transform/dPco79GYgzag0000>`__):
|
56
|
+
|
57
|
+
.. image:: https://lamin-site-assets.s3.amazonaws.com/.lamindb/eHDmIOAxLEoqZ2oK0000.png
|
58
|
+
:width: 400px
|
59
|
+
|
60
|
+
.. dropdown:: Managing access to storage locations across instances
|
61
|
+
|
62
|
+
You can low-level manage access through AWS policies that you attach to your S3 bucket
|
63
|
+
or leverage LaminHub's fine-grained access management.
|
64
|
+
|
65
|
+
Head over to `https://lamin.ai/{account}/infrastructure` and you'll see a UI as in the screenshot below.
|
66
|
+
By clicking the green button that says "Connect S3 bucket", you enable LaminHub to issue federated S3 tokens
|
67
|
+
for a new S3 bucket so that your collaborators can access data in this bucket based on their permissions in LaminHub.
|
68
|
+
:doc:`docs:access` has more details.
|
69
|
+
|
70
|
+
.. image:: https://lamin-site-assets.s3.amazonaws.com/.lamindb/ze8hkgVxVptSSZEU0000.png
|
71
|
+
:width: 800px
|
72
|
+
|
73
|
+
Args:
|
74
|
+
root: `str` The root path of the storage location, e.g., `"./myfolder"`, `"s3://my-bucket/myfolder"`, or `"gs://my-bucket/myfolder"`.
|
75
|
+
type: :class:`~lamindb.setup.types.StorageType` The type of storage.
|
76
|
+
description: `str | None = None` A description.
|
77
|
+
region: `str | None = None` Cloud storage region, if applicable. Auto-populated for AWS S3.
|
78
|
+
|
79
|
+
See Also:
|
80
|
+
:attr:`lamindb.core.Settings.storage`
|
81
|
+
Current default storage location of your compute session for writing artifacts.
|
82
|
+
:attr:`~lamindb.setup.core.StorageSettings`
|
83
|
+
Storage settings.
|
84
|
+
|
85
|
+
Examples:
|
86
|
+
|
87
|
+
When you create a LaminDB instance, you configure its default storage location via `--storage`::
|
88
|
+
|
89
|
+
lamin init --storage ./myfolder # or "s3://my-bucket/myfolder" or "gs://my-bucket/myfolder"
|
90
|
+
|
91
|
+
View the current default storage location in your compute session for writing artifacts::
|
92
|
+
|
93
|
+
import lamindb as ln
|
94
|
+
|
95
|
+
ln.settings.storage
|
96
|
+
|
97
|
+
Switch to another default storage location for writing artifacts::
|
98
|
+
|
99
|
+
ln.settings.storage = "./myfolder2" # or "s3://my-bucket/my-folder2" or "gs://my-bucket/my-folder2"
|
100
|
+
|
101
|
+
View all storage locations used in your LaminDB instance::
|
102
|
+
|
103
|
+
ln.Storage.df()
|
104
|
+
|
105
|
+
Create a new storage location::
|
106
|
+
|
107
|
+
ln.Storage(root="./myfolder3").save()
|
108
|
+
|
109
|
+
Notes:
|
110
|
+
|
111
|
+
.. dropdown:: What is the `.lamindb/` directory inside a storage location?
|
112
|
+
|
113
|
+
It stores all artifacts that are ingested through `lamindb`, indexed by the artifact `uid`.
|
114
|
+
This means you don't have to worry about renaming or moving files, as this all happens on the database level.
|
115
|
+
|
116
|
+
Existing artifacts are typically stored in hierarchical structures with semantic folder names.
|
117
|
+
Instead of copying such artifacts into `.lamindb/` upon calls of `Artifact("legacy_path").save()`,
|
118
|
+
LaminDB registers them with the semantic `key` representing the relative path within the storage location.
|
119
|
+
These artifacts are marked with `artifact._key_is_virtual = False` and treated correspondingly.
|
120
|
+
|
121
|
+
There is only a single `.lamindb/` directory per storage location.
|
122
|
+
|
123
|
+
.. dropdown:: What should I do if I want to bulk migrate all artifacts to another storage?
|
124
|
+
|
125
|
+
Currently, you can only achieve this manually and you should be careful with it.
|
126
|
+
|
127
|
+
1. Copy or move artifacts into the desired new storage location
|
128
|
+
2. Adapt the corresponding record in the {class}`~lamindb.Storage` registry by setting the `root` field to the new location
|
129
|
+
3. If your LaminDB storage location is managed through the hub, you also need to update the storage record on the hub -- contact support
|
130
|
+
|
131
|
+
"""
|
132
|
+
|
133
|
+
class Meta(SQLRecord.Meta, TracksRun.Meta, TracksUpdates.Meta):
|
134
|
+
abstract = False
|
135
|
+
|
136
|
+
_name_field: str = "root"
|
137
|
+
|
138
|
+
id: int = models.AutoField(primary_key=True)
|
139
|
+
"""Internal id, valid only in one DB instance."""
|
140
|
+
uid: str = CharField(
|
141
|
+
editable=False, unique=True, max_length=12, default=base62_12, db_index=True
|
142
|
+
)
|
143
|
+
"""Universal id, valid across DB instances."""
|
144
|
+
root: str = CharField(db_index=True, unique=True)
|
145
|
+
"""Root path of storage (cloud or local path)."""
|
146
|
+
description: str | None = CharField(db_index=True, null=True)
|
147
|
+
"""A description of what the storage location is used for (optional)."""
|
148
|
+
type: StorageType = CharField(max_length=30, db_index=True)
|
149
|
+
"""Can be "local" vs. "s3" vs. "gs"."""
|
150
|
+
region: str | None = CharField(max_length=64, db_index=True, null=True)
|
151
|
+
"""Cloud storage region, if applicable."""
|
152
|
+
instance_uid: str | None = CharField(max_length=12, db_index=True, null=True)
|
153
|
+
"""Instance that manages this storage location."""
|
154
|
+
artifacts: Artifact
|
155
|
+
"""Artifacts contained in this storage location."""
|
156
|
+
|
157
|
+
@overload
|
158
|
+
def __init__(
|
159
|
+
self,
|
160
|
+
root: str,
|
161
|
+
type: str,
|
162
|
+
description: str | None = None,
|
163
|
+
region: str | None = None,
|
164
|
+
): ...
|
165
|
+
|
166
|
+
@overload
|
167
|
+
def __init__(
|
168
|
+
self,
|
169
|
+
*db_args,
|
170
|
+
): ...
|
171
|
+
|
172
|
+
def __init__(
|
173
|
+
self,
|
174
|
+
*args,
|
175
|
+
**kwargs,
|
176
|
+
):
|
177
|
+
if len(args) == len(self._meta.concrete_fields):
|
178
|
+
super().__init__(*args)
|
179
|
+
return None
|
180
|
+
storage_record = Storage.filter(root=kwargs["root"]).one_or_none()
|
181
|
+
if storage_record is not None:
|
182
|
+
from .sqlrecord import init_self_from_db
|
183
|
+
|
184
|
+
init_self_from_db(self, storage_record)
|
185
|
+
return None
|
186
|
+
|
187
|
+
skip_preparation = kwargs.pop("_skip_preparation", False)
|
188
|
+
if skip_preparation:
|
189
|
+
super().__init__(*args, **kwargs)
|
190
|
+
return None
|
191
|
+
|
192
|
+
# instance_id won't take effect if
|
193
|
+
# - there is no write access
|
194
|
+
# - the storage location is already managed by another instance
|
195
|
+
ssettings, _ = init_storage(
|
196
|
+
kwargs["root"],
|
197
|
+
instance_id=setup_settings.instance._id,
|
198
|
+
instance_slug=setup_settings.instance.slug,
|
199
|
+
prevent_register_hub=not setup_settings.instance.is_on_hub,
|
200
|
+
)
|
201
|
+
# ssettings performed validation and normalization of the root path
|
202
|
+
kwargs["root"] = ssettings.root_as_str # noqa: S101
|
203
|
+
if "instance_uid" in kwargs:
|
204
|
+
assert kwargs["instance_uid"] == ssettings.instance_uid # noqa: S101
|
205
|
+
else:
|
206
|
+
kwargs["instance_uid"] = ssettings.instance_uid
|
207
|
+
if ssettings._uid is not None: # need private attribute here
|
208
|
+
kwargs["uid"] = ssettings._uid
|
209
|
+
if "type" not in kwargs:
|
210
|
+
kwargs["type"] = ssettings.type
|
211
|
+
else:
|
212
|
+
assert kwargs["type"] == ssettings.type # noqa: S101
|
213
|
+
if "region" in kwargs:
|
214
|
+
assert kwargs["region"] == ssettings.region # noqa: S101
|
215
|
+
else:
|
216
|
+
kwargs["region"] = ssettings.region
|
217
|
+
|
218
|
+
is_managed_by_current_instance = (
|
219
|
+
ssettings.instance_uid == setup_settings.instance.uid
|
220
|
+
)
|
221
|
+
if ssettings.instance_uid is not None and not is_managed_by_current_instance:
|
222
|
+
is_managed_by_instance = (
|
223
|
+
f", is managed by instance with uid {ssettings.instance_uid}"
|
224
|
+
)
|
225
|
+
else:
|
226
|
+
is_managed_by_instance = ""
|
227
|
+
hub_message = ""
|
228
|
+
if setup_settings.instance.is_on_hub and is_managed_by_current_instance:
|
229
|
+
instance_owner = setup_settings.instance.owner
|
230
|
+
hub_message = f", see: https://lamin.ai/{instance_owner}/infrastructure"
|
231
|
+
managed_message = (
|
232
|
+
"created managed"
|
233
|
+
if is_managed_by_current_instance
|
234
|
+
else "referenced read-only"
|
235
|
+
)
|
236
|
+
logger.important(
|
237
|
+
f"{managed_message} storage location at {kwargs['root']}{is_managed_by_instance}{hub_message}"
|
238
|
+
)
|
239
|
+
super().__init__(**kwargs)
|
240
|
+
|
241
|
+
@property
|
242
|
+
def path(self) -> Path | UPath:
|
243
|
+
"""Path.
|
244
|
+
|
245
|
+
Uses the `.root` field and converts it into a `Path` or `UPath`.
|
246
|
+
"""
|
247
|
+
access_token = self._access_token if hasattr(self, "_access_token") else None
|
248
|
+
return create_path(self.root, access_token=access_token)
|
249
|
+
|
250
|
+
def delete(self) -> None:
|
251
|
+
"""Delete the storage location.
|
252
|
+
|
253
|
+
This errors in case the storage location is not empty.
|
254
|
+
"""
|
255
|
+
from .. import settings
|
256
|
+
|
257
|
+
assert not self.artifacts.exists(), "Cannot delete storage holding artifacts." # noqa: S101
|
258
|
+
check_storage_is_empty(self.path)
|
259
|
+
assert settings.storage.root_as_str != self.root, ( # noqa: S101
|
260
|
+
"Cannot delete the current storage location, switch to another."
|
261
|
+
)
|
262
|
+
if setup_settings.user.handle != "anonymous": # only attempt if authenticated
|
263
|
+
storage_records = get_storage_records_for_instance(
|
264
|
+
# only query those storage records on the hub that are managed by the current instance
|
265
|
+
setup_settings.instance._id
|
266
|
+
)
|
267
|
+
for storage_record in storage_records:
|
268
|
+
if storage_record["lnid"] == self.uid:
|
269
|
+
assert storage_record["is_default"] in {False, None}, ( # noqa: S101
|
270
|
+
"Cannot delete default storage of instance."
|
271
|
+
)
|
272
|
+
delete_storage_record(storage_record)
|
273
|
+
ssettings = StorageSettings(self.root)
|
274
|
+
if ssettings._mark_storage_root.exists():
|
275
|
+
ssettings._mark_storage_root.unlink(
|
276
|
+
missing_ok=True # this is totally weird, but needed on Py3.11
|
277
|
+
)
|
278
|
+
super().delete()
|
lamindb/models/transform.py
CHANGED
@@ -66,8 +66,8 @@ class Transform(SQLRecord, IsVersioned):
|
|
66
66
|
revises: `Transform | None = None` An old version of the transform.
|
67
67
|
|
68
68
|
See Also:
|
69
|
-
:
|
70
|
-
Globally track a script
|
69
|
+
:func:`~lamindb.track`
|
70
|
+
Globally track a script or notebook run.
|
71
71
|
:class:`~lamindb.Run`
|
72
72
|
Executions of transforms.
|
73
73
|
|
@@ -201,6 +201,10 @@ class Transform(SQLRecord, IsVersioned):
|
|
201
201
|
type: TransformType | None = kwargs.pop("type", "pipeline")
|
202
202
|
reference: str | None = kwargs.pop("reference", None)
|
203
203
|
reference_type: str | None = kwargs.pop("reference_type", None)
|
204
|
+
branch = kwargs.pop("branch", None)
|
205
|
+
branch_id = kwargs.pop("branch_id", 1)
|
206
|
+
space = kwargs.pop("space", None)
|
207
|
+
space_id = kwargs.pop("space_id", 1)
|
204
208
|
using_key = kwargs.pop("using_key", None)
|
205
209
|
if "name" in kwargs:
|
206
210
|
if key is None:
|
@@ -292,6 +296,10 @@ class Transform(SQLRecord, IsVersioned):
|
|
292
296
|
hash=hash,
|
293
297
|
_has_consciously_provided_uid=has_consciously_provided_uid,
|
294
298
|
revises=revises,
|
299
|
+
branch=branch,
|
300
|
+
branch_id=branch_id,
|
301
|
+
space=space,
|
302
|
+
space_id=space_id,
|
295
303
|
)
|
296
304
|
|
297
305
|
@property
|
lamindb/models/ulabel.py
CHANGED
@@ -35,7 +35,7 @@ class ULabel(SQLRecord, HasParents, CanCurate, TracksRun, TracksUpdates):
|
|
35
35
|
|
36
36
|
Args:
|
37
37
|
name: `str` A name.
|
38
|
-
description: `str` A description.
|
38
|
+
description: `str | None = None` A description.
|
39
39
|
reference: `str | None = None` For instance, an external ID or a URL.
|
40
40
|
reference_type: `str | None = None` For instance, `"url"`.
|
41
41
|
|
@@ -175,6 +175,10 @@ class ULabel(SQLRecord, HasParents, CanCurate, TracksRun, TracksUpdates):
|
|
175
175
|
description: str | None = kwargs.pop("description", None)
|
176
176
|
reference: str | None = kwargs.pop("reference", None)
|
177
177
|
reference_type: str | None = kwargs.pop("reference_type", None)
|
178
|
+
branch = kwargs.pop("branch", None)
|
179
|
+
branch_id = kwargs.pop("branch_id", 1)
|
180
|
+
space = kwargs.pop("space", None)
|
181
|
+
space_id = kwargs.pop("space_id", 1)
|
178
182
|
_skip_validation = kwargs.pop("_skip_validation", False)
|
179
183
|
_aux = kwargs.pop("_aux", None)
|
180
184
|
if len(kwargs) > 0:
|
@@ -189,6 +193,10 @@ class ULabel(SQLRecord, HasParents, CanCurate, TracksRun, TracksUpdates):
|
|
189
193
|
description=description,
|
190
194
|
reference=reference,
|
191
195
|
reference_type=reference_type,
|
196
|
+
branch=branch,
|
197
|
+
branch_id=branch_id,
|
198
|
+
space=space,
|
199
|
+
space_id=space_id,
|
192
200
|
_skip_validation=_skip_validation,
|
193
201
|
_aux=_aux,
|
194
202
|
)
|
lamindb/py.typed
ADDED
File without changes
|
lamindb/setup/__init__.py
CHANGED
@@ -7,7 +7,8 @@ from lamindb_setup import (
|
|
7
7
|
settings,
|
8
8
|
)
|
9
9
|
|
10
|
-
from . import core
|
10
|
+
from . import core, errors, types
|
11
|
+
from ._switch import switch # noqa: F401
|
11
12
|
|
12
13
|
del connect # we have this at the root level, hence, we don't want it here
|
13
14
|
__doc__ = _lamindb_setup.__doc__.replace("lamindb_setup", "lamindb.setup")
|
lamindb/setup/_switch.py
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING
|
4
|
+
|
5
|
+
from lamindb_setup import settings
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from lamindb.models import Branch, Space
|
9
|
+
|
10
|
+
|
11
|
+
def switch(*, branch: str | Branch | None = None, space: str | Space | None = None):
|
12
|
+
"""Switch to a branch or space, create if not exists."""
|
13
|
+
if branch is not None:
|
14
|
+
settings.branch = branch
|
15
|
+
if space is not None:
|
16
|
+
settings.space = space
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: lamindb
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.7.0
|
4
4
|
Summary: A data framework for biology.
|
5
5
|
Author-email: Lamin Labs <open-source@lamin.ai>
|
6
6
|
Requires-Python: >=3.10,<3.14
|
@@ -9,9 +9,9 @@ Classifier: Programming Language :: Python :: 3.10
|
|
9
9
|
Classifier: Programming Language :: Python :: 3.11
|
10
10
|
Classifier: Programming Language :: Python :: 3.12
|
11
11
|
Classifier: Programming Language :: Python :: 3.13
|
12
|
-
Requires-Dist: lamin_utils==0.
|
13
|
-
Requires-Dist: lamin_cli==1.
|
14
|
-
Requires-Dist: lamindb_setup[aws]==1.
|
12
|
+
Requires-Dist: lamin_utils==0.15.0
|
13
|
+
Requires-Dist: lamin_cli==1.5.3
|
14
|
+
Requires-Dist: lamindb_setup[aws]==1.7.2
|
15
15
|
Requires-Dist: pyyaml
|
16
16
|
Requires-Dist: pyarrow
|
17
17
|
Requires-Dist: pandera>=0.24.0
|
@@ -23,7 +23,7 @@ Requires-Dist: anndata>=0.8.0,<=0.11.4
|
|
23
23
|
Requires-Dist: fsspec
|
24
24
|
Requires-Dist: graphviz
|
25
25
|
Requires-Dist: psycopg2-binary
|
26
|
-
Requires-Dist: bionty>=1.
|
26
|
+
Requires-Dist: bionty>=1.6.0 ; extra == "bionty"
|
27
27
|
Requires-Dist: clinicore ; extra == "clinicore"
|
28
28
|
Requires-Dist: tomlkit ; extra == "dev"
|
29
29
|
Requires-Dist: line_profiler ; extra == "dev"
|
@@ -1,48 +1,51 @@
|
|
1
|
-
lamindb/__init__.py,sha256=
|
2
|
-
lamindb/_finish.py,sha256=
|
1
|
+
lamindb/__init__.py,sha256=xSigyw3dbK_W_lY1HZtkZ3PfYGPJDjFtUXEH6gDNS0o,2904
|
2
|
+
lamindb/_finish.py,sha256=MZKXiGk_NFRyc693OXitqq7Qd9bGojcBe26JkingJGI,20859
|
3
3
|
lamindb/_tracked.py,sha256=-wK7BJv30nf4v2_nH5qDCyxHvug7ih6duQNGxDrj3UE,4447
|
4
4
|
lamindb/_view.py,sha256=cod1RnZoLyzMVJcjWjytg78Sf4qsR8IAdqpwzsi8FTw,4950
|
5
|
-
lamindb/errors.py,sha256=
|
5
|
+
lamindb/errors.py,sha256=efqBQ1ca3jMsgCYj2Dssf-SQ9nN70we-eEWnwhQesio,2192
|
6
|
+
lamindb/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
7
|
lamindb/base/__init__.py,sha256=6-iUeiBHuxC8vxP3vG880CH1nqP_7z34Appzzr63FBA,295
|
7
8
|
lamindb/base/fields.py,sha256=5l8ke5sAJ5_JvWqjKEMW8oyriGKA7itqGjbmoKKrJrM,8102
|
8
9
|
lamindb/base/ids.py,sha256=X-1N129FOoNw4TPlK_EzgTZOzRidiMyPWszz9r_066g,34
|
9
|
-
lamindb/base/types.py,sha256=
|
10
|
+
lamindb/base/types.py,sha256=NM_J9hQE80fere5dy-se04_Tg2BnPx_0n1ulLHL9iss,3027
|
10
11
|
lamindb/base/uids.py,sha256=cLBi5mIlsf1ltkTb17r1FLzlOjlGmjvsCygoVJHQ-A8,2116
|
11
12
|
lamindb/base/users.py,sha256=8MSmAvCKoUF15YsDE6BGLBXsFWpfoEEg8iDTKZ7kD48,848
|
12
13
|
lamindb/core/__init__.py,sha256=aaBq0UVjNolMynbT1V5hB6UrJm1tK0M6WHu_r6em9_4,604
|
13
14
|
lamindb/core/_compat.py,sha256=NLnKk1qk4xdgMV-QwFDnBnbio02ujjlF86icvhpdv4c,2029
|
14
|
-
lamindb/core/_context.py,sha256=
|
15
|
-
lamindb/core/_mapped_collection.py,sha256=
|
16
|
-
lamindb/core/_settings.py,sha256=
|
15
|
+
lamindb/core/_context.py,sha256=pRcpBW1gsk3xBKL6dV2BiyHV_Iz0bGjSGDXkBsZz6Hc,39791
|
16
|
+
lamindb/core/_mapped_collection.py,sha256=osquwC6ee0wJ_I6O-8AZwnQUa_r9zqa0MN82Q-nBI3Y,25746
|
17
|
+
lamindb/core/_settings.py,sha256=7Dw1SOtUCfyg3VyxgV696UYjJYmVogyiNM2P1ZL9RMk,7937
|
17
18
|
lamindb/core/_sync_git.py,sha256=Z7keuyS5X7CAj285sEbZIFExZF9mtjGH8DzKwz3xhHw,5881
|
18
|
-
lamindb/core/_track_environment.py,sha256=
|
19
|
+
lamindb/core/_track_environment.py,sha256=fa0-qKEe0BpL79_nsDUDtbg1iA3VpJTh0RCOGdc2XOA,974
|
19
20
|
lamindb/core/exceptions.py,sha256=FMEoSvT3FvtLkxQAt2oDXPeaPem8V5x5UBbTsPFYU5w,53
|
20
|
-
lamindb/core/loaders.py,sha256=
|
21
|
-
lamindb/core/types.py,sha256=
|
21
|
+
lamindb/core/loaders.py,sha256=QH3r3Q_aPrbkgiWaV30TmxcLCs6zZFQLRW442DsTrNU,5456
|
22
|
+
lamindb/core/types.py,sha256=_u8amXATAZN-nNGNWYGmyqYDcHbT_i0NZeLRhm_-ygI,378
|
22
23
|
lamindb/core/datasets/__init__.py,sha256=x5zn_vn8D4xMJOJ9hVc8wRwQk5ea81Un2tGHb2UfiHg,1893
|
23
24
|
lamindb/core/datasets/_core.py,sha256=uaP0snoKuAE5nDTL_XIgPeEoXSp5sTrNNAyOPDciZRU,20286
|
24
25
|
lamindb/core/datasets/_fake.py,sha256=BZF9R_1iF0HDnvtZNqL2FtsjSMuqDIfuFxnw_LJYIh4,953
|
25
26
|
lamindb/core/datasets/_small.py,sha256=HBzyTporAl-6Cr4DbDDEtzbU2ILKNxxiRM-GeZofqsw,2290
|
26
27
|
lamindb/core/datasets/mini_immuno.py,sha256=eAtRQ3_4cln5IFzTH0jNufbWcyQKrXmzizbSmvfS-FM,5707
|
27
28
|
lamindb/core/storage/__init__.py,sha256=JOIMu_7unbyhndtH1j0Q-9AvY8knSuc1IJO9sQnyBAQ,498
|
28
|
-
lamindb/core/storage/_anndata_accessor.py,sha256=
|
29
|
+
lamindb/core/storage/_anndata_accessor.py,sha256=jrKbRylkqgZ3opKcJCwilDhRGEnPcQsKt-X7EA9Isr8,26100
|
29
30
|
lamindb/core/storage/_backed_access.py,sha256=LlpRDZ0skseZA5tBFu3-cH1wJwuXm7-NS2RgnTK7wgc,7382
|
30
31
|
lamindb/core/storage/_polars_lazy_df.py,sha256=Z0KMp0OU5S36L5g8EuJk7V_nn-spgG1lFeEFnkTOLcw,1350
|
31
32
|
lamindb/core/storage/_pyarrow_dataset.py,sha256=lRYYt7edUtwauhxd7RwFud6YPDbz2PFvYYgqLhfapfk,1398
|
32
|
-
lamindb/core/storage/_tiledbsoma.py,sha256=
|
33
|
-
lamindb/core/storage/_valid_suffixes.py,sha256=
|
34
|
-
lamindb/core/storage/_zarr.py,sha256=
|
35
|
-
lamindb/core/storage/objects.py,sha256=
|
36
|
-
lamindb/core/storage/paths.py,sha256=
|
33
|
+
lamindb/core/storage/_tiledbsoma.py,sha256=kwf5zz8byZF5Lm-4Tt2ZE-hjUzwO8l07I9G7l2r68u0,11434
|
34
|
+
lamindb/core/storage/_valid_suffixes.py,sha256=vUSeQ4s01rdhD_vSd6wKmFBsgMJAKkBMnL_T9Y1znMg,501
|
35
|
+
lamindb/core/storage/_zarr.py,sha256=PncgrnA3XX2D01AQsTatCImEpbJUriEo00LHmARCkIE,4265
|
36
|
+
lamindb/core/storage/objects.py,sha256=ISVjBuXPQENZ2XVQDvfX-HZSyDjQi_OGnoJXQmI---Y,3282
|
37
|
+
lamindb/core/storage/paths.py,sha256=C6qAFtWFvFA2RtA9M4KGxT87wmZWqB9b1V5jOCY0ALc,7141
|
37
38
|
lamindb/core/subsettings/__init__.py,sha256=f_vOqZOjVGez8pLmtrUuc_ayDGXl07t_ZY-P2Cedxbo,201
|
38
39
|
lamindb/core/subsettings/_annotation_settings.py,sha256=o-yTYw-NmjFmtehbKU8qnf7tyaeDFkTRGan1pXAIVT0,370
|
39
40
|
lamindb/core/subsettings/_creation_settings.py,sha256=NGHWKqCFSzVNBxAr2VnmdYguiFdW29XUK7T9wRsVshg,906
|
40
41
|
lamindb/curators/__init__.py,sha256=rv5Xrhv0jS1NMpuRVUHEMAsu6pXhBdDP8PBlO4FXrsE,662
|
41
|
-
lamindb/curators/_legacy.py,sha256=
|
42
|
-
lamindb/curators/core.py,sha256=
|
42
|
+
lamindb/curators/_legacy.py,sha256=vWA3CFryIXRG2RDHY7-paMFoG7bpu_gHti8V0sJLuYc,76280
|
43
|
+
lamindb/curators/core.py,sha256=eZGd_PndfD68kb8Vjn0Beoz7fbut7v0OWvCs4Ar1Hng,66825
|
43
44
|
lamindb/curators/_cellxgene_schemas/__init__.py,sha256=iw6PrzhBQpAR7aQ4_MXopSAVX2hdderHH3LRWeQy7Hk,7511
|
44
45
|
lamindb/curators/_cellxgene_schemas/schema_versions.csv,sha256=X9rmO88TW1Fht1f5mJs0JdW-VPvyKSajpf8lHNeECj4,1680
|
45
46
|
lamindb/examples/__init__.py,sha256=DGImiuWYDvwxh78p5FCwQWClEwsE3ODLU49i_NqbW0c,533
|
47
|
+
lamindb/examples/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
48
|
+
lamindb/examples/fixtures/sheets.py,sha256=2oRAY2jQYCJuW_gCTGAs90XerYQHIe3pivoi0vzgXpc,9035
|
46
49
|
lamindb/examples/schemas/__init__.py,sha256=NPDp7VjMOHStEIthx3xW9NSHtY7jnnMzrNPcSDgxT3M,241
|
47
50
|
lamindb/examples/schemas/_anndata.py,sha256=Q0h7YWZ6lqAZtE0i1xxCvJ8JfSa_RhFj4RY1sE_9HZs,764
|
48
51
|
lamindb/examples/schemas/_simple.py,sha256=JdavLLrJnxDLTKBKRk2Tb534AInlzX0jyEvU9LcH-NQ,568
|
@@ -82,38 +85,52 @@ lamindb/migrations/0099_alter_writelog_seqno.py,sha256=Sg4jbLO3dP69_A53EL2L3rwfM
|
|
82
85
|
lamindb/migrations/0100_branch_alter_artifact__branch_code_and_more.py,sha256=dC1b1ntEVayNxBVEvJVVpVjqjV6qnzZxZ7Ez0qy_9j4,3158
|
83
86
|
lamindb/migrations/0101_alter_artifact_hash_alter_feature_name_and_more.py,sha256=yxnVzVcoRxd-Xc2KIkR07EtlBxd3LyY4C7F8enBHBYY,14154
|
84
87
|
lamindb/migrations/0102_remove_writelog_branch_code_and_more.py,sha256=LkedZIweHHQGytJbo3OhshLFZLMKAbp22EuW-YqoTp0,2222
|
85
|
-
lamindb/migrations/0103_remove_writelog_migration_state_and_more.py,sha256=
|
88
|
+
lamindb/migrations/0103_remove_writelog_migration_state_and_more.py,sha256=gouVqJFAVLz1ge5KNlhfxFzbXMkKB-VTNdT7SOpBOnI,1194
|
86
89
|
lamindb/migrations/0104_alter_branch_uid.py,sha256=YHhQHblFoOG5jphqbtPg69gnkiBqw9wdVIFKVrzoRhk,12863
|
87
|
-
lamindb/migrations/
|
90
|
+
lamindb/migrations/0105_record_unique_name.py,sha256=E_4lDalToosxAjUY6qSslhJy8a9D6RhUAO2mjt1qpYE,494
|
91
|
+
lamindb/migrations/0106_transfer_data_migration.py,sha256=-48RH8oaeJjnDrFxolhmMPdeFxqyGjvFQzOZ91R62Ys,715
|
92
|
+
lamindb/migrations/0107_add_schema_to_record.py,sha256=iFSmtP0RZL8dae4jlzS8hE8gGY6ct_MEy2dsMccP0KM,2192
|
93
|
+
lamindb/migrations/0108_remove_record_sheet_remove_sheetproject_sheet_and_more.py,sha256=ZhEj6nLMqi7BjWw1H44fLZ5NRf9RYpJSy_l62bOpIBg,693
|
94
|
+
lamindb/migrations/0109_record_input_of_runs_alter_record_run_and_more.py,sha256=HDTex8PR-1OJ3ChRW-AdtrG_wFZGvjjgUa9RRaWYpWs,4240
|
95
|
+
lamindb/migrations/0110_rename_values_artifacts_record_linked_artifacts.py,sha256=v2z0hO0uqLWWtfIk0PMReG1TKMeuBh9tGgdCiu-HqVE,408
|
96
|
+
lamindb/migrations/0111_remove_record__sort_order.py,sha256=m5CC_VXupeUywupKQ74RW4hCrYhMjlOy-1VX5TYOQPc,5037
|
97
|
+
lamindb/migrations/0112_alter_recordartifact_feature_and_more.py,sha256=19AothLLch_iY5W5YhH3G-paNFSlqTeGwVfYX78o8Hc,3458
|
98
|
+
lamindb/migrations/0113_lower_case_branch_and_space_names.py,sha256=Xt2krstx3t30iTi2z0qTCBNteDA5Wy9L-thRXJSeUA8,1734
|
99
|
+
lamindb/migrations/0114_alter_run__status_code.py,sha256=KkGecSBJElA3LBnhSK5_rFpcFridOuv6BhM8DCYqTKw,612
|
100
|
+
lamindb/migrations/0115_alter_space_uid.py,sha256=18fCP8d31Ox1KxSSmfzU-W3lSpS3xtiaBNbPeHQiuTM,1332
|
101
|
+
lamindb/migrations/0115_squashed.py,sha256=gDjKt5S-Uk5NK72JPnsB1zD_kyAVIXR5DFEBHNAUcr4,162935
|
88
102
|
lamindb/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
89
|
-
lamindb/models/__init__.py,sha256=
|
90
|
-
lamindb/models/_describe.py,sha256=
|
103
|
+
lamindb/models/__init__.py,sha256=mtjZH0x31aV463YaUef8ZvdQHlGa6SZr_thsrlbdkCg,2419
|
104
|
+
lamindb/models/_describe.py,sha256=kxw7E_a5FqAI_GEH0QDGsBywQtmZ9DqQrJxnFmVJDt8,7717
|
91
105
|
lamindb/models/_django.py,sha256=bBu1yBJcE7RvPWor1Fp2sU0IEyrgTHxJbrDILDAvVFM,9029
|
92
|
-
lamindb/models/_feature_manager.py,sha256=
|
106
|
+
lamindb/models/_feature_manager.py,sha256=YLhcNGQHWpKDzXR2SFoj0jAPkz0Iynw51_pcxJUSNCE,54854
|
93
107
|
lamindb/models/_from_values.py,sha256=cCGPMDlAbBrdhFW-XrIQVZ10q1LNg4MycYPLOkF0fTc,13366
|
94
108
|
lamindb/models/_is_versioned.py,sha256=Th2_cBf9UWh27E6ANxg6LGmjBOumXFy7AjH0GG4FoXA,7601
|
95
|
-
lamindb/models/_label_manager.py,sha256=
|
109
|
+
lamindb/models/_label_manager.py,sha256=O3KaaTEVId5ky3h0aCGg1kDoFFfrovFYlV82YsZZyIs,12127
|
96
110
|
lamindb/models/_relations.py,sha256=zHYLujy9vkuB9jVq5844TpzLSP__iYNCQcsl-FzK1Jw,3700
|
97
|
-
lamindb/models/artifact.py,sha256=
|
111
|
+
lamindb/models/artifact.py,sha256=OR_dr4r72WQ_hzZPILYRx14xHDccggO7ZY0-jRn7Nh8,116972
|
98
112
|
lamindb/models/artifact_set.py,sha256=VOZEGDo3m_9Yg_ftx3I2fwdydjHN61X_qV18N6xG4kM,4117
|
99
113
|
lamindb/models/can_curate.py,sha256=ShEva1GGpJcCg7k95t99RzWfz28OFSorPFXLrGoXavE,29266
|
100
|
-
lamindb/models/collection.py,sha256=
|
101
|
-
lamindb/models/
|
102
|
-
lamindb/models/
|
103
|
-
lamindb/models/
|
104
|
-
lamindb/models/
|
105
|
-
lamindb/models/
|
106
|
-
lamindb/models/
|
107
|
-
lamindb/models/
|
108
|
-
lamindb/models/
|
109
|
-
lamindb/models/
|
110
|
-
lamindb/models/
|
111
|
-
lamindb/models/
|
112
|
-
lamindb/models/transform.py,sha256=
|
113
|
-
lamindb/models/ulabel.py,sha256=
|
114
|
-
lamindb/setup/__init__.py,sha256=
|
114
|
+
lamindb/models/collection.py,sha256=zNiYzj0K_UgIobWzBY93rekVpZm76p9BJOw7Pz0i8ZE,28356
|
115
|
+
lamindb/models/feature.py,sha256=ZQL5bOnNKyWHz3XXStXuk-pp9pvG8wa3yvW0gDkZZA0,37181
|
116
|
+
lamindb/models/has_parents.py,sha256=NRNshrWCX7G3nnM3lnnHQ3Ho216T3EJfgakY6KlTvt8,20301
|
117
|
+
lamindb/models/project.py,sha256=Za__zEzsShXmfCkKjg1wmlJ_UuGJur-mg6ALNslYJfw,17315
|
118
|
+
lamindb/models/query_manager.py,sha256=EzbyNA5zWUbLYH5yJ7dIC90j1teVoQHrXpRLjCfBEao,11036
|
119
|
+
lamindb/models/query_set.py,sha256=d27m8UF8QZAzHZBEVE1QdJRtx9wCzYgkDdHGCATBM48,34815
|
120
|
+
lamindb/models/record.py,sha256=syOBBefZhlqZpoVJD32uqzEzbwXiOboAOA3AlGaOkhE,12055
|
121
|
+
lamindb/models/run.py,sha256=3xCAJnxK4iNeFlFz1bAxYDnRGU4HnRpDfxq4MwB6cPw,15565
|
122
|
+
lamindb/models/save.py,sha256=jXha2jfY-pWsKuP2dwaEROhUGxhM8fTWQGWAzA_xsM0,16777
|
123
|
+
lamindb/models/schema.py,sha256=oI3_eUYTYrMofOVJTCCKVkGr4L6VWpIxx5L4fauTtn8,48244
|
124
|
+
lamindb/models/sqlrecord.py,sha256=FqtK9epCiFPhqr2DI0W6OmU621wU7FVh9rXouGK3_3w,68136
|
125
|
+
lamindb/models/storage.py,sha256=D5wVikrFiQqrDIOVB0nJvX2f5nicrFHIBlan7AMqDn0,11387
|
126
|
+
lamindb/models/transform.py,sha256=BceBz250AznWf85LefgS2nJNye_xJ0w_jce-mGJDN6Y,12474
|
127
|
+
lamindb/models/ulabel.py,sha256=ocAMSKeQcq2Kr6Dq0mxGupOmW1K0pAs19vjDeTEb6vM,9335
|
128
|
+
lamindb/setup/__init__.py,sha256=QZ-JF8IzO_ckDOU223lsJrdO5ay7cDFgvCbkLeAuxYA,467
|
129
|
+
lamindb/setup/_switch.py,sha256=njZJN__JOhVrBFGClQG1wobdhJJp6l_XzPGKtKSCrfU,434
|
115
130
|
lamindb/setup/core/__init__.py,sha256=SevlVrc2AZWL3uALbE5sopxBnIZPWZ1IB0NBDudiAL8,167
|
116
|
-
lamindb
|
117
|
-
lamindb
|
118
|
-
lamindb-1.
|
119
|
-
lamindb-1.
|
131
|
+
lamindb/setup/errors/__init__.py,sha256=bAHTxOUJW1rm4zpF0Pvqkftn8W6iMGnQ-uyNBu13Nfg,171
|
132
|
+
lamindb/setup/types/__init__.py,sha256=ATaosOi6q-cDWB52T69_sRmLMqj8cHfc-vljzZsrJNw,169
|
133
|
+
lamindb-1.7.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
134
|
+
lamindb-1.7.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
|
135
|
+
lamindb-1.7.0.dist-info/METADATA,sha256=AL4aAfIdZxG9rRc4TfkvRkLe-Z9GkGAnemRWa11R0ts,2669
|
136
|
+
lamindb-1.7.0.dist-info/RECORD,,
|