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