[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.8", "Programming Language :: Python :: 3.9", "Topic :: Software Development :: Libraries :: Application Frameworks", ] dependencies = ["graphlib_backport >= 1.0.0; python_version < '3.9'"] 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.1.6" [project.scripts] pymake = "pyflowx.cli.pymake:main" gitt = "pyflowx.cli.gittool: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", ] [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]"] [tool.coverage.run] branch = true concurrency = ["thread"] omit = ["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] target-version = "py38" line-length = 120 [tool.ruff.format] # 使用双引号 quote-style = "double" # 缩进使用空格 indent-style = "space" # 保留尾随逗号 skip-magic-trailing-comma = false # 行长度由 [tool.ruff] 中的 line-length 控制 [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 "PTH", # flake8-use-pathlib "PL", # Pylint "RUF", # Ruff-specific rules ] ignore = [ "E501", # line too long (handled by formatter) "PLR0913", # too many arguments "PLR2004", # magic value comparison "PTH123", # pathlib open() replacement "SIM108", # use ternary operator "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) "PLC0415", # import should be at top-level (intentional for lazy imports) "PLR0915", # too many statements (intentional for complex methods) "PTH119", # os.path.basename (intentional for sys.argv) ] [tool.pyrefly] project-includes = [ "**/*.py*", "**/*.ipynb", ] preset = "basic" python-version = "3.8"