social media crossposting tool. 3rd time's the charm
mastodon
misskey
crossposting
bluesky
1[project]
2name = "xpost"
3version = "0.1.0"
4description = "social media crossposting tool"
5readme = "README.md"
6requires-python = ">=3.12"
7dependencies = [
8 "dnspython>=2.8.0",
9 "grapheme>=0.6.0",
10 "httpx>=0.27.0",
11 "python-magic>=0.4.27",
12 "websockets>=15.0.1",
13]
14
15[dependency-groups]
16dev = [
17 "pytest>=8.4.2",
18 "ruff>=0.9.0",
19 "mypy>=1.15.0",
20]
21
22[tool.pytest.ini_options]
23pythonpath = ["."]
24
25[tool.ruff]
26target-version = "py312"
27line-length = 88
28src = ["."]
29
30[tool.ruff.lint]
31select = [
32 "E", # pycodestyle errors
33 "W", # pycodestyle warnings
34 "F", # Pyflakes
35 "I", # isort
36 "B", # flake8-bugbear
37 "C4", # flake8-comprehensions
38 "UP", # pyupgrade
39 "ARG", # flake8-unused-arguments
40 "SIM", # flake8-simplify
41]
42ignore = [
43 "E501", # line too long (handled by formatter)
44 "B008", # do not perform function calls in argument defaults
45 "B904", # raise without from inside except
46 "B023", # loop variable binding in lambdas (false positive for async for)
47]
48
49[tool.ruff.lint.isort]
50force-single-line = false
51lines-after-imports = 2
52
53[tool.ruff.format]
54quote-style = "double"
55indent-style = "space"
56skip-magic-trailing-comma = false
57line-ending = "auto"
58
59[tool.mypy]
60python_version = "3.12"
61warn_return_any = true
62warn_unused_configs = true
63warn_unused_ignores = true
64disallow_untyped_defs = false
65disallow_incomplete_defs = false
66check_untyped_defs = true
67no_implicit_optional = true
68warn_redundant_casts = true
69strict_equality = true
70
71# external libraries
72[[tool.mypy.overrides]]
73module = ["grapheme"]
74ignore_missing_imports = true