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.
Files changed (62) hide show
  1. lamindb/__init__.py +1 -3
  2. lamindb/_finish.py +32 -16
  3. lamindb/base/types.py +6 -4
  4. lamindb/core/_context.py +127 -57
  5. lamindb/core/_mapped_collection.py +1 -1
  6. lamindb/core/_settings.py +44 -4
  7. lamindb/core/_track_environment.py +5 -2
  8. lamindb/core/loaders.py +1 -1
  9. lamindb/core/storage/_anndata_accessor.py +1 -1
  10. lamindb/core/storage/_tiledbsoma.py +14 -8
  11. lamindb/core/storage/_valid_suffixes.py +0 -1
  12. lamindb/core/storage/_zarr.py +1 -1
  13. lamindb/core/storage/objects.py +13 -8
  14. lamindb/core/storage/paths.py +9 -6
  15. lamindb/core/types.py +1 -1
  16. lamindb/curators/_legacy.py +2 -1
  17. lamindb/curators/core.py +106 -105
  18. lamindb/errors.py +9 -0
  19. lamindb/examples/fixtures/__init__.py +0 -0
  20. lamindb/examples/fixtures/sheets.py +224 -0
  21. lamindb/migrations/0103_remove_writelog_migration_state_and_more.py +1 -1
  22. lamindb/migrations/0105_record_unique_name.py +20 -0
  23. lamindb/migrations/0106_transfer_data_migration.py +25 -0
  24. lamindb/migrations/0107_add_schema_to_record.py +68 -0
  25. lamindb/migrations/0108_remove_record_sheet_remove_sheetproject_sheet_and_more.py +30 -0
  26. lamindb/migrations/0109_record_input_of_runs_alter_record_run_and_more.py +123 -0
  27. lamindb/migrations/0110_rename_values_artifacts_record_linked_artifacts.py +17 -0
  28. lamindb/migrations/0111_remove_record__sort_order.py +148 -0
  29. lamindb/migrations/0112_alter_recordartifact_feature_and_more.py +105 -0
  30. lamindb/migrations/0113_lower_case_branch_and_space_names.py +62 -0
  31. lamindb/migrations/0114_alter_run__status_code.py +24 -0
  32. lamindb/migrations/0115_alter_space_uid.py +52 -0
  33. lamindb/migrations/{0104_squashed.py → 0115_squashed.py} +261 -257
  34. lamindb/models/__init__.py +4 -3
  35. lamindb/models/_describe.py +88 -31
  36. lamindb/models/_feature_manager.py +627 -658
  37. lamindb/models/_label_manager.py +1 -3
  38. lamindb/models/artifact.py +214 -99
  39. lamindb/models/collection.py +7 -1
  40. lamindb/models/feature.py +288 -60
  41. lamindb/models/has_parents.py +3 -3
  42. lamindb/models/project.py +32 -15
  43. lamindb/models/query_manager.py +7 -1
  44. lamindb/models/query_set.py +118 -41
  45. lamindb/models/record.py +140 -94
  46. lamindb/models/run.py +42 -42
  47. lamindb/models/save.py +102 -16
  48. lamindb/models/schema.py +41 -8
  49. lamindb/models/sqlrecord.py +105 -40
  50. lamindb/models/storage.py +278 -0
  51. lamindb/models/transform.py +10 -2
  52. lamindb/models/ulabel.py +9 -1
  53. lamindb/py.typed +0 -0
  54. lamindb/setup/__init__.py +2 -1
  55. lamindb/setup/_switch.py +16 -0
  56. lamindb/setup/errors/__init__.py +4 -0
  57. lamindb/setup/types/__init__.py +4 -0
  58. {lamindb-1.6.2.dist-info → lamindb-1.7.0.dist-info}/METADATA +5 -5
  59. {lamindb-1.6.2.dist-info → lamindb-1.7.0.dist-info}/RECORD +61 -44
  60. lamindb/models/core.py +0 -135
  61. {lamindb-1.6.2.dist-info → lamindb-1.7.0.dist-info}/LICENSE +0 -0
  62. {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()
@@ -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
- :meth:`~lamindb.core.Context.track`
70
- Globally track a script, notebook or pipeline run.
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")
@@ -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
@@ -0,0 +1,4 @@
1
+ import lamindb_setup as _lamindb_setup
2
+ from lamindb_setup.errors import * # noqa: F403
3
+
4
+ __doc__ = _lamindb_setup.errors.__doc__.replace("lamindb_setup", "lamindb.setup")
@@ -0,0 +1,4 @@
1
+ import lamindb_setup as _lamindb_setup
2
+ from lamindb_setup.types import * # noqa: F403
3
+
4
+ __doc__ = _lamindb_setup.types.__doc__.replace("lamindb_setup", "lamindb.setup")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: lamindb
3
- Version: 1.6.2
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.14.0
13
- Requires-Dist: lamin_cli==1.4.2
14
- Requires-Dist: lamindb_setup[aws]==1.6.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.5.0 ; extra == "bionty"
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=bU13-ltReMyTLY-IB58pnYXM3a3PIITrieNjQOczvJM,2928
2
- lamindb/_finish.py,sha256=XVEaFQQDeGvAnW3Fx-COcXCSXAvu-bIS3VkmqBS81Gs,20148
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=JEjXg_DGHmg1wy5lThmg7YpSOVg7z2D4b3N6d45qebU,2009
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=HVtZbUqo1nfimep9JyiP-O-pQjyMge1_PcCM9v9je10,2777
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=bmQJPd2UnOQdPkWWMLnG_sZTfXPLuZyXEi3UFmttoYU,36812
15
- lamindb/core/_mapped_collection.py,sha256=dxyZ1ZHFn5SBl1xILqN9N6TTUJP0PptVBV-2O0EdZww,25751
16
- lamindb/core/_settings.py,sha256=I_h_O06BNlzhHkMiJqDlRhfbRwCWdMDjKdalNIfIZT0,6214
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=gKmXiL2meqJT65X-66p_GlonoxzBZXNwNm-G9gk0fS4,847
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=2qi6CPYbPRVnZaj5iJamB5Cmxm6H2TEDvhphtRhoX1Q,5461
21
- lamindb/core/types.py,sha256=yHr2Vn_p1Hepz_mBooXmsKudqu8Tco7lXZmVS_ORQIw,383
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=j7PgAxKL7bumvHja99Ldm6BtWkdGMu2Dh_sYoXocTeQ,26105
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=QLMOPjdxv9JFs9JR0Kqg1UTkJKNgwIDMeHAewB0-Lqg,11124
33
- lamindb/core/storage/_valid_suffixes.py,sha256=MlX1Cj8cYnSPL8qp6Evm8MdioyOCEaPUUeckqHwDXIM,529
34
- lamindb/core/storage/_zarr.py,sha256=XZ9FoMYc6xsThAduSf3gUS2mVJfqe1KxQvbRpYv11ac,4270
35
- lamindb/core/storage/objects.py,sha256=n1Kj1soxF-_iLFyNnHriVFcngw6nqEAd7aVm0Hm8Tcw,3017
36
- lamindb/core/storage/paths.py,sha256=wJTD7qza87Xx7ZMo9HFHKgZWaVnst6qc4F2SzqvBMrE,7118
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=p0jn3VcH-yrCGreKtmbntiJcgxXSOo7KDbP-jgynxyo,76238
42
- lamindb/curators/core.py,sha256=YjKWeCiH90QI6Rzntj39i8iiXP3V01ouvQFLIoUCn2I,66827
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=pipVgTTq6kmsi0ePCmfT2ajbrPrjJ1O6W5nC1DTG614,1195
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/0104_squashed.py,sha256=H5Yjj2pONWw9DjPjvp8YHsuDGgrofshze9yVElzT3so,162357
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=Pu7ugwrc_xTxaY4ZnjD5lU2RlCVF4cAa-3bKWRNbI8I,2386
90
- lamindb/models/_describe.py,sha256=DF_AyjxrkBqKM4E1Ym5crvyYc6oJ-EaeOda9KJKBVAU,5482
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=8AI3iWFmPBcClbwDqBsoKWSQ8ToWcB2FVM8Ny8Xvo4w,52974
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=ZcZuajBX7MRAbXyzkhOHypLeCYAjGJe39cP8I9cVt9M,12304
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=eByxq8IpKJqs3OJzMcKqojQ17MmJ7JUQnDKHT5c_LSs,111207
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=BWoSzc5GQDFtMTXl-OjY8WhQgYR6YDe9hctibk96z24,28142
101
- lamindb/models/core.py,sha256=BIpqguoZwaoZ8JshHz5dZWM7u3GwObYjmN2_vLaICH8,4030
102
- lamindb/models/feature.py,sha256=RZG_82HS20esb8dmCW8VH-j6kiR2A9bMmJmDVaATlo8,29392
103
- lamindb/models/has_parents.py,sha256=aqYlCN0P8njmEt5CK5AqS_M5S1ttQz8r6FsT-t3WUTk,20328
104
- lamindb/models/project.py,sha256=V_ooZavXIGSq1iwGQMP9zpvbs7Bg5dT_rQ1u6hZSTS4,16614
105
- lamindb/models/query_manager.py,sha256=4s0BNB_XaYnNaDNQgk-nzNYq2bOCEr4JsV1e1wLWzoY,10727
106
- lamindb/models/query_set.py,sha256=pQ5yRCYB7DkJIXBaUo_oDUTMC4Z8tapiv7sze-yqiNw,31472
107
- lamindb/models/record.py,sha256=mQKIEEikmbemQjNAwEwlZagQ_Xnuu-OfrUbOhzdeKJE,9518
108
- lamindb/models/run.py,sha256=Frdcjg9-xROo4KmRaiXczztAST718-rC9aa56b_zh4o,15274
109
- lamindb/models/save.py,sha256=JtrEAy1D20EpRm6UmjCfZtCTBeq1RNtqzkq9mfhLFtE,13360
110
- lamindb/models/schema.py,sha256=oFXVxQU0GjM4ivbPYSOQaIDoC376_1vlQ-AZoQm39eM,47529
111
- lamindb/models/sqlrecord.py,sha256=by38XCpnLXlnBR1dqPq9GEqFTnTOXHFnw5IVf2pSAOM,64691
112
- lamindb/models/transform.py,sha256=lmBkk20tRoOByX3kd5DEbszT1REhBRm1NMNfQgtziKk,12203
113
- lamindb/models/ulabel.py,sha256=b9_wY-nsLDBuLvXdEiChjteDf0DkEQxTiLErd1qTABw,9027
114
- lamindb/setup/__init__.py,sha256=OwZpZzPDv5lPPGXZP7-zK6UdO4FHvvuBh439yZvIp3A,410
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-1.6.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
117
- lamindb-1.6.2.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
118
- lamindb-1.6.2.dist-info/METADATA,sha256=HBakNz_A2djoJ3wKO897pc6XvmmxRQNEyCtzEGfDwBo,2669
119
- lamindb-1.6.2.dist-info/RECORD,,
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,,