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] 43 44[project.optional-dependencies] 45dev = [ 46 "pytest>=8.0.0", 47 "pytest-asyncio>=0.24.0", 48 "pytest-cov>=6.0.0", 49 "black>=24.0.0", 50 "ruff>=0.8.0", 51 "mypy>=1.13.0", 52 "types-PyYAML>=6.0.0", 53] 54 55[project.urls] 56Homepage = "https://github.com/example/thicket" 57Documentation = "https://github.com/example/thicket" 58Repository = "https://github.com/example/thicket" 59"Bug Tracker" = "https://github.com/example/thicket/issues" 60 61[project.scripts] 62thicket = "thicket.cli.main:app" 63 64[tool.hatch.version] 65path = "src/thicket/__init__.py" 66 67[tool.hatch.build.targets.wheel] 68packages = ["src/thicket"] 69 70[tool.black] 71line-length = 88 72target-version = ['py39'] 73include = '\.pyi?$' 74extend-exclude = ''' 75/( 76 # directories 77 \.eggs 78 | \.git 79 | \.hg 80 | \.mypy_cache 81 | \.tox 82 | \.venv 83 | build 84 | dist 85)/ 86''' 87 88[tool.ruff] 89target-version = "py39" 90line-length = 88 91select = [ 92 "E", # pycodestyle errors 93 "W", # pycodestyle warnings 94 "F", # pyflakes 95 "I", # isort 96 "B", # flake8-bugbear 97 "C4", # flake8-comprehensions 98 "UP", # pyupgrade 99] 100ignore = [ 101 "E501", # line too long, handled by black 102 "B008", # do not perform function calls in argument defaults 103 "C901", # too complex 104] 105 106[tool.ruff.per-file-ignores] 107"__init__.py" = ["F401"] 108 109[tool.mypy] 110python_version = "3.9" 111check_untyped_defs = true 112disallow_any_generics = true 113disallow_incomplete_defs = true 114disallow_untyped_defs = true 115no_implicit_optional = true 116warn_redundant_casts = true 117warn_unused_ignores = true 118warn_return_any = true 119strict_optional = true 120 121[[tool.mypy.overrides]] 122module = [ 123 "feedparser", 124 "git", 125 "bleach", 126] 127ignore_missing_imports = true 128 129[tool.pytest.ini_options] 130testpaths = ["tests"] 131python_files = ["test_*.py"] 132python_classes = ["Test*"] 133python_functions = ["test_*"] 134addopts = [ 135 "-ra", 136 "--strict-markers", 137 "--strict-config", 138 "--cov=src/thicket", 139 "--cov-report=term-missing", 140 "--cov-report=html", 141 "--cov-report=xml", 142] 143filterwarnings = [ 144 "error", 145 "ignore::UserWarning", 146 "ignore::DeprecationWarning", 147] 148markers = [ 149 "slow: marks tests as slow (deselect with '-m \"not slow\"')", 150 "integration: marks tests as integration tests", 151] 152 153[tool.coverage.run] 154source = ["src"] 155branch = true 156 157[tool.coverage.report] 158exclude_lines = [ 159 "pragma: no cover", 160 "def __repr__", 161 "if self.debug:", 162 "if settings.DEBUG", 163 "raise AssertionError", 164 "raise NotImplementedError", 165 "if 0:", 166 "if __name__ == .__main__.:", 167 "class .*\\bProtocol\\):", 168 "@(abc\\.)?abstractmethod", 169]