lamindb 1.10.2__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 (50) 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 +2 -2
  8. lamindb/core/storage/_anndata_accessor.py +29 -9
  9. lamindb/curators/_legacy.py +16 -3
  10. lamindb/curators/core.py +442 -188
  11. lamindb/errors.py +6 -0
  12. lamindb/examples/cellxgene/__init__.py +8 -3
  13. lamindb/examples/cellxgene/_cellxgene.py +127 -13
  14. lamindb/examples/cellxgene/{cxg_schema_versions.csv → cellxgene_schema_versions.csv} +11 -0
  15. lamindb/examples/croissant/__init__.py +32 -6
  16. lamindb/examples/datasets/__init__.py +2 -2
  17. lamindb/examples/datasets/_core.py +9 -2
  18. lamindb/examples/datasets/_small.py +66 -22
  19. lamindb/examples/fixtures/sheets.py +8 -2
  20. lamindb/integrations/_croissant.py +34 -11
  21. lamindb/migrations/0119_squashed.py +5 -2
  22. lamindb/migrations/0120_add_record_fk_constraint.py +64 -0
  23. lamindb/migrations/0121_recorduser.py +60 -0
  24. lamindb/models/__init__.py +4 -1
  25. lamindb/models/_describe.py +2 -2
  26. lamindb/models/_feature_manager.py +131 -71
  27. lamindb/models/_from_values.py +2 -2
  28. lamindb/models/_is_versioned.py +4 -4
  29. lamindb/models/_label_manager.py +4 -4
  30. lamindb/models/artifact.py +326 -172
  31. lamindb/models/artifact_set.py +45 -1
  32. lamindb/models/can_curate.py +1 -2
  33. lamindb/models/collection.py +3 -34
  34. lamindb/models/feature.py +111 -7
  35. lamindb/models/has_parents.py +11 -11
  36. lamindb/models/project.py +18 -0
  37. lamindb/models/query_manager.py +16 -7
  38. lamindb/models/query_set.py +191 -78
  39. lamindb/models/record.py +30 -5
  40. lamindb/models/run.py +10 -33
  41. lamindb/models/save.py +6 -8
  42. lamindb/models/schema.py +54 -26
  43. lamindb/models/sqlrecord.py +152 -40
  44. lamindb/models/storage.py +59 -14
  45. lamindb/models/transform.py +17 -17
  46. lamindb/models/ulabel.py +6 -1
  47. {lamindb-1.10.2.dist-info → lamindb-1.11.0.dist-info}/METADATA +12 -18
  48. {lamindb-1.10.2.dist-info → lamindb-1.11.0.dist-info}/RECORD +50 -47
  49. {lamindb-1.10.2.dist-info → lamindb-1.11.0.dist-info}/WHEEL +1 -1
  50. {lamindb-1.10.2.dist-info/licenses → lamindb-1.11.0.dist-info}/LICENSE +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
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.3
2
2
  Name: lamindb
3
- Version: 1.10.2
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
@@ -9,10 +9,15 @@ 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
- License-File: LICENSE
13
12
  Requires-Dist: lamin_utils==0.15.0
14
- Requires-Dist: lamin_cli==1.6.1
15
- 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
16
21
  Requires-Dist: pyyaml
17
22
  Requires-Dist: pyarrow
18
23
  Requires-Dist: pandera>=0.24.0
@@ -24,8 +29,6 @@ Requires-Dist: anndata>=0.8.0,<=0.12.1
24
29
  Requires-Dist: fsspec
25
30
  Requires-Dist: graphviz
26
31
  Requires-Dist: psycopg2-binary
27
- Requires-Dist: bionty>=1.6.1rc1 ; extra == "bionty"
28
- Requires-Dist: clinicore>=1.2.1 ; extra == "clinicore"
29
32
  Requires-Dist: tomlkit ; extra == "dev"
30
33
  Requires-Dist: line_profiler ; extra == "dev"
31
34
  Requires-Dist: pre-commit ; extra == "dev"
@@ -33,28 +36,19 @@ Requires-Dist: nox ; extra == "dev"
33
36
  Requires-Dist: laminci>=0.3 ; extra == "dev"
34
37
  Requires-Dist: pytest>=6.0 ; extra == "dev"
35
38
  Requires-Dist: coverage ; extra == "dev"
36
- Requires-Dist: pytest-cov ; extra == "dev"
39
+ Requires-Dist: pytest-cov<7.0.0 ; extra == "dev"
37
40
  Requires-Dist: mudata ; extra == "dev"
38
41
  Requires-Dist: nbproject_test>=0.6.0 ; extra == "dev"
39
42
  Requires-Dist: faker-biology ; extra == "dev"
40
43
  Requires-Dist: pronto ; extra == "dev"
41
44
  Requires-Dist: readfcs>=2.0.1 ; extra == "fcs"
42
45
  Requires-Dist: lamindb_setup[gcp] ; extra == "gcp"
43
- Requires-Dist: nbproject==0.11.1 ; extra == "jupyter"
44
- Requires-Dist: jupytext ; extra == "jupyter"
45
- Requires-Dist: nbconvert>=7.2.1 ; extra == "jupyter"
46
- Requires-Dist: mistune!=3.1.0 ; extra == "jupyter"
47
- Requires-Dist: wetlab>=1.3.1 ; extra == "wetlab"
48
46
  Requires-Dist: numcodecs<0.16.0 ; extra == "zarr"
49
47
  Requires-Dist: zarr>=2.16.0,<3.0.0a0 ; extra == "zarr"
50
48
  Project-URL: Home, https://github.com/laminlabs/lamindb
51
- Provides-Extra: bionty
52
- Provides-Extra: clinicore
53
49
  Provides-Extra: dev
54
50
  Provides-Extra: fcs
55
51
  Provides-Extra: gcp
56
- Provides-Extra: jupyter
57
- Provides-Extra: wetlab
58
52
  Provides-Extra: zarr
59
53
 
60
54
  [![Stars](https://img.shields.io/github/stars/laminlabs/lamindb?logo=GitHub)](https://github.com/laminlabs/lamindb)
@@ -78,7 +72,7 @@ It lets you track data transformations, validate & annotate datasets, and query
78
72
  Install the `lamindb` Python package:
79
73
 
80
74
  ```shell
81
- pip install 'lamindb[jupyter,bionty]' # support notebooks & biological ontologies
75
+ pip install lamindb
82
76
  ```
83
77
 
84
78
  Create a LaminDB instance:
@@ -1,10 +1,11 @@
1
- lamindb/__init__.py,sha256=pY7V83g2bBifDvpSqVwvAWDmkIBDXUh_fBMIG70o7Zo,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,14 +15,14 @@ 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=urrw4PtH6XR5MXyziggkzdCHMG2qUI51ZF6ISFOtA7w,10990
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=0u6U7wNUc__yb2addm1Isp_ITEABuy-YHrGSF3oFz7g,29092
25
+ lamindb/core/storage/_anndata_accessor.py,sha256=R6GMSojhI1qj2G1Ei9E1u_jhkHU9dX2kezy7TGojebQ,29778
25
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
@@ -35,26 +36,26 @@ lamindb/core/subsettings/__init__.py,sha256=f_vOqZOjVGez8pLmtrUuc_ayDGXl07t_ZY-P
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=2ZzZG8Xyg3N7UdKrQwhgFjtrd2MSz2fKJ0D3WsInD2s,68838
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
@@ -107,39 +108,41 @@ lamindb/migrations/0116_remove_artifact_unique_artifact_storage_key_hash_and_mor
107
108
  lamindb/migrations/0117_fix_artifact_storage_hash_unique_constraints.py,sha256=OqgUmf9_TeNwTddwcwZdJYfpN6cpFYBaw5_KitYumNM,1033
108
109
  lamindb/migrations/0118_alter_recordproject_value_projectrecord.py,sha256=aNC_o3xfH9wk1BTbOWKbXeV4r_IPXgytYBRTFi_U-MM,3493
109
110
  lamindb/migrations/0119_rename_records_project_linked_in_records.py,sha256=Feh4rCfoGD4kiGG-sk_IQx7cplDn-yVIlzI5FzE8utI,688
110
- lamindb/migrations/0119_squashed.py,sha256=s4qKQa6EMR3fontNSSd18LsamK0HkfqPJtolwqWcAVI,166916
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
111
114
  lamindb/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
- lamindb/models/__init__.py,sha256=mtjZH0x31aV463YaUef8ZvdQHlGa6SZr_thsrlbdkCg,2419
113
- 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
114
117
  lamindb/models/_django.py,sha256=go0sAhIGJ-JkYe5OMviWUm-ZwHdqDuBgnPbFvncA-lQ,12347
115
- lamindb/models/_feature_manager.py,sha256=rKScsFCpmZ1JVu4pnq59MhZsz90zlF6oN2UAilwPokU,55038
116
- lamindb/models/_from_values.py,sha256=cCGPMDlAbBrdhFW-XrIQVZ10q1LNg4MycYPLOkF0fTc,13366
117
- lamindb/models/_is_versioned.py,sha256=Th2_cBf9UWh27E6ANxg6LGmjBOumXFy7AjH0GG4FoXA,7601
118
- 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
119
122
  lamindb/models/_relations.py,sha256=zHYLujy9vkuB9jVq5844TpzLSP__iYNCQcsl-FzK1Jw,3700
120
- lamindb/models/artifact.py,sha256=NZtF9x7z3O7pSaCGQwA9V-lnoSvaHfusEMkuWjxora4,118203
121
- lamindb/models/artifact_set.py,sha256=VOZEGDo3m_9Yg_ftx3I2fwdydjHN61X_qV18N6xG4kM,4117
122
- lamindb/models/can_curate.py,sha256=_6ymHhtc9zpU8O6ozqNDqn7jh87C9JisU_dl2gH2Hpo,29329
123
- lamindb/models/collection.py,sha256=ZMBaDqQtil9yWqDC_twKbavGkdAulcu9j2WlfHADxn0,28358
124
- lamindb/models/feature.py,sha256=eIskKsSBkwW6ftfOZ_ngeqD9Pi6Y70cY_m3WHTCXNU8,38031
125
- lamindb/models/has_parents.py,sha256=NRNshrWCX7G3nnM3lnnHQ3Ho216T3EJfgakY6KlTvt8,20301
126
- lamindb/models/project.py,sha256=AzfkZsMIUtTM2QGz_jhS4F5zt53V-j2l4Sz-b6NvW34,18192
127
- lamindb/models/query_manager.py,sha256=EzbyNA5zWUbLYH5yJ7dIC90j1teVoQHrXpRLjCfBEao,11036
128
- lamindb/models/query_set.py,sha256=d27m8UF8QZAzHZBEVE1QdJRtx9wCzYgkDdHGCATBM48,34815
129
- lamindb/models/record.py,sha256=WW6iuQT8M4KHcpZoYGSTjND10hvDUIff7DOkyD5d2Fc,12070
130
- lamindb/models/run.py,sha256=czMzg1Hp0Ju4eGM0T2vwCSerVpdzd5JyEW2Kj9tjg2o,15580
131
- lamindb/models/save.py,sha256=jXha2jfY-pWsKuP2dwaEROhUGxhM8fTWQGWAzA_xsM0,16777
132
- lamindb/models/schema.py,sha256=7l2T_uOi7Lkj4yHuZWml1p7axBn_yNO4IlXkn8M2f9g,48962
133
- lamindb/models/sqlrecord.py,sha256=SBonVDvkUXh4XZgM87VV96yM9MNMgVvBlRalhTpaZH8,68515
134
- lamindb/models/storage.py,sha256=0jvuQyJcIMdrZ9qq-vmKkI66libb2DqWjCXNFuvinIM,13518
135
- lamindb/models/transform.py,sha256=oXT_uF9CM4vrEt1APbdSUSMxclkxeVq9tjgQRmicqos,12774
136
- 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
137
140
  lamindb/setup/__init__.py,sha256=QZ-JF8IzO_ckDOU223lsJrdO5ay7cDFgvCbkLeAuxYA,467
138
141
  lamindb/setup/_switch.py,sha256=njZJN__JOhVrBFGClQG1wobdhJJp6l_XzPGKtKSCrfU,434
139
142
  lamindb/setup/core/__init__.py,sha256=SevlVrc2AZWL3uALbE5sopxBnIZPWZ1IB0NBDudiAL8,167
140
143
  lamindb/setup/errors/__init__.py,sha256=bAHTxOUJW1rm4zpF0Pvqkftn8W6iMGnQ-uyNBu13Nfg,171
141
144
  lamindb/setup/types/__init__.py,sha256=ATaosOi6q-cDWB52T69_sRmLMqj8cHfc-vljzZsrJNw,169
142
- lamindb-1.10.2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
143
- lamindb-1.10.2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
144
- lamindb-1.10.2.dist-info/METADATA,sha256=n3KlfwBGbuxGLNq-qpfSWxHaU7ZmEhjsHwfrvHrBchk,5221
145
- lamindb-1.10.2.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,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: flit 3.12.0
2
+ Generator: flit 3.10.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any