Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Dates are specified in the format DD-MM-YYYY.
0.9.1 - 06-03-2026¶
- Moved documentation dependencies to separate group
- Added support for
booleandtype descriptor - Updated lockfile
0.9.0 - 27-02-2026¶
Added¶
- Migrated code from
redsun-mimirto here - In particular the whole plan specification and action system
- Some things still require additional tests, although have been empirically tested in
redsun-mimir DeviceSequenceEdit: newValueWidgetsubclass renderingSequence[PDevice]andSet[PDevice]parameters as a checkbox list with a live selection count label.PlanWidget.device_widgets: exposes device parameter widgets for external validation.PlanWidget.params_widget: singleQWidgetwrapping the Devices and Parameters group boxes; disabled atomically during plan execution so all inputs lock without affecting run/stop/pause buttons.Set[PDevice]/AbstractSet[PDevice]annotation support in plan spec:isdevicesetpredicate and_handle_device_sethandler;resolve_argumentscoerces toset()for set-typed params.HasWriterprotocol expressing the ability of a device to encapsulate a writer.SessionPathProviderwith automatic run-number increment, replacingAutoIncrementFileProvider.- Metadata registry on
Writer; metadata collected atpreparetime is written immediately after stream open. clear_sourcesmechanism for presenters to explicitly clear writer sources after a plan finishes.groupparameter on path providers for sub-group addressing within a Zarr store.
Changed¶
- Storage layer migrated to per-device
Writerinstances identified by URI (singleton viaget()). - Device preparation migrated from
StorageInfo/StorageConfigdict-based API toPrepareInfo. make_writersignature updated to(uri, mimetype).- Shareable plan-spec and widget infrastructure migrated from redsun-mimir into the SDK.
create_plan_widgetnow splits device and scalar parameters into separate "Devices" and "Parameters" group boxes.- Widget factory predicates now match on annotation shape rather than
choices is not None; empty-choices case produces a valid empty widget instead of raisingRuntimeError. _try_factory_entrynow only swallows predicate errors; factory crashes propagate immediately.is_device_setremoved fromParamDescription; set coercion derived from annotation directly viaisdeviceset(p.annotation), symmetric with howisdevicesequencewas already handled.
0.8.2 - 23-02-2026¶
Changed¶
- Drop the
StaticandUUIDfilename providers in favor ofAutoIncrementas default - Will be reintroduced at a later date when storage API is stabilized
Fixed¶
- Fixed broken links in changelog
- Store the suffix of a
FilenameProvideror it gets lost - Convert URI to standard path for
acquire-zarrbackend
Added¶
- Added some helper utilities for making descriptor/reading keys following canonical convention
0.8.0 - 22-02-2026¶
Changed¶
- Migrated sunflare codebase to redsun. Sunflare will be archived.
0.7.2 - 22-02-2026¶
Changed¶
- Merged SDK (formerly sunflare) into redsun
- Migrated the HasStorage protocol to toolkit
Fixed¶
- Fixed path lookup for storage
0.7.0 - 21-02-2026¶
Added¶
- Added initial support for opt-in storage capacities for devices via descriptor protocol
- Currently supporting only Zarr V3 format via
acquire-zarr
0.6.1 - 20-02-2026¶
Fixed¶
- Allow multiple widgets to be stacked in the center via
QTabWidgetforQtAppContainer - Fix the attribute look-up in loop construction to get the
view_positionattribute ofPView
0.6.0 - 20-02-2026¶
Added¶
- Added
device(),presenter(),view()typed field specifiers for declarative component registration
Changed¶
IsProvider.register_providers()now runs over both presenters and viewsIsInjectable.inject_dependencies()now runs over both presenters and views- Refactored build loop in component construction, provider registration and dependency injection
_ComponentBase: alias slot removed; name fully resolved at metaclass time_PresenterComponent.build(): removed unused container: VirtualContainer parameter- All
_*Component.build()methods use self.name directly - Changed plugin manifest format: from
{ class: "module:Type" }to flat"module:Type"string - Updated documentation
Removed¶
- Removed
component()catch-all field declarator in favor of layer-specific functions
0.5.6 - 18-02-2026¶
Fixed¶
AppContainer.build()now callsconnect_to_virtual()on allVirtualAwareview components after all components are fully constructed, symmetrically with the existing presenter loop. Previously, views were connected only via aQtMainViewdelegator called fromQtAppContainer.run(), meaning the wiring was Qt-specific and bypassed the base build phase entirely.- Removed the now-redundant
connect_to_virtual()delegator fromQtMainViewand the explicit call to it inQtAppContainer.run(). - Fixed a spurious warning when a
from_configkey exists in the YAML but has no kwargs (bare key with null value, e.g.camera2:with nothing after it). Previouslydict.get()returnedNonefor both a missing key and a null value, making them indistinguishable. A sentinel is now used so only a genuinely absent key triggers the warning; a present-but-empty section is silently normalised to{}.
Added¶
redsun.qtpublic namespace exposingQtAppContainerfor use in explicit, developer-written application configurations:- Clarified documentation
0.5.4 - 18-02-2026¶
Fixed¶
- Relaxed the
component()overloads: all three (layer="device",layer="presenter",layer="view") now accepttypeinstead oftype[Device],type[Presenter],type[View]. This fixes mypy errors for classes built from protocol mixins that do not inherit from the sunflare base classes directly.
0.5.3 - 18-02-2026¶
Warning
This release was yanked from PyPI due to a broken distribution
Added¶
AppContainerandcomponentare now importable directly from the top-levelredsunpackage:
Changed¶
component()now takes the component class as its first positional argument:RedSunConfigremoved from the public API; it is an internalTypedDictused only for YAML configuration validation.
0.5.0 - 17-02-2026¶
Changed¶
- Fully refactor the package to go towards a containerization approach
- Declare applications as containers, list relevant components as fields of a class
- Provide support also for building from a configuration file as before
- Upgrade to
sunflare>=0.9.0 - Move the
FrontendTypesandViewPositionTypesfromsunflaretoredsun - They're part of the overall configuration and should not concern the core package
- Revamped documentation with more comprehensive information
0.4.0 - 15-12-2025¶
Changed¶
- Apply a more strict check on imported plugins
- Add support for 3.13 (simply declared on PyPI and tested via CI)
- Upgrade to
sunflare>=0.7.0
0.3.0 - 04-07-2025¶
Changed¶
- Upgraded to
sunflare>=0.6.1 - Switch to
uv - Drop support for Python 3.9
0.2.0 - 03-03-2025¶
Changed¶
- Reworked the plugin system
- The approach now loosely follows the
naparimanifest, where plugins are to be published via ayamlconfiguration file in the root folder of the plugin package, specifiying where the classes have to be imported. - The manifest is taken as the actual entry point of a plugin, which will be used to redirect to the actual imports which is executed via the standard library
importlib. - Added additional coverage for the
factorymodule. - Bumped sunflare version to
sunflare>=0.5.0, which implements the above changes at toolkit level
0.1.0 - 22-02-2025¶
Added¶
- Initial release on PyPI