mirror of
https://github.com/openai/codex.git
synced 2026-05-14 08:12:36 +00:00
## Why Mixed prose lines that contained URLs started taking the URL-preserving wrapping path, but that path could split ordinary words mid-token. A follow-up issue remained in scrollback insertion: when already-rendered indented rows were wrapped again, continuation rows could lose their margin and fall back to terminal hard wrapping. Together those bugs made normal Markdown output look broken around links, lists, blockquotes, and indented content. Separately, the local argument-comment lint wrappers failed under environments that set `PYTHONSAFEPATH=1`, because Python no longer adds the script directory to `sys.path` automatically. That prevented the lint from reaching Rust callsites at all. <img width="1778" height="1558" alt="CleanShot 2026-05-09 at 11 51 38" src="https://github.com/user-attachments/assets/9274d150-1757-4f1a-89ac-5bdc9997d8cb" /> ## What Changed - Preserve URL tokens without turning every neighboring prose word into a character-level split point. - Add a mixed URL/prose wrapper that keeps ordinary words whole, preserves leading whitespace, and re-splits long non-URL tokens against the actual width available on continuation rows. - Reuse a rendered history row's leading whitespace as the continuation indent when scrollback insertion has to pre-wrap it again. - Add regression coverage for markdown wrapping, history-cell rendering, scrollback continuation margins, leading-indent width accounting, and continuation-row re-splitting. - Make both argument-comment lint entrypoints explicitly add their own directory to `sys.path`, so sibling imports still work when `PYTHONSAFEPATH=1`. ## How to Test 1. Start Codex and render a long Markdown response that mixes prose with inline links, blockquotes, lists, and indented code-like text. 2. Confirm that ordinary words next to links stay whole instead of breaking mid-word. 3. Resize or replay the transcript and confirm wrapped continuation rows keep their expected left margin for blockquotes, lists, and indented content. 4. Run the source argument-comment lint from a shell with `PYTHONSAFEPATH=1` and confirm it starts normally instead of failing to import `wrapper_common`. Targeted tests: - `cargo test -p codex-tui mixed_line --lib` - `cargo test -p codex-tui preserves_prefix_on_wrapped_rows --lib` - `cargo test -p codex-tui agent_markdown_cell_does_not_split_words_after_inline_markdown --lib` - `cargo test -p codex-tui mixed_url_markdown_wraps_prose_without_splitting_words_snapshot --lib` - `python3 tools/argument-comment-lint/test_wrapper_common.py` - `just argument-comment-lint-from-source -p codex-tui -- --lib` Notes: - `cargo test -p codex-tui` currently reaches the new tests successfully, then still aborts in the pre-existing `tests::fork_last_filters_latest_session_by_cwd_unless_show_all` stack-overflow failure.
125 lines
3.5 KiB
Python
125 lines
3.5 KiB
Python
#!/usr/bin/env python3
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
import sys
|
|
import unittest
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
|
|
import wrapper_common
|
|
|
|
|
|
class WrapperCommonTest(unittest.TestCase):
|
|
def test_defaults_to_workspace_and_all_targets(self) -> None:
|
|
parsed = wrapper_common.parse_wrapper_args([])
|
|
final_args = wrapper_common.build_final_args(parsed, Path("/repo/codex-rs/Cargo.toml"))
|
|
|
|
self.assertEqual(
|
|
final_args,
|
|
[
|
|
"--manifest-path",
|
|
"/repo/codex-rs/Cargo.toml",
|
|
"--workspace",
|
|
"--no-deps",
|
|
"--",
|
|
"--all-targets",
|
|
],
|
|
)
|
|
|
|
def test_forwarded_cargo_args_keep_single_separator(self) -> None:
|
|
parsed = wrapper_common.parse_wrapper_args(["-p", "codex-core", "--", "--tests"])
|
|
final_args = wrapper_common.build_final_args(parsed, Path("/repo/codex-rs/Cargo.toml"))
|
|
|
|
self.assertEqual(
|
|
final_args,
|
|
[
|
|
"--manifest-path",
|
|
"/repo/codex-rs/Cargo.toml",
|
|
"--no-deps",
|
|
"-p",
|
|
"codex-core",
|
|
"--",
|
|
"--tests",
|
|
],
|
|
)
|
|
|
|
def test_fix_does_not_add_all_targets(self) -> None:
|
|
parsed = wrapper_common.parse_wrapper_args(["--fix", "-p", "codex-core"])
|
|
final_args = wrapper_common.build_final_args(parsed, Path("/repo/codex-rs/Cargo.toml"))
|
|
|
|
self.assertEqual(
|
|
final_args,
|
|
[
|
|
"--manifest-path",
|
|
"/repo/codex-rs/Cargo.toml",
|
|
"--no-deps",
|
|
"--fix",
|
|
"-p",
|
|
"codex-core",
|
|
],
|
|
)
|
|
|
|
def test_explicit_manifest_and_workspace_are_preserved(self) -> None:
|
|
parsed = wrapper_common.parse_wrapper_args(
|
|
[
|
|
"--manifest-path",
|
|
"/tmp/custom/Cargo.toml",
|
|
"--workspace",
|
|
"--no-deps",
|
|
"--",
|
|
"--bins",
|
|
]
|
|
)
|
|
final_args = wrapper_common.build_final_args(parsed, Path("/repo/codex-rs/Cargo.toml"))
|
|
|
|
self.assertEqual(
|
|
final_args,
|
|
[
|
|
"--manifest-path",
|
|
"/tmp/custom/Cargo.toml",
|
|
"--workspace",
|
|
"--no-deps",
|
|
"--",
|
|
"--bins",
|
|
],
|
|
)
|
|
|
|
def test_explicit_package_manifest_does_not_force_workspace(self) -> None:
|
|
parsed = wrapper_common.parse_wrapper_args(
|
|
[
|
|
"--manifest-path",
|
|
"/tmp/custom/Cargo.toml",
|
|
]
|
|
)
|
|
final_args = wrapper_common.build_final_args(parsed, Path("/repo/codex-rs/Cargo.toml"))
|
|
|
|
self.assertEqual(
|
|
final_args,
|
|
[
|
|
"--no-deps",
|
|
"--manifest-path",
|
|
"/tmp/custom/Cargo.toml",
|
|
"--",
|
|
"--all-targets",
|
|
],
|
|
)
|
|
|
|
def test_default_lint_env_promotes_both_strict_lints(self) -> None:
|
|
env: dict[str, str] = {}
|
|
|
|
wrapper_common.set_default_lint_env(env)
|
|
|
|
self.assertEqual(
|
|
env["DYLINT_RUSTFLAGS"],
|
|
"-D argument-comment-mismatch "
|
|
"-D uncommented-anonymous-literal-argument "
|
|
"-A unknown_lints",
|
|
)
|
|
self.assertEqual(env["CARGO_INCREMENTAL"], "0")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|