Changelog#
The format is based on Keep a Changelog.
Versioning currently follows X.Y.Z semantic versioning.
Historically, before 1.14.0, a different versioning scheme was used.
Minor breaking changes are still possible in 1.X.Y but we try to announce them with DeprecationWarnings in the previous Y-1 release.
[Unreleased]#
Added#
Improved token authentication
bfabric.experimental.webapp_integration_settingsBfabric.connect_token,Bfabric.connect_token_async: this one respects the list of allowed bfabric instancesbfabric.rest.token_data.validate_tokenBfabric.from_token_data: creates a new Bfabric instance from token data.
ResultContainer.to_polarsnow has aflattenparameter to flatten struct columns into individual columns.
Deprecated#
Bfabric.from_configBfabric.connect_webapp
Fixed#
Referencescorrectly handles references with extra fields like_position.ResultContainer.to_polarssets the schema length toNoneto fix bugs in some cases with more than 100 items.
[1.16.1] - 2025-12-15#
Fixed#
Datasetcorrectly handlesNonevalues in items.
[1.16.0] - 2025-12-15#
Added#
bfabric.typingwith specific types for the API request and response objects.Executable.decoded_str,Executable.decoded_bytesWorkunit.workunit_parametersto list workunit context parametersExternalJob.client_entity
Changed#
Type hints have been narrowed in the public interfaces of the following classes:
BfabricResultContainerReferencesEntityEntityReaderEngineSudsEngineZeep
Parameter.valuereturns""for values not specified withrequired=false. This solves a few rare compatibility bugs and I do not think having the ability to distinguish betweenNoneand""makes much sense at this level.
Removed#
Legacy workaround for B-Fabric with non-list
technologyfield is removed. Assumed to not be breaking since for the current B-Fabric instances, this change should be transparent.
Deprecated#
Executable.decoded: misleading name
[1.15.1] - 2025-12-09#
Fixed#
Allow
http://localhostfor EntityURIs.
[1.15.0] - 2025-12-09#
Added#
TokenData.web_service_userwhich indicates whether the user has permission to use webservices API.
[1.14.1] - 2025-12-02#
Added#
EntityReader.read_methods accept aexpected_typeparameter to specify the expected type of the entity (defaultEntity).
Fixed#
A few imports within the package were accidentally broken in 1.14.0 which is resolved now.
basedpyrighthas been added to identify issues like this earlier.
[1.14.0] - 2025-12-02#
The minimal Python version has been updated to 3.11.
bfabric.entities
The read-only API in
bfabric.entitieshas been redesigned to support multiple B-Fabric instances cleanly.In particular, when handling configuration files it should now be obvious how to specify entities by their URI rather than having to specify instance, classname, and id separately.
The main new concept is the
EntityUriwhich standardizes the way entities are specified by their URI.EntityReaderis a new class which implements the resolution, currently for only one B-Fabric instance, but extensible to support multiple B-Fabric instances in the future.We also remove the reliance on custom entity classes providing generic functionality to read entities and their references. This is available through the
EntityReaderclass which can be accessed throughBfabric.reader.
Versioning:
The
bfabricPython package versioning starting with 1.14.0 does not track the B-Fabric server version anymore.This will allow us to adapt to implement a more semantically meaningful versioning, starting with 1.14.0.
Applications, like
bfabric-scriptscan instead track the particular version of bfabric against which they are tested/developed either in their version (planned forbfabric-scripts) or through documentation.
Added#
Entity.uriproperty to obtain the URI of an entity.Entity.refsresolves all references of entities generically, writes the data intodata_dictand is compatible with pre-loaded references from B-Fabric.bfabric.entities.core.uri.EntityUrito identify entities regardless of B-Fabric instance.bfabric.entities.core.uri.EntityUriComponentsto access individual components(bfabric_instance, entity_type, entity_id)from a URI.bfabric.entities.core.uri.GroupedUrishelper for looping over lists ofEntityUris.-bfabric.entities.core.entity_readerwhich allows reading entities by URI, ID, and general queries.bfabric.entities.cachewhich supersedesbfabric.experimental.cache.HasOneandHasManyshould be able to use resolved entities when loading withfulldetails=True.Entity.custom_attributesfor reading custom attribute values.bfabric.experimental.update_custom_attributesfor updating custom attributes correctly.
Changed#
Minimal Python version is now 3.11.
BFabricClientConfigdoes not allow passingNonefor values anymore.HasManyretains response order, instead of redundant sorting by ID.bfabric.entitiesallows loading entity references without custom definitions in Python.Internal
Entityhas a new constructor parameterbfabric_instancewhich in the future will become mandatory.BfabricClientConfig.base_urlalways ends with exactly one/now.bfabric.entitiesdo not define custom constructors anymore, simplifying future changes (and removing tiny inconsistencies).TokenDataretrieval uses async httpx internally, but provides a sync interface for compatibility.
Removed#
bfabric.experimental.cacheis removed in favor ofbfabric.entities.cache.Future deprecations:
Entity.find,Entity.find_all,Entity.find_bywill be removed in favor ofEntityReadermethods.Passing entity class to
cache_contextwill be removed in favor of their name (this is because not all entities have custom classes).
[1.13.36] - 2025-10-27#
Changed#
This is the last release supporting Python 3.9. From the next release onwards, Python 3.11 or higher will be required.
Flask is not a dependency anymore, as the dependency will be moved to bfabric-scripts.
Version upper bounds for dependencies have been defined.
More robust URL handling for token authentication.
Fixed#
A test-only incompatibility with Polars was fixed.
[1.13.35] - 2025-09-22#
Changed#
Dataset column type detection now supports case-insensitive entity matching (e.g., “resource” is detected as “Resource” type automatically).
[1.13.34] - 2025-09-19#
Added#
bfabric.experimental.cachewhich implements re-entrant lookup caching for entities (when retrieved by ID).Fields
filename,storage_relative_path,storage_absolute_pathhave been added toResource. This should be used in the future, to ensure path handling is performed consistently
Removed#
bfabric.experimental.entity_lookup_cachehas been removed in favor of the new (experimental) API.
[1.13.33] - 2025-08-26#
Added#
Add new field
WorkunitDefinition.registration.user_id.Add created/modified fields to
Workunitentity.
Fixed#
Legacy wrapper creator also writes the inputdataset name.
[1.13.32] - 2025-08-26#
Added#
New entities:
Workflow,WorkflowStep,WorkflowTemplate,WorkflowTemplateStepNew relationship:
HasUserto resolve user references (since these are modeled differently from other relationships).
Fixed#
There was an issue in
import_entity.pywhich made loading entities with additional uppercase characters in the type fail.Fix compatibility in legacy wrapper creator for dataset-flow workunits.
[1.13.31] - 2025-09-20#
Changed#
The
Bfabric.connect_webappwill use thecallerfield from the token data to set thebase_urlof the client.Existing code should not break, but will emit a deprecation warning as we plan to remove the old parameters.
Theoretically, it changes the semantics, but in practice it should yield the same result for all known use cases.
Added#
TokenDatawill include thecallerurl now.Entity
Userhas been added.
Fixed#
Legacy wrapper creator creates
""rather thanNonefor empty parameter values.
[1.13.30] - 2025-08-19#
Fixed#
Fix legacy wrapper creator for orders without projects.
[1.13.29] - 2025-07-04#
Changed#
bfabric.rest.token_data.get_token_datanow only requires the base_url instead of the whole config.
[1.13.28] - 2025-06-27#
Breaking#
base_urlis now a mandatory parameter in the configuration.
Added#
It is now possible to configure
~/.bfabricpy.ymlwithout a default environment. In that case it will always be necessary to specify the requested config environment to be used.bfabric.entities.Executablehasparametersrelationship now
Removed#
Some old submitter related functionality is deleted.
Changed#
Columns of tables named after B-Fabric entities, containing only integers, will be set as the specified type when saving to B-Fabric (in
experimental.upload_dataset).
[1.13.27] - 2025-05-21#
Added#
Attribute
Bfabric.config_datato obtain aConfigDataobject directly.TokenData.load_entityconvenience method to load an entity from the token data.Entities
Instrument,Plate,Runwere added (but with no extra functionality).Workunit.{application_parameters, submitter_parameters}to access parameter values.
Changed#
Submitter parameters will not be written any longer to
WorkunitExecutionparameters.
Fixed#
Compatibility with upcoming change that
Applicationcan have multipletechnologyvalues.
Deprecated#
Workunit.parameter_valueswill be removed in favor ofWorkunit.application_parametersandWorkunit.submitter_parametersin a future version.
[1.13.26] - 2025-04-26#
This release introduces an environment variable BFABRICPY_CONFIG_OVERRIDE to configure the Bfabric client completely,
along with a new method for creating an instance of the Bfabric client, Bfabric.connect().
This will allow us to propagate any configuration to subprocesses reliably. BFABRICPY_CONFIG_ENV remains available
with the same semantics, but lower priority than BFABRICPY_CONFIG_OVERRIDE.
This also simplifies the logic that was present in Bfabric.from_config which is why this introduced with a new API
to prevent configuration mix-ups.
Added#
New environment variable
BFABRICPY_CONFIG_OVERRIDEto configure theBfabricclient completelyNew method
Bfabric.connect()for creating an instance of theBfabricclient
Changed#
Renamed
Bfabric.from_tokentoBfabric.connect_webapp()(along with some changes, no known users of this API yet)Disallowed
defaultas an environment config namebfabric.cli_integration.utils.use_clientusesBfabric.connect()instead ofBfabric.from_config()
Deprecated#
Bfabric.from_configis now deprecated in favor ofBfabric.connect()
[1.13.25] - 2025-04-22#
Breaking#
Bfabric.from_tokenreturns theTokenDatain addition to the client instance. While this is breaking, I’m not aware of any existing users of this API and I noticed that this information is going to be needed in this context often.
Added#
bfabric.experimental.upload_dataset.warn_on_trailing_spacesfunction used bybfabric-scriptsto validate
[1.13.24] - 2025-04-08#
Removed#
cycloptsis not a dependency ofbfabricanymore, but rather ofbfabric-scriptsandbfabric-app-runner.
Changed#
Bfabricclient now does not takeengineargument anymore, but rather this information comes fromClientConfig. For compatibility reasons, theengineargument is still accepted inBfabric.from_configandBfabric.from_token.
[1.13.23] - 2025-03-25#
Fixed#
Unsuccessful deletions are detected by checking the B-Fabric response.
Handle problematic characters in
Workunit.store_output_folder.BfabricRequestErrordid not properly subclass RuntimeError.
Changed#
WorkunitDefinitionusesPathSafeStrto normalize app and workunit names.Internal:
ResultContainerhas no optional constructor arguments anymore to avoid confusion.
Added#
Generic functionality in
bfabric.utils.path_safe_nameto validate names for use in paths.bfabric.entities.Dataset.{write_parquet, get_parquet}methods for writing parquet
[1.13.22] - 2025-02-19#
Fixed#
Correctly read datasets, if columns were swapped in B-Fabric.
Changed#
Dataset.typeswas renamed toDataset.column_types, since there is only 1 usage and it is recent, this is not considered breaking.
[1.13.21] - 2025-02-19#
Added#
Entity.load_yamlandEntity.dump_yamlBfabric.from_tokento create aBfabricinstance from a tokenbfabric.rest.token_datato get token data from the REST API, low-level functionality
Changed#
Internally, the user password is now in a
pydantic.SecretStruntil we construct the API call. This should prevent some logging related accidents.
[1.13.20] - 2025-02-10#
Breaking#
the old
bfabric.cli_formattingandbfabric.bfabric2modules have been deleted
Changed#
move
use_clienttobfabric.utils.cli_integration: this will allow reuse between bfabric-scripts and bfabric-app-runnermove functionality from
bfabric.cli_formattingtobfabric.utils.cli_integration
[1.13.19] - 2025-02-06#
Fixed#
Config: Log messages of app runner are shown by default again.
[1.13.18] - 2025-01-28#
Changed#
bfabric_upload_resource.pydoes not print a list anymore, but rather only the dict of the uploaded resource.
Fixed#
Some scripts were not Python 3.9 compatible, which is restored now. However, we can consider increasing the Python requirement soon.
[1.13.17] - 2025-01-23#
Added#
bfabric-cli workunit export-definitionto exportworkunit_definition.ymlfilesExecutable.storagerelationship
Fixed#
Workunit.parametersandWorkunit.resourcesare optionalbfabric-clihad unmet dependencies, that were not caught by the tests either
[1.13.16] - 2025-01-22#
Added#
Add missing
Entity.__contains__implementation to check if a key is present in an entity.polars_utils.pywhich contains functionality to normalize relational fields in tablesAdd
bfabric-cli executable inspectcommand to inspect executables registered in B-Fabric.Add
bfabric-cli executable uploadcommand to upload executables to B-Fabric.
Fixed#
Order.projectis optional
[1.13.15] - 2025-01-15#
Added#
Entity
SampleRelationship
Resource.sample.Extract logic for container resolution into
HasContainerMixinwhich is right now shared betweenSampleandWorkunit.
Fixed#
Fix bug in
bfabric_save_fasta.py.
[1.13.14] - 2025-01-08#
Changed#
Slurm submitter prints more diagnostics about PATH variable etc.
Fixed#
Some commands in bfabric-cli are broken because
__future__.annotationsis imported and this breaks cyclopts.
[1.13.13] - 2024-12-18#
Changed#
Move
bfabric-cli readtobfabric-cli api read.(internal)
use_clientdecorator is introduced to simplify and standardize the client usage in the new CLI code.
Added#
Functionality to log by specifying the workunit instead of external job, which is used in some legacy scripts.
Add logging commands to
bfabric-cli api log.Add
bfabric-cli api save.Submitter script prints the id and hostname of apps, which in practice can be very useful.
Fixed#
A bug in bfabric_save_workflowstep.py that crashed the script.
[1.13.12] - 2024-12-17#
Changed#
The submitter ensures that workunits always get set to
processing.
Fixed#
The script
bfabric_setResourceStatus_available.pyand other uses ofreport_resource, correctly search files which have a relative path starting with/as in the case of the legacy wrapper creator.
[1.13.11] - 2024-12-13#
Fixed#
The script
bfabric_setWorkunitStatus.pydid always set the status toavailable, instead of the specified status.
Changed#
bfabric_setResourceStatus_available.pycalls thereport_resourcefunction, in general this functionality has been refactored.
[1.13.10] - 2024-12-13#
Fixed#
If
bfabricpy.ymlcontains a root-level key which is not a dictionary, a correct error message is shown instead of raising an exception.A bug introduced while refactoring in
slurm.pywhich passedPathobjects tosubprocessinstead of strings.Submitter
does not use unset
JOB_IDenvironment variable anymore.does not set unused
STAMPenvironment variable anymore.
Fix
bfabric_save_workflowstep.pybugs from refactoring.
Added#
Experimental bfabric-cli interface. Please do not use it in production yet as it will need a lot of refinement.
[1.13.9] - 2024-12-10#
From this release onwards, the experimental app runner is not part of the main bfabric package and instead a separate Python package with its individual changelog.
Added#
Relationship:
ExternalJob.executable(experimental) EntityLookupCache that allows to cache entity lookups in a script to avoid redundant requests.
Specific use case script: bfabric_save_resource_description.py (the functionality will be available in a future CLI).
Fixed#
Entity.find_allreturns no values when an empty list is passed as an argument.
Changed#
Except for macOS x86_64 (which we assume is Rosetta emulation nowadays), we use the faster
polarsinstead ofpolars-lts-cpu.BfabricRequestErroris now aRuntimeErrorsubclass.Add
py.typedmarker.
Removed#
bfabric_legacy.pyhas been removed.math_helper.pyhas been removed.
[1.13.8] - 2024-10-03#
This release contains mainly internal changes and ongoing development on the experimental app interface functionality.
Added#
Entities can be compared and sorted by ID now.
Show Python version in version info string.
Caching for bfabric_list_not_existing_storage_directories.py.
(experimental) add initial code for a resource based application dispatch
(experimental) new app_runner cli that integrates all commands into a single interface
Fixed#
bfabric_read.py is a bit more robust if “name” misses and tabular output is requested.
Changed#
bfabric.scriptshas been moved into a namespace packagebfabric_scriptsso we can later split it off.(internal) migrate to src layout
(experimental) the former
processstep of the app runner has been split into aprocessandcollectstep where, the collect step is responsible for generating theoutput.ymlfile that will then be used to register the results.(experimental) app runner apps by default reuse the default resource
[1.13.7] - 2024-09-17#
Fixed#
bfabric_save_csv2dataset.pyconsiders all rows for schema inference, only considering the first 100 rows did cause problems with some files previously.
Added#
Script logging configuration
If
BFABRICPY_DEBUGenvironment variable is set, log messages in scripts will be set to debug mode.Log messages from
__main__will also be shown by default.
bfabric.entities.MultiplexKitto extract multiplex kit information.bfabric.entities.Workunit.store_output_folderimplements the old rule, but more deterministically and reusable.(Experimental)
bfabric.experimental.app_interfacecore functionality is implementedThis can be used as a building block to standardize the input preparation for applications.
Changed#
Correctly support optional workunit parameters.
Removed#
bfabric.entities.Resourceassociationapplicationhas been removed as it does not exist
[1.13.6] - 2024-08-29#
Added#
Entity.find_byhas new parametermax_results.
Changed#
bfabric_read.pyprints non-output information exclusively through logger and does not restrict entity types anymore.bfabric_delete.pyaccepts multiple ids at once and does not restrict entity types anymore.Both engines raise a
BfabricRequestErrorif the endpoint was not found.
Removed#
bfabric.endpointslist is deleted, since it was out of date and generally not so useful.
[1.13.5] - 2024-08-13#
Added#
The
Bfabricinstance is now pickleable.Entities mapping:
Add
Entity.idandEntity.web_urlproperties.Add
Entity.__getitem__andEntity.getto access fields from the data dictionary directly.Add
Entity.find_byto find entities by a query.More types and relationships
Relationships defer imports to descriptor call, i.e. circular relationships are possible now.
HasOneandHasManyallow definingoptional=Trueto indicate fields which can be missing under some circumstances.
Add
nodelistcolumn and application name tobfabric_list_not_available_proteomics_workunits.pyoutput.
Changed#
Entity.find_allsupports more than 100 IDs now by using the experimental MultiQuery API.
[1.13.4] - 2024-08-05#
Added#
Add
Workunit,Parameter, andResourceentities.Add concept of has_many and has_one relationships to entities.
bfabric_slurm_queue_status.pyto quickly check slurm queue status.Bfabric.saveprovidesmethodwhich can be set tocheckandinsertfor specific use cases.
Changed#
Most messages are now logged to debug level.
The old verbose version information is now always logged, to INFO level, since it could entail useful information for error reporting.
[1.13.3] - 2024-07-18#
Added#
Flask
New endpoint
GET /config/remote_base_urlfor testing
Changed#
Flask
Simplify logging by using loguru only.
Simplified setup logic since the production use case should use a WSGI server.
Fixed#
bfabric_save_csv2dataset.pyhad an undeclared dependency on numpy and a few bugs which was improved.
[1.13.2] - 2024-07-11#
Added#
Add
bfabric.entities.Datasetto easily read datasets.Pydantic-based configuration parsing
The config format did not change.
The code is easier to maintain now.
Additionally, there is a lot more validation of the configuration file now, that should catch errors early.
Make host and port configurable in
bfabric_flask.py(currently only dev mode).
[1.13.1] - 2024-07-02#
Changed#
bfabric_save_csv2dataset will raise an error if problematic characters are found in any of the cells
Correctly define
bfabric_setWorkunitStatus_available.py, andprocessingandfailedvariants.
Added#
Add loguru for future logging refactoring.
Easily runnable tests with
noxand standardized formatting usingpre-commit.
Removed#
Pandas is no longer a dependency, and has been replaced by polars.
[1.13.0] - 2024-05-24#
This is a major release refactoring bfabricPy’s API.
Changed#
The
Bfabricclass operations now returnResultContainerobjects.These provide a list-like interface to access individual items or iterate over them.
Individual items are a dictionary, potentially nested, and not specific to suds/zeep anymore.
Convenience conversions, e.g. to a polars DataFrame, can be provided there.
Configuration is now defined in
~/.bfabricpy.ymland supports multiple configurations, which can be selected by theBFABRICPY_CONFIG_ENVenvironment variable. Please consult the README for an example configuration.Use
pyproject.tomlfor package configuration.Scripts have been refactored on a case-by-case basis.
Added#
Zeep can be used instead of suds for SOAP communication.
Bfabriccan be instantiated without authentication, that can be provided later. This is useful in a server setup.Pagination support in
Bfabric, specify the number of max_results and a potential offset. Pages handling is abstracted away.Detect errors in responses, e.g. invalid login.
Removed#
Several old scripts have been moved into a
deprecated_scriptsfolder.Wrapper creator related code is currently not updated but has been extracted into a dedicated folder
wrapper_creatoras well.