from io import ( BytesIO, StringIO, ) import pytest import pandas as pd import pandas._testing as tm pytest.importorskip("tabulate") def test_simple(): buf = StringIO() df = pd.DataFrame([1, 2, 3]) df.to_markdown(buf=buf) result = buf.getvalue() assert ( result == "| | 0 |\n|---:|----:|\n| 0 | 1 |\n| 1 | 2 |\n| 2 | 3 |" ) def test_empty_frame(): buf = StringIO() df = pd.DataFrame({"id": [], "first_name": [], "last_name": []}).set_index("id") df.to_markdown(buf=buf) result = buf.getvalue() assert result == ( "| id | first_name | last_name |\n" "|------|--------------|-------------|" ) def test_other_tablefmt(): buf = StringIO() df = pd.DataFrame([1, 2, 3]) df.to_markdown(buf=buf, tablefmt="jira") result = buf.getvalue() assert result == "|| || 0 ||\n| 0 | 1 |\n| 1 | 2 |\n| 2 | 3 |" def test_other_headers(): buf = StringIO() df = pd.DataFrame([1, 2, 3]) df.to_markdown(buf=buf, headers=["foo", "bar"]) result = buf.getvalue() assert result == ( "| foo | bar |\n|------:|------:|\n| 0 " "| 1 |\n| 1 | 2 |\n| 2 | 3 |" ) def test_series(): buf = StringIO() s = pd.Series([1, 2, 3], name="foo") s.to_markdown(buf=buf) result = buf.getvalue() assert result == ( "| | foo |\n|---:|------:|\n| 0 | 1 " "|\n| 1 | 2 |\n| 2 | 3 |" ) def test_no_buf(): df = pd.DataFrame([1, 2, 3]) result = df.to_markdown() assert ( result == "| | 0 |\n|---:|----:|\n| 0 | 1 |\n| 1 | 2 |\n| 2 | 3 |" ) @pytest.mark.parametrize("index", [True, False]) def test_index(index): # GH 32667 df = pd.DataFrame([1, 2, 3]) result = df.to_markdown(index=index) if index: expected = ( "| | 0 |\n|---:|----:|\n| 0 | 1 |\n| 1 | 2 |\n| 2 | 3 |" ) else: expected = "| 0 |\n|----:|\n| 1 |\n| 2 |\n| 3 |" assert result == expected def test_showindex_disallowed_in_kwargs(): # GH 32667; disallowing showindex in kwargs enforced in 2.0 df = pd.DataFrame([1, 2, 3]) with pytest.raises(ValueError, match="Pass 'index' instead of 'showindex"): df.to_markdown(index=True, showindex=True) def test_markdown_pos_args_deprecatation(): # GH-54229 df = pd.DataFrame({"a": [1, 2, 3]}) msg = ( r"Starting with pandas version 3.0 all arguments of to_markdown except for the " r"argument 'buf' will be keyword-only." ) with tm.assert_produces_warning(FutureWarning, match=msg): buffer = BytesIO() df.to_markdown(buffer, "grid")