From 6c27421afdc619ccddcc6b0818dffdf65d765071 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Fri, 3 Jan 2020 20:35:24 +0000 Subject: [PATCH 1/6] TYP: check_untyped_defs io.sas.sasreader --- pandas/io/sas/sasreader.py | 23 ++++++++++++++++------- setup.cfg | 3 --- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index 56ebb583bc2f9..1a8332a6a9f98 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -1,16 +1,24 @@ """ Read SAS sas7bdat or xport files. """ +from typing import TYPE_CHECKING, AnyStr, Optional, Union + +from pandas._typing import FilePathOrBuffer + from pandas.io.common import stringify_path +if TYPE_CHECKING: + from pandas.io.sas.sas_xport import XportReader # noqa: F401 + from pandas.io.sas.sas7bdat import SAS7BDATReader # noqa: F401 + def read_sas( - filepath_or_buffer, - format=None, + filepath_or_buffer: FilePathOrBuffer[AnyStr], + format: Optional[str] = None, index=None, - encoding=None, - chunksize=None, - iterator=False, + encoding: Optional[str] = None, + chunksize: Optional[int] = None, + iterator: bool = False, ): """ Read SAS files stored as either XPORT or SAS7BDAT format files. @@ -63,14 +71,15 @@ def read_sas( else: raise ValueError("unable to infer format of SAS file") + reader: Union["XportReader", "SAS7BDATReader"] if format.lower() == "xport": - from pandas.io.sas.sas_xport import XportReader + from pandas.io.sas.sas_xport import XportReader # noqa: F811 reader = XportReader( filepath_or_buffer, index=index, encoding=encoding, chunksize=chunksize ) elif format.lower() == "sas7bdat": - from pandas.io.sas.sas7bdat import SAS7BDATReader + from pandas.io.sas.sas7bdat import SAS7BDATReader # noqa: F811 reader = SAS7BDATReader( filepath_or_buffer, index=index, encoding=encoding, chunksize=chunksize diff --git a/setup.cfg b/setup.cfg index 96af78c77feb8..f69bfa971de4f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -313,9 +313,6 @@ check_untyped_defs=False [mypy-pandas.io.sas.sas7bdat] check_untyped_defs=False -[mypy-pandas.io.sas.sasreader] -check_untyped_defs=False - [mypy-pandas.io.sql] check_untyped_defs=False From 576c08118945a8c386057330e743b6b486b9723f Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 5 Jan 2020 10:59:41 +0000 Subject: [PATCH 2/6] imports at top --- pandas/io/sas/sasreader.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index 1a8332a6a9f98..1f11735af5ce2 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -1,15 +1,13 @@ """ Read SAS sas7bdat or xport files. """ -from typing import TYPE_CHECKING, AnyStr, Optional, Union +from typing import AnyStr, Optional, Union from pandas._typing import FilePathOrBuffer from pandas.io.common import stringify_path - -if TYPE_CHECKING: - from pandas.io.sas.sas_xport import XportReader # noqa: F401 - from pandas.io.sas.sas7bdat import SAS7BDATReader # noqa: F401 +from pandas.io.sas.sas7bdat import SAS7BDATReader +from pandas.io.sas.sas_xport import XportReader def read_sas( @@ -73,14 +71,10 @@ def read_sas( reader: Union["XportReader", "SAS7BDATReader"] if format.lower() == "xport": - from pandas.io.sas.sas_xport import XportReader # noqa: F811 - reader = XportReader( filepath_or_buffer, index=index, encoding=encoding, chunksize=chunksize ) elif format.lower() == "sas7bdat": - from pandas.io.sas.sas7bdat import SAS7BDATReader # noqa: F811 - reader = SAS7BDATReader( filepath_or_buffer, index=index, encoding=encoding, chunksize=chunksize ) From 966819f7afe5436de02e06af939d7c73273ab2f8 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 13 Apr 2020 19:34:27 +0100 Subject: [PATCH 3/6] Revert "imports at top" This reverts commit 576c08118945a8c386057330e743b6b486b9723f. --- pandas/io/sas/sasreader.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index 292de97315b45..4c8658ff224d1 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -1,13 +1,15 @@ """ Read SAS sas7bdat or xport files. """ -from typing import AnyStr, Optional, Union +from typing import TYPE_CHECKING, AnyStr, Optional, Union from pandas._typing import FilePathOrBuffer from pandas.io.common import stringify_path -from pandas.io.sas.sas7bdat import SAS7BDATReader -from pandas.io.sas.sas_xport import XportReader + +if TYPE_CHECKING: + from pandas.io.sas.sas_xport import XportReader # noqa: F401 + from pandas.io.sas.sas7bdat import SAS7BDATReader # noqa: F401 def read_sas( @@ -70,10 +72,14 @@ def read_sas( reader: Union["XportReader", "SAS7BDATReader"] if format.lower() == "xport": + from pandas.io.sas.sas_xport import XportReader # noqa: F811 + reader = XportReader( filepath_or_buffer, index=index, encoding=encoding, chunksize=chunksize ) elif format.lower() == "sas7bdat": + from pandas.io.sas.sas7bdat import SAS7BDATReader # noqa: F811 + reader = SAS7BDATReader( filepath_or_buffer, index=index, encoding=encoding, chunksize=chunksize ) From 7849d97277a1c13c845f93a0b9a65d5ca1d6dff2 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 13 Apr 2020 20:48:33 +0100 Subject: [PATCH 4/6] abc for sas readers --- pandas/io/sas/sas7bdat.py | 3 ++- pandas/io/sas/sas_xport.py | 3 ++- pandas/io/sas/sasreader.py | 37 +++++++++++++++++++++++-------------- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/pandas/io/sas/sas7bdat.py b/pandas/io/sas/sas7bdat.py index d47dd2c71b86f..f5f418a9f781d 100644 --- a/pandas/io/sas/sas7bdat.py +++ b/pandas/io/sas/sas7bdat.py @@ -25,6 +25,7 @@ from pandas.io.common import get_filepath_or_buffer from pandas.io.sas._sas import Parser +from pandas.io.sas.reader import ReaderBase import pandas.io.sas.sas_constants as const @@ -37,7 +38,7 @@ class _column: # SAS7BDAT represents a SAS data file in SAS7BDAT format. -class SAS7BDATReader(abc.Iterator): +class SAS7BDATReader(ReaderBase, abc.Iterator): """ Read SAS files in SAS7BDAT format. diff --git a/pandas/io/sas/sas_xport.py b/pandas/io/sas/sas_xport.py index 85b7fd497cedd..75d775c50e17a 100644 --- a/pandas/io/sas/sas_xport.py +++ b/pandas/io/sas/sas_xport.py @@ -19,6 +19,7 @@ import pandas as pd from pandas.io.common import get_filepath_or_buffer +from pandas.io.sas.reader import ReaderBase _correct_line1 = ( "HEADER RECORD*******LIBRARY HEADER RECORD!!!!!!!" @@ -239,7 +240,7 @@ def _parse_float_vec(vec): return ieee -class XportReader(abc.Iterator): +class XportReader(ReaderBase, abc.Iterator): __doc__ = _xport_reader_doc def __init__( diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index 4c8658ff224d1..b8be6f7219ff6 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -1,24 +1,33 @@ """ Read SAS sas7bdat or xport files. """ -from typing import TYPE_CHECKING, AnyStr, Optional, Union - -from pandas._typing import FilePathOrBuffer from pandas.io.common import stringify_path +from abc import ABCMeta, abstractmethod + + +# TODO: replace with Protocol in Python 3.8 +class ReaderBase(metaclass=ABCMeta): + """ + Protocol for XportReader and SAS7BDATReader classes. + """ + + @abstractmethod + def read(self, nrows=None): + pass -if TYPE_CHECKING: - from pandas.io.sas.sas_xport import XportReader # noqa: F401 - from pandas.io.sas.sas7bdat import SAS7BDATReader # noqa: F401 + @abstractmethod + def close(self): + pass def read_sas( - filepath_or_buffer: FilePathOrBuffer[AnyStr], - format: Optional[str] = None, + filepath_or_buffer, + format=None, index=None, - encoding: Optional[str] = None, - chunksize: Optional[int] = None, - iterator: bool = False, + encoding=None, + chunksize=None, + iterator=False, ): """ Read SAS files stored as either XPORT or SAS7BDAT format files. @@ -70,15 +79,15 @@ def read_sas( else: raise ValueError("unable to infer format of SAS file") - reader: Union["XportReader", "SAS7BDATReader"] + reader: ReaderBase if format.lower() == "xport": - from pandas.io.sas.sas_xport import XportReader # noqa: F811 + from pandas.io.sas.sas_xport import XportReader reader = XportReader( filepath_or_buffer, index=index, encoding=encoding, chunksize=chunksize ) elif format.lower() == "sas7bdat": - from pandas.io.sas.sas7bdat import SAS7BDATReader # noqa: F811 + from pandas.io.sas.sas7bdat import SAS7BDATReader reader = SAS7BDATReader( filepath_or_buffer, index=index, encoding=encoding, chunksize=chunksize From 20aff22d3774bfe57650bbd80a725d771367ed2b Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 13 Apr 2020 20:53:10 +0100 Subject: [PATCH 5/6] isort fixup --- pandas/io/sas/sasreader.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index b8be6f7219ff6..6ebcaf6b72c45 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -2,9 +2,10 @@ Read SAS sas7bdat or xport files. """ -from pandas.io.common import stringify_path from abc import ABCMeta, abstractmethod +from pandas.io.common import stringify_path + # TODO: replace with Protocol in Python 3.8 class ReaderBase(metaclass=ABCMeta): From 4666b0863171105506c711c0e29a3e686fd5f029 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Tue, 14 Apr 2020 14:35:37 +0100 Subject: [PATCH 6/6] fix imports --- pandas/io/sas/sas7bdat.py | 2 +- pandas/io/sas/sas_xport.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/io/sas/sas7bdat.py b/pandas/io/sas/sas7bdat.py index f5f418a9f781d..2bfcd500ee239 100644 --- a/pandas/io/sas/sas7bdat.py +++ b/pandas/io/sas/sas7bdat.py @@ -25,8 +25,8 @@ from pandas.io.common import get_filepath_or_buffer from pandas.io.sas._sas import Parser -from pandas.io.sas.reader import ReaderBase import pandas.io.sas.sas_constants as const +from pandas.io.sas.sasreader import ReaderBase class _subheader_pointer: diff --git a/pandas/io/sas/sas_xport.py b/pandas/io/sas/sas_xport.py index 75d775c50e17a..7fc1bc6d3eb6c 100644 --- a/pandas/io/sas/sas_xport.py +++ b/pandas/io/sas/sas_xport.py @@ -19,7 +19,7 @@ import pandas as pd from pandas.io.common import get_filepath_or_buffer -from pandas.io.sas.reader import ReaderBase +from pandas.io.sas.sasreader import ReaderBase _correct_line1 = ( "HEADER RECORD*******LIBRARY HEADER RECORD!!!!!!!"