dataclassdb 0.1.0__tar.gz → 0.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. {dataclassdb-0.1.0/src/dataclassdb.egg-info → dataclassdb-0.1.2}/PKG-INFO +1 -1
  2. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/pyproject.toml +1 -1
  3. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/dataclass_db.py +1 -1
  4. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/dataclass_field_codec.py +2 -6
  5. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/dataclass_sqlite_field.py +4 -16
  6. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/utils.py +13 -1
  7. {dataclassdb-0.1.0 → dataclassdb-0.1.2/src/dataclassdb.egg-info}/PKG-INFO +1 -1
  8. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_dataclass_db.py +1 -1
  9. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_utils.py +14 -1
  10. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/LICENSE +0 -0
  11. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/README.md +0 -0
  12. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/setup.cfg +0 -0
  13. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/__init__.py +0 -0
  14. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/builders/function_builder.py +0 -0
  15. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/builders/list_utils.py +0 -0
  16. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/builders/query_builder.py +0 -0
  17. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/builders/statement_builder.py +0 -0
  18. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/builders/string_builder.py +0 -0
  19. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/constants.py +0 -0
  20. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/dataclass_sqlite_table.py +0 -0
  21. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/dataclass_types.py +0 -0
  22. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/db_engine.py +0 -0
  23. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb.egg-info/SOURCES.txt +0 -0
  24. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb.egg-info/dependency_links.txt +0 -0
  25. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb.egg-info/requires.txt +0 -0
  26. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb.egg-info/top_level.txt +0 -0
  27. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_annotation_parsing.py +0 -0
  28. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_builders.py +0 -0
  29. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_custom_codec.py +0 -0
  30. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_dataclass_field_codec.py +0 -0
  31. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_dataclass_sqlite_codec.py +0 -0
  32. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_date_codec.py +0 -0
  33. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_db_engine.py +0 -0
  34. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_list_utils.py +0 -0
  35. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_no_primary.py +0 -0
  36. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_query_builder.py +0 -0
  37. {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_string_builder.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataclassdb
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: This module provides a lightweight sqlite3 ORM using normal dataclass.
5
5
  Author-email: "@stuarts-art" <stuartsartemail@gmail.com>
6
6
  Maintainer-email: "@stuarts-art" <stuartsartemail@gmail.com>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "dataclassdb"
3
- version = "0.1.0"
3
+ version = "0.1.2"
4
4
  description = "This module provides a lightweight sqlite3 ORM using normal dataclass."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -252,7 +252,7 @@ class DataclassDb(QueryBuilder):
252
252
  )
253
253
  self.execute_script(sql_script=str(query))
254
254
  logger.info(
255
- "Table creation for %s successful.", self.table_name, overlapping_fields
255
+ "Table creation for %s successful with overlapping fields %s", self.table_name, overlapping_fields
256
256
  )
257
257
  else:
258
258
  logger.info("Table has not changed.")
@@ -8,18 +8,14 @@ from typing import Any, TypeVar, Union, get_args, get_origin
8
8
  import dacite
9
9
 
10
10
  from dataclassdb.dataclass_types import Codec, IsDataclass
11
- from dataclassdb.utils import is_enum_class, is_strenum
11
+ from dataclassdb.utils import get_absolute_origin, is_enum_class, is_strenum
12
12
 
13
13
  logger = logging.getLogger(__name__)
14
14
 
15
15
  DataclassT = TypeVar("DataclassT", bound=IsDataclass)
16
16
  T = TypeVar("T")
17
17
  def create_field_codec(field_class: T, sql_type: str) -> Codec:
18
- if origin := get_origin(field_class):
19
- if origin is Union:
20
- field_class = get_args(field_class)[0]
21
- else:
22
- field_class = origin
18
+ field_class = get_absolute_origin(field_class)
23
19
 
24
20
  if sql_type == "BLOB":
25
21
  if dataclasses.is_dataclass(field_class):
@@ -9,6 +9,7 @@ from typing import Annotated, Union, get_args, get_origin
9
9
  from dataclassdb.builders.query_builder import QueryBuilder
10
10
  from dataclassdb.dataclass_field_codec import create_field_codec
11
11
  from dataclassdb.dataclass_types import Codec
12
+ from dataclassdb.utils import get_absolute_origin
12
13
 
13
14
  logger = logging.getLogger(__name__)
14
15
 
@@ -135,31 +136,18 @@ class DataclassSqliteField:
135
136
  if self.type_override:
136
137
  return
137
138
 
138
- if origin := get_origin(field_type):
139
- if origin is Union:
140
- field_type = get_args(field_type)[0]
141
- self.origin = field_type
142
- else:
143
- field_type = origin
144
- self.origin = field_type
139
+ self.origin = get_absolute_origin(field_type)
145
140
 
146
- if inspect.isclass(self.type) and issubclass(field_type, set):
141
+ if inspect.isclass(self.origin) and issubclass(self.origin, set):
147
142
  raise TypeError(
148
143
  "Sets cannot be encoded as text. Either override the type to BLOB, "
149
144
  "override the codec, or change the datatype."
150
145
  )
151
146
 
152
147
  for mapped_type in self._type_map:
153
- if issubclass(field_type, mapped_type):
154
- # if isinstance(field_type, mapped_type):
155
- # if issubclass(field_type, mapped_type):
148
+ if issubclass(self.origin, mapped_type):
156
149
  self.sql_type = self._type_map[mapped_type]
157
150
  break
158
- # if inspect.isclass(field_type):
159
- # else:
160
- # if isinstance(field_type, mapped_type):
161
- # self.sql_type = self._type_map[mapped_type]
162
- # break
163
151
 
164
152
  def parse_default(self, dc_field):
165
153
  if dc_field.default_factory is not MISSING:
@@ -2,7 +2,7 @@ import logging
2
2
  import sqlite3
3
3
  from dataclasses import dataclass
4
4
  from enum import Enum, StrEnum
5
- from typing import Any, ClassVar
5
+ from typing import Annotated, Any, ClassVar, Union, get_args, get_origin
6
6
 
7
7
  import dacite
8
8
 
@@ -17,6 +17,18 @@ class UpperStrEnum(StrEnum):
17
17
  return name.upper().replace("_", " ")
18
18
 
19
19
 
20
+ def get_absolute_origin(field_type):
21
+ if origin := get_origin(field_type):
22
+ args = get_args(field_type)
23
+ if origin is Union:
24
+ return get_absolute_origin(args[0])
25
+ elif origin is Annotated:
26
+ return get_absolute_origin(args[0])
27
+ else:
28
+ return origin
29
+ return field_type
30
+
31
+
20
32
  def table_exists(connection: sqlite3.Connection, table_name):
21
33
  cursor = connection.cursor()
22
34
  cursor.execute(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataclassdb
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: This module provides a lightweight sqlite3 ORM using normal dataclass.
5
5
  Author-email: "@stuarts-art" <stuartsartemail@gmail.com>
6
6
  Maintainer-email: "@stuarts-art" <stuartsartemail@gmail.com>
@@ -16,7 +16,7 @@ class Example_Dataclass:
16
16
  score: int = 0
17
17
  tags: Annotated[list, "TEXT"] = field(default_factory=list)
18
18
  connections: Annotated[dict, "BLOB"] = field(default_factory=dict)
19
-
19
+ extras: list[str] | None = None
20
20
 
21
21
  @dataclass
22
22
  class XOR_Example_Dataclass:
@@ -1,6 +1,12 @@
1
1
  from enum import Enum, StrEnum
2
+ from typing import Annotated
2
3
 
3
- from dataclassdb.utils import is_enum_class, is_strenum, table_exists
4
+ from dataclassdb.utils import (
5
+ get_absolute_origin,
6
+ is_enum_class,
7
+ is_strenum,
8
+ table_exists,
9
+ )
4
10
 
5
11
 
6
12
  def test_table_exists(db_mem_connection):
@@ -28,3 +34,10 @@ def test_is_enum(db_mem_connection):
28
34
  for t in [str, int, list, dict, list[str]]:
29
35
  assert not is_enum_class(t)
30
36
  assert not is_strenum(t)
37
+
38
+
39
+ def test_get_absolute_origin():
40
+ assert get_absolute_origin(list[str]) is list
41
+ assert get_absolute_origin(list[str] | None) is list
42
+ assert get_absolute_origin(Annotated[list[str], "str"]) is list
43
+ assert get_absolute_origin(Annotated[list[str] | None, "str"]) is list
File without changes
File without changes
File without changes