From b52f204b43f9fd6d6b0a42f51c79cbc2d8909696 Mon Sep 17 00:00:00 2001 From: tomrod Date: Wed, 21 Dec 2016 16:52:40 -0500 Subject: [PATCH 1/9] Clarified error in read_sas method when buffer object provided without format --- doc/source/whatsnew/v0.20.0.txt | 1 + pandas/io/sas/sasreader.py | 3 +++ 2 files changed, 4 insertions(+) diff --git a/doc/source/whatsnew/v0.20.0.txt b/doc/source/whatsnew/v0.20.0.txt index 27f8564ba16c2..bccbeff17ac4b 100644 --- a/doc/source/whatsnew/v0.20.0.txt +++ b/doc/source/whatsnew/v0.20.0.txt @@ -271,6 +271,7 @@ Performance Improvements - Improved performance of ``pd.wide_to_long()`` (:issue:`14779`) - Increased performance of ``pd.factorize()`` by releasing the GIL with ``object`` dtype when inferred as strings (:issue:`14859`) +- When reading buffer object in ``read_sas()`` method without specified format, filepath string is inferred rather than buffer object. Error is now thrown if buffer object is provided without format {sas7bdat|xport} specification. .. _whatsnew_0200.bug_fixes: diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index 081d780f71cb3..bb58f9556e2ce 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -31,6 +31,9 @@ def read_sas(filepath_or_buffer, format=None, index=None, encoding=None, """ if format is None: + bufferr = "Format unrecognized. If buffer object, specify format") + if type(filesize_or_buffer) != str: + raise TypeError(bufferr) try: fname = filepath_or_buffer.lower() if fname.endswith(".xpt"): From f8166fcc942e2ad9df1aae7c236d4faa334cc4f8 Mon Sep 17 00:00:00 2001 From: tomrod Date: Fri, 30 Dec 2016 19:55:47 -0500 Subject: [PATCH 2/9] Updated based on feedback from jreback --- doc/source/whatsnew/v0.20.0.txt | 2 +- pandas/io/sas/sasreader.py | 8 ++++---- pandas/io/tests/sas/test_sas.py | 5 +++++ 3 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 pandas/io/tests/sas/test_sas.py diff --git a/doc/source/whatsnew/v0.20.0.txt b/doc/source/whatsnew/v0.20.0.txt index bccbeff17ac4b..b70b3c1cea2b5 100644 --- a/doc/source/whatsnew/v0.20.0.txt +++ b/doc/source/whatsnew/v0.20.0.txt @@ -271,7 +271,7 @@ Performance Improvements - Improved performance of ``pd.wide_to_long()`` (:issue:`14779`) - Increased performance of ``pd.factorize()`` by releasing the GIL with ``object`` dtype when inferred as strings (:issue:`14859`) -- When reading buffer object in ``read_sas()`` method without specified format, filepath string is inferred rather than buffer object. Error is now thrown if buffer object is provided without format {sas7bdat|xport} specification. +- When reading buffer object in ``read_sas()`` method without specified format, filepath string is inferred rather than buffer object. .. _whatsnew_0200.bug_fixes: diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index bb58f9556e2ce..89a815d94871d 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -29,11 +29,11 @@ def read_sas(filepath_or_buffer, format=None, index=None, encoding=None, DataFrame if iterator=False and chunksize=None, else SAS7BDATReader or XportReader """ - + from pandas import compat if format is None: - bufferr = "Format unrecognized. If buffer object, specify format") - if type(filesize_or_buffer) != str: - raise TypeError(bufferr) + buffErr = "Format unrecognized. If buffer object, specify format") + if not isinstance(filepath_or_buffer,compat.string_types): + raise TypeError(buffErr) try: fname = filepath_or_buffer.lower() if fname.endswith(".xpt"): diff --git a/pandas/io/tests/sas/test_sas.py b/pandas/io/tests/sas/test_sas.py new file mode 100644 index 0000000000000..68293b1da154e --- /dev/null +++ b/pandas/io/tests/sas/test_sas.py @@ -0,0 +1,5 @@ +def test_sas_buffer_format(self): + import StringIO + b = StringIO.StringIO("") + with self.assertRaises(TypeError): + result=pd.read_sas(b) From 5efdb85389337954ba0032473e6d864fdab92b48 Mon Sep 17 00:00:00 2001 From: tomrod Date: Fri, 30 Dec 2016 21:00:01 -0500 Subject: [PATCH 3/9] Adding tests --- pandas/io/sas/sasreader.py | 2 +- pandas/io/tests/sas/test_sas.py | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index 89a815d94871d..7b738e07df93c 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -31,7 +31,7 @@ def read_sas(filepath_or_buffer, format=None, index=None, encoding=None, """ from pandas import compat if format is None: - buffErr = "Format unrecognized. If buffer object, specify format") + buffErr = "Format unrecognized. If buffer object, specify format" if not isinstance(filepath_or_buffer,compat.string_types): raise TypeError(buffErr) try: diff --git a/pandas/io/tests/sas/test_sas.py b/pandas/io/tests/sas/test_sas.py index 68293b1da154e..257dc18d61cfa 100644 --- a/pandas/io/tests/sas/test_sas.py +++ b/pandas/io/tests/sas/test_sas.py @@ -1,5 +1,13 @@ -def test_sas_buffer_format(self): - import StringIO - b = StringIO.StringIO("") - with self.assertRaises(TypeError): - result=pd.read_sas(b) +from pandas.io.sas.sasreader import read_sas +import pandas.util.testing as tm +import pandas as pd + +class TestSasBuff(tm.TestCase): + + def test_sas_buffer_format(self): + import StringIO + from pandas.io.sas.sasreader import read_sas + b = StringIO.StringIO("") + with self.assertRaises(TypeError): + result=read_sas(b) + From bf60d23063168b8264b14e232c669637abfa54e0 Mon Sep 17 00:00:00 2001 From: tomrod Date: Fri, 30 Dec 2016 22:38:45 -0500 Subject: [PATCH 4/9] Adding tests, creating updated information --- pandas/io/tests/sas/test_sas.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pandas/io/tests/sas/test_sas.py b/pandas/io/tests/sas/test_sas.py index 257dc18d61cfa..1de296508f8be 100644 --- a/pandas/io/tests/sas/test_sas.py +++ b/pandas/io/tests/sas/test_sas.py @@ -1,13 +1,9 @@ -from pandas.io.sas.sasreader import read_sas import pandas.util.testing as tm -import pandas as pd class TestSasBuff(tm.TestCase): - def test_sas_buffer_format(self): import StringIO from pandas.io.sas.sasreader import read_sas b = StringIO.StringIO("") with self.assertRaises(TypeError): - result=read_sas(b) - + read_sas(b) From aa1ada38f5227bcb0a5be02a38bb540103c6774b Mon Sep 17 00:00:00 2001 From: tomrod Date: Sat, 31 Dec 2016 16:32:26 -0500 Subject: [PATCH 5/9] More specific error message, moved imports to top of files --- pandas/io/sas/sasreader.py | 8 ++++---- pandas/io/tests/sas/test_sas.py | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index 7b738e07df93c..9d2bac2bf54e5 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -1,7 +1,7 @@ """ Read SAS sas7bdat or xport files. """ - +from pandas import compat def read_sas(filepath_or_buffer, format=None, index=None, encoding=None, chunksize=None, iterator=False): @@ -29,11 +29,11 @@ def read_sas(filepath_or_buffer, format=None, index=None, encoding=None, DataFrame if iterator=False and chunksize=None, else SAS7BDATReader or XportReader """ - from pandas import compat if format is None: - buffErr = "Format unrecognized. If buffer object, specify format" + buffer_error_msg = "If this is a buffer object rather\ + than a string name, you must specify a format string" if not isinstance(filepath_or_buffer,compat.string_types): - raise TypeError(buffErr) + raise TypeError(buffer_error_msg) try: fname = filepath_or_buffer.lower() if fname.endswith(".xpt"): diff --git a/pandas/io/tests/sas/test_sas.py b/pandas/io/tests/sas/test_sas.py index 1de296508f8be..3d7a8e87288fd 100644 --- a/pandas/io/tests/sas/test_sas.py +++ b/pandas/io/tests/sas/test_sas.py @@ -1,9 +1,9 @@ import pandas.util.testing as tm +from pandas.compat import StringIO +from pandas import read_sas class TestSasBuff(tm.TestCase): def test_sas_buffer_format(self): - import StringIO - from pandas.io.sas.sasreader import read_sas - b = StringIO.StringIO("") + b = StringIO("") with self.assertRaises(TypeError): read_sas(b) From ffdce1d152b3a572f298239867229c68daa0d63e Mon Sep 17 00:00:00 2001 From: tomrod Date: Tue, 3 Jan 2017 17:54:51 -0500 Subject: [PATCH 6/9] Updating to match pep8 as per @jorisvandenbossche --- pandas/io/sas/sasreader.py | 5 +++-- pandas/io/tests/sas/test_sas.py | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index 9d2bac2bf54e5..e8ea87e5ece2d 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -30,8 +30,9 @@ def read_sas(filepath_or_buffer, format=None, index=None, encoding=None, or XportReader """ if format is None: - buffer_error_msg = "If this is a buffer object rather\ - than a string name, you must specify a format string" + buffer_error_msg = ("If this is a buffer object rather" + "than a string name, you must specify" + " a format string") if not isinstance(filepath_or_buffer,compat.string_types): raise TypeError(buffer_error_msg) try: diff --git a/pandas/io/tests/sas/test_sas.py b/pandas/io/tests/sas/test_sas.py index 3d7a8e87288fd..2189b66ee5186 100644 --- a/pandas/io/tests/sas/test_sas.py +++ b/pandas/io/tests/sas/test_sas.py @@ -2,7 +2,8 @@ from pandas.compat import StringIO from pandas import read_sas -class TestSasBuff(tm.TestCase): +class TestSas(tm.TestCase): + def test_sas_buffer_format(self): b = StringIO("") with self.assertRaises(TypeError): From ab76d80b772a943abb2ee25577826818eb80e6e9 Mon Sep 17 00:00:00 2001 From: tomrod Date: Tue, 3 Jan 2017 17:57:24 -0500 Subject: [PATCH 7/9] Updating to match pep8 whitespace requirements in sasreader.py --- 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 e8ea87e5ece2d..95f862f325880 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -5,6 +5,7 @@ def read_sas(filepath_or_buffer, format=None, index=None, encoding=None, chunksize=None, iterator=False): + """ Read SAS files stored as either XPORT or SAS7BDAT format files. @@ -32,7 +33,7 @@ def read_sas(filepath_or_buffer, format=None, index=None, encoding=None, if format is None: buffer_error_msg = ("If this is a buffer object rather" "than a string name, you must specify" - " a format string") + " a format string") if not isinstance(filepath_or_buffer,compat.string_types): raise TypeError(buffer_error_msg) try: From 4cf92318858e1dc07fbe79bb5fe266356653c79f Mon Sep 17 00:00:00 2001 From: tomrod Date: Tue, 3 Jan 2017 18:27:30 -0500 Subject: [PATCH 8/9] PEP8 compliance --- pandas/io/sas/sasreader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index 95f862f325880..49dbc11b11497 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -33,8 +33,8 @@ def read_sas(filepath_or_buffer, format=None, index=None, encoding=None, if format is None: buffer_error_msg = ("If this is a buffer object rather" "than a string name, you must specify" - " a format string") - if not isinstance(filepath_or_buffer,compat.string_types): + " a format string") + if not isinstance(filepath_or_buffer, compat.string_types): raise TypeError(buffer_error_msg) try: fname = filepath_or_buffer.lower() From 1285dbb1cdb63bb00bc3db50c17db772833b03a9 Mon Sep 17 00:00:00 2001 From: tomrod Date: Wed, 4 Jan 2017 09:16:36 -0500 Subject: [PATCH 9/9] flake8 testing --- pandas/io/sas/sasreader.py | 1 + pandas/io/tests/sas/test_sas.py | 1 + 2 files changed, 2 insertions(+) diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index 49dbc11b11497..6f7e4c0d213bc 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -3,6 +3,7 @@ """ from pandas import compat + def read_sas(filepath_or_buffer, format=None, index=None, encoding=None, chunksize=None, iterator=False): diff --git a/pandas/io/tests/sas/test_sas.py b/pandas/io/tests/sas/test_sas.py index 2189b66ee5186..2a55a2d68157c 100644 --- a/pandas/io/tests/sas/test_sas.py +++ b/pandas/io/tests/sas/test_sas.py @@ -2,6 +2,7 @@ from pandas.compat import StringIO from pandas import read_sas + class TestSas(tm.TestCase): def test_sas_buffer_format(self):