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]