[project] authors = [{ name = "pyflowx" }] classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Topic :: Software Development :: Libraries :: Application Frameworks", ] dependencies = [ "graphlib_backport >= 1.0.0; python_version < '3.9'", "typing-extensions>=4.13.2; python_version < '3.10'", ] description = "Lightweight, type-safe DAG task scheduler with multi-strategy execution." keywords = ["async", "dag", "scheduler", "task", "workflow"] license = { text = "MIT" } name = "pyflowx" readme = "README.md" requires-python = ">=3.8" version = "0.3.0" [project.scripts] autofmt = "pyflowx.cli.autofmt:main" bumpversion = "pyflowx.cli.bumpversion:main" emlman = "pyflowx.cli.emlmanager:main" filedate = "pyflowx.cli.filedate:main" filelvl = "pyflowx.cli.filelevel:main" foldback = "pyflowx.cli.folderback:main" foldzip = "pyflowx.cli.folderzip:main" gitt = "pyflowx.cli.gittool:main" lscalc = "pyflowx.cli.lscalc:main" msdown = "pyflowx.cli.llm.msdownload:main" packtool = "pyflowx.cli.packtool:main" pdftool = "pyflowx.cli.pdftool:main" piptool = "pyflowx.cli.piptool:main" pymake = "pyflowx.cli.pymake:main" pxp = "pyflowx.cli.profiler:main" reseticon = "pyflowx.cli.reseticoncache:main" scrcap = "pyflowx.cli.screenshot:main" sglang = "pyflowx.cli.llm.sglang:main" sshcopy = "pyflowx.cli.sshcopyid:main" # dev envdev = "pyflowx.cli.dev.envdev:main" # system clr = "pyflowx.cli.system.clearscreen:main" taskk = "pyflowx.cli.system.taskkill:main" wch = "pyflowx.cli.system.which:main" [project.optional-dependencies] dev = [ "hatch>=1.14.2", "httpx>=0.28.0", "prek>=0.4.5", "pyrefly>=1.1.1", "pytest-asyncio>=0.24.0", "pytest-cov>=5.0.0", "pytest-html>=4.1.1", "pytest-mock>=3.14.0", "pytest-xdist>=3.6.1", "pytest>=8.0.0", "ruff>=0.8.0", "tox-uv>=1.13.1", "tox>=4.25.0", ] llm = [ "sglang[all]==0.5.10rc0; python_version >= '3.10' and sys_platform == 'linux'", ] office = [ "pillow>=10.4.0", "pymupdf>=1.24.11", "pypdf>=5.9.0", "pytesseract>=0.3.13", ] [build-system] build-backend = "hatchling.build" requires = ["hatchling"] [[tool.uv.index]] default = true url = "https://mirrors.aliyun.com/pypi/simple/" [tool.hatch.build.targets.wheel] packages = ["src/pyflowx"] [tool.hatch.build.targets.wheel.force-include] "src/pyflowx/py.typed" = "pyflowx/py.typed" [tool.uv.sources] pyflowx = { workspace = true } [dependency-groups] dev = ["pyflowx[dev,office,llm]"] [tool.coverage.run] branch = true concurrency = ["thread"] omit = ["src/pyflowx/cli/*", "src/pyflowx/examples/*", "tests/*"] source = ["pyflowx"] [tool.coverage.report] exclude_lines = [ "if TYPE_CHECKING:", "if __name__ == .__main__.:", "pragma: no cover", "raise NotImplementedError", ] fail_under = 95 show_missing = true [tool.pytest.ini_options] asyncio_default_fixture_loop_scope = "function" markers = ["slow: marks tests as slow (deselect with '-m \"not slow\"')"] # Ruff 配置 - 与 .pre-commit-config.yaml 保持一致 [tool.ruff] line-length = 120 target-version = "py38" [tool.ruff.lint] ignore = [ "E501", # line too long (handled by formatter) "PLC0415", # import should be at top-level (intentional for lazy imports) "PLR0913", # too many arguments "PLR0915", # too many statements (intentional for complex methods) "PLR2004", # magic value comparison "PTH119", # os.path.basename (intentional for sys.argv) "PTH123", # pathlib open() replacement "RUF001", # ambiguous unicode characters in string "RUF002", # ambiguous unicode characters in docstring "RUF003", # ambiguous unicode characters in comment "RUF012", # mutable class attributes (intentional for config) "SIM108", # use ternary operator ] select = [ "ARG", # flake8-unused-arguments "B", # flake8-bugbear "C4", # flake8-comprehensions "E", # pycodestyle errors "F", # Pyflakes "I", # isort "PL", # Pylint "PTH", # flake8-use-pathlib "RUF", # Ruff-specific rules "SIM", # flake8-simplify "UP", # pyupgrade "W", # pycodestyle warnings ] [tool.ruff.lint.per-file-ignores] "**/tests/**" = ["ARG001", "ARG002"] [tool.pyrefly] preset = "strict" project-includes = ["**/*.ipynb", "**/*.py*"] python-version = "3.8"