lamindb 1.10.1__py3-none-any.whl → 1.11.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 (55) hide show
  1. lamindb/__init__.py +89 -49
  2. lamindb/_finish.py +17 -15
  3. lamindb/_tracked.py +2 -4
  4. lamindb/_view.py +1 -1
  5. lamindb/base/__init__.py +2 -1
  6. lamindb/base/dtypes.py +76 -0
  7. lamindb/core/_settings.py +45 -2
  8. lamindb/core/storage/_anndata_accessor.py +118 -26
  9. lamindb/core/storage/_backed_access.py +10 -7
  10. lamindb/core/storage/_spatialdata_accessor.py +15 -4
  11. lamindb/core/storage/_zarr.py +3 -0
  12. lamindb/curators/_legacy.py +16 -3
  13. lamindb/curators/core.py +449 -193
  14. lamindb/errors.py +6 -0
  15. lamindb/examples/cellxgene/__init__.py +8 -3
  16. lamindb/examples/cellxgene/_cellxgene.py +127 -13
  17. lamindb/examples/cellxgene/{cxg_schema_versions.csv → cellxgene_schema_versions.csv} +11 -0
  18. lamindb/examples/croissant/__init__.py +32 -6
  19. lamindb/examples/datasets/__init__.py +2 -2
  20. lamindb/examples/datasets/_core.py +9 -2
  21. lamindb/examples/datasets/_small.py +66 -22
  22. lamindb/examples/fixtures/sheets.py +8 -2
  23. lamindb/integrations/_croissant.py +34 -11
  24. lamindb/migrations/0118_alter_recordproject_value_projectrecord.py +99 -0
  25. lamindb/migrations/0119_rename_records_project_linked_in_records.py +26 -0
  26. lamindb/migrations/{0117_squashed.py → 0119_squashed.py} +92 -5
  27. lamindb/migrations/0120_add_record_fk_constraint.py +64 -0
  28. lamindb/migrations/0121_recorduser.py +60 -0
  29. lamindb/models/__init__.py +4 -1
  30. lamindb/models/_describe.py +2 -2
  31. lamindb/models/_feature_manager.py +131 -71
  32. lamindb/models/_from_values.py +2 -2
  33. lamindb/models/_is_versioned.py +4 -4
  34. lamindb/models/_label_manager.py +4 -4
  35. lamindb/models/artifact.py +357 -192
  36. lamindb/models/artifact_set.py +45 -1
  37. lamindb/models/can_curate.py +1 -2
  38. lamindb/models/collection.py +3 -34
  39. lamindb/models/feature.py +111 -7
  40. lamindb/models/has_parents.py +11 -11
  41. lamindb/models/project.py +42 -2
  42. lamindb/models/query_manager.py +16 -7
  43. lamindb/models/query_set.py +191 -78
  44. lamindb/models/record.py +30 -5
  45. lamindb/models/run.py +10 -33
  46. lamindb/models/save.py +6 -8
  47. lamindb/models/schema.py +54 -26
  48. lamindb/models/sqlrecord.py +152 -40
  49. lamindb/models/storage.py +59 -14
  50. lamindb/models/transform.py +17 -17
  51. lamindb/models/ulabel.py +6 -1
  52. {lamindb-1.10.1.dist-info → lamindb-1.11.0.dist-info}/METADATA +11 -16
  53. {lamindb-1.10.1.dist-info → lamindb-1.11.0.dist-info}/RECORD +55 -50
  54. {lamindb-1.10.1.dist-info → lamindb-1.11.0.dist-info}/LICENSE +0 -0
  55. {lamindb-1.10.1.dist-info → lamindb-1.11.0.dist-info}/WHEEL +0 -0
lamindb/models/storage.py CHANGED
@@ -4,6 +4,7 @@ from typing import (
4
4
  TYPE_CHECKING,
5
5
  overload,
6
6
  )
7
+ from uuid import UUID
7
8
 
8
9
  from django.db import models
9
10
  from lamin_utils import logger
@@ -11,6 +12,8 @@ from lamindb_setup import settings as setup_settings
11
12
  from lamindb_setup.core._hub_core import (
12
13
  delete_storage_record,
13
14
  get_storage_records_for_instance,
15
+ select_space,
16
+ update_storage_with_space,
14
17
  )
15
18
  from lamindb_setup.core._settings_storage import (
16
19
  StorageSettings,
@@ -25,7 +28,7 @@ from lamindb.base.fields import (
25
28
 
26
29
  from ..base.ids import base62_12
27
30
  from .run import TracksRun, TracksUpdates
28
- from .sqlrecord import SQLRecord
31
+ from .sqlrecord import Space, SQLRecord
29
32
 
30
33
  if TYPE_CHECKING:
31
34
  from pathlib import Path
@@ -61,22 +64,31 @@ class Storage(SQLRecord, TracksRun, TracksUpdates):
61
64
 
62
65
  .. dropdown:: Managing access to storage locations across instances
63
66
 
64
- You can manage access through AWS policies that you attach to your S3 bucket
65
- or leverage LaminHub's fine-grained access management.
67
+ You can manage access through LaminHub's fine-grained access management or
68
+ through AWS policies that you attach to your S3 bucket.
66
69
 
67
- Head over to `https://lamin.ai/{account}/infrastructure`.
68
- By clicking the green button that says "Connect S3 bucket", you enable Lamin to issue federated S3 tokens
69
- for a bucket so that your collaborators can access data based on their permissions in LaminHub.
70
+ To enable access management via LaminHub, head over to `https://lamin.ai/{account}/infrastructure`.
71
+ By clicking the green button that says "Connect S3 bucket", LaminDB will start connecting through federated S3 tokens
72
+ so that your collaborators access data based on their permissions in LaminHub.
70
73
  :doc:`docs:access` has more details.
71
74
 
72
75
  .. image:: https://lamin-site-assets.s3.amazonaws.com/.lamindb/ze8hkgVxVptSSZEU0000.png
73
76
  :width: 800px
74
77
 
78
+ By default, access permissions to a storage location are governed by the access permissions of its managing instance. If you
79
+ want to further restrict access to a storage location, you can move it into a space::
80
+
81
+ space = ln.Space.get(name="my-space")
82
+ storage_loc = ln.Storage.get(root="s3://my-storace-location")
83
+ storage_loc.space = space
84
+ storage_loc.save()
85
+
75
86
  If you don't want to store data in the cloud, you can use local storage locations: :doc:`faq/keep-artifacts-local`.
76
87
 
77
88
  Args:
78
89
  root: `str` The root path of the storage location, e.g., `"./mydir"`, `"s3://my-bucket"`, `"s3://my-bucket/myfolder"`, `"gs://my-bucket/myfolder"`, `"/nfs/shared/datasets/genomics"`, `"/weka/shared/models/"`, ...
79
90
  description: `str | None = None` An optional description.
91
+ space: `Space | None = None` A space to restrict access permissions to the storage location.
80
92
  host: `str | None = None` For local storage locations, pass a globally unique host identifier, e.g. `"my-institute-cluster-1"`, `"my-server-abcd"`, ...
81
93
 
82
94
  See Also:
@@ -107,18 +119,17 @@ class Storage(SQLRecord, TracksRun, TracksUpdates):
107
119
 
108
120
  ln.Storage(root="/dir/our-shared-dir", host="our-server-123").save()
109
121
 
110
- Switch to another storage location::
122
+ Globally switch to another storage location::
111
123
 
112
124
  ln.settings.storage = "/dir/our-shared-dir" # or "s3://our-bucket/our-folder", "gs://our-bucket/our-folder", ...
113
125
 
114
- If you're operating in `keep-artifacts-local` mode (:doc:`faq/keep-artifacts-local`), you can switch among additional local storage locations::
126
+ Or if you're operating in `keep-artifacts-local` mode (:doc:`faq/keep-artifacts-local`)::
115
127
 
116
- ln.Storage(root="/dir/our-other-shared-dir", host="our-server-123").save() # create
117
- ln.settings.local_storage = "/dir/our-other-shared-dir" # switch
128
+ ln.settings.local_storage = "/dir/our-other-shared-dir"
118
129
 
119
130
  View all storage locations used in your LaminDB instance::
120
131
 
121
- ln.Storage.df()
132
+ ln.Storage.to_dataframe()
122
133
 
123
134
  Notes:
124
135
 
@@ -146,6 +157,7 @@ class Storage(SQLRecord, TracksRun, TracksUpdates):
146
157
 
147
158
  class Meta(SQLRecord.Meta, TracksRun.Meta, TracksUpdates.Meta):
148
159
  abstract = False
160
+ app_label = "lamindb"
149
161
 
150
162
  _name_field: str = "root"
151
163
 
@@ -174,6 +186,7 @@ class Storage(SQLRecord, TracksRun, TracksUpdates):
174
186
  root: str,
175
187
  *,
176
188
  description: str | None = None,
189
+ space: Space | None = None,
177
190
  host: str | None = None,
178
191
  ): ...
179
192
 
@@ -190,6 +203,8 @@ class Storage(SQLRecord, TracksRun, TracksUpdates):
190
203
  ):
191
204
  if len(args) == len(self._meta.concrete_fields):
192
205
  super().__init__(*args)
206
+ self._old_space = self.space
207
+ self._old_space_id = self.space_id
193
208
  return None
194
209
  if args:
195
210
  assert len(args) == 1, ( # noqa: S101
@@ -213,17 +228,30 @@ class Storage(SQLRecord, TracksRun, TracksUpdates):
213
228
  ).one_or_none()
214
229
  else:
215
230
  storage_record = Storage.filter(root=kwargs["root"]).one_or_none()
231
+ space = kwargs.get("space", None)
216
232
  if storage_record is not None:
217
233
  from .sqlrecord import init_self_from_db
218
234
 
219
235
  init_self_from_db(self, storage_record)
236
+ self._old_space = self.space
237
+ self._old_space_id = self.space_id
220
238
  return None
221
239
 
222
240
  skip_preparation = kwargs.pop("_skip_preparation", False)
223
241
  if skip_preparation:
242
+ assert space is None, "`space` must not be set if _skip_preparation is True" # noqa: S101
224
243
  super().__init__(*args, **kwargs)
225
244
  return None
226
245
 
246
+ space_uuid = None
247
+ if space is not None:
248
+ hub_space_record = select_space(space.uid)
249
+ if hub_space_record is None:
250
+ raise ValueError(
251
+ "Please first create a space on the hub: https://docs.lamin.ai/access"
252
+ )
253
+ space_uuid = UUID(hub_space_record["id"])
254
+
227
255
  # instance_id won't take effect if
228
256
  # - there is no write access
229
257
  # - the storage location is already managed by another instance
@@ -232,8 +260,8 @@ class Storage(SQLRecord, TracksRun, TracksUpdates):
232
260
  instance_id=setup_settings.instance._id,
233
261
  instance_slug=setup_settings.instance.slug,
234
262
  register_hub=setup_settings.instance.is_on_hub,
235
- prevent_register_hub=not setup_settings.instance.is_on_hub,
236
263
  region=kwargs.get("region", None), # host was renamed to region already
264
+ space_uuid=space_uuid,
237
265
  )
238
266
  # ssettings performed validation and normalization of the root path
239
267
  kwargs["root"] = ssettings.root_as_str # noqa: S101
@@ -274,6 +302,8 @@ class Storage(SQLRecord, TracksRun, TracksUpdates):
274
302
  f"{managed_message} storage location at {kwargs['root']}{is_managed_by_instance}{hub_message}"
275
303
  )
276
304
  super().__init__(**kwargs)
305
+ self._old_space = self.space
306
+ self._old_space_id = self.space_id
277
307
 
278
308
  @property
279
309
  def host(self) -> str | None:
@@ -296,10 +326,25 @@ class Storage(SQLRecord, TracksRun, TracksUpdates):
296
326
  access_token = self._access_token if hasattr(self, "_access_token") else None
297
327
  return create_path(self.root, access_token=access_token)
298
328
 
299
- def delete(self) -> None:
329
+ def save(self, *args, **kwargs):
330
+ """Save the storage record."""
331
+ if hasattr(self, "_old_space") and hasattr(self, "_old_space_id"):
332
+ if (
333
+ self._old_space != self.space or self._old_space_id != self.space_id
334
+ ): # space_id is automatically handled by field tracker according to Claude
335
+ update_storage_with_space(
336
+ storage_lnid=self.uid, space_lnid=self.space.uid
337
+ )
338
+ super().save(*args, **kwargs)
339
+ return self
340
+
341
+ def delete(self) -> None: # type: ignore
342
+ # type ignore is there because we don't use a trash here unlike everywhere else
300
343
  """Delete the storage location.
301
344
 
302
345
  This errors in case the storage location is not empty.
346
+
347
+ Unlike other `SQLRecord`-based registries, this does *not* move the storage record into the trash.
303
348
  """
304
349
  from .. import settings
305
350
 
@@ -324,4 +369,4 @@ class Storage(SQLRecord, TracksRun, TracksUpdates):
324
369
  ssettings._mark_storage_root.unlink(
325
370
  missing_ok=True # this is totally weird, but needed on Py3.11
326
371
  )
327
- super().delete()
372
+ super(SQLRecord, self).delete()
@@ -30,6 +30,22 @@ if TYPE_CHECKING:
30
30
  from .ulabel import ULabel
31
31
 
32
32
 
33
+ def delete_transform_relations(transform: Transform):
34
+ from .project import TransformProject
35
+
36
+ # query all runs and delete their associated report and env artifacts
37
+ runs = Run.filter(transform=transform)
38
+ for run in runs:
39
+ delete_run_artifacts(run)
40
+ # CASCADE doesn't do the job below because run_id might be protected through run__transform=self
41
+ # hence, proactively delete the label links
42
+ qs = TransformProject.filter(transform=transform)
43
+ if qs.exists():
44
+ qs.delete()
45
+ # at this point, all artifacts have been taken care of
46
+ # and one can now leverage CASCADE delete
47
+
48
+
33
49
  # does not inherit from TracksRun because the Transform
34
50
  # is needed to define a run
35
51
  class Transform(SQLRecord, IsVersioned):
@@ -95,6 +111,7 @@ class Transform(SQLRecord, IsVersioned):
95
111
 
96
112
  class Meta(SQLRecord.Meta, IsVersioned.Meta):
97
113
  abstract = False
114
+ app_label = "lamindb"
98
115
  unique_together = ("key", "hash")
99
116
 
100
117
  _len_stem_uid: int = 12
@@ -315,23 +332,6 @@ class Transform(SQLRecord, IsVersioned):
315
332
  """The latest run of this transform."""
316
333
  return self.runs.order_by("-started_at").first()
317
334
 
318
- def delete(self) -> None:
319
- """Delete."""
320
- from .project import TransformProject
321
-
322
- # query all runs and delete their artifacts
323
- runs = Run.filter(transform=self)
324
- for run in runs:
325
- delete_run_artifacts(run)
326
- # CASCADE doesn't do the job below because run_id might be protected through run__transform=self
327
- # hence, proactively delete the labels
328
- qs = TransformProject.filter(transform=self)
329
- if qs.exists():
330
- qs.delete()
331
- # at this point, all artifacts have been taken care of
332
- # we can now leverage CASCADE delete
333
- super().delete()
334
-
335
335
  def view_lineage(self, with_successors: bool = False, distance: int = 5):
336
336
  """View lineage of transforms.
337
337
 
lamindb/models/ulabel.py CHANGED
@@ -83,11 +83,12 @@ class ULabel(SQLRecord, HasParents, CanCurate, TracksRun, TracksUpdates):
83
83
 
84
84
  Query an artifact by ulabel:
85
85
 
86
- >>> ln.Artifact.filter(ulabels=train_split).df()
86
+ >>> ln.Artifact.filter(ulabels=train_split).to_dataframe()
87
87
  """
88
88
 
89
89
  class Meta(SQLRecord.Meta, TracksRun.Meta, TracksUpdates.Meta):
90
90
  abstract = False
91
+ app_label = "lamindb"
91
92
 
92
93
  _name_field: str = "name"
93
94
 
@@ -221,6 +222,7 @@ class ArtifactULabel(BaseSQLRecord, IsLink, TracksRun):
221
222
  class Meta:
222
223
  # can have the same label linked to the same artifact if the feature is
223
224
  # different
225
+ app_label = "lamindb"
224
226
  unique_together = ("artifact", "ulabel", "feature")
225
227
 
226
228
 
@@ -230,6 +232,7 @@ class TransformULabel(BaseSQLRecord, IsLink, TracksRun):
230
232
  ulabel: ULabel = ForeignKey(ULabel, PROTECT, related_name="links_transform")
231
233
 
232
234
  class Meta:
235
+ app_label = "lamindb"
233
236
  unique_together = ("transform", "ulabel")
234
237
 
235
238
 
@@ -247,6 +250,7 @@ class RunULabel(BaseSQLRecord, IsLink):
247
250
  """Creator of record."""
248
251
 
249
252
  class Meta:
253
+ app_label = "lamindb"
250
254
  unique_together = ("run", "ulabel")
251
255
 
252
256
 
@@ -263,4 +267,5 @@ class CollectionULabel(BaseSQLRecord, IsLink, TracksRun):
263
267
  feature_ref_is_name: bool | None = BooleanField(null=True)
264
268
 
265
269
  class Meta:
270
+ app_label = "lamindb"
266
271
  unique_together = ("collection", "ulabel")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: lamindb
3
- Version: 1.10.1
3
+ Version: 1.11.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
@@ -10,8 +10,14 @@ Classifier: Programming Language :: Python :: 3.11
10
10
  Classifier: Programming Language :: Python :: 3.12
11
11
  Classifier: Programming Language :: Python :: 3.13
12
12
  Requires-Dist: lamin_utils==0.15.0
13
- Requires-Dist: lamin_cli==1.6.1
14
- Requires-Dist: lamindb_setup[aws]==1.9.1
13
+ Requires-Dist: lamin_cli==1.7.1
14
+ Requires-Dist: lamindb_setup[aws]==1.10.1
15
+ Requires-Dist: bionty>=1.7a1
16
+ Requires-Dist: wetlab>=1.5a1
17
+ Requires-Dist: nbproject==0.11.1
18
+ Requires-Dist: jupytext
19
+ Requires-Dist: nbconvert>=7.2.1
20
+ Requires-Dist: mistune!=3.1.0
15
21
  Requires-Dist: pyyaml
16
22
  Requires-Dist: pyarrow
17
23
  Requires-Dist: pandera>=0.24.0
@@ -23,8 +29,6 @@ Requires-Dist: anndata>=0.8.0,<=0.12.1
23
29
  Requires-Dist: fsspec
24
30
  Requires-Dist: graphviz
25
31
  Requires-Dist: psycopg2-binary
26
- Requires-Dist: bionty>=1.6.1rc1 ; extra == "bionty"
27
- Requires-Dist: clinicore>=1.2.1 ; extra == "clinicore"
28
32
  Requires-Dist: tomlkit ; extra == "dev"
29
33
  Requires-Dist: line_profiler ; extra == "dev"
30
34
  Requires-Dist: pre-commit ; extra == "dev"
@@ -32,28 +36,19 @@ Requires-Dist: nox ; extra == "dev"
32
36
  Requires-Dist: laminci>=0.3 ; extra == "dev"
33
37
  Requires-Dist: pytest>=6.0 ; extra == "dev"
34
38
  Requires-Dist: coverage ; extra == "dev"
35
- Requires-Dist: pytest-cov ; extra == "dev"
39
+ Requires-Dist: pytest-cov<7.0.0 ; extra == "dev"
36
40
  Requires-Dist: mudata ; extra == "dev"
37
41
  Requires-Dist: nbproject_test>=0.6.0 ; extra == "dev"
38
42
  Requires-Dist: faker-biology ; extra == "dev"
39
43
  Requires-Dist: pronto ; extra == "dev"
40
44
  Requires-Dist: readfcs>=2.0.1 ; extra == "fcs"
41
45
  Requires-Dist: lamindb_setup[gcp] ; extra == "gcp"
42
- Requires-Dist: nbproject==0.11.1 ; extra == "jupyter"
43
- Requires-Dist: jupytext ; extra == "jupyter"
44
- Requires-Dist: nbconvert>=7.2.1 ; extra == "jupyter"
45
- Requires-Dist: mistune!=3.1.0 ; extra == "jupyter"
46
- Requires-Dist: wetlab>=1.3.1 ; extra == "wetlab"
47
46
  Requires-Dist: numcodecs<0.16.0 ; extra == "zarr"
48
47
  Requires-Dist: zarr>=2.16.0,<3.0.0a0 ; extra == "zarr"
49
48
  Project-URL: Home, https://github.com/laminlabs/lamindb
50
- Provides-Extra: bionty
51
- Provides-Extra: clinicore
52
49
  Provides-Extra: dev
53
50
  Provides-Extra: fcs
54
51
  Provides-Extra: gcp
55
- Provides-Extra: jupyter
56
- Provides-Extra: wetlab
57
52
  Provides-Extra: zarr
58
53
 
59
54
  [![Stars](https://img.shields.io/github/stars/laminlabs/lamindb?logo=GitHub)](https://github.com/laminlabs/lamindb)
@@ -77,7 +72,7 @@ It lets you track data transformations, validate & annotate datasets, and query
77
72
  Install the `lamindb` Python package:
78
73
 
79
74
  ```shell
80
- pip install 'lamindb[jupyter,bionty]' # support notebooks & biological ontologies
75
+ pip install lamindb
81
76
  ```
82
77
 
83
78
  Create a LaminDB instance:
@@ -1,10 +1,11 @@
1
- lamindb/__init__.py,sha256=cWTeR7mqoNI5I8jjkRldYjJOqmaCsy7n8wCvbbWbeNI,2905
2
- lamindb/_finish.py,sha256=3HVKRw27rQs_S2ior-JX2IU0vUkeG5a6p8XgEgdT8-U,21219
3
- lamindb/_tracked.py,sha256=-wK7BJv30nf4v2_nH5qDCyxHvug7ih6duQNGxDrj3UE,4447
4
- lamindb/_view.py,sha256=cod1RnZoLyzMVJcjWjytg78Sf4qsR8IAdqpwzsi8FTw,4950
5
- lamindb/errors.py,sha256=efqBQ1ca3jMsgCYj2Dssf-SQ9nN70we-eEWnwhQesio,2192
1
+ lamindb/__init__.py,sha256=iD3JsR1_pxWQ_61vYJRqY3W04strzBiwxhGMBksNvys,3241
2
+ lamindb/_finish.py,sha256=4KkFyb9d-GEGjDw_zDrnGt_bq3auQ_OQu0hV-2U73AQ,21355
3
+ lamindb/_tracked.py,sha256=fls9yd7EEGO9Ni51kA_pcBkeLpzm2HZrWtwYGQequNE,4395
4
+ lamindb/_view.py,sha256=GOKTfwnEaly9fdeWo9SlhYRc3UWEyLDmTlIUzjFXMYY,4960
5
+ lamindb/errors.py,sha256=kHKRWXPGQPnzTo0D0vQxJjY_8bGH_Xx1IGFgM-dYN3E,2277
6
6
  lamindb/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- lamindb/base/__init__.py,sha256=6-iUeiBHuxC8vxP3vG880CH1nqP_7z34Appzzr63FBA,295
7
+ lamindb/base/__init__.py,sha256=u623ZDoNCwwyLLt_Jhtp3KDeum0LOg6cwAqn5TEgz_E,313
8
+ lamindb/base/dtypes.py,sha256=Bfrca8Slb3vIAIMLd-mjG4_9bTHz-LlThSIUHvfNmhA,3189
8
9
  lamindb/base/fields.py,sha256=5l8ke5sAJ5_JvWqjKEMW8oyriGKA7itqGjbmoKKrJrM,8102
9
10
  lamindb/base/ids.py,sha256=X-1N129FOoNw4TPlK_EzgTZOzRidiMyPWszz9r_066g,34
10
11
  lamindb/base/types.py,sha256=NM_J9hQE80fere5dy-se04_Tg2BnPx_0n1ulLHL9iss,3027
@@ -14,47 +15,47 @@ lamindb/core/__init__.py,sha256=I9F-GugBMZwFLpUPb1MXyLfccIVAj021Gb_00h_18MY,633
14
15
  lamindb/core/_compat.py,sha256=NLnKk1qk4xdgMV-QwFDnBnbio02ujjlF86icvhpdv4c,2029
15
16
  lamindb/core/_context.py,sha256=5edP0M5_m8zgNXu7-1XaRLOv20i5LaWHBkEvMHsSiB0,40376
16
17
  lamindb/core/_mapped_collection.py,sha256=osquwC6ee0wJ_I6O-8AZwnQUa_r9zqa0MN82Q-nBI3Y,25746
17
- lamindb/core/_settings.py,sha256=Dj44Xh5x3OEpTPvG0twREcIv6X6Er5NzDZO86i8Cq9g,8678
18
+ lamindb/core/_settings.py,sha256=519bOSopRb7_nE874KDJB263v1xFlk4TOqhBNNeO4yw,10992
18
19
  lamindb/core/_sync_git.py,sha256=Z7keuyS5X7CAj285sEbZIFExZF9mtjGH8DzKwz3xhHw,5881
19
20
  lamindb/core/_track_environment.py,sha256=fa0-qKEe0BpL79_nsDUDtbg1iA3VpJTh0RCOGdc2XOA,974
20
21
  lamindb/core/exceptions.py,sha256=FMEoSvT3FvtLkxQAt2oDXPeaPem8V5x5UBbTsPFYU5w,53
21
22
  lamindb/core/loaders.py,sha256=QH3r3Q_aPrbkgiWaV30TmxcLCs6zZFQLRW442DsTrNU,5456
22
23
  lamindb/core/types.py,sha256=_u8amXATAZN-nNGNWYGmyqYDcHbT_i0NZeLRhm_-ygI,378
23
24
  lamindb/core/storage/__init__.py,sha256=2gJyn9w6rzv3oPHjY756OfQYrLEXb37YuKMqh6ZjbF8,542
24
- lamindb/core/storage/_anndata_accessor.py,sha256=NOAqI-SHS8IwM0MwsZmRUtqG8r4tBTJ9T8888lhvQkw,26611
25
- lamindb/core/storage/_backed_access.py,sha256=5y3C_D1g89d831FAXr8-WashmmL3cdNfTR5s61vrMdA,7858
25
+ lamindb/core/storage/_anndata_accessor.py,sha256=R6GMSojhI1qj2G1Ei9E1u_jhkHU9dX2kezy7TGojebQ,29778
26
+ lamindb/core/storage/_backed_access.py,sha256=f5BOAEFSfiFQcZQiok-vTpSUqF6BbSyF6UKkYLC_chc,8077
26
27
  lamindb/core/storage/_polars_lazy_df.py,sha256=_JhnU8RmoTzU2kp7kyHRSUTAkFhpCJo6NNnHxvBXQv4,2929
27
28
  lamindb/core/storage/_pyarrow_dataset.py,sha256=lRYYt7edUtwauhxd7RwFud6YPDbz2PFvYYgqLhfapfk,1398
28
- lamindb/core/storage/_spatialdata_accessor.py,sha256=e5jqRMWAb2zA0srHOTpgmUdFZk54g6gVEbkEBqq6Ndk,1446
29
+ lamindb/core/storage/_spatialdata_accessor.py,sha256=mn3iiNIBixGpBJoMmkHCvcoUut7Ttwy9QxGK7P5ywNo,1718
29
30
  lamindb/core/storage/_tiledbsoma.py,sha256=EdzgGVTamB7Ef31doGFWwIOhTd9TNrBfNUplDWSp6wo,11386
30
31
  lamindb/core/storage/_valid_suffixes.py,sha256=vUSeQ4s01rdhD_vSd6wKmFBsgMJAKkBMnL_T9Y1znMg,501
31
- lamindb/core/storage/_zarr.py,sha256=PncgrnA3XX2D01AQsTatCImEpbJUriEo00LHmARCkIE,4265
32
+ lamindb/core/storage/_zarr.py,sha256=VHT01D_QktmZB4r92XSe8FYveoPkFtn_8XAd3hV1GSA,4433
32
33
  lamindb/core/storage/objects.py,sha256=ISVjBuXPQENZ2XVQDvfX-HZSyDjQi_OGnoJXQmI---Y,3282
33
34
  lamindb/core/storage/paths.py,sha256=C6qAFtWFvFA2RtA9M4KGxT87wmZWqB9b1V5jOCY0ALc,7141
34
35
  lamindb/core/subsettings/__init__.py,sha256=f_vOqZOjVGez8pLmtrUuc_ayDGXl07t_ZY-P2Cedxbo,201
35
36
  lamindb/core/subsettings/_annotation_settings.py,sha256=o-yTYw-NmjFmtehbKU8qnf7tyaeDFkTRGan1pXAIVT0,370
36
37
  lamindb/core/subsettings/_creation_settings.py,sha256=NGHWKqCFSzVNBxAr2VnmdYguiFdW29XUK7T9wRsVshg,906
37
38
  lamindb/curators/__init__.py,sha256=WLnaVxrhQGZxGB3pjg-SM4oUu6DaKA78S_J3BfVKLEg,496
38
- lamindb/curators/_legacy.py,sha256=V2zF1J7jN2Ry7ascH06JytrAQzeOiirg7e4a9d0hpvM,54768
39
- lamindb/curators/core.py,sha256=OfCSLw6Ngu_HmCSjwRUZrsVwcdq-ge9JL1Wfl0djiyM,68832
39
+ lamindb/curators/_legacy.py,sha256=Ay2nd4u2OPL59aYC6rKNE9YpfVTC-MMPvnyzS3fM6xg,55172
40
+ lamindb/curators/core.py,sha256=PbkRxt8ngAxnfTXXxKNKCCEgtUxoyp3_I2f4UVyB7tE,78316
40
41
  lamindb/examples/__init__.py,sha256=f0pBxijIA26ULUBnsP2sa1e4CLqMTeUUEqNeINJIf9o,179
41
- lamindb/examples/cellxgene/__init__.py,sha256=Xzxfi_NQcWdK-RrbNFdlIFQFVPG8Qy18ekYx3sOQZeM,161
42
- lamindb/examples/cellxgene/_cellxgene.py,sha256=HP_skQJbNYDEYhiLUpaP9kfmtPivmgTuGyoWNLs07nw,8844
43
- lamindb/examples/cellxgene/cxg_schema_versions.csv,sha256=Du_zk2rrMA4AbHwYp6vgLzZH1Krnmml_KVerc2IvvkI,2107
44
- lamindb/examples/croissant/__init__.py,sha256=a8LFsAvHzts_C2jlcbuF7kxwGEBWd4VERsluwDFh_iY,1418
42
+ lamindb/examples/cellxgene/__init__.py,sha256=0itpr7sthjaZAbL5nGTVTisL5OeP-3WqKFr8zyDWxYM,247
43
+ lamindb/examples/cellxgene/_cellxgene.py,sha256=Vgot8L9ZmaX_PwOlsghmVKsnstxj979yRGjWNtDclUw,12885
44
+ lamindb/examples/cellxgene/cellxgene_schema_versions.csv,sha256=IbtgPbrMksqr3q9z0t2-D1ZTPnMO_i29W7crtgpN52w,2534
45
+ lamindb/examples/croissant/__init__.py,sha256=dfkL6MJ-L0qdPd4ZzGlMAlQHCB5wIGpSuQVwXBEeQwQ,2322
45
46
  lamindb/examples/croissant/mini_immuno.anndata.zarr_metadata.json,sha256=XhY4wnFyMoK4Thkaolh2yJxtU6sX0bdFsJvRvt942k8,2921
46
- lamindb/examples/datasets/__init__.py,sha256=TI91CjNMh0MqcZVcruO6xLGPYqqQ5o3p_E37huOV3GI,1976
47
- lamindb/examples/datasets/_core.py,sha256=o_Kaz-i1W7ldXP2d1arUix_JvxPS9n2bpDAiW0M_yxA,21302
47
+ lamindb/examples/datasets/__init__.py,sha256=SKeX5kgjfXtNkUek4GfLYsgn-bGO8UsuF4Qf3R_zN-4,1988
48
+ lamindb/examples/datasets/_core.py,sha256=JIHf8NrvGYHYtt-ILxCIb4tOQUIPpFBXw357fDlbU2I,21553
48
49
  lamindb/examples/datasets/_fake.py,sha256=BZF9R_1iF0HDnvtZNqL2FtsjSMuqDIfuFxnw_LJYIh4,953
49
- lamindb/examples/datasets/_small.py,sha256=60WKs6Oo2NE7HUqe6PLfiPxH_5TYUjr_iZdtFWiOeAA,3460
50
+ lamindb/examples/datasets/_small.py,sha256=wHJb6eXzkQC_Ma8VqX7Orb3nGuAbyNdrr0jxJ93jjxc,4852
50
51
  lamindb/examples/datasets/mini_immuno.py,sha256=ZEL9T4zhCKm8ggqU7VVhuihVKPR3MmlkJNOtdygH2v4,6107
51
52
  lamindb/examples/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
- lamindb/examples/fixtures/sheets.py,sha256=2oRAY2jQYCJuW_gCTGAs90XerYQHIe3pivoi0vzgXpc,9035
53
+ lamindb/examples/fixtures/sheets.py,sha256=YrkHLSjXIzIJlvZFuYppGqDcQKif93O37CcRobZkNDQ,9506
53
54
  lamindb/examples/schemas/__init__.py,sha256=NPDp7VjMOHStEIthx3xW9NSHtY7jnnMzrNPcSDgxT3M,241
54
55
  lamindb/examples/schemas/_anndata.py,sha256=TAQrnBLZhH4TgbznrJDdGK_Gze6cf1MvyXuCcKIvb1g,1210
55
56
  lamindb/examples/schemas/_simple.py,sha256=Dspj5QRmv241IstBxuc1E1Q5YeEqTOnOvakg7ChPj1k,911
56
57
  lamindb/integrations/__init__.py,sha256=Zh0ROuRmob1QGV2mCo3A7cFmdheJGq4CUdo7G16pRHU,286
57
- lamindb/integrations/_croissant.py,sha256=9zRkOg2pkaiylKslfKfxYzZ5I5813qhCfA4Er3Q3bB4,4166
58
+ lamindb/integrations/_croissant.py,sha256=RNX6dDPPun1QG6t456GxK19t071_FJWzwmUXiVDkHFE,5200
58
59
  lamindb/integrations/_vitessce.py,sha256=s2F8KPpYVG0zUOTaDJgH1XAJtQDg1zrD_SxC4ZHUkHk,4035
59
60
  lamindb/migrations/0069_squashed.py,sha256=7XdiRW0MBtr3Jck9dbIy_9qxmB_sjtLM1SH9x062d2k,62631
60
61
  lamindb/migrations/0070_lamindbv1_migrate_data.py,sha256=tyq_xi6U8TXi9C2Raf6v_UTtfyfqQOUIFJzYj4oCgAE,2429
@@ -105,39 +106,43 @@ lamindb/migrations/0114_alter_run__status_code.py,sha256=KkGecSBJElA3LBnhSK5_rFp
105
106
  lamindb/migrations/0115_alter_space_uid.py,sha256=18fCP8d31Ox1KxSSmfzU-W3lSpS3xtiaBNbPeHQiuTM,1332
106
107
  lamindb/migrations/0116_remove_artifact_unique_artifact_storage_key_hash_and_more.py,sha256=vCAeIg8TdtVaC2kZIq3KTY5hcz_RiXh_44Sczv75RA4,1562
107
108
  lamindb/migrations/0117_fix_artifact_storage_hash_unique_constraints.py,sha256=OqgUmf9_TeNwTddwcwZdJYfpN6cpFYBaw5_KitYumNM,1033
108
- lamindb/migrations/0117_squashed.py,sha256=i9rdXIVWkgNaZTaaFs-Ozi_0CC-pKHOdF2ZM37M4fOY,163772
109
+ lamindb/migrations/0118_alter_recordproject_value_projectrecord.py,sha256=aNC_o3xfH9wk1BTbOWKbXeV4r_IPXgytYBRTFi_U-MM,3493
110
+ lamindb/migrations/0119_rename_records_project_linked_in_records.py,sha256=Feh4rCfoGD4kiGG-sk_IQx7cplDn-yVIlzI5FzE8utI,688
111
+ lamindb/migrations/0119_squashed.py,sha256=mY1gpmPqEDEZjjPFgiDJSSGhP9TmNi-T7b5bNmRDztM,166975
112
+ lamindb/migrations/0120_add_record_fk_constraint.py,sha256=KvYuA0ET6hoVugu9gwAk29_dSM5HKeOzNvQARjjyK5U,1815
113
+ lamindb/migrations/0121_recorduser.py,sha256=aDz6P-dSUn2bsLKuNPpMk2bSY1DeDftQPBBIVtNCpAI,1980
109
114
  lamindb/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
- lamindb/models/__init__.py,sha256=mtjZH0x31aV463YaUef8ZvdQHlGa6SZr_thsrlbdkCg,2419
111
- lamindb/models/_describe.py,sha256=OD-MokYrB6mfzkmFdTkRj0J93LyqxFOgJi_5LvOXr1A,10915
115
+ lamindb/models/__init__.py,sha256=Owupnxv_JnoOenlSpn6iT997VRnwayBowh5MAfT-Eqs,2484
116
+ lamindb/models/_describe.py,sha256=Co6_whJG7Pm2Sl6YDmGoYL28XZyJ7VqICHTfgGedxvw,10919
112
117
  lamindb/models/_django.py,sha256=go0sAhIGJ-JkYe5OMviWUm-ZwHdqDuBgnPbFvncA-lQ,12347
113
- lamindb/models/_feature_manager.py,sha256=rKScsFCpmZ1JVu4pnq59MhZsz90zlF6oN2UAilwPokU,55038
114
- lamindb/models/_from_values.py,sha256=cCGPMDlAbBrdhFW-XrIQVZ10q1LNg4MycYPLOkF0fTc,13366
115
- lamindb/models/_is_versioned.py,sha256=Th2_cBf9UWh27E6ANxg6LGmjBOumXFy7AjH0GG4FoXA,7601
116
- lamindb/models/_label_manager.py,sha256=O3KaaTEVId5ky3h0aCGg1kDoFFfrovFYlV82YsZZyIs,12127
118
+ lamindb/models/_feature_manager.py,sha256=35CylDvaq-awUTSpjqgMDyBU78wfkRou3OteUfmtZo0,57502
119
+ lamindb/models/_from_values.py,sha256=ymR8b0Qa3ZiTFTIuMsFYiBNH16ggDPlYeFjCaFgGETA,13372
120
+ lamindb/models/_is_versioned.py,sha256=zCnn5Z5HehBlKX-NXFhqfr3lbVOMRhlvG4ljtLbXl4A,7590
121
+ lamindb/models/_label_manager.py,sha256=12RV8uEpWILGUkNHb7JMccF341ArmrIbHfI9KAo742Q,12118
117
122
  lamindb/models/_relations.py,sha256=zHYLujy9vkuB9jVq5844TpzLSP__iYNCQcsl-FzK1Jw,3700
118
- lamindb/models/artifact.py,sha256=yBNgOJTokGKy5EUDzugzs1bXBObGKSqDLJ2nZLk6M3s,117610
119
- lamindb/models/artifact_set.py,sha256=VOZEGDo3m_9Yg_ftx3I2fwdydjHN61X_qV18N6xG4kM,4117
120
- lamindb/models/can_curate.py,sha256=_6ymHhtc9zpU8O6ozqNDqn7jh87C9JisU_dl2gH2Hpo,29329
121
- lamindb/models/collection.py,sha256=ZMBaDqQtil9yWqDC_twKbavGkdAulcu9j2WlfHADxn0,28358
122
- lamindb/models/feature.py,sha256=eIskKsSBkwW6ftfOZ_ngeqD9Pi6Y70cY_m3WHTCXNU8,38031
123
- lamindb/models/has_parents.py,sha256=NRNshrWCX7G3nnM3lnnHQ3Ho216T3EJfgakY6KlTvt8,20301
124
- lamindb/models/project.py,sha256=4w2rMZMPrLmvirvJQanhKfqwGqEnpY42iaOWi99YPw0,17345
125
- lamindb/models/query_manager.py,sha256=EzbyNA5zWUbLYH5yJ7dIC90j1teVoQHrXpRLjCfBEao,11036
126
- lamindb/models/query_set.py,sha256=d27m8UF8QZAzHZBEVE1QdJRtx9wCzYgkDdHGCATBM48,34815
127
- lamindb/models/record.py,sha256=WW6iuQT8M4KHcpZoYGSTjND10hvDUIff7DOkyD5d2Fc,12070
128
- lamindb/models/run.py,sha256=czMzg1Hp0Ju4eGM0T2vwCSerVpdzd5JyEW2Kj9tjg2o,15580
129
- lamindb/models/save.py,sha256=jXha2jfY-pWsKuP2dwaEROhUGxhM8fTWQGWAzA_xsM0,16777
130
- lamindb/models/schema.py,sha256=7l2T_uOi7Lkj4yHuZWml1p7axBn_yNO4IlXkn8M2f9g,48962
131
- lamindb/models/sqlrecord.py,sha256=SBonVDvkUXh4XZgM87VV96yM9MNMgVvBlRalhTpaZH8,68515
132
- lamindb/models/storage.py,sha256=0jvuQyJcIMdrZ9qq-vmKkI66libb2DqWjCXNFuvinIM,13518
133
- lamindb/models/transform.py,sha256=oXT_uF9CM4vrEt1APbdSUSMxclkxeVq9tjgQRmicqos,12774
134
- lamindb/models/ulabel.py,sha256=ocAMSKeQcq2Kr6Dq0mxGupOmW1K0pAs19vjDeTEb6vM,9335
123
+ lamindb/models/artifact.py,sha256=V_uLsa73xNll7iFqUjJl0lAI1s7Q6qycG6ufWP4pvYo,123158
124
+ lamindb/models/artifact_set.py,sha256=TfRxmuY9mRzkIeG_vWIDxq4_R_efnXuTbz4xxz7S5Kg,5389
125
+ lamindb/models/can_curate.py,sha256=_w7k8-gPju7owHzX79phtcL7VRy7wAaz-90MzOz8UUQ,29313
126
+ lamindb/models/collection.py,sha256=OqPhDppzCx2y7xEqtmV83el4iNrvOO1KvkE-y8ZEvm4,27372
127
+ lamindb/models/feature.py,sha256=6kI3UZMp3gBi75NhXBp_jn-1tRlc42YdJOEJFNgjtNo,41814
128
+ lamindb/models/has_parents.py,sha256=Ok-Tsh4-oBDjkyevyMSuOCb0mzDiswiO_0ufTqWz8o4,20341
129
+ lamindb/models/project.py,sha256=AhaY24iE8ilpS5dRFYzY6xQNVlqPHWMk72ib2OI_N8U,18732
130
+ lamindb/models/query_manager.py,sha256=zjO31kbj1t08WTxeZB9-BPjooz6axh06EFu90dfvpSA,11358
131
+ lamindb/models/query_set.py,sha256=y18mzqWUNbjOmcS1oW25ZxYtvEMtXYGB8c10OGxNZ4c,39117
132
+ lamindb/models/record.py,sha256=2eKEDqpiX5-aN2kUVXLuTVvQUspqQ5h10onbQM6Ta7g,13041
133
+ lamindb/models/run.py,sha256=LVZ2z5QV4aVYYsqGcLmMfqvPpKj4EGGHVts_RR8_c-E,14443
134
+ lamindb/models/save.py,sha256=gBt74RqfwgTa8PnTE153p17PruTAt6WGmGk9ZEBrojI,16719
135
+ lamindb/models/schema.py,sha256=LQuPQhyLitloRGxq6DWZMHcR-xDZY1NctPHjrC6t1iw,49827
136
+ lamindb/models/sqlrecord.py,sha256=3ueIE0_1CY8BUkHNigOhpsPf7WnulAytjEaINnOmS2I,72681
137
+ lamindb/models/storage.py,sha256=n7jth0RQ19K0W8ICbrAO942d5jBm1-h7DsrSjMJgAB0,15551
138
+ lamindb/models/transform.py,sha256=FcIPqmSk1hahg2Cr8q6lm1kKpbdvu2JUceSlPIV9Dww,12780
139
+ lamindb/models/ulabel.py,sha256=UznidEEoiIns_KetWgCbDejXuM5hmzF6F49yqf2kLpQ,9495
135
140
  lamindb/setup/__init__.py,sha256=QZ-JF8IzO_ckDOU223lsJrdO5ay7cDFgvCbkLeAuxYA,467
136
141
  lamindb/setup/_switch.py,sha256=njZJN__JOhVrBFGClQG1wobdhJJp6l_XzPGKtKSCrfU,434
137
142
  lamindb/setup/core/__init__.py,sha256=SevlVrc2AZWL3uALbE5sopxBnIZPWZ1IB0NBDudiAL8,167
138
143
  lamindb/setup/errors/__init__.py,sha256=bAHTxOUJW1rm4zpF0Pvqkftn8W6iMGnQ-uyNBu13Nfg,171
139
144
  lamindb/setup/types/__init__.py,sha256=ATaosOi6q-cDWB52T69_sRmLMqj8cHfc-vljzZsrJNw,169
140
- lamindb-1.10.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
141
- lamindb-1.10.1.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
142
- lamindb-1.10.1.dist-info/METADATA,sha256=UYl8nK7xlSZg0L4GaKYNkMjXuNs36LvfgSJFq-StSho,5199
143
- lamindb-1.10.1.dist-info/RECORD,,
145
+ lamindb-1.11.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
146
+ lamindb-1.11.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
147
+ lamindb-1.11.0.dist-info/METADATA,sha256=lda7anilPXNn2C-lxekpQAR_AekrD8gU6vYzCxp76TM,4865
148
+ lamindb-1.11.0.dist-info/RECORD,,