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]