diff --git a/dbzero/setup.py b/dbzero/setup.py index 85951aa6..a36a94d3 100755 --- a/dbzero/setup.py +++ b/dbzero/setup.py @@ -10,7 +10,7 @@ setup( name='dbzero', - version='0.5.0', + version='0.5.1', description='DBZero community edition', packages=['dbzero'], python_requires='>=3.9', diff --git a/pyproject.toml b/pyproject.toml index 92e6a039..b1a4fa20 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ requires = ['meson-python'] [project] name = 'dbzero' -version = '0.5.0' +version = '0.5.1' description = 'A state management system for Python 3.x that unifies your applications business logic, data persistence, and caching into a single, efficient layer.' readme = 'README.md' requires-python = '>=3.9' diff --git a/python_tests/test_enum.py b/python_tests/test_enum.py index a66da7e8..47b06c97 100755 --- a/python_tests/test_enum.py +++ b/python_tests/test_enum.py @@ -191,6 +191,14 @@ def test_enum_value_as_default_param(db0_fixture): assert func_to_test() == ColorsEnum.RED assert func_to_test(ColorsEnum.GREEN) == ColorsEnum.GREEN assert func_to_test(ColorsEnum.BLUE) == ColorsEnum.BLUE + + +def test_enum_value_repr_can_be_added_as_tag(db0_fixture): + obj = MemoTestClass(1) + + db0.tags(obj).add(func_to_test()) + + assert list(db0.find(ColorsEnum.RED)) == [obj] def test_enum_value_value_repr_compare(db0_fixture): diff --git a/python_tests/test_tag_fields.py b/python_tests/test_tag_fields.py index 3e7cfd36..f259d8b7 100755 --- a/python_tests/test_tag_fields.py +++ b/python_tests/test_tag_fields.py @@ -3,12 +3,27 @@ import pytest import dbzero as db0 +from dataclasses import dataclass from dbzero.dbzero import _get_tag_fields from .memo_test_types import MemoTestClass, KVTestClass _TAG_FIELDS_ATTR = "__DBZERO_TAG_FIELDS_ATTR" +TagFieldDataclassDefaultStatus = db0.enum( + "TagFieldDataclassDefaultStatus", + values=["lead", "archived"], +) +TagFieldDataclassDefaultStatusValue = type(TagFieldDataclassDefaultStatus.lead) + + +@db0.memo +@db0.tag_fields("status") +@dataclass(eq=False) +class DataclassEnumDefaultTag: + name: str + status: TagFieldDataclassDefaultStatusValue = TagFieldDataclassDefaultStatus.lead + def _query_names(memo_type, *tags): return {obj.name for obj in db0.find(memo_type, *tags)} @@ -151,6 +166,13 @@ def __init__(self, status): assert list(db0.find(BufferedInitialTag, "open")) == [obj] +def test_dataclass_enum_default_is_valid_initial_tag(db0_fixture): + obj = DataclassEnumDefaultTag("Avery") + + assert obj.status == TagFieldDataclassDefaultStatus.lead + assert list(db0.find(DataclassEnumDefaultTag, TagFieldDataclassDefaultStatus.lead)) == [obj] + + def test_initial_tags_use_final_values_and_flush_together(db0_fixture): @db0.memo @db0.tag_fields("status", "owner") diff --git a/src/dbzero/object_model/tags/TagIndex.cpp b/src/dbzero/object_model/tags/TagIndex.cpp index e7ba3b26..f0142686 100755 --- a/src/dbzero/object_model/tags/TagIndex.cpp +++ b/src/dbzero/object_model/tags/TagIndex.cpp @@ -260,6 +260,7 @@ namespace db0::object_model case TypeId::MEMO_IMMUTABLE_OBJECT: case TypeId::DB0_TAG: case TypeId::DB0_ENUM_VALUE: + case TypeId::DB0_ENUM_VALUE_REPR: case TypeId::DB0_FIELD_DEF: case TypeId::DB0_CLASS: return; @@ -1295,6 +1296,8 @@ namespace db0::object_model return tryAddShortTagFromTag(py_arg); } else if (type_id == TypeId::DB0_ENUM_VALUE) { return getShortTagFromEnumValue(py_arg); + } else if (type_id == TypeId::DB0_ENUM_VALUE_REPR) { + return getShortTagFromEnumValueRepr(py_arg); } else if (type_id == TypeId::DB0_FIELD_DEF) { return getShortTagFromFieldDef(py_arg); } else if (type_id == TypeId::DB0_CLASS) {