[project] name = "plyngent" version = "0.1.3" description = "LLM chat and agent toolkit" authors = [ { name = "HivertMoZara", email = "worldmozara@163.com" }, ] dependencies = [ "msgspec>=0.21.1", "niquests>=3.20", "typing-extensions>=4.15.0", "platformdirs>=4.10.0", "tomlkit>=0.15.0", "sqlalchemy>=2.0.51", "aiosqlite>=0.22.1", "click>=8.4.2", "awaitlet>=0.0.1", "pywinpty>=2.0.0; sys_platform == \"win32\"", "rich>=13" ] requires-python = ">=3.14,<4" readme = "README.md" license = { text = "MIT" } [project.scripts] plyngent = "plyngent.cli:main" [dependency-groups] dev = [ "basedpyright==1.39.9", "ruff==0.15.22", "pytest>=9.1.1", "pytest-asyncio>=1.4.0", ] [build-system] requires = ["pdm-backend"] build-backend = "pdm.backend" [tool.basedpyright] typeCheckingMode = "recommended" strictGenericNarrowing = true # winpty is Windows-only (pywinpty); stubs live under typings/ (pyright default stubPath). reportMissingModuleSource = "hint" reportAny = "hint" reportExplicitAny = "hint" reportImplicitStringConcatenation = "hint" reportImportCycles = "hint" [[tool.basedpyright.executionEnvironments]] root = "tests" extraPaths = ["src", "."] reportPrivateUsage = "none" reportUnreachable = "none" reportUnusedCallResult = "none" reportUnannotatedClassAttribute = "none" reportUnknownArgumentType = "none" reportUnknownLambdaType = "none" reportUnknownMemberType = "none" reportUnknownVariableType = "none" reportUnknownParameterType = "none" reportMissingParameterType = "none" reportUnusedParameter = "none" reportMissingImports = "none" reportMissingTypeStubs = "none" [[tool.basedpyright.executionEnvironments]] root = "scripts" reportUnusedCallResult = "none" [tool.pytest.ini_options] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" testpaths = ["tests"] [tool.pdm] distribution = true [tool.ruff] line-length = 120 target-version = "py314" [tool.ruff.format] line-ending = "lf" [tool.ruff.lint] # For more rules, see https://docs.astral.sh/ruff/rules/. select = [ "F", # Pyflakes "W", # pycodestyle warnings "E", # pycodestyle errors "I", # isort "C90", # mccabe "N", # pep8-naming "PL", # pylint "UP", # pyupgrade "YTT", # flake8-2020 "ANN", # flake8-annotations "ASYNC", # flake8-async "BLE", # flake8-blind-except "FBT", # flake8-boolean-trap "B", # flake8-bugbear "A", # flake8-builtins "COM", # flake8-commas "C4", # flake8-comprehensions "DTZ", # flake8-datetimez "T10", # flake8-debugger "ICN", # flake8-import-conventions "PIE", # flake8-pie "T20", # flake8-print "PYI", # flake8-pyi "Q", # flake8-quotes "RSE", # flake8-raise "RET", # flake8-return "SIM", # flake8-simplify "SLOT", # flake8-slots "TID", # flake8-tidy-imports "TC", # flake8-type-checking "ARG", # flake8-unused-arguments "PTH", # flake8-use-pathlib # "ERA", # eradicate "FAST", # FastAPI "PERF", # Perflint "PGH", # pygrep-hooks "FURB", # refurb "TRY", # tryceratops "RUF", # Ruff-specific rules ] ignore = [ "UP037", # quoted-annotation # "ANN201", # missing-return-type-undocumented-public-function "ANN202", # missing-return-type-private-function "ANN401", # any-type "COM812", # missing-trailing-comma "PLC0415", # import-outside-top-level "TID252", "PLR0913", # too-many-arguments (common on constructors/composed functions) ] allowed-confusables = [ ",", "。", "“", "”", ":", ";", "?", "!", "【", "】", "《", "》", "…", "—", "(", ")", "、" ] [tool.ruff.lint.per-file-ignores] "tests/**" = [ "ANN", # type annotations often noisy in tests "ARG", # unused fixtures/args are common "ASYNC240", # pathlib in async tests is fine "PLR2004", # magic values in asserts "PLR0911", # many returns in fixtures/helpers "PLR0912", # branching in scripted clients "PLR0915", # long test functions "C901", # complexity in scripted fakes "S101", # assert is the point of tests "TC", # TYPE_CHECKING import churn "TRY003", # long exception messages in tests "FBT", # boolean positional args in helpers ] "scripts/**" = [ "T201", # CLI scripts print status "PLR0911", # command dispatch returns ]