f9196da9f8
Screenshots now properly preserve terminal colors: 1. Replay buffer provides raw ANSI data with color codes 2. pyte interprets escape sequences for accurate screen state 3. Rich renders the pyte buffer with colors to SVG This gives us both accurate terminal state (no creeping/wrapping) and proper color preservation in screenshots. Bumps version to 0.1.12.
118 lines
2.8 KiB
TOML
118 lines
2.8 KiB
TOML
[tool.poetry]
|
|
name = "textual-webterm"
|
|
version = "0.1.12"
|
|
description = "Serve terminal sessions over the web"
|
|
authors = ["Will McGugan <will@textualize.io>"]
|
|
license = "MIT"
|
|
readme = "README.md"
|
|
packages = [{include = "textual_webterm", from = "src"}]
|
|
include = [{ path = "src/textual_webterm/static/monospace.css" }]
|
|
|
|
[tool.poetry.dependencies]
|
|
python = "^3.9"
|
|
textual-serve = "^1.1.0"
|
|
aiohttp = "^3.13.0"
|
|
uvloop = { version = "^0.22.0", markers = "sys_platform != 'win32'" }
|
|
click = "^8.1.7"
|
|
pydantic = "^2.7.0"
|
|
xdg = "^6.0.0"
|
|
msgpack = "^1.1.0"
|
|
importlib-metadata = ">=6.0.0"
|
|
httpx = ">=0.27.0"
|
|
tomli = { version = "^2.0.1", python = "<3.11" }
|
|
pyyaml = "^6.0.0"
|
|
pyte = "^0.8.0"
|
|
|
|
[tool.poetry.group.dev.dependencies]
|
|
pytest = "^8.0.0"
|
|
pytest-asyncio = "^0.24.0"
|
|
pytest-cov = "^6.0.0"
|
|
pytest-timeout = "^2.3.0"
|
|
ruff = "^0.9.0"
|
|
|
|
[build-system]
|
|
requires = ["poetry-core"]
|
|
build-backend = "poetry.core.masonry.api"
|
|
|
|
[tool.poetry.scripts]
|
|
textual-webterm = "textual_webterm.cli:app"
|
|
|
|
[tool.ruff]
|
|
line-length = 100
|
|
target-version = "py39"
|
|
src = ["src"]
|
|
|
|
[tool.ruff.lint]
|
|
select = [
|
|
"E", # pycodestyle errors
|
|
"W", # pycodestyle warnings
|
|
"F", # Pyflakes
|
|
"I", # isort
|
|
"B", # flake8-bugbear
|
|
"C4", # flake8-comprehensions
|
|
"UP", # pyupgrade
|
|
"ARG", # flake8-unused-arguments
|
|
"SIM", # flake8-simplify
|
|
"TC", # flake8-type-checking
|
|
"PTH", # flake8-use-pathlib
|
|
"ERA", # eradicate (commented out code)
|
|
"PL", # Pylint
|
|
"RUF", # Ruff-specific rules
|
|
]
|
|
ignore = [
|
|
"E501", # line too long (handled by formatter)
|
|
"PLR0912", # too many branches
|
|
"PLR0913", # too many arguments
|
|
"PLR0915", # too many statements
|
|
"PLR2004", # magic value comparison
|
|
"ARG001", # unused function argument
|
|
"ARG002", # unused method argument
|
|
"PLC0415", # import not at top level (needed for optional deps)
|
|
]
|
|
|
|
[tool.ruff.lint.isort]
|
|
known-first-party = ["textual_webterm"]
|
|
|
|
[tool.ruff.format]
|
|
quote-style = "double"
|
|
indent-style = "space"
|
|
skip-magic-trailing-comma = false
|
|
line-ending = "auto"
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|
|
asyncio_mode = "auto"
|
|
asyncio_default_fixture_loop_scope = "function"
|
|
timeout = 30
|
|
addopts = [
|
|
"-v",
|
|
"--tb=short",
|
|
"--strict-markers",
|
|
]
|
|
markers = [
|
|
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
|
|
"integration: marks tests as integration tests",
|
|
]
|
|
|
|
[tool.coverage.run]
|
|
source = ["src/textual_webterm"]
|
|
branch = true
|
|
omit = [
|
|
"*/tests/*",
|
|
"*/__pycache__/*",
|
|
# Thread/FD polling integration is harder to deterministically unit test
|
|
"*/poller.py",
|
|
]
|
|
|
|
[tool.coverage.report]
|
|
exclude_lines = [
|
|
"pragma: no cover",
|
|
"def __repr__",
|
|
"raise NotImplementedError",
|
|
"if TYPE_CHECKING:",
|
|
"if __name__ == .__main__.:",
|
|
"assert ",
|
|
]
|
|
# Unit test coverage target
|
|
fail_under = 80
|