Changelog 2025¶
2025-01-23 db 1.0.5¶
2025-01-21 db 1.0.4¶
🚚 Revert Collection.description back to unlimited length TextField. PR @falexwolf
2025-01-21 db 1.0.3¶
🚸 In track(), improve logging in RStudio sessions. PR @falexwolf
2025-01-20 R 0.4.0¶
🚚 Migrate to lamindb v1 PR @falexwolf
🚸 Improve the user experience for setting up Python & reticulate PR @lazappi
2025-01-20 db 1.0.2¶
🚚 Improvments for lamindb v1 migrations. PR @falexwolf
add a
.descriptionfield toSchemaenable labeling
RunwithULabeladd a
.predecessorsand.successorsfield toProjectakin to what’s present onTransformmake
.uidfields not editable
2025-01-18 db 1.0.1¶
🐛 Block non-admin users from confirming the dialogue for integrating lnschema-core. PR @falexwolf
2025-01-17 db 1.0.0¶
This release makes the API consistent, integrates lnschema_core & ourprojects into the lamindb package, and introduces a breadth of database migrations to enable future features without disruption. You’ll now need at least Python 3.10.
Your code will continue to run as is, but you will receive warnings about a few renamed API components.
What |
Before |
After |
|---|---|---|
Dataset vs. model |
|
|
Python object for |
|
|
Number of files |
|
|
|
|
|
|
|
|
Consecutiveness field |
|
|
Run initiator |
|
|
|
|
|
Migration guide:
Upon
lamin connect account/instanceyou will be prompted to confirm migrating away fromlnschema_coreAfter that, you will be prompted to call
lamin migrate deployto apply database migrations
New features:
✨ Allow filtering by multiple
obscolumns inMappedCollectionPR @Koncopd✨ In git sync, also search git blob hash in non-default branches PR @Zethson
✨ Add relationship with
Projectto everything exceptRun,Storage&Userso that you can easily filter for the entities relevant to your project PR @falexwolf✨ Capture logs of scripts during
ln.track()PR1 PR2 @falexwolf @Koncopd✨ Support
"|"-seperated multi-values inCuratorPR @sunnyosun🚸 Accept
Noneinconnect()and improve migration dialogue PR @falexwolf
UX improvements:
🚸 Simplify the
ln.track()experience PR @falexwolfyou can omit the
uidargumentyou can organize transforms in folders
versioning is fully automated (requirement for 1.)
you can save scripts and notebooks without running them (corollary of 1.)
you avoid the interactive prompt in a notebook and the throwing of an error in a script (corollary of 1.)
you are no longer required to add a title in a notebook
🚸 Raise error when modifying
Artifact.keyin problematic ways PR1 PR2 @sunnyosun @Koncopd🚸 Better error message on running
ln.track()within Python terminal PR @Koncopd🚸 Hide traceback for
InstanceNotEmptyusing Click Exception PR @Zethson🚸 Only auto-search
._name_fieldin sub-classes ofCanCuratePR @falexwolf🚸 Simplify installation & API overview PR @falexwolf
🚸 Make
lamin_run_uidcategorical in tiledbsoma stores PR @Koncopd🚸 Raise
ValueErrorwhen trying to search aNonevalue PR @Zethson
Bug fixes:
🐛 Skip deleting storage when deleting outdated versions of folder-like artifacts PR @Koncopd
🐛 Let
SOMACurator()validate and annotate all.obscolumns PR @falexwolf🐛 Fix renaming of feature sets PR @sunnyosun
🐛 Do not raise an exception when default AWS credentials fail PR @Koncopd
🐛 Only map synonyms when field is name PR @sunnyosun
🐛 Fix
sourcein.from_valuesPR @sunnyosun🐛 Fix creating instances with storage in the current local working directory PR @Koncopd
🐛 Fix NA values in
Curator.add_new_from()PR @sunnyosun
Refactors, renames & maintenance:
🏗️ Integrate
lnschema-coreintolamindbPR1 PR2 @falexwolf @Koncopd🏗️ Integrate
ourprojectsinto lamindb PR @falexwolf♻️ Manage
created_at,updated_aton the database-level, makecreated_bynot editable PR @falexwolf🚚 Rename transform type “glue” to “linker” PR @falexwolf
🚚 Deprecate the
--schemaargument oflamin initin favor of--modulesPR @falexwolf
DevOps:
Detailed list of database migrations
Those not yet announced above will be announced with the functionality they enable.
♻️ Add
contenttypesDjango plugin PR @falexwolf🚚 Prepare introduction of persistable
Curatorobjects by renamingFeatureSettoSchemaon the database-level PR @falexwolf🚚 Add a
.typeforeign key toULabel,Feature,FeatureSet,Reference,ParamPR @falexwolf🚚 Introduce
RunData,TidyTable, andTidyTableDatain the database PR @falexwolf
All remaining database schema changes were made in this PR @falexwolf. Data migrations happen automatically.
remove
_source_code_artifactfrom Transform, it’s been deprecated since 0.75data migration: for all transforms that have
_source_code_artifactpopulated, populatesource_code
rename
Transform.nametoTransform.descriptionbecause it’s analogous toArtifact.descriptionbackward compat:
in the
Transformconstructor usenameto populatekeyin all cases in which onlynameis passedreturn the same transform based on
keyin casesource_code is Nonevia._name_field = "key"
data migrations:
there already was a legacy
descriptionfield that was never exposed on the constructor; to be safe, we concatenated potential data in it on the new description fieldfor all transforms that have
key=Noneandname!=None, usenameto pre-populatekey
rename
Collection.nametoCollection.keyfor consistency withArtifact&Transformand the high likelihood of you wanting to organize them hierarchicallya
_branch_codeinteger on every record to model pull requestsinclude
visibilitywithin that coderepurpose
visibility=0as_branch_code=0as “archive”put an index on it
code a “draft” as _branch_code = 2, and “draft prs” as negative branch codes
rename values
"number"to"num"in dtypean
._auxjson field onRecorda SmallInteger
run._status_codethat allows to writefinished_atin clean up operations so that there is a run time also for aborted runsrename
Run.is_consecutivetoRun._is_consecutivea
_template_idFK to store the information of the generating template (whether a record is a template is coded via _branch_code)rename
_accessortootypeto publicly declare the data format assuffix, accessorrename
Artifact.typetoArtifact.kinda FK to artifact
run._logfilewhich holds logsa
hashfield onParamValueandFeatureValueto enforce uniqueness without running the danger of failure for large dictionariesadd a boolean field
._expect_manytoFeature/Paramthat defaults toTrue/Falseand indicates whether values for this feature/param are expected to occur a single or multiple times for every single artifact/runfor feature
if it’s
True(default), the values come from an observation-level aggregation and a dtype ofdatetimeon the observation-level meanset[datetime]on the artifact-levelif it’s
Falseit’s an artifact-level value anddatetimemeansdatetime; this is an edge case because an arbitrary artifact would always be a set of arbitrary measurements that would need to be aggregated (“one just happens to measure a single cell line in that artifact”)
for param
if it’s
False(default), the values mean artifact/run-level values anddatetimemeansdatetimeif it’s
True, the values would be from an aggregation, this seems like an edge case but say when characterizing a model ensemble trained with different parameters it could be relevant
remove the
.transformforeign key from artifact and collection for consistency with all other records; introduce a property and a simple filter statement instead that maintains the same UXstore provenance metadata for
TransformULabel,RunParamValue,ArtifactParamValueenable linking projects & references to transforms & collections
rename
Run.parenttoRun.initiated_by_runintroduce a boolean flag on artifact that’s called
_overwrite_versions, which indicates whether versions are overwritten or stored separately; it defaults toFalsefor file-like artifacts and toTruefor folder-like artifactsRename
n_objectston_filesfor more clarityAdd a
Spaceregistry to lamindb with an FK on everyBasicRecordadd a name column to
Runso that a specific run can be used as a named specific analysisremove
_previous_runsfield on everything exceptArtifact&Collection