)
-class _NumberDumper(Dumper):
+class _IntDumper(Dumper):
def dump(self, obj: Any) -> bytes:
- return str(obj).encode()
+ # Convert to int in order to dump IntEnum correctly
+ return str(int(obj)).encode()
def quote(self, obj: Any) -> bytes:
value = self.dump(obj)
return value if obj >= 0 else b" " + value
-class _SpecialValuesDumper(_NumberDumper):
+class _SpecialValuesDumper(Dumper):
_special: Dict[bytes, bytes] = {}
+ def dump(self, obj: Any) -> bytes:
+ return str(obj).encode()
+
def quote(self, obj: Any) -> bytes:
value = self.dump(obj)
}
-class Int2Dumper(_NumberDumper):
+class Int2Dumper(_IntDumper):
oid = postgres.types["int2"].oid
-class Int4Dumper(_NumberDumper):
+class Int4Dumper(_IntDumper):
oid = postgres.types["int4"].oid
-class Int8Dumper(_NumberDumper):
+class Int8Dumper(_IntDumper):
oid = postgres.types["int8"].oid
-class IntNumericDumper(_NumberDumper):
+class IntNumericDumper(_IntDumper):
oid = postgres.types["numeric"].oid
-class OidDumper(_NumberDumper):
+class OidDumper(_IntDumper):
oid = postgres.types["oid"].oid
+import enum
from decimal import Decimal
from math import isnan, isinf, exp
assert ok
-@pytest.mark.parametrize("fmt_in", PyFormat)
-def test_dump_enum(conn, fmt_in):
- import enum
+class MyEnum(enum.IntEnum):
+ foo = 42
+
- class MyEnum(enum.IntEnum):
- foo = 42
+class MyMixinEnum(enum.IntEnum):
+ foo = 42000000
+
+@pytest.mark.parametrize("fmt_in", PyFormat)
+@pytest.mark.parametrize("enum", [MyEnum, MyMixinEnum])
+def test_dump_enum(conn, fmt_in, enum):
cur = conn.cursor()
- (res,) = cur.execute("select %s", (MyEnum.foo,)).fetchone()
- assert res == 42
+ cur.execute(f"select %{fmt_in}", (enum.foo,))
+ (res,) = cur.fetchone()
+ assert res == enum.foo.value
@pytest.mark.parametrize(