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.
- {dataclassdb-0.1.0/src/dataclassdb.egg-info → dataclassdb-0.1.2}/PKG-INFO +1 -1
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/pyproject.toml +1 -1
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/dataclass_db.py +1 -1
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/dataclass_field_codec.py +2 -6
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/dataclass_sqlite_field.py +4 -16
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/utils.py +13 -1
- {dataclassdb-0.1.0 → dataclassdb-0.1.2/src/dataclassdb.egg-info}/PKG-INFO +1 -1
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_dataclass_db.py +1 -1
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_utils.py +14 -1
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/LICENSE +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/README.md +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/setup.cfg +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/__init__.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/builders/function_builder.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/builders/list_utils.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/builders/query_builder.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/builders/statement_builder.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/builders/string_builder.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/constants.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/dataclass_sqlite_table.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/dataclass_types.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb/db_engine.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb.egg-info/SOURCES.txt +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb.egg-info/dependency_links.txt +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb.egg-info/requires.txt +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/src/dataclassdb.egg-info/top_level.txt +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_annotation_parsing.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_builders.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_custom_codec.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_dataclass_field_codec.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_dataclass_sqlite_codec.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_date_codec.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_db_engine.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_list_utils.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_no_primary.py +0 -0
- {dataclassdb-0.1.0 → dataclassdb-0.1.2}/tests/test_query_builder.py +0 -0
- {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.
|
|
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>
|
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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(
|
|
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.
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|