From 0d78ca736fdea9e9962975d250a42465449f626e Mon Sep 17 00:00:00 2001 From: Stephen Granade Date: Thu, 9 Jul 2020 10:40:52 -0500 Subject: [PATCH] Fix error in test suite under Python 3.6. --- dataenforce/__init__.py | 13 +++++++++---- tests/test_validate.py | 7 +++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/dataenforce/__init__.py b/dataenforce/__init__.py index 816380f..63c5dae 100644 --- a/dataenforce/__init__.py +++ b/dataenforce/__init__.py @@ -15,12 +15,14 @@ import inspect from functools import wraps import pandas as pd -from typing import _TypingEmpty, _tp_cache, Generic,get_type_hints +from typing import _TypingEmpty, _tp_cache, Generic, get_type_hints import numpy as np try: - from typing import GenericMeta # Python 3.6 -except ImportError: # Python 3.7 - class GenericMeta(type): pass + from typing import GenericMeta # Python 3.6 +except ImportError: # Python 3.7 + class GenericMeta(type): + pass + def validate(f): signature = inspect.signature(f) @@ -50,6 +52,7 @@ def wrapper(*args, **kwargs): return wrapper + def _get_columns_dtypes(p): columns = set() dtypes = {} @@ -74,6 +77,7 @@ def _get_columns_dtypes(p): return columns, dtypes + class DatasetMeta(GenericMeta): """Metaclass for Dataset (internal).""" @@ -101,6 +105,7 @@ def __getitem__(self, parameters): return meta + class Dataset(pd.DataFrame, extra=Generic, metaclass=DatasetMeta): """Defines type Dataset to serve as column name & type enforcement for pandas DataFrames""" __slots__ = () diff --git a/tests/test_validate.py b/tests/test_validate.py index 9295110..218db31 100644 --- a/tests/test_validate.py +++ b/tests/test_validate.py @@ -55,15 +55,18 @@ def process(data: Dataset[...]): with pytest.raises(TypeError): process(False) + def test_validate_dtypes(): - df = pd.DataFrame(dict(a=[1,2,3], b=[4.1,5.1,6.1], c=["a", "b", "c"], d=[datetime.now().replace(hour=x) for x in [7,8,9]])) + df = pd.DataFrame(dict(a=[1, 2, 3], b=[4.1, 5.1, 6.1], c=["a", "b", "c"], d=[datetime.now().replace(hour=x) for x in [7, 8, 9]])) @validate - def process1(data: Dataset["a": int, "b": np.float, "c": object, "d": np.datetime64]): + def process1(data: Dataset["a": np.int64, "b": np.float, "c": object, "d": np.datetime64]): pass + @validate def process2(data: Dataset["a": float, "b", ...]): pass + @validate def process3(data: Dataset["a": np.datetime64, ...]): pass