Releases: SciQLop/tscat
Releases · SciQLop/tscat
v0.5.1
Bug fixes
remove_events_from_cataloguechecked membership by Pythonid(), which broke whenever the caller resolved the event viaget_events(uuid=...)(the 0.5.0 fast path returns wrappers backed by_LazyBackendEntity, a different Python object from the one stored incatalogue.events). Membership is now compared on the SQL primary key, matchingadd_events_to_catalogue.- After
event.remove(permanently=True),catalogue.eventskept the deleted ORMEventin its in-memory collection. A lateradd_events_to_catalogue()with a freshly created event reusing the same UUID was wrongly rejected as "already in catalogue".Backend.removenow detaches the event from every catalogue'seventscollection beforesession.delete. - The fast-path query was leaking
_LazyBackendEntityproxies into SQLAlchemy relationships. Wrapper→backend boundaries (add/remove_events_to_catalogue,_BackendBasedEntity.remove) now resolve proxies to identity-mapped ORM entities before handing them to SQLAlchemy.
Two regression tests cover both scenarios.
Full Changelog: v0.5.0...v0.5.1
v0.5.0
Highlights
This release modernizes the internals and migrates the on-disk schema. Existing databases are auto-migrated on first open and a timestamped .sqlite.backup is created next to them.
Storage / migrations
- Predicates serialized as JSON instead of pickle (Alembic migration
4a1d43bb9936) - Tags & products stored as JSON arrays instead of comma-separated strings (Alembic migration
df61d8f30e7c); the comma-restriction on tag/product values is removed sqlalchemy_utilsdependency droppedevent.ratingfield added (Alembic migration9a655086fb51)
API / DSL
- New filtering DSL:
from tscat.filtering import eventthenevent.author == "Alice", combinable with&|~ get_catalogue(uuid=...)/get_catalogue(name=...)/get_catalogue(predicate=...)helperexisting_tags()returns the union of all tags used across events and cataloguesPredicate.to_dict()/Predicate.from_dict()for explicit JSON serialization
Internals
- Migrated to SQLAlchemy 2.0 (
DeclarativeBase,Mapped[T],mapped_column,select()) - Build system migrated to
uv+hatchling - Python ≥ 3.10 (3.10 — 3.14 tested in CI)
Performance
- ~14 % faster event creation, 1.6× faster catalogue reads, 2.1× faster tag filtering on a 10K-event benchmark
- Raw-SQL fast path for bulk event loads (~2× speedup)
Fixes
- Eager
session.addinSession._track— fixes silent relationship-skip warning on import (#) - Mutable default arguments removed
- Identity-map cleared after
rollback() - Import dedup for catalogues batched by UUID set
- Set-based
remove_events_from_catalogue(was O(n·m)) is_removed()returnsFalseafterrestore()again- Bulk import on large catalogues no longer hits the SQLite bind-variable limit
Full Changelog: v0.4.4...v0.5.0
v0.4.4
v0.4.3
- v0.4.2 did fail to release.
Full Changelog: v0.4.2...v0.4.3
v0.4.2
v0.4.1
v0.4.0
v0.3.0
What's Changed
- list-values: string-list items are not allowed to contain a comma by @pboettch in #45
- export: allow export of a list of catalogues by @pboettch in #47
- get_events: option to only assigned get_events of a (dynamic) catalogue by @pboettch in #48
- VOTable: add import/export-functionality by @pboettch in #51
- remove and re-create catalogue with same uuid now works correclty by @pboettch in #52
- is_removed is now cached by @pboettch in #53
- events: get only events matching the predicate from a catalogue by @pboettch in #54
- Rating implementation by @pboettch in #55
- events: get_events now is multi-dispatch, returns query-info for catalogues by @pboettch in #57
- Alembic integration by @pboettch in #58
Full Changelog: v0.2.0...v0.3.0
v0.2.0
Initial release
Test release.