From 63605b295b0fa5aeb4485f05d00240a2801372b6 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 16 Sep 2018 01:53:46 +0100 Subject: [PATCH 1/9] refactor indentation --- pandas/io/formats/html.py | 99 +++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 50 deletions(-) diff --git a/pandas/io/formats/html.py b/pandas/io/formats/html.py index a6b03c9c6dd23..cf468f431e140 100644 --- a/pandas/io/formats/html.py +++ b/pandas/io/formats/html.py @@ -47,23 +47,32 @@ def __init__(self, formatter, classes=None, max_rows=None, max_cols=None, border = get_option('display.html.border') self.border = border self.table_id = table_id + self.indent = 0 + + def write(self, s): + if any((s.startswith(i) + for i in ['', ''])): + self.indent += self.indent_delta - def write(self, s, indent=0): rs = pprint_thing(s) - self.elements.append(' ' * indent + rs) + self.elements.append(' ' * self.indent + rs) + + if any((s.startswith(i) + for i in ['', '', ' 0: tags = (tags or "") tags += ('style="min-width: {colspace};"' .format(colspace=self.fmt.col_space)) - return self._write_cell(s, kind='th', indent=indent, tags=tags) + return self._write_cell(s, kind='th', tags=tags) - def write_td(self, s, indent=0, tags=None): - return self._write_cell(s, kind='td', indent=indent, tags=tags) + def write_td(self, s, tags=None): + return self._write_cell(s, kind='td', tags=tags) - def _write_cell(self, s, kind='td', indent=0, tags=None): + def _write_cell(self, s, kind='td', tags=None): if tags is not None: start_tag = '<{kind} {tags}>'.format(kind=kind, tags=tags) else: @@ -77,29 +86,27 @@ def _write_cell(self, s, kind='td', indent=0, tags=None): esc = {} rs = pprint_thing(s, escape_chars=esc).strip() self.write(u'{start}{rs}' - .format(start=start_tag, rs=rs, kind=kind), indent) + .format(start=start_tag, rs=rs, kind=kind)) - def write_tr(self, line, indent=0, indent_delta=4, header=False, + def write_tr(self, line, header=False, align=None, tags=None, nindex_levels=0): if tags is None: tags = {} if align is None: - self.write('', indent) + self.write('') else: self.write('' - .format(align=align), indent) - indent += indent_delta + .format(align=align)) for i, s in enumerate(line): val_tag = tags.get(i, None) if header or (self.bold_rows and i < nindex_levels): - self.write_th(s, indent, tags=val_tag) + self.write_th(s, tags=val_tag) else: - self.write_td(s, indent, tags=val_tag) + self.write_td(s, tags=val_tag) - indent -= indent_delta - self.write('', indent) + self.write('') def write_style(self): # We use the "scoped" attribute here so that the desired @@ -142,7 +149,6 @@ def write_style(self): self.write(template) def write_result(self, buf): - indent = 0 id_section = "" frame = self.frame @@ -175,13 +181,12 @@ def write_result(self, buf): id_section = ' id="{table_id}"'.format(table_id=self.table_id) self.write('' .format(border=self.border, cls=' '.join(_classes), - id_section=id_section), indent) + id_section=id_section)) - indent += self.indent_delta - indent = self._write_header(indent) - indent = self._write_body(indent) + self._write_header() + self._write_body() - self.write('
', indent) + self.write('') if self.should_show_dimensions: by = chr(215) if compat.PY3 else unichr(215) # × self.write(u('

{rows} rows {by} {cols} columns

') @@ -194,12 +199,12 @@ def write_result(self, buf): buffer_put_lines(buf, self.elements) - def _write_header(self, indent): + def _write_header(self): truncate_h = self.fmt.truncate_h row_levels = self.frame.index.nlevels if not self.fmt.header: # write nothing - return indent + return def _column_header(): if self.fmt.index: @@ -221,9 +226,7 @@ def _column_header(): row.extend(self.columns) return row - self.write('', indent) - - indent += self.indent_delta + self.write('') if isinstance(self.columns, ABCMultiIndex): template = 'colspan="{span:d}" halign="left"' @@ -287,7 +290,7 @@ def _column_header(): pprint_thing(name)] if row == [""] and self.fmt.index is False: - row = [] + row = [] tags = {} j = len(row) @@ -299,7 +302,7 @@ def _column_header(): continue j += 1 row.append(v) - self.write_tr(row, indent, self.indent_delta, tags=tags, + self.write_tr(row, tags=tags, header=True) else: col_row = _column_header() @@ -309,7 +312,7 @@ def _column_header(): ins_col = row_levels + self.fmt.tr_col_num col_row.insert(ins_col, '...') - self.write_tr(col_row, indent, self.indent_delta, header=True, + self.write_tr(col_row, header=True, align=align) if all((self.fmt.has_index_names, @@ -321,16 +324,14 @@ def _column_header(): if truncate_h: ins_col = row_levels + self.fmt.tr_col_num row.insert(ins_col, '') - self.write_tr(row, indent, self.indent_delta, header=True) + self.write_tr(row, header=True) - indent -= self.indent_delta - self.write('', indent) + self.write('') - return indent + return - def _write_body(self, indent): - self.write('', indent) - indent += self.indent_delta + def _write_body(self): + self.write('') fmt_values = {} for i in range(min(len(self.columns), self.max_cols)): @@ -339,21 +340,19 @@ def _write_body(self, indent): # write values if self.fmt.index: if isinstance(self.frame.index, ABCMultiIndex): - self._write_hierarchical_rows(fmt_values, indent) + self._write_hierarchical_rows(fmt_values) else: - self._write_regular_rows(fmt_values, indent) + self._write_regular_rows(fmt_values) else: for i in range(min(len(self.frame), self.max_rows)): row = [fmt_values[j][i] for j in range(len(self.columns))] - self.write_tr(row, indent, self.indent_delta, tags=None) + self.write_tr(row, tags=None) - indent -= self.indent_delta - self.write('', indent) - indent -= self.indent_delta + self.write('') - return indent + return - def _write_regular_rows(self, fmt_values, indent): + def _write_regular_rows(self, fmt_values): truncate_h = self.fmt.truncate_h truncate_v = self.fmt.truncate_v @@ -370,7 +369,7 @@ def _write_regular_rows(self, fmt_values, indent): if truncate_v and i == (self.fmt.tr_row_num): str_sep_row = ['...'] * len(row) - self.write_tr(str_sep_row, indent, self.indent_delta, + self.write_tr(str_sep_row, tags=None, nindex_levels=1) row = [] @@ -380,10 +379,10 @@ def _write_regular_rows(self, fmt_values, indent): if truncate_h: dot_col_ix = self.fmt.tr_col_num + 1 row.insert(dot_col_ix, '...') - self.write_tr(row, indent, self.indent_delta, tags=None, + self.write_tr(row, tags=None, nindex_levels=1) - def _write_hierarchical_rows(self, fmt_values, indent): + def _write_hierarchical_rows(self, fmt_values): template = 'rowspan="{span}" valign="top"' truncate_h = self.fmt.truncate_h @@ -471,7 +470,7 @@ def _write_hierarchical_rows(self, fmt_values, indent): if truncate_h: row.insert(row_levels - sparse_offset + self.fmt.tr_col_num, '...') - self.write_tr(row, indent, self.indent_delta, tags=tags, + self.write_tr(row, tags=tags, nindex_levels=len(levels) - sparse_offset) else: for i in range(len(frame)): @@ -482,7 +481,7 @@ def _write_hierarchical_rows(self, fmt_values, indent): row.extend(fmt_values[j][i] for j in range(ncols)) if truncate_h: row.insert(row_levels + self.fmt.tr_col_num, '...') - self.write_tr(row, indent, self.indent_delta, tags=None, + self.write_tr(row, tags=None, nindex_levels=frame.index.nlevels) From d0dd4327853df456094c635868c1f8f4f1dabb00 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 17 Sep 2018 14:39:47 +0100 Subject: [PATCH 2/9] undo indentation changes --- pandas/io/formats/html.py | 99 ++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/pandas/io/formats/html.py b/pandas/io/formats/html.py index cf468f431e140..a6b03c9c6dd23 100644 --- a/pandas/io/formats/html.py +++ b/pandas/io/formats/html.py @@ -47,32 +47,23 @@ def __init__(self, formatter, classes=None, max_rows=None, max_cols=None, border = get_option('display.html.border') self.border = border self.table_id = table_id - self.indent = 0 - - def write(self, s): - if any((s.startswith(i) - for i in ['', ''])): - self.indent += self.indent_delta + def write(self, s, indent=0): rs = pprint_thing(s) - self.elements.append(' ' * self.indent + rs) - - if any((s.startswith(i) - for i in ['', '', ' 0: tags = (tags or "") tags += ('style="min-width: {colspace};"' .format(colspace=self.fmt.col_space)) - return self._write_cell(s, kind='th', tags=tags) + return self._write_cell(s, kind='th', indent=indent, tags=tags) - def write_td(self, s, tags=None): - return self._write_cell(s, kind='td', tags=tags) + def write_td(self, s, indent=0, tags=None): + return self._write_cell(s, kind='td', indent=indent, tags=tags) - def _write_cell(self, s, kind='td', tags=None): + def _write_cell(self, s, kind='td', indent=0, tags=None): if tags is not None: start_tag = '<{kind} {tags}>'.format(kind=kind, tags=tags) else: @@ -86,27 +77,29 @@ def _write_cell(self, s, kind='td', tags=None): esc = {} rs = pprint_thing(s, escape_chars=esc).strip() self.write(u'{start}{rs}' - .format(start=start_tag, rs=rs, kind=kind)) + .format(start=start_tag, rs=rs, kind=kind), indent) - def write_tr(self, line, header=False, + def write_tr(self, line, indent=0, indent_delta=4, header=False, align=None, tags=None, nindex_levels=0): if tags is None: tags = {} if align is None: - self.write('') + self.write('', indent) else: self.write('' - .format(align=align)) + .format(align=align), indent) + indent += indent_delta for i, s in enumerate(line): val_tag = tags.get(i, None) if header or (self.bold_rows and i < nindex_levels): - self.write_th(s, tags=val_tag) + self.write_th(s, indent, tags=val_tag) else: - self.write_td(s, tags=val_tag) + self.write_td(s, indent, tags=val_tag) - self.write('') + indent -= indent_delta + self.write('', indent) def write_style(self): # We use the "scoped" attribute here so that the desired @@ -149,6 +142,7 @@ def write_style(self): self.write(template) def write_result(self, buf): + indent = 0 id_section = "" frame = self.frame @@ -181,12 +175,13 @@ def write_result(self, buf): id_section = ' id="{table_id}"'.format(table_id=self.table_id) self.write('' .format(border=self.border, cls=' '.join(_classes), - id_section=id_section)) + id_section=id_section), indent) - self._write_header() - self._write_body() + indent += self.indent_delta + indent = self._write_header(indent) + indent = self._write_body(indent) - self.write('
') + self.write('', indent) if self.should_show_dimensions: by = chr(215) if compat.PY3 else unichr(215) # × self.write(u('

{rows} rows {by} {cols} columns

') @@ -199,12 +194,12 @@ def write_result(self, buf): buffer_put_lines(buf, self.elements) - def _write_header(self): + def _write_header(self, indent): truncate_h = self.fmt.truncate_h row_levels = self.frame.index.nlevels if not self.fmt.header: # write nothing - return + return indent def _column_header(): if self.fmt.index: @@ -226,7 +221,9 @@ def _column_header(): row.extend(self.columns) return row - self.write('') + self.write('', indent) + + indent += self.indent_delta if isinstance(self.columns, ABCMultiIndex): template = 'colspan="{span:d}" halign="left"' @@ -290,7 +287,7 @@ def _column_header(): pprint_thing(name)] if row == [""] and self.fmt.index is False: - row = [] + row = [] tags = {} j = len(row) @@ -302,7 +299,7 @@ def _column_header(): continue j += 1 row.append(v) - self.write_tr(row, tags=tags, + self.write_tr(row, indent, self.indent_delta, tags=tags, header=True) else: col_row = _column_header() @@ -312,7 +309,7 @@ def _column_header(): ins_col = row_levels + self.fmt.tr_col_num col_row.insert(ins_col, '...') - self.write_tr(col_row, header=True, + self.write_tr(col_row, indent, self.indent_delta, header=True, align=align) if all((self.fmt.has_index_names, @@ -324,14 +321,16 @@ def _column_header(): if truncate_h: ins_col = row_levels + self.fmt.tr_col_num row.insert(ins_col, '') - self.write_tr(row, header=True) + self.write_tr(row, indent, self.indent_delta, header=True) - self.write('') + indent -= self.indent_delta + self.write('', indent) - return + return indent - def _write_body(self): - self.write('') + def _write_body(self, indent): + self.write('', indent) + indent += self.indent_delta fmt_values = {} for i in range(min(len(self.columns), self.max_cols)): @@ -340,19 +339,21 @@ def _write_body(self): # write values if self.fmt.index: if isinstance(self.frame.index, ABCMultiIndex): - self._write_hierarchical_rows(fmt_values) + self._write_hierarchical_rows(fmt_values, indent) else: - self._write_regular_rows(fmt_values) + self._write_regular_rows(fmt_values, indent) else: for i in range(min(len(self.frame), self.max_rows)): row = [fmt_values[j][i] for j in range(len(self.columns))] - self.write_tr(row, tags=None) + self.write_tr(row, indent, self.indent_delta, tags=None) - self.write('') + indent -= self.indent_delta + self.write('', indent) + indent -= self.indent_delta - return + return indent - def _write_regular_rows(self, fmt_values): + def _write_regular_rows(self, fmt_values, indent): truncate_h = self.fmt.truncate_h truncate_v = self.fmt.truncate_v @@ -369,7 +370,7 @@ def _write_regular_rows(self, fmt_values): if truncate_v and i == (self.fmt.tr_row_num): str_sep_row = ['...'] * len(row) - self.write_tr(str_sep_row, + self.write_tr(str_sep_row, indent, self.indent_delta, tags=None, nindex_levels=1) row = [] @@ -379,10 +380,10 @@ def _write_regular_rows(self, fmt_values): if truncate_h: dot_col_ix = self.fmt.tr_col_num + 1 row.insert(dot_col_ix, '...') - self.write_tr(row, tags=None, + self.write_tr(row, indent, self.indent_delta, tags=None, nindex_levels=1) - def _write_hierarchical_rows(self, fmt_values): + def _write_hierarchical_rows(self, fmt_values, indent): template = 'rowspan="{span}" valign="top"' truncate_h = self.fmt.truncate_h @@ -470,7 +471,7 @@ def _write_hierarchical_rows(self, fmt_values): if truncate_h: row.insert(row_levels - sparse_offset + self.fmt.tr_col_num, '...') - self.write_tr(row, tags=tags, + self.write_tr(row, indent, self.indent_delta, tags=tags, nindex_levels=len(levels) - sparse_offset) else: for i in range(len(frame)): @@ -481,7 +482,7 @@ def _write_hierarchical_rows(self, fmt_values): row.extend(fmt_values[j][i] for j in range(ncols)) if truncate_h: row.insert(row_levels + self.fmt.tr_col_num, '...') - self.write_tr(row, tags=None, + self.write_tr(row, indent, self.indent_delta, tags=None, nindex_levels=frame.index.nlevels) From a7db256516e47df48b79d100de7e3cd4f3e8ac0a Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 17 Sep 2018 14:44:49 +0100 Subject: [PATCH 3/9] add tests from gh-22655 (not merged) --- pandas/tests/io/formats/conftest.py | 12 ++ ...index_named_multi_columns_named_multi.html | 34 +++++ ...ex_named_multi_columns_named_standard.html | 29 +++++ ...dex_named_multi_columns_unnamed_multi.html | 34 +++++ ..._named_multi_columns_unnamed_standard.html | 29 +++++ ...ex_named_standard_columns_named_multi.html | 30 +++++ ...named_standard_columns_named_standard.html | 26 ++++ ..._named_standard_columns_unnamed_multi.html | 30 +++++ ...med_standard_columns_unnamed_standard.html | 26 ++++ .../data/index_none_columns_named_multi.html | 25 ++++ .../index_none_columns_named_standard.html | 21 +++ .../formats/data/index_none_columns_none.html | 12 ++ .../index_none_columns_unnamed_multi.html | 21 +++ .../index_none_columns_unnamed_standard.html | 18 +++ ...dex_unnamed_multi_columns_named_multi.html | 28 ++++ ..._unnamed_multi_columns_named_standard.html | 23 ++++ ...x_unnamed_multi_columns_unnamed_multi.html | 28 ++++ ...nnamed_multi_columns_unnamed_standard.html | 23 ++++ ..._unnamed_standard_columns_named_multi.html | 25 ++++ ...named_standard_columns_named_standard.html | 21 +++ ...nnamed_standard_columns_unnamed_multi.html | 25 ++++ ...med_standard_columns_unnamed_standard.html | 21 +++ pandas/tests/io/formats/test_to_html.py | 122 ++++++++++++++++++ 23 files changed, 663 insertions(+) create mode 100644 pandas/tests/io/formats/conftest.py create mode 100644 pandas/tests/io/formats/data/index_named_multi_columns_named_multi.html create mode 100644 pandas/tests/io/formats/data/index_named_multi_columns_named_standard.html create mode 100644 pandas/tests/io/formats/data/index_named_multi_columns_unnamed_multi.html create mode 100644 pandas/tests/io/formats/data/index_named_multi_columns_unnamed_standard.html create mode 100644 pandas/tests/io/formats/data/index_named_standard_columns_named_multi.html create mode 100644 pandas/tests/io/formats/data/index_named_standard_columns_named_standard.html create mode 100644 pandas/tests/io/formats/data/index_named_standard_columns_unnamed_multi.html create mode 100644 pandas/tests/io/formats/data/index_named_standard_columns_unnamed_standard.html create mode 100644 pandas/tests/io/formats/data/index_none_columns_named_multi.html create mode 100644 pandas/tests/io/formats/data/index_none_columns_named_standard.html create mode 100644 pandas/tests/io/formats/data/index_none_columns_none.html create mode 100644 pandas/tests/io/formats/data/index_none_columns_unnamed_multi.html create mode 100644 pandas/tests/io/formats/data/index_none_columns_unnamed_standard.html create mode 100644 pandas/tests/io/formats/data/index_unnamed_multi_columns_named_multi.html create mode 100644 pandas/tests/io/formats/data/index_unnamed_multi_columns_named_standard.html create mode 100644 pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_multi.html create mode 100644 pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_standard.html create mode 100644 pandas/tests/io/formats/data/index_unnamed_standard_columns_named_multi.html create mode 100644 pandas/tests/io/formats/data/index_unnamed_standard_columns_named_standard.html create mode 100644 pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_multi.html create mode 100644 pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_standard.html diff --git a/pandas/tests/io/formats/conftest.py b/pandas/tests/io/formats/conftest.py new file mode 100644 index 0000000000000..79afd2e95c08f --- /dev/null +++ b/pandas/tests/io/formats/conftest.py @@ -0,0 +1,12 @@ +import pytest + + +@pytest.fixture +def read_file(datapath): + """fixture factory to read text files from tests/io/formats/data""" + def _read_file(filename): + filepath = datapath('io', 'formats', 'data', filename) + with open(filepath) as f: + contents = f.read() + return contents + return _read_file diff --git a/pandas/tests/io/formats/data/index_named_multi_columns_named_multi.html b/pandas/tests/io/formats/data/index_named_multi_columns_named_multi.html new file mode 100644 index 0000000000000..817b54d77f8b1 --- /dev/null +++ b/pandas/tests/io/formats/data/index_named_multi_columns_named_multi.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columns.name.0a
columns.name.1bc
index.name.0index.name.1
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_named_multi_columns_named_standard.html b/pandas/tests/io/formats/data/index_named_multi_columns_named_standard.html new file mode 100644 index 0000000000000..e85965f14075d --- /dev/null +++ b/pandas/tests/io/formats/data/index_named_multi_columns_named_standard.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columns.name01
index.name.0index.name.1
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_named_multi_columns_unnamed_multi.html b/pandas/tests/io/formats/data/index_named_multi_columns_unnamed_multi.html new file mode 100644 index 0000000000000..7af63e893b12e --- /dev/null +++ b/pandas/tests/io/formats/data/index_named_multi_columns_unnamed_multi.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a
bc
index.name.0index.name.1
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_named_multi_columns_unnamed_standard.html b/pandas/tests/io/formats/data/index_named_multi_columns_unnamed_standard.html new file mode 100644 index 0000000000000..2f7837864bf88 --- /dev/null +++ b/pandas/tests/io/formats/data/index_named_multi_columns_unnamed_standard.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
01
index.name.0index.name.1
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_named_standard_columns_named_multi.html b/pandas/tests/io/formats/data/index_named_standard_columns_named_multi.html new file mode 100644 index 0000000000000..ca9b8bd834a9c --- /dev/null +++ b/pandas/tests/io/formats/data/index_named_standard_columns_named_multi.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columns.name.0a
columns.name.1bc
index.name
000
100
diff --git a/pandas/tests/io/formats/data/index_named_standard_columns_named_standard.html b/pandas/tests/io/formats/data/index_named_standard_columns_named_standard.html new file mode 100644 index 0000000000000..6478c99ad85e9 --- /dev/null +++ b/pandas/tests/io/formats/data/index_named_standard_columns_named_standard.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
columns.name01
index.name
000
100
diff --git a/pandas/tests/io/formats/data/index_named_standard_columns_unnamed_multi.html b/pandas/tests/io/formats/data/index_named_standard_columns_unnamed_multi.html new file mode 100644 index 0000000000000..d7660872177dc --- /dev/null +++ b/pandas/tests/io/formats/data/index_named_standard_columns_unnamed_multi.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a
bc
index.name
000
100
diff --git a/pandas/tests/io/formats/data/index_named_standard_columns_unnamed_standard.html b/pandas/tests/io/formats/data/index_named_standard_columns_unnamed_standard.html new file mode 100644 index 0000000000000..4810f66018d3b --- /dev/null +++ b/pandas/tests/io/formats/data/index_named_standard_columns_unnamed_standard.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
01
index.name
000
100
diff --git a/pandas/tests/io/formats/data/index_none_columns_named_multi.html b/pandas/tests/io/formats/data/index_none_columns_named_multi.html new file mode 100644 index 0000000000000..cb19a95bf5d18 --- /dev/null +++ b/pandas/tests/io/formats/data/index_none_columns_named_multi.html @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
columns.name.0a
columns.name.1bc
00
00
diff --git a/pandas/tests/io/formats/data/index_none_columns_named_standard.html b/pandas/tests/io/formats/data/index_none_columns_named_standard.html new file mode 100644 index 0000000000000..cff4d2372acec --- /dev/null +++ b/pandas/tests/io/formats/data/index_none_columns_named_standard.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + +
columns.name01
00
00
diff --git a/pandas/tests/io/formats/data/index_none_columns_none.html b/pandas/tests/io/formats/data/index_none_columns_none.html new file mode 100644 index 0000000000000..44899858d9519 --- /dev/null +++ b/pandas/tests/io/formats/data/index_none_columns_none.html @@ -0,0 +1,12 @@ + + + + + + + + + + + +
00
00
diff --git a/pandas/tests/io/formats/data/index_none_columns_unnamed_multi.html b/pandas/tests/io/formats/data/index_none_columns_unnamed_multi.html new file mode 100644 index 0000000000000..b21a618328b1b --- /dev/null +++ b/pandas/tests/io/formats/data/index_none_columns_unnamed_multi.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + +
a
bc
00
00
diff --git a/pandas/tests/io/formats/data/index_none_columns_unnamed_standard.html b/pandas/tests/io/formats/data/index_none_columns_unnamed_standard.html new file mode 100644 index 0000000000000..1249fa5605099 --- /dev/null +++ b/pandas/tests/io/formats/data/index_none_columns_unnamed_standard.html @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + +
01
00
00
diff --git a/pandas/tests/io/formats/data/index_unnamed_multi_columns_named_multi.html b/pandas/tests/io/formats/data/index_unnamed_multi_columns_named_multi.html new file mode 100644 index 0000000000000..95c38c9c8fd28 --- /dev/null +++ b/pandas/tests/io/formats/data/index_unnamed_multi_columns_named_multi.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
columns.name.0a
columns.name.1bc
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_unnamed_multi_columns_named_standard.html b/pandas/tests/io/formats/data/index_unnamed_multi_columns_named_standard.html new file mode 100644 index 0000000000000..9583a21f55f01 --- /dev/null +++ b/pandas/tests/io/formats/data/index_unnamed_multi_columns_named_standard.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + +
columns.name01
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_multi.html b/pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_multi.html new file mode 100644 index 0000000000000..f620259037b60 --- /dev/null +++ b/pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_multi.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a
bc
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_standard.html b/pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_standard.html new file mode 100644 index 0000000000000..2ca18c288437b --- /dev/null +++ b/pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_standard.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + +
01
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_unnamed_standard_columns_named_multi.html b/pandas/tests/io/formats/data/index_unnamed_standard_columns_named_multi.html new file mode 100644 index 0000000000000..ed3360f898afd --- /dev/null +++ b/pandas/tests/io/formats/data/index_unnamed_standard_columns_named_multi.html @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
columns.name.0a
columns.name.1bc
000
100
diff --git a/pandas/tests/io/formats/data/index_unnamed_standard_columns_named_standard.html b/pandas/tests/io/formats/data/index_unnamed_standard_columns_named_standard.html new file mode 100644 index 0000000000000..54da03858a9a4 --- /dev/null +++ b/pandas/tests/io/formats/data/index_unnamed_standard_columns_named_standard.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + +
columns.name01
000
100
diff --git a/pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_multi.html b/pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_multi.html new file mode 100644 index 0000000000000..b57fafbe0ca40 --- /dev/null +++ b/pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_multi.html @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
a
bc
000
100
diff --git a/pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_standard.html b/pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_standard.html new file mode 100644 index 0000000000000..235ca61a9e63d --- /dev/null +++ b/pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_standard.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + +
01
000
100
diff --git a/pandas/tests/io/formats/test_to_html.py b/pandas/tests/io/formats/test_to_html.py index 845fb1ee3dc3a..1943861bdd12a 100644 --- a/pandas/tests/io/formats/test_to_html.py +++ b/pandas/tests/io/formats/test_to_html.py @@ -12,6 +12,7 @@ from pandas.compat import u, lrange, StringIO from pandas.util import testing as tm import pandas.io.formats.format as fmt +import pandas.core.common as com div_style = '' try: @@ -22,6 +23,113 @@ pass +def _has_names(index): + if index.nlevels > 1: + return com._any_not_none(*index.names) + else: + return index.name is not None + + +def _index_init_params(index): + return (index.nlevels > 1, + _has_names(index)) + + +@pytest.fixture +def expected_html(read_file): + def _expected_html(name): + filename = '.'.join([name, 'html']) + html = read_file(filename) + return html.rstrip() + return _expected_html + + +@pytest.fixture(params=[True, False], ids=['index_true', 'index_false']) +def index(request): + # to_html() parameter values for index + # whether to print index (row) labels, default True + return request.param + + +@pytest.fixture(params=[True, False], ids=['header_true', 'header_false']) +def header(request): + # to_html() parameter values for header + # whether to print column labels, default True + return request.param + + +@pytest.fixture(params=[True, False], ids=['index_names_true', + 'index_names_false']) +def index_names(request): + # to_html() parameter values for index_names + # prints the names of the indexes, default True + return request.param + + +@pytest.fixture(params=[ + Index([0, 1]), + Index([0, 1], name='index.name'), + MultiIndex.from_product([['a'], ['b', 'c']]), + MultiIndex.from_product([['a'], ['b', 'c']], names=[ + 'index.name.0', 'index.name.1']) +], + ids=['index_unnamed_standard', + 'index_named_standard', + 'index_unnamed_multi', + 'index_named_multi']) +def idx_type(request): + # standard and multiIndex index, named and unnamed + # used for basic table alignment tests + return request.param + + +@pytest.fixture( + params=[ + Index([0, 1]), + Index([0, 1], name='columns.name'), + MultiIndex.from_product([['a'], ['b', 'c']]), + MultiIndex.from_product([['a'], ['b', 'c']], names=[ + 'columns.name.0', 'columns.name.1']) + ], + ids=['columns_unnamed_standard', + 'columns_named_standard', + 'columns_unnamed_multi', + 'columns_named_multi']) +def col_idx_type(request): + # standard and multiIndex columns index, named and unnamed + # used for basic table alignment tests + return request.param + + +@pytest.fixture +def expected_output(expected_html): + def _expected_output(idx_type, col_idx_type, + index=True, header=True, index_names=True): + + def _expected_output_name(idx_type, index, index_names): + is_multi, is_named = _index_init_params(idx_type) + if index is False: + return 'none' + + idx_type_ids = { + (False, False): 'unnamed_standard', + (True, False): 'named_standard', + (False, True): 'unnamed_multi', + (True, True): 'named_multi'} + + return idx_type_ids[(is_named and index_names, is_multi)] + + return expected_html( + '_'.join([ + 'index', + _expected_output_name(idx_type, index, index_names), + 'columns', + _expected_output_name(col_idx_type, header, index_names) + ]) + ) + return _expected_output + + class TestToHTML(object): def test_to_html_with_col_space(self): @@ -1905,6 +2013,20 @@ def test_to_html_multiindex_max_cols(self): """) assert result == expected + @pytest.mark.parametrize('header', [True]) + @pytest.mark.parametrize('index', [True]) + @pytest.mark.parametrize('index_names', [True]) + def test_to_html_index_names(self, expected_output, + idx_type, col_idx_type, index, header, + index_names): + df = DataFrame(np.zeros((2, 2), dtype=int), + index=idx_type, columns=col_idx_type) + result = df.to_html(index=index, header=header, + index_names=index_names) + assert result == expected_output(idx_type, col_idx_type, + index=index, header=header, + index_names=index_names) + def test_to_html_notebook_has_style(self): df = pd.DataFrame({"A": [1, 2, 3]}) result = df.to_html(notebook=True) From 98104a733db0a83e7ca4a7b81a8167ba347c05e3 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 17 Sep 2018 14:52:58 +0100 Subject: [PATCH 4/9] remove unreachable code block --- pandas/io/formats/html.py | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/pandas/io/formats/html.py b/pandas/io/formats/html.py index a6b03c9c6dd23..8c11a59470659 100644 --- a/pandas/io/formats/html.py +++ b/pandas/io/formats/html.py @@ -207,18 +207,9 @@ def _column_header(): else: row = [] - if isinstance(self.columns, ABCMultiIndex): - if self.fmt.has_column_names and self.fmt.index: - row.append(single_column_table(self.columns.names)) - else: - row.append('') - style = "text-align: {just};".format(just=self.fmt.justify) - row.extend([single_column_table(c, self.fmt.justify, style) - for c in self.columns]) - else: - if self.fmt.index: - row.append(self.columns.name or '') - row.extend(self.columns) + if self.fmt.index: + row.append(self.columns.name or '') + row.extend(self.columns) return row self.write('', indent) From f8a6f8ea9659ed3df4752de3c4e3c5c258dc6cbb Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 17 Sep 2018 14:53:56 +0100 Subject: [PATCH 5/9] remove unused functions --- pandas/io/formats/html.py | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/pandas/io/formats/html.py b/pandas/io/formats/html.py index 8c11a59470659..56356f8951aa1 100644 --- a/pandas/io/formats/html.py +++ b/pandas/io/formats/html.py @@ -475,24 +475,3 @@ def _write_hierarchical_rows(self, fmt_values, indent): row.insert(row_levels + self.fmt.tr_col_num, '...') self.write_tr(row, indent, self.indent_delta, tags=None, nindex_levels=frame.index.nlevels) - - -def single_column_table(column, align=None, style=None): - table = '{i!s}'.format(i=i)) - table += '' - return table - - -def single_row_table(row): # pragma: no cover - table = '' - for i in row: - table += (''.format(i=i)) - table += '
{i!s}
' - return table From 61c3c19267c0df753f992f51ec9764bf5b283284 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 17 Sep 2018 14:55:59 +0100 Subject: [PATCH 6/9] refactor _column_header() --- pandas/io/formats/html.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pandas/io/formats/html.py b/pandas/io/formats/html.py index 56356f8951aa1..28c9b9eecfe13 100644 --- a/pandas/io/formats/html.py +++ b/pandas/io/formats/html.py @@ -204,11 +204,9 @@ def _write_header(self, indent): def _column_header(): if self.fmt.index: row = [''] * (self.frame.index.nlevels - 1) + row.append(self.columns.name or '') else: row = [] - - if self.fmt.index: - row.append(self.columns.name or '') row.extend(self.columns) return row From cb394f2059fd818561e9ac9e8c9e67eafbfb90d7 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 17 Sep 2018 15:03:05 +0100 Subject: [PATCH 7/9] inline code from _column_header() --- pandas/io/formats/html.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/pandas/io/formats/html.py b/pandas/io/formats/html.py index 28c9b9eecfe13..c64dfca21ea71 100644 --- a/pandas/io/formats/html.py +++ b/pandas/io/formats/html.py @@ -201,15 +201,6 @@ def _write_header(self, indent): # write nothing return indent - def _column_header(): - if self.fmt.index: - row = [''] * (self.frame.index.nlevels - 1) - row.append(self.columns.name or '') - else: - row = [] - row.extend(self.columns) - return row - self.write('', indent) indent += self.indent_delta @@ -291,14 +282,19 @@ def _column_header(): self.write_tr(row, indent, self.indent_delta, tags=tags, header=True) else: - col_row = _column_header() + if self.fmt.index: + row = [''] * (self.frame.index.nlevels - 1) + row.append(self.columns.name or '') + else: + row = [] + row.extend(self.columns) align = self.fmt.justify if truncate_h: ins_col = row_levels + self.fmt.tr_col_num - col_row.insert(ins_col, '...') + row.insert(ins_col, '...') - self.write_tr(col_row, indent, self.indent_delta, header=True, + self.write_tr(row, indent, self.indent_delta, header=True, align=align) if all((self.fmt.has_index_names, From a6ce459090d8f5ab7e97de997f55b4150adc2337 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 17 Sep 2018 15:05:19 +0100 Subject: [PATCH 8/9] change default indent_delta for write_tr() --- pandas/io/formats/html.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/io/formats/html.py b/pandas/io/formats/html.py index c64dfca21ea71..2d6339e5e5962 100644 --- a/pandas/io/formats/html.py +++ b/pandas/io/formats/html.py @@ -79,7 +79,7 @@ def _write_cell(self, s, kind='td', indent=0, tags=None): self.write(u'{start}{rs}' .format(start=start_tag, rs=rs, kind=kind), indent) - def write_tr(self, line, indent=0, indent_delta=4, header=False, + def write_tr(self, line, indent=0, indent_delta=0, header=False, align=None, tags=None, nindex_levels=0): if tags is None: tags = {} From b65bb539c30a59bdf764dcb2b663dd36bf57f878 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Wed, 19 Sep 2018 23:18:34 +0100 Subject: [PATCH 9/9] remove unapproved tests --- pandas/tests/io/formats/conftest.py | 12 -- ...index_named_multi_columns_named_multi.html | 34 ----- ...ex_named_multi_columns_named_standard.html | 29 ----- ...dex_named_multi_columns_unnamed_multi.html | 34 ----- ..._named_multi_columns_unnamed_standard.html | 29 ----- ...ex_named_standard_columns_named_multi.html | 30 ----- ...named_standard_columns_named_standard.html | 26 ---- ..._named_standard_columns_unnamed_multi.html | 30 ----- ...med_standard_columns_unnamed_standard.html | 26 ---- .../data/index_none_columns_named_multi.html | 25 ---- .../index_none_columns_named_standard.html | 21 --- .../formats/data/index_none_columns_none.html | 12 -- .../index_none_columns_unnamed_multi.html | 21 --- .../index_none_columns_unnamed_standard.html | 18 --- ...dex_unnamed_multi_columns_named_multi.html | 28 ---- ..._unnamed_multi_columns_named_standard.html | 23 ---- ...x_unnamed_multi_columns_unnamed_multi.html | 28 ---- ...nnamed_multi_columns_unnamed_standard.html | 23 ---- ..._unnamed_standard_columns_named_multi.html | 25 ---- ...named_standard_columns_named_standard.html | 21 --- ...nnamed_standard_columns_unnamed_multi.html | 25 ---- ...med_standard_columns_unnamed_standard.html | 21 --- pandas/tests/io/formats/test_to_html.py | 122 ------------------ 23 files changed, 663 deletions(-) delete mode 100644 pandas/tests/io/formats/conftest.py delete mode 100644 pandas/tests/io/formats/data/index_named_multi_columns_named_multi.html delete mode 100644 pandas/tests/io/formats/data/index_named_multi_columns_named_standard.html delete mode 100644 pandas/tests/io/formats/data/index_named_multi_columns_unnamed_multi.html delete mode 100644 pandas/tests/io/formats/data/index_named_multi_columns_unnamed_standard.html delete mode 100644 pandas/tests/io/formats/data/index_named_standard_columns_named_multi.html delete mode 100644 pandas/tests/io/formats/data/index_named_standard_columns_named_standard.html delete mode 100644 pandas/tests/io/formats/data/index_named_standard_columns_unnamed_multi.html delete mode 100644 pandas/tests/io/formats/data/index_named_standard_columns_unnamed_standard.html delete mode 100644 pandas/tests/io/formats/data/index_none_columns_named_multi.html delete mode 100644 pandas/tests/io/formats/data/index_none_columns_named_standard.html delete mode 100644 pandas/tests/io/formats/data/index_none_columns_none.html delete mode 100644 pandas/tests/io/formats/data/index_none_columns_unnamed_multi.html delete mode 100644 pandas/tests/io/formats/data/index_none_columns_unnamed_standard.html delete mode 100644 pandas/tests/io/formats/data/index_unnamed_multi_columns_named_multi.html delete mode 100644 pandas/tests/io/formats/data/index_unnamed_multi_columns_named_standard.html delete mode 100644 pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_multi.html delete mode 100644 pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_standard.html delete mode 100644 pandas/tests/io/formats/data/index_unnamed_standard_columns_named_multi.html delete mode 100644 pandas/tests/io/formats/data/index_unnamed_standard_columns_named_standard.html delete mode 100644 pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_multi.html delete mode 100644 pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_standard.html diff --git a/pandas/tests/io/formats/conftest.py b/pandas/tests/io/formats/conftest.py deleted file mode 100644 index 79afd2e95c08f..0000000000000 --- a/pandas/tests/io/formats/conftest.py +++ /dev/null @@ -1,12 +0,0 @@ -import pytest - - -@pytest.fixture -def read_file(datapath): - """fixture factory to read text files from tests/io/formats/data""" - def _read_file(filename): - filepath = datapath('io', 'formats', 'data', filename) - with open(filepath) as f: - contents = f.read() - return contents - return _read_file diff --git a/pandas/tests/io/formats/data/index_named_multi_columns_named_multi.html b/pandas/tests/io/formats/data/index_named_multi_columns_named_multi.html deleted file mode 100644 index 817b54d77f8b1..0000000000000 --- a/pandas/tests/io/formats/data/index_named_multi_columns_named_multi.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columns.name.0a
columns.name.1bc
index.name.0index.name.1
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_named_multi_columns_named_standard.html b/pandas/tests/io/formats/data/index_named_multi_columns_named_standard.html deleted file mode 100644 index e85965f14075d..0000000000000 --- a/pandas/tests/io/formats/data/index_named_multi_columns_named_standard.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columns.name01
index.name.0index.name.1
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_named_multi_columns_unnamed_multi.html b/pandas/tests/io/formats/data/index_named_multi_columns_unnamed_multi.html deleted file mode 100644 index 7af63e893b12e..0000000000000 --- a/pandas/tests/io/formats/data/index_named_multi_columns_unnamed_multi.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
a
bc
index.name.0index.name.1
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_named_multi_columns_unnamed_standard.html b/pandas/tests/io/formats/data/index_named_multi_columns_unnamed_standard.html deleted file mode 100644 index 2f7837864bf88..0000000000000 --- a/pandas/tests/io/formats/data/index_named_multi_columns_unnamed_standard.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
01
index.name.0index.name.1
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_named_standard_columns_named_multi.html b/pandas/tests/io/formats/data/index_named_standard_columns_named_multi.html deleted file mode 100644 index ca9b8bd834a9c..0000000000000 --- a/pandas/tests/io/formats/data/index_named_standard_columns_named_multi.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columns.name.0a
columns.name.1bc
index.name
000
100
diff --git a/pandas/tests/io/formats/data/index_named_standard_columns_named_standard.html b/pandas/tests/io/formats/data/index_named_standard_columns_named_standard.html deleted file mode 100644 index 6478c99ad85e9..0000000000000 --- a/pandas/tests/io/formats/data/index_named_standard_columns_named_standard.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -
columns.name01
index.name
000
100
diff --git a/pandas/tests/io/formats/data/index_named_standard_columns_unnamed_multi.html b/pandas/tests/io/formats/data/index_named_standard_columns_unnamed_multi.html deleted file mode 100644 index d7660872177dc..0000000000000 --- a/pandas/tests/io/formats/data/index_named_standard_columns_unnamed_multi.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
a
bc
index.name
000
100
diff --git a/pandas/tests/io/formats/data/index_named_standard_columns_unnamed_standard.html b/pandas/tests/io/formats/data/index_named_standard_columns_unnamed_standard.html deleted file mode 100644 index 4810f66018d3b..0000000000000 --- a/pandas/tests/io/formats/data/index_named_standard_columns_unnamed_standard.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -
01
index.name
000
100
diff --git a/pandas/tests/io/formats/data/index_none_columns_named_multi.html b/pandas/tests/io/formats/data/index_none_columns_named_multi.html deleted file mode 100644 index cb19a95bf5d18..0000000000000 --- a/pandas/tests/io/formats/data/index_none_columns_named_multi.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -
columns.name.0a
columns.name.1bc
00
00
diff --git a/pandas/tests/io/formats/data/index_none_columns_named_standard.html b/pandas/tests/io/formats/data/index_none_columns_named_standard.html deleted file mode 100644 index cff4d2372acec..0000000000000 --- a/pandas/tests/io/formats/data/index_none_columns_named_standard.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -
columns.name01
00
00
diff --git a/pandas/tests/io/formats/data/index_none_columns_none.html b/pandas/tests/io/formats/data/index_none_columns_none.html deleted file mode 100644 index 44899858d9519..0000000000000 --- a/pandas/tests/io/formats/data/index_none_columns_none.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - -
00
00
diff --git a/pandas/tests/io/formats/data/index_none_columns_unnamed_multi.html b/pandas/tests/io/formats/data/index_none_columns_unnamed_multi.html deleted file mode 100644 index b21a618328b1b..0000000000000 --- a/pandas/tests/io/formats/data/index_none_columns_unnamed_multi.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -
a
bc
00
00
diff --git a/pandas/tests/io/formats/data/index_none_columns_unnamed_standard.html b/pandas/tests/io/formats/data/index_none_columns_unnamed_standard.html deleted file mode 100644 index 1249fa5605099..0000000000000 --- a/pandas/tests/io/formats/data/index_none_columns_unnamed_standard.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - -
01
00
00
diff --git a/pandas/tests/io/formats/data/index_unnamed_multi_columns_named_multi.html b/pandas/tests/io/formats/data/index_unnamed_multi_columns_named_multi.html deleted file mode 100644 index 95c38c9c8fd28..0000000000000 --- a/pandas/tests/io/formats/data/index_unnamed_multi_columns_named_multi.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columns.name.0a
columns.name.1bc
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_unnamed_multi_columns_named_standard.html b/pandas/tests/io/formats/data/index_unnamed_multi_columns_named_standard.html deleted file mode 100644 index 9583a21f55f01..0000000000000 --- a/pandas/tests/io/formats/data/index_unnamed_multi_columns_named_standard.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -
columns.name01
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_multi.html b/pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_multi.html deleted file mode 100644 index f620259037b60..0000000000000 --- a/pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_multi.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - -
a
bc
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_standard.html b/pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_standard.html deleted file mode 100644 index 2ca18c288437b..0000000000000 --- a/pandas/tests/io/formats/data/index_unnamed_multi_columns_unnamed_standard.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -
01
ab00
c00
diff --git a/pandas/tests/io/formats/data/index_unnamed_standard_columns_named_multi.html b/pandas/tests/io/formats/data/index_unnamed_standard_columns_named_multi.html deleted file mode 100644 index ed3360f898afd..0000000000000 --- a/pandas/tests/io/formats/data/index_unnamed_standard_columns_named_multi.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -
columns.name.0a
columns.name.1bc
000
100
diff --git a/pandas/tests/io/formats/data/index_unnamed_standard_columns_named_standard.html b/pandas/tests/io/formats/data/index_unnamed_standard_columns_named_standard.html deleted file mode 100644 index 54da03858a9a4..0000000000000 --- a/pandas/tests/io/formats/data/index_unnamed_standard_columns_named_standard.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -
columns.name01
000
100
diff --git a/pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_multi.html b/pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_multi.html deleted file mode 100644 index b57fafbe0ca40..0000000000000 --- a/pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_multi.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -
a
bc
000
100
diff --git a/pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_standard.html b/pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_standard.html deleted file mode 100644 index 235ca61a9e63d..0000000000000 --- a/pandas/tests/io/formats/data/index_unnamed_standard_columns_unnamed_standard.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -
01
000
100
diff --git a/pandas/tests/io/formats/test_to_html.py b/pandas/tests/io/formats/test_to_html.py index 1943861bdd12a..845fb1ee3dc3a 100644 --- a/pandas/tests/io/formats/test_to_html.py +++ b/pandas/tests/io/formats/test_to_html.py @@ -12,7 +12,6 @@ from pandas.compat import u, lrange, StringIO from pandas.util import testing as tm import pandas.io.formats.format as fmt -import pandas.core.common as com div_style = '' try: @@ -23,113 +22,6 @@ pass -def _has_names(index): - if index.nlevels > 1: - return com._any_not_none(*index.names) - else: - return index.name is not None - - -def _index_init_params(index): - return (index.nlevels > 1, - _has_names(index)) - - -@pytest.fixture -def expected_html(read_file): - def _expected_html(name): - filename = '.'.join([name, 'html']) - html = read_file(filename) - return html.rstrip() - return _expected_html - - -@pytest.fixture(params=[True, False], ids=['index_true', 'index_false']) -def index(request): - # to_html() parameter values for index - # whether to print index (row) labels, default True - return request.param - - -@pytest.fixture(params=[True, False], ids=['header_true', 'header_false']) -def header(request): - # to_html() parameter values for header - # whether to print column labels, default True - return request.param - - -@pytest.fixture(params=[True, False], ids=['index_names_true', - 'index_names_false']) -def index_names(request): - # to_html() parameter values for index_names - # prints the names of the indexes, default True - return request.param - - -@pytest.fixture(params=[ - Index([0, 1]), - Index([0, 1], name='index.name'), - MultiIndex.from_product([['a'], ['b', 'c']]), - MultiIndex.from_product([['a'], ['b', 'c']], names=[ - 'index.name.0', 'index.name.1']) -], - ids=['index_unnamed_standard', - 'index_named_standard', - 'index_unnamed_multi', - 'index_named_multi']) -def idx_type(request): - # standard and multiIndex index, named and unnamed - # used for basic table alignment tests - return request.param - - -@pytest.fixture( - params=[ - Index([0, 1]), - Index([0, 1], name='columns.name'), - MultiIndex.from_product([['a'], ['b', 'c']]), - MultiIndex.from_product([['a'], ['b', 'c']], names=[ - 'columns.name.0', 'columns.name.1']) - ], - ids=['columns_unnamed_standard', - 'columns_named_standard', - 'columns_unnamed_multi', - 'columns_named_multi']) -def col_idx_type(request): - # standard and multiIndex columns index, named and unnamed - # used for basic table alignment tests - return request.param - - -@pytest.fixture -def expected_output(expected_html): - def _expected_output(idx_type, col_idx_type, - index=True, header=True, index_names=True): - - def _expected_output_name(idx_type, index, index_names): - is_multi, is_named = _index_init_params(idx_type) - if index is False: - return 'none' - - idx_type_ids = { - (False, False): 'unnamed_standard', - (True, False): 'named_standard', - (False, True): 'unnamed_multi', - (True, True): 'named_multi'} - - return idx_type_ids[(is_named and index_names, is_multi)] - - return expected_html( - '_'.join([ - 'index', - _expected_output_name(idx_type, index, index_names), - 'columns', - _expected_output_name(col_idx_type, header, index_names) - ]) - ) - return _expected_output - - class TestToHTML(object): def test_to_html_with_col_space(self): @@ -2013,20 +1905,6 @@ def test_to_html_multiindex_max_cols(self): """) assert result == expected - @pytest.mark.parametrize('header', [True]) - @pytest.mark.parametrize('index', [True]) - @pytest.mark.parametrize('index_names', [True]) - def test_to_html_index_names(self, expected_output, - idx_type, col_idx_type, index, header, - index_names): - df = DataFrame(np.zeros((2, 2), dtype=int), - index=idx_type, columns=col_idx_type) - result = df.to_html(index=index, header=header, - index_names=index_names) - assert result == expected_output(idx_type, col_idx_type, - index=index, header=header, - index_names=index_names) - def test_to_html_notebook_has_style(self): df = pd.DataFrame({"A": [1, 2, 3]}) result = df.to_html(notebook=True)