Skip to content

Commit

Permalink
format code with black
Browse files Browse the repository at this point in the history
  • Loading branch information
sheppard committed Aug 3, 2022
1 parent 99ade51 commit 7e5c1f8
Show file tree
Hide file tree
Showing 19 changed files with 630 additions and 560 deletions.
40 changes: 19 additions & 21 deletions rest_pandas/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,25 +26,23 @@


__all__ = [
'PandasMixin',
'PandasSimpleView',
'PandasView',
'PandasViewSet',

'PandasSerializer',
'PandasUnstackedSerializer',
'PandasScatterSerializer',
'PandasBoxplotSerializer',
'SimpleSerializer',

'PandasBaseRenderer',
'PandasFileRenderer',
'PandasCSVRenderer',
'PandasTextRenderer',
'PandasJSONRenderer',
'PandasExcelRenderer',
'PandasOldExcelRenderer',
'PandasImageRenderer',
'PandasPNGRenderer',
'PandasSVGRenderer',
"PandasMixin",
"PandasSimpleView",
"PandasView",
"PandasViewSet",
"PandasSerializer",
"PandasUnstackedSerializer",
"PandasScatterSerializer",
"PandasBoxplotSerializer",
"SimpleSerializer",
"PandasBaseRenderer",
"PandasFileRenderer",
"PandasCSVRenderer",
"PandasTextRenderer",
"PandasJSONRenderer",
"PandasExcelRenderer",
"PandasOldExcelRenderer",
"PandasImageRenderer",
"PandasPNGRenderer",
"PandasSVGRenderer",
]
110 changes: 60 additions & 50 deletions rest_pandas/renderers.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@


RESPONSE_ERROR = (
"Response data is a %s, not a DataFrame! "
"Did you extend PandasMixin?"
"Response data is a %s, not a DataFrame! Did you extend PandasMixin?"
)


Expand All @@ -18,18 +17,17 @@ class PandasBaseRenderer(BaseRenderer):
Only works with serializers that return DataFrames as their data object.
Uses a StringIO to capture the output of dataframe.to_[format]()
"""

def render(self, data, accepted_media_type=None, renderer_context=None):
if renderer_context and 'response' in renderer_context:
status_code = renderer_context['response'].status_code
if renderer_context and "response" in renderer_context:
status_code = renderer_context["response"].status_code
if not status.is_success(status_code):
return "Error: %s" % data.get('detail', status_code)
return "Error: %s" % data.get("detail", status_code)

if not isinstance(data, DataFrame):
raise Exception(
RESPONSE_ERROR % type(data).__name__
)
raise Exception(RESPONSE_ERROR % type(data).__name__)

name = getattr(self, 'function', "to_%s" % self.format)
name = getattr(self, "function", "to_%s" % self.format)
if not hasattr(data, name):
raise Exception("Data frame is missing %s property!" % name)

Expand Down Expand Up @@ -60,16 +58,17 @@ class PandasFileRenderer(PandasBaseRenderer):
"""
Renderer for output formats that absolutely must use a file (i.e. Excel)
"""

def init_output(self):
file, filename = mkstemp(suffix='.' + self.format)
file, filename = mkstemp(suffix="." + self.format)
self.filename = filename
os.close(file)

def get_pandas_args(self, data):
return [self.filename]

def get_output(self):
file = open(self.filename, 'rb')
file = open(self.filename, "rb")
result = file.read()
file.close()
os.unlink(self.filename)
Expand All @@ -82,59 +81,66 @@ class PandasHTMLRenderer(TemplateHTMLRenderer, PandasBaseRenderer):

def render(self, data, accepted_media_type=None, renderer_context=None):
table = PandasBaseRenderer.render(
self, data, accepted_media_type, renderer_context,
self,
data,
accepted_media_type,
renderer_context,
)

return TemplateHTMLRenderer.render(
self, {'table': table}, accepted_media_type, renderer_context,
self,
{"table": table},
accepted_media_type,
renderer_context,
)

def get_template_context(self, data, renderer_context):
view = renderer_context['view']
request = renderer_context['request']
view = renderer_context["view"]
request = renderer_context["request"]

data['name'] = view.get_view_name()
data['description'] = view.get_view_description(html=True)
data['url'] = request.path.replace('.html', '')
data["name"] = view.get_view_name()
data["description"] = view.get_view_description(html=True)
data["url"] = request.path.replace(".html", "")
full_path = request.get_full_path()
if '?' in full_path:
data['url_params'] = full_path[full_path.index('?'):]
data['available_formats'] = [
cls.format for cls in view.renderer_classes
if cls.format != 'html'
if "?" in full_path:
data["url_params"] = full_path[full_path.index("?") :]
data["available_formats"] = [
cls.format for cls in view.renderer_classes if cls.format != "html"
]

chart_type = view.pandas_serializer_class.wq_chart_type
if chart_type:
data['wq_chart_type'] = chart_type
data["wq_chart_type"] = chart_type

if hasattr(view, 'get_template_context'):
if hasattr(view, "get_template_context"):
data.update(view.get_template_context(data))

return data

def get_pandas_kwargs(self, data, renderer_context):
return {
'classes': 'ui-table table-stripe',
'na_rep': '',
"classes": "ui-table table-stripe",
"na_rep": "",
}


class PandasCSVRenderer(PandasBaseRenderer):
"""
Renders data frame as CSV
"""

media_type = "text/csv"
format = "csv"

def get_pandas_kwargs(self, data, renderer_context):
return {'encoding': self.charset}
return {"encoding": self.charset}


class PandasTextRenderer(PandasCSVRenderer):
"""
Renders data frame as CSV, but uses text/plain as media type
"""

media_type = "text/plain"
format = "txt"
function = "to_csv"
Expand All @@ -144,52 +150,52 @@ class PandasJSONRenderer(PandasBaseRenderer):
"""
Renders data frame as JSON
"""

media_type = "application/json"
format = "json"

orient_choices = {
'records-index', # Unique to DRP
'split',
'records',
'index',
'columns',
'values',
'table',
"records-index", # Unique to DRP
"split",
"records",
"index",
"columns",
"values",
"table",
}
default_orient = 'records-index'
default_orient = "records-index"

date_format_choices = {'epoch', 'iso'}
default_date_format = 'iso'
date_format_choices = {"epoch", "iso"}
default_date_format = "iso"

def get_pandas_kwargs(self, data, renderer_context):
request = renderer_context['request']
request = renderer_context["request"]

orient = request.GET.get('orient', '')
orient = request.GET.get("orient", "")
if orient not in self.orient_choices:
orient = self.default_orient

date_format = request.GET.get('date_format', '')
date_format = request.GET.get("date_format", "")
if date_format not in self.date_format_choices:
date_format = self.default_date_format

return {
'orient': orient,
'date_format': date_format,
"orient": orient,
"date_format": date_format,
}

def render_dataframe(self, data, name, *args, **kwargs):
if kwargs.get('orient') == 'records-index':
kwargs['orient'] = 'records'
if kwargs.get("orient") == "records-index":
kwargs["orient"] = "records"
data.reset_index(inplace=True)
return super().render_dataframe(
data, name, *args, **kwargs
)
return super().render_dataframe(data, name, *args, **kwargs)


class PandasExcelRenderer(PandasFileRenderer):
"""
Renders data frame as Excel (.xlsx)
"""

media_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" # noqa
format = "xlsx"
function = "to_excel"
Expand All @@ -199,6 +205,7 @@ class PandasOldExcelRenderer(PandasFileRenderer):
"""
Renders data frame as Excel (.xls)
"""

media_type = "application/vnd.ms-excel"
format = "xls"
function = "to_excel"
Expand All @@ -208,21 +215,24 @@ class PandasImageRenderer(PandasBaseRenderer):
"""
Renders dataframe using built-in plot() function
"""

function = "plot"
matplotlib_backend = 'Agg'
matplotlib_backend = "Agg"

def init_output(self):
import matplotlib

matplotlib.use(self.matplotlib_backend)
import matplotlib.pyplot as plt

self.fig = plt.figure()
self.ax = self.fig.add_subplot(111)

def get_pandas_args(self, data):
return []

def get_pandas_kwargs(self, data, renderer_context):
return {'ax': self.ax}
return {"ax": self.ax}

def get_output(self):
data = BytesIO()
Expand Down
Loading

0 comments on commit 7e5c1f8

Please sign in to comment.