Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 17 additions & 8 deletions redcap/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,6 @@ def export_fem(self, arms=None, format='json', df_kwargs=None):
"""
ret_format = format
if format == 'df':
from pandas import read_csv
ret_format = 'csv'
pl = self.__basepl('formEventMapping', format=ret_format)

Expand All @@ -189,9 +188,9 @@ def export_fem(self, arms=None, format='json', df_kwargs=None):
return response
elif format == 'df':
if not df_kwargs:
return read_csv(StringIO(response))
else:
return read_csv(StringIO(response), **df_kwargs)
df_kwargs = {}

return self.read_csv(StringIO(response), **df_kwargs)

def export_metadata(self, fields=None, forms=None, format='json',
df_kwargs=None):
Expand Down Expand Up @@ -219,7 +218,6 @@ def export_metadata(self, fields=None, forms=None, format='json',
"""
ret_format = format
if format == 'df':
from pandas import read_csv
ret_format = 'csv'
pl = self.__basepl('metadata', format=ret_format)
to_add = [fields, forms]
Expand All @@ -235,7 +233,7 @@ def export_metadata(self, fields=None, forms=None, format='json',
elif format == 'df':
if not df_kwargs:
df_kwargs = {'index_col': 'field_name'}
return read_csv(StringIO(response), **df_kwargs)
return self.read_csv(StringIO(response), **df_kwargs)

def delete_records(self, records):
"""
Expand Down Expand Up @@ -329,7 +327,6 @@ def export_records(self, records=None, fields=None, forms=None,
"""
ret_format = format
if format == 'df':
from pandas import read_csv
ret_format = 'csv'
pl = self.__basepl('record', format=ret_format)
fields = self.backfill_fields(fields, forms)
Expand Down Expand Up @@ -360,10 +357,22 @@ def export_records(self, records=None, fields=None, forms=None,
else:
df_kwargs = {'index_col': self.def_field}
buf = StringIO(response)
df = read_csv(buf, **df_kwargs)
df = self.read_csv(buf, **df_kwargs)
buf.close()
return df

def read_csv(self, buf, **df_kwargs):
"""Wrapper around pandas read_csv that handles EmptyDataError"""
from pandas import DataFrame, read_csv
from pandas.errors import EmptyDataError

try:
df = read_csv(buf, **df_kwargs)
except EmptyDataError:
df = DataFrame()

return df

def metadata_type(self, field_name):
"""If the given field_name is validated by REDCap, return it's type"""
return self.__meta_metadata(field_name,
Expand Down
18 changes: 18 additions & 0 deletions test/test_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -615,6 +615,24 @@ def test_import_dataframe(self):
self.assertIn('count', response)
self.assertNotIn('error', response)

def test_export_records_handles_empty_data_error(self):
self.reg_proj._call_api = mock.Mock()
self.reg_proj._call_api.return_value = "\n", {}
df = self.reg_proj.export_records(format='df')
self.assertTrue(df.empty)

def test_export_fem_handles_empty_data_error(self):
self.reg_proj._call_api = mock.Mock()
self.reg_proj._call_api.return_value = "\n", {}
df = self.reg_proj.export_fem(format='df')
self.assertTrue(df.empty)

def test_export_metadata_handles_empty_data_error(self):
self.reg_proj._call_api = mock.Mock()
self.reg_proj._call_api.return_value = "\n", {}
df = self.reg_proj.export_metadata(format='df')
self.assertTrue(df.empty)

@responses.activate
def test_date_formatting(self):
"""Test date_format parameter"""
Expand Down