Contents
New Features
- [x] Make `Datafile`s and `Dataset`s labelable
- [x] Use new version of tags in all `Taggable`s
- [x] Replace string tags in a `TagSet` with key-value pairs in a `TagDict`
- [x] Add new `Taggable` mixin for providing the new tags interface
- [x] Add `FilterDict`, allowing filtering of key-value pairs by their values
- [x] Allow nested attribute/dictionary filtering in the filter containers `FilterSet`, `FilterList` and `FilterDict`
- [x] Allow any number of filters to be specified when filtering in filter containers
- [x] Allow ignoring of filterables missing the filtered-for attribute in a filter container instead of raising an error
- [x] Add filter container `one` method?
- [x] Allow ordering by nested attributes in all `FilterContainer`s
- [x] Allow `gs://` paths to be used in `Datafile`, `Dataset`, and `Manifest`
- [x] Allow `gs://` paths to be used in storage client
- [x] Add `datetime` filters
- [x] Add in-range filters to `str`, `datetime`, and `Number` filters
Breaking changes
- [x] Use new format for manifests' datasets in `twine.json` files
- [x] Convert old `Taggable` mixin to `Labelable` mixin
- [x] Convert old `Tag` class to `Label` class
- [x] Convert `TagSet` to `LabelSet`
- [x] Use key-value pairs for filter names and values when filtering `Filterable`s
- [x] Stop logging in `Serialisable`
- [x] Always exclude `logger` field in `Serialisable`
- [x] Simplify tag name pattern to `^[a-z0-9][a-z0-9_]*(?<!_)$`
- [x] Simplify label pattern to `^[a-z0-9][a-z0-9-]*(?<!-)$`
- [x] Store tags as key-value pairs in GCS custom metadata
- [x] Unbase `TagDict` and `LabelSet` from filter containers
- [x] JSON-encode cloud storage custom metadata again
- [x] Store tags in `tags` field of cloud metadata again
- [x] Close 165: prefix GCS custom metadata fields with "octue__"
Minor improvements
- [x] Remove `filters` field from manifest strand in twines
- [x] Allow tags to be added via `kwargs` in `Taggable.add_tags`
- [x] Remove unused `_FILTERSET_ATTRIBUTE` class variables
- [x] Base `Label` on `str`
- [x] Support non-English characters in case-insensitive filtering
- [x] Add `octue-sdk-python` version to datafile metadata
- [x] Base filter containers on new `FilterContainer` abstract class
- [x] Move `filter` and `order` methods into `FilterContainer`
- [x] Use `OctueJSONDecoder` in `Serialisable` and `GoogleCloudStorageClient`
- [x] Add de/serialisation of `datetime` objects to de/encoders
- [x] Clarify name of some `GoogleCloudStorageClient` methods
- [x] Add `set` and `UserString` encoding to `OctueJSONEncoder`
- [x] Use `OctueJSONDecoder`
- [x] Add `set` and `datetime` decoding to `OctueJSONDecoder`
- [x] Remove unnecessary methods from `LabelSet`
- [x] Rename `add_labels` method and add `add` method to `LabelSet`
- [x] Automatically generate complementary (`not`) filters from other filters
- [x] Remove a line of duplicated code in `Datafile`
Fixes
- [x] Handle timestamps from cloud with/without timezone information
- [x] Fix `OctueJSONDecoder`
- [x] Make it harder to add invalid labels to `LabelSet`
Dependencies
- [x] Use new version of `twined` that distinguishes tags from labels
Testing
- [x] Use latest GCS emulator
- [x] Only run deployment test if `RUN_DEPLOYMENT_TESTS` envvar is `True`
Quality Checklist
- [x] New features are fully tested (No matter how much Coverage Karma you have)
- [x] **[v0.2 onward]** New features are included in the documentation