Skip to content

Commit 3add510

Browse files
committed
Fix various typings
1 parent b42009c commit 3add510

File tree

3 files changed

+27
-7
lines changed

3 files changed

+27
-7
lines changed

postgres_composite_types/caster.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1+
from typing import TYPE_CHECKING, Type
2+
13
from psycopg2.extras import CompositeCaster
24

5+
if TYPE_CHECKING:
6+
from .composite_type import CompositeType
7+
38
__all__ = ["BaseCaster"]
49

510

@@ -9,5 +14,7 @@ class BaseCaster(CompositeCaster):
914
instance.
1015
"""
1116

17+
_composite_type_model: Type["CompositeType"]
18+
1219
def make(self, values):
1320
return self._composite_type_model(*values)

postgres_composite_types/composite_type.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
from typing import Type
23

34
from django.db import connections, models
45
from django.db.backends.signals import connection_created
@@ -66,10 +67,10 @@ def __new__(cls, name, bases, attrs):
6667
# Use an EmptyManager for everything as types cannot be queried.
6768
meta_obj.default_manager_name = "objects"
6869
meta_obj.base_manager_name = "objects"
69-
attrs["objects"] = EmptyManager(model=None)
70+
attrs["objects"] = EmptyManager(model=None) # type: ignore
7071

7172
ret = super().__new__(cls, name, bases, attrs)
72-
ret.Field._composite_type_model = ret
73+
ret.Field._composite_type_model = ret # type: ignore
7374
return ret
7475

7576
def __init__(cls, name, bases, attrs):
@@ -147,16 +148,18 @@ class CompositeType(metaclass=CompositeTypeMeta):
147148

148149
# The database connection this type is registered with
149150
registered_connection = None
151+
_meta: Type
150152

151153
def __init__(self, *args, **kwargs):
152154
if args and kwargs:
153155
raise RuntimeError("Specify either args or kwargs but not both.")
154156

155-
for field in self._meta.fields:
157+
fields = self.get_fields()
158+
for field in fields:
156159
setattr(self, field.name, None)
157160

158161
# Unpack any args as if they came from the type
159-
for field, arg in zip(self._meta.fields, args):
162+
for field, arg in zip(fields, args):
160163
setattr(self, field.name, arg)
161164

162165
for name, value in kwargs.items():
@@ -169,21 +172,21 @@ def __repr__(self):
169172
def __to_tuple__(self):
170173
return tuple(
171174
field.get_prep_value(getattr(self, field.name))
172-
for field in self._meta.fields
175+
for field in self.get_fields()
173176
)
174177

175178
def __to_dict__(self):
176179
return {
177180
field.name: field.get_prep_value(getattr(self, field.name))
178-
for field in self._meta.fields
181+
for field in self.get_fields()
179182
}
180183

181184
def __eq__(self, other):
182185
if not isinstance(other, CompositeType):
183186
return False
184187
if self._meta.model != other._meta.model:
185188
return False
186-
for field in self._meta.fields:
189+
for field in self.get_fields():
187190
if getattr(self, field.name) != getattr(other, field.name):
188191
return False
189192
return True
@@ -235,3 +238,6 @@ def _get_next_or_previous_by_FIELD(self):
235238
@classmethod
236239
def check(cls, **kwargs):
237240
return []
241+
242+
def get_fields(self):
243+
return self._meta.fields

postgres_composite_types/fields.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
import json
2+
from typing import TYPE_CHECKING, Type
23

34
from django.core.exceptions import ValidationError
45
from django.db.backends.postgresql.base import (
56
DatabaseWrapper as PostgresDatabaseWrapper,
67
)
78
from django.db.models import Field
89

10+
if TYPE_CHECKING:
11+
from .composite_type import CompositeType
12+
13+
914
__all__ = ["BaseField"]
1015

1116

@@ -22,6 +27,8 @@ class DummyField(Field):
2227
class BaseField(Field):
2328
"""Base class for the field that relates to this type."""
2429

30+
_composite_type_model: Type["CompositeType"]
31+
2532
default_error_messages = {
2633
"bad_json": "to_python() received a string that was not valid JSON",
2734
}

0 commit comments

Comments
 (0)