Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✅ Add more tests for the behaviour of rich_markup_mode #964

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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
186 changes: 186 additions & 0 deletions tests/test_rich_markup_mode.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from typing import List

import pytest
import typer
import typer.completion
from typer.testing import CliRunner
Expand Down Expand Up @@ -38,3 +41,186 @@ def main(arg: str):

result = runner.invoke(app, ["--help"])
assert any(c in result.stdout for c in rounded)


@pytest.mark.parametrize(
"mode,lines",
[
("markdown", ["First line", "Line 1 Line 2 Line 3", ""]),
("rich", ["First line", "Line 1", "", "Line 2", "", "Line 3", ""]),
("none", ["First line", "Line 1", "Line 2", "Line 3", ""]),
],
)
def test_markup_mode_newline_pr815(mode: str, lines: List[str]):
Comment on lines +46 to +54
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here, the question is mostly about the newlines: should there be one after "First line" or not?

Further, should the markdown parser output "Line 1 Line 2 Line 3" as one string, or split them into multiple strings, similar to the current behaviour for the option none?

app = typer.Typer(rich_markup_mode=mode)

@app.command()
def main(arg: str):
"""First line

Line 1

Line 2

Line 3
"""
print(f"Hello {arg}")

assert app.rich_markup_mode == mode

result = runner.invoke(app, ["World"])
assert "Hello World" in result.stdout

result = runner.invoke(app, ["--help"])
result_lines = [line.strip() for line in result.stdout.split("\n")]
assert any(c in result.stdout for c in rounded)
help_start = result_lines.index("First line")
arg_start = [i for i, row in enumerate(result_lines) if "Arguments" in row][0]
assert help_start != -1
assert result_lines[help_start:arg_start] == lines


@pytest.mark.parametrize(
"mode,lines",
[
(
"markdown",
[
"This header is just pretty long really",
"Line 1 of a very extremely super long line And a short line 2",
"",
],
),
(
"rich",
[
"This header is just pretty long really",
"Line 1 of a very",
"extremely super long",
"line",
"",
"And a short line 2",
"",
],
),
(
"none",
[
"This header is just pretty long really",
"Line 1 of a very extremely super long line",
"And a short line 2",
"",
],
),
],
)
def test_markup_mode_newline_issue447(mode: str, lines: List[str]):
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here, the splitting of the strings is different for all 3 options, with rich keep each input line as such, markdown merging everything that is not header, and none keeping all double newlines as separators.

app = typer.Typer(rich_markup_mode=mode)

@app.command()
def main(arg: str):
"""This header
is just
pretty long
really

Line 1 of a very
extremely super long
line

And a short line 2
"""
print(f"Hello {arg}")

assert app.rich_markup_mode == mode

result = runner.invoke(app, ["World"])
assert "Hello World" in result.stdout

result = runner.invoke(app, ["--help"])
result_lines = [line.strip() for line in result.stdout.split("\n")]
assert any(c in result.stdout for c in rounded)
help_start = [i for i, row in enumerate(result_lines) if "This header" in row][0]
arg_start = [i for i, row in enumerate(result_lines) if "Arguments" in row][0]
assert help_start != -1
assert result_lines[help_start:arg_start] == lines


@pytest.mark.parametrize(
"mode,lines",
[
pytest.param(
"markdown",
["First line", "", "• 1", "• 2", "• 3", ""],
marks=pytest.mark.xfail(),
),
Comment on lines +152 to +156
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test currently fails on master, with the output being

['First line', '', '• 1 - 2 - 3', '']

-> this happens mostly because the newlines are not parsed correctly, after which the bullet points aren't recognized correctly. PR #815 attempts to fix this.

("rich", ["First line", "- 1", "- 2", "- 3", ""]),
("none", ["First line", "- 1 - 2 - 3", ""]),
],
)
def test_markup_mode_bullets(mode: str, lines: List[str]):
app = typer.Typer(rich_markup_mode=mode)

@app.command()
def main(arg: str):
"""First line

- 1
- 2
- 3
"""
print(f"Hello {arg}")

assert app.rich_markup_mode == mode

result = runner.invoke(app, ["World"])
assert "Hello World" in result.stdout

result = runner.invoke(app, ["--help"])
result_lines = [line.strip() for line in result.stdout.split("\n")]
assert any(c in result.stdout for c in rounded)
help_start = result_lines.index("First line")
arg_start = [i for i, row in enumerate(result_lines) if "Arguments" in row][0]
assert help_start != -1
assert result_lines[help_start:arg_start] == lines


@pytest.mark.parametrize(
"mode,lines",
[
pytest.param(
"markdown",
["First line", "", "• 1", "• 2", "• a", "• b", "• 3", ""],
marks=pytest.mark.xfail(),
),
Comment on lines +191 to +195
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test currently fails on master, with the output being

['First line', '', '• 1 - 2   - a   - b - 3', '']

-> this happens mostly because the newlines are not parsed correctly, after which the bullet points aren't recognized correctly. PR #815 attempts to fix this.

("rich", ["First line", "- 1", "- 2", "- a", "- b", "- 3", ""]),
("none", ["First line", "- 1 - 2 - a - b - 3", ""]),
],
)
def test_markup_mode_nested_bullets(mode: str, lines: List[str]):
app = typer.Typer(rich_markup_mode=mode)

@app.command()
def main(arg: str):
"""First line

- 1
- 2
- a
- b
- 3
"""
print(f"Hello {arg}")

assert app.rich_markup_mode == mode

result = runner.invoke(app, ["World"])
assert "Hello World" in result.stdout

result = runner.invoke(app, ["--help"])
result_lines = [line.strip() for line in result.stdout.split("\n")]
assert any(c in result.stdout for c in rounded)
help_start = result_lines.index("First line")
arg_start = [i for i, row in enumerate(result_lines) if "Arguments" in row][0]
assert help_start != -1
assert result_lines[help_start:arg_start] == lines
Loading