Manage Atom feeds in a persistent git repository
1[build-system] 2requires = ["hatchling"] 3build-backend = "hatchling.build" 4 5[project] 6name = "thicket" 7dynamic = ["version"] 8description = "A CLI tool for persisting Atom/RSS feeds in Git repositories" 9readme = "README.md" 10license = "MIT" 11requires-python = ">=3.9" 12authors = [ 13 {name = "thicket", email = "thicket@example.com"}, 14] 15classifiers = [ 16 "Development Status :: 3 - Alpha", 17 "Intended Audience :: Developers", 18 "License :: OSI Approved :: MIT License", 19 "Operating System :: OS Independent", 20 "Programming Language :: Python :: 3", 21 "Programming Language :: Python :: 3.9", 22 "Programming Language :: Python :: 3.10", 23 "Programming Language :: Python :: 3.11", 24 "Programming Language :: Python :: 3.12", 25 "Programming Language :: Python :: 3.13", 26 "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: News/Diary", 27 "Topic :: Software Development :: Version Control :: Git", 28 "Topic :: Text Processing :: Markup :: XML", 29] 30dependencies = [ 31 "typer>=0.15.0", 32 "rich>=13.0.0", 33 "GitPython>=3.1.40", 34 "feedparser>=6.0.11", 35 "pydantic>=2.11.0", 36 "pydantic-settings>=2.10.0", 37 "httpx>=0.28.0", 38 "pendulum>=3.0.0", 39 "bleach>=6.0.0", 40 "platformdirs>=4.0.0", 41 "pyyaml>=6.0.0", 42 "email_validator", 43 "textual>=4.0.0", 44 "flask>=3.1.1", 45] 46 47[project.optional-dependencies] 48dev = [ 49 "pytest>=8.0.0", 50 "pytest-asyncio>=0.24.0", 51 "pytest-cov>=6.0.0", 52 "black>=24.0.0", 53 "ruff>=0.8.0", 54 "mypy>=1.13.0", 55 "types-PyYAML>=6.0.0", 56] 57 58[project.urls] 59Homepage = "https://github.com/example/thicket" 60Documentation = "https://github.com/example/thicket" 61Repository = "https://github.com/example/thicket" 62"Bug Tracker" = "https://github.com/example/thicket/issues" 63 64[project.scripts] 65thicket = "thicket.cli.main:app" 66 67[tool.hatch.version] 68path = "src/thicket/__init__.py" 69 70[tool.hatch.build.targets.wheel] 71packages = ["src/thicket"] 72 73[tool.black] 74line-length = 88 75target-version = ['py39'] 76include = '\.pyi?$' 77extend-exclude = ''' 78/( 79 # directories 80 \.eggs 81 | \.git 82 | \.hg 83 | \.mypy_cache 84 | \.tox 85 | \.venv 86 | build 87 | dist 88)/ 89''' 90 91[tool.ruff] 92target-version = "py39" 93line-length = 88 94 95[tool.ruff.lint] 96select = [ 97 "E", # pycodestyle errors 98 "W", # pycodestyle warnings 99 "F", # pyflakes 100 "I", # isort 101 "B", # flake8-bugbear 102 "C4", # flake8-comprehensions 103 "UP", # pyupgrade 104] 105ignore = [ 106 "E501", # line too long, handled by black 107 "B008", # do not perform function calls in argument defaults 108 "C901", # too complex 109] 110 111[tool.ruff.lint.per-file-ignores] 112"__init__.py" = ["F401"] 113 114[tool.mypy] 115python_version = "3.9" 116check_untyped_defs = true 117disallow_any_generics = true 118disallow_incomplete_defs = true 119disallow_untyped_defs = true 120no_implicit_optional = true 121warn_redundant_casts = true 122warn_unused_ignores = true 123warn_return_any = true 124strict_optional = true 125 126[[tool.mypy.overrides]] 127module = [ 128 "feedparser", 129 "git", 130 "bleach", 131] 132ignore_missing_imports = true 133 134[tool.pytest.ini_options] 135testpaths = ["tests"] 136python_files = ["test_*.py"] 137python_classes = ["Test*"] 138python_functions = ["test_*"] 139addopts = [ 140 "-ra", 141 "--strict-markers", 142 "--strict-config", 143 "--cov=src/thicket", 144 "--cov-report=term-missing", 145 "--cov-report=html", 146 "--cov-report=xml", 147] 148filterwarnings = [ 149 "error", 150 "ignore::UserWarning", 151 "ignore::DeprecationWarning", 152] 153markers = [ 154 "slow: marks tests as slow (deselect with '-m \"not slow\"')", 155 "integration: marks tests as integration tests", 156] 157 158[tool.coverage.run] 159source = ["src"] 160branch = true 161 162[tool.coverage.report] 163exclude_lines = [ 164 "pragma: no cover", 165 "def __repr__", 166 "if self.debug:", 167 "if settings.DEBUG", 168 "raise AssertionError", 169 "raise NotImplementedError", 170 "if 0:", 171 "if __name__ == .__main__.:", 172 "class .*\\bProtocol\\):", 173 "@(abc\\.)?abstractmethod", 174]