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]