From 253635a541df9b766e4bd5596e452e358894ad44 Mon Sep 17 00:00:00 2001 From: Stefan VanBuren Date: Fri, 27 Mar 2026 11:58:42 -0400 Subject: [PATCH] Add tombi formatting/linting for TOML files Figure we may as well auto-format as much as we can. Signed-off-by: Stefan VanBuren --- connectrpc-otel/pyproject.toml | 112 +++---- justfile | 7 +- protoc-gen-connect-python/pyproject.toml | 68 ++-- pyproject.toml | 379 ++++++++++++----------- uv.lock | 24 ++ zensical.toml | 7 + 6 files changed, 316 insertions(+), 281 deletions(-) diff --git a/connectrpc-otel/pyproject.toml b/connectrpc-otel/pyproject.toml index 8cf21d6..76770aa 100644 --- a/connectrpc-otel/pyproject.toml +++ b/connectrpc-otel/pyproject.toml @@ -2,82 +2,82 @@ name = "connectrpc-otel" version = "0.1.0" description = "OpenTelemetry instrumentation for connectrpc" -maintainers = [ - { name = "Anuraag Agrawal", email = "anuraaga@gmail.com" }, - { name = "Spencer Nelson", email = "spencer@firetiger.com" }, - { name = "Stefan VanBuren", email = "svanburen@buf.build" }, - { name = "Yasushi Itoh", email = "i2y.may.roku@gmail.com" }, -] -requires-python = ">= 3.10" readme = "README.md" +requires-python = ">= 3.10" license = "Apache-2.0" license-files = ["LICENSE"] +maintainers = [ + { name = "Anuraag Agrawal", email = "anuraaga@gmail.com" }, + { name = "Spencer Nelson", email = "spencer@firetiger.com" }, + { name = "Stefan VanBuren", email = "svanburen@buf.build" }, + { name = "Yasushi Itoh", email = "i2y.may.roku@gmail.com" }, +] keywords = [ - "opentelemetry", - "otel", - "connectrpc", - "connect-python", - "middleware", - "tracing", - "observability", + "connect-python", + "connectrpc", + "middleware", + "observability", + "opentelemetry", + "otel", + "tracing", ] classifiers = [ - "Development Status :: 4 - Beta", - "Environment :: Console", - "Intended Audience :: Developers", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Topic :: System :: Networking", + "Development Status :: 4 - Beta", + "Environment :: Console", + "Intended Audience :: Developers", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Topic :: System :: Networking", ] dependencies = [ - "opentelemetry-api>=1.39.1", - # We do not want to prevent users from updating OTel when connectrpc isn't depending on - # the latest. This does introduce a possibility of incompatibilities, but there is no - # alternative, and in practice, the APIs we use have been stable for a long time. - "opentelemetry-instrumentation>=0.60b1", + "opentelemetry-api>=1.39.1", + # We do not want to prevent users from updating OTel when connectrpc isn't depending on + # the latest. This does introduce a possibility of incompatibilities, but there is no + # alternative, and in practice, the APIs we use have been stable for a long time. + "opentelemetry-instrumentation>=0.60b1", ] +[project.urls] +Homepage = "https://github.com/connectrpc/connect-python" +Issues = "https://github.com/connectrpc/connect-python/issues" +Repository = "https://github.com/connectrpc/connect-python" + +[project.entry-points.opentelemetry_instrumentor] +connectrpc = "connectrpc_otel:ConnectInstrumentor" + [dependency-groups] dev = [ - # auto-instrumentation shouldn't include a dependency on the library being instrumented - # so it can be packaged in auto-instrumentation distros for general use. - # - # This library also supports manually initializing the interceptor. - # For users that manually instrument by initializing the interceptor, it is easier to - # have a real dependency to avoid any possible version conflicts. But for Python, - # the ecosystem vastly favors auto-instrumentation, and it is easier to add than remove - # a transitive dependency, so we go ahead and leave it out. - "connectrpc>=0.8.0", + # auto-instrumentation shouldn't include a dependency on the library being instrumented + # so it can be packaged in auto-instrumentation distros for general use. + # + # This library also supports manually initializing the interceptor. + # For users that manually instrument by initializing the interceptor, it is easier to + # have a real dependency to avoid any possible version conflicts. But for Python, + # the ecosystem vastly favors auto-instrumentation, and it is easier to add than remove + # a transitive dependency, so we go ahead and leave it out. + "connectrpc>=0.8.0", - "opentelemetry-sdk==1.40.0", - "opentelemetry-instrumentation-asgi==0.61b0", - "opentelemetry-instrumentation-wsgi==0.61b0", + "opentelemetry-instrumentation-asgi==0.61b0", + "opentelemetry-instrumentation-wsgi==0.61b0", + "opentelemetry-sdk==1.40.0", - "connect-python-example", - "pytest", + "connect-python-example", + "pytest", ] -[project.entry-points.opentelemetry_instrumentor] -connectrpc = "connectrpc_otel:ConnectInstrumentor" - -[project.urls] -Homepage = "https://github.com/connectrpc/connect-python" -Repository = "https://github.com/connectrpc/connect-python" -Issues = "https://github.com/connectrpc/connect-python/issues" - [build-system] requires = ["uv_build>=0.11.0,<0.12.0"] build-backend = "uv_build" +[tool.ruff] +extend = "../pyproject.toml" + [tool.uv.build-backend] module-name = "connectrpc_otel" module-root = "" - -[tool.ruff] -extend = "../pyproject.toml" diff --git a/justfile b/justfile index 2b7a566..4625ef7 100644 --- a/justfile +++ b/justfile @@ -5,15 +5,18 @@ BUF_VERSION := "v1.57.0" [private] @default: check -# Format Python files +# Format Python files and TOML files format: uv run ruff check --fix --unsafe-fixes --exit-zero . uv run ruff format . + uv run tombi format -# Lint Python files +# Lint Python and TOML files lint: uv run ruff format --check . uv run ruff check . + uv run tombi format --check + uv run tombi lint # Typecheck Python files typecheck: diff --git a/protoc-gen-connect-python/pyproject.toml b/protoc-gen-connect-python/pyproject.toml index 1c15f46..389c259 100644 --- a/protoc-gen-connect-python/pyproject.toml +++ b/protoc-gen-connect-python/pyproject.toml @@ -2,51 +2,51 @@ name = "protoc-gen-connectrpc" version = "0.9.0" description = "Code generator for connect-python" -maintainers = [ - { name = "Anuraag Agrawal", email = "anuraaga@gmail.com" }, - { name = "Spencer Nelson", email = "spencer@firetiger.com" }, - { name = "Stefan VanBuren", email = "svanburen@buf.build" }, - { name = "Yasushi Itoh", email = "i2y.may.roku@gmail.com" }, -] -requires-python = ">= 3.10" readme = "README.md" +requires-python = ">= 3.10" license = "Apache-2.0" license-files = ["LICENSE"] +maintainers = [ + { name = "Anuraag Agrawal", email = "anuraaga@gmail.com" }, + { name = "Spencer Nelson", email = "spencer@firetiger.com" }, + { name = "Stefan VanBuren", email = "svanburen@buf.build" }, + { name = "Yasushi Itoh", email = "i2y.may.roku@gmail.com" }, +] keywords = [ - "protoc", - "protobuf", - "protocol-buffers", - "code-generation", - "connect", - "connectrpc", - "connect-protocol", - "connect-rpc", - "rpc", - "compiler", - "plugin", + "code-generation", + "compiler", + "connect", + "connect-protocol", + "connect-rpc", + "connectrpc", + "plugin", + "protobuf", + "protoc", + "protocol-buffers", + "rpc", ] classifiers = [ - "Development Status :: 4 - Beta", - "Environment :: Console", - "Intended Audience :: Developers", - "Operating System :: OS Independent", - "Programming Language :: Go", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Topic :: Software Development :: Code Generators", - "Topic :: Software Development :: Compilers", - "Topic :: System :: Networking", + "Development Status :: 4 - Beta", + "Environment :: Console", + "Intended Audience :: Developers", + "Operating System :: OS Independent", + "Programming Language :: Go", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Topic :: Software Development :: Code Generators", + "Topic :: Software Development :: Compilers", + "Topic :: System :: Networking", ] [project.urls] Homepage = "https://github.com/connectrpc/connect-python" -Repository = "https://github.com/connectrpc/connect-python" Issues = "https://github.com/connectrpc/connect-python/issues" +Repository = "https://github.com/connectrpc/connect-python" [dependency-groups] dev = ["wheel"] diff --git a/pyproject.toml b/pyproject.toml index 95923da..06bc7f4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,91 +2,100 @@ name = "connectrpc" version = "0.9.0" description = "Server and client runtime library for Connect RPC" -maintainers = [ - { name = "Anuraag Agrawal", email = "anuraaga@gmail.com" }, - { name = "Spencer Nelson", email = "spencer@firetiger.com" }, - { name = "Stefan VanBuren", email = "svanburen@buf.build" }, - { name = "Yasushi Itoh", email = "i2y.may.roku@gmail.com" }, -] -requires-python = ">= 3.10" -dependencies = ["protobuf>=5.28", "pyqwest>=0.4.1"] readme = "README.md" +requires-python = ">= 3.10" license = "Apache-2.0" license-files = ["LICENSE"] -keywords = ["rpc", "grpc", "connect", "protobuf", "http"] +maintainers = [ + { name = "Anuraag Agrawal", email = "anuraaga@gmail.com" }, + { name = "Spencer Nelson", email = "spencer@firetiger.com" }, + { name = "Stefan VanBuren", email = "svanburen@buf.build" }, + { name = "Yasushi Itoh", email = "i2y.may.roku@gmail.com" }, +] +keywords = ["connect", "grpc", "http", "protobuf", "rpc"] classifiers = [ - "Development Status :: 4 - Beta", - "Intended Audience :: Developers", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Topic :: Internet :: WWW/HTTP", - "Topic :: Software Development :: Libraries :: Python Modules", - "Typing :: Typed", + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Topic :: Internet :: WWW/HTTP", + "Topic :: Software Development :: Libraries :: Python Modules", + "Typing :: Typed", ] +dependencies = ["protobuf>=5.28", "pyqwest>=0.4.1"] [project.urls] +Documentation = "https://connectrpc.com/docs/python/getting-started/" Homepage = "https://github.com/connectrpc/connect-python" -Repository = "https://github.com/connectrpc/connect-python" Issues = "https://github.com/connectrpc/connect-python/issues" -Documentation = "https://connectrpc.com/docs/python/getting-started/" +Repository = "https://github.com/connectrpc/connect-python" [dependency-groups] dev = [ - "asgiref==3.11.1", - "brotli==1.2.0", - "connect-python-example", - "daphne==4.2.1", - "hypercorn==0.18.0", - "granian==2.7.2", - "grpcio-tools==1.78.0", - "gunicorn==25.1.0", - "just-bin==1.47.1; sys_platform != 'win32'", - "pyright[nodejs]==1.1.408", - "pyvoy==0.3.0", - "ruff~=0.15.0", - "uvicorn==0.42.0", - # Needed to enable HTTP/2 in daphne - "Twisted[tls,http2]==25.5.0", - "typing_extensions==4.15.0", - "zstandard==0.25.0", - - # Versions locked in constraint-dependencies - "pytest", - "pytest-asyncio", - "pytest-cov", - "pytest-timeout", + # Needed to enable HTTP/2 in daphne + "Twisted[tls,http2]==25.5.0", + "asgiref==3.11.1", + "brotli==1.2.0", + "connect-python-example", + "daphne==4.2.1", + "granian==2.7.2", + "grpcio-tools==1.78.0", + "gunicorn==25.1.0", + "hypercorn==0.18.0", + "just-bin==1.47.1; sys_platform != 'win32'", + "pyright[nodejs]==1.1.408", + "pyvoy==0.3.0", + "ruff~=0.15.0", + "tombi==0.9.9", + "typing_extensions==4.15.0", + "uvicorn==0.42.0", + "zstandard==0.25.0", + + # Versions locked in constraint-dependencies + "pytest", + "pytest-asyncio", + "pytest-cov", + "pytest-timeout", ] -docs = ["zensical==0.0.28", "mkdocstrings-python==2.0.3"] +docs = ["mkdocstrings-python==2.0.3", "zensical==0.0.28"] [build-system] requires = ["uv_build>=0.11.0,<0.12.0"] build-backend = "uv_build" -[tool.uv] -constraint-dependencies = [ - "coverage==7.13.2", - "pytest==9.0.2", - "pytest-asyncio==1.3.0", - "pytest-cov==7.0.0", - "pytest-timeout==2.4.0", +[tool.pyright] +exclude = [ + # Defaults. + "**/node_modules", + "**/__pycache__", + "**/.*", + ".venv", + + # GRPC python files don't typecheck on their own. + # See https://github.com/grpc/grpc/issues/39555 + "**/*_pb2_grpc.py", + + # TODO: Work out the import issues to allow it to work. + "conformance/**", ] -[tool.uv.build-backend] -module-name = "connectrpc" - [tool.pytest] -strict = true -testpaths = ["test"] -timeout = "1800" # 30 min # Turn all warnings into errors filterwarnings = ["error"] +strict = true +testpaths = ["test"] +timeout = "1800" # 30 min + +[tool.ruff] +# Don't run ruff on generated code from external plugins. +extend-exclude = ["*_pb2.py", "*_pb2.pyi"] [tool.ruff.format] skip-magic-trailing-comma = true @@ -94,106 +103,106 @@ docstring-code-format = true [tool.ruff.lint] extend-select = [ - # Same order as listed on https://docs.astral.sh/ruff/rules/ - "YTT", - "ANN", - "ASYNC", - "S", - "FBT", - "B", - "A", - "COM818", # Other comma rules are handled by formatting - "C4", - "DTZ", - "T10", - "EM", - "EXE", - "FA", - "ISC", - "ICN", - "LOG", - "G", - "INP", - "PIE", - "T20", - "PYI", - "PT", - "Q004", # Other quote rules are handled by formatting - "RSE", - "RET", - # This rule is a bit strict since accessing private members within this package can be - # useful to reduce public API exposure. But it is important to not access private members - # of external dependencies so we enable it and ignore the locations where we need to. - "SLF", - "SIM", - "SLOT", - "TID", - # TODO: Update TODOs then enable - # "TD", - "TC", - "ARG", - "PTH", - "FLY", - "I", - "N", - "PERF", - "E", - "W", - # TODO: Flesh out docs and enable - # "DOC" - # "D", - "F", - "PGH", - "PLC", - "PLE", - "PLW", - "UP", - "FURB", - "RUF", - # TODO: See if it makes sense to enable after a pass at reducing code duplication - # "TRY", + # Same order as listed on https://docs.astral.sh/ruff/rules/ + "YTT", + "ANN", + "ASYNC", + "S", + "FBT", + "B", + "A", + "COM818", # Other comma rules are handled by formatting + "C4", + "DTZ", + "T10", + "EM", + "EXE", + "FA", + "ISC", + "ICN", + "LOG", + "G", + "INP", + "PIE", + "T20", + "PYI", + "PT", + "Q004", # Other quote rules are handled by formatting + "RSE", + "RET", + # This rule is a bit strict since accessing private members within this package can be + # useful to reduce public API exposure. But it is important to not access private members + # of external dependencies so we enable it and ignore the locations where we need to. + "SLF", + "SIM", + "SLOT", + "TID", + # TODO: Update TODOs then enable + # "TD", + "TC", + "ARG", + "PTH", + "FLY", + "I", + "N", + "PERF", + "E", + "W", + # TODO: Flesh out docs and enable + # "DOC" + # "D", + "F", + "PGH", + "PLC", + "PLE", + "PLW", + "UP", + "FURB", + "RUF", + # TODO: See if it makes sense to enable after a pass at reducing code duplication + # "TRY", ] # Document reasons for ignoring specific linting errors ignore = [ - # Not applicable - "AIR", - # Dangerous false positives https://github.com/astral-sh/ruff/issues/4845 - "ERA", - # Not Applicable - "FAST", - # Important to call user callbacks safely - "BLE", - # stdlib includes a module named code. This is less of an issue since users need to import a module so allow it - "A005", - # TODO: Consider using copyright headers - "CPY", - # Not Applicable - "DJ", - # It's fine to have TODOs - "FIX", - # Not Applicable - "INT", - # Even prevents pytest.raises around an iteration which is too strict - "PT012", - # Triggers for protocol implementations that don't need the arg too - "ARG002", - # Complexity checks usually reduce readability - "C90", - # Not Applicable - "NPY", - # Not Applicable - "PD", - # We use the Exception suffix instead - "N818", - # Handled by formatting - "E111", - "E114", - "E117", - "E501", - "W191", - # Low signal-to-noise ratio - "PLR", + # Not applicable + "AIR", + # Dangerous false positives https://github.com/astral-sh/ruff/issues/4845 + "ERA", + # Not Applicable + "FAST", + # Important to call user callbacks safely + "BLE", + # stdlib includes a module named code. This is less of an issue since users need to import a module so allow it + "A005", + # TODO: Consider using copyright headers + "CPY", + # Not Applicable + "DJ", + # It's fine to have TODOs + "FIX", + # Not Applicable + "INT", + # Even prevents pytest.raises around an iteration which is too strict + "PT012", + # Triggers for protocol implementations that don't need the arg too + "ARG002", + # Complexity checks usually reduce readability + "C90", + # Not Applicable + "NPY", + # Not Applicable + "PD", + # We use the Exception suffix instead + "N818", + # Handled by formatting + "E111", + "E114", + "E117", + "E501", + "W191", + # Low signal-to-noise ratio + "PLR", ] typing-extensions = false @@ -201,22 +210,22 @@ typing-extensions = false [tool.ruff.lint.per-file-ignores] "conformance/test/**" = ["ANN", "INP", "SLF", "SIM115", "S101", "D"] "example/**" = [ - "ANN", - "S", # Keep examples simpler, e.g. allow normal random - "T20", - "D", + "ANN", + "S", # Keep examples simpler, e.g. allow normal random + "T20", + "D", ] "**/test_*.py" = [ - "ANN", - "S101", - "S603", - "S607", - "FBT", - "EM", - "INP", - "SLF", - "PERF", - "D", + "ANN", + "S101", + "S603", + "S607", + "FBT", + "EM", + "INP", + "SLF", + "PERF", + "D", ] "**/*_grpc.py" = ["N", "FBT"] @@ -224,26 +233,18 @@ typing-extensions = false required-imports = ["from __future__ import annotations"] split-on-trailing-comma = false -[tool.ruff] -# Don't run ruff on generated code from external plugins. -extend-exclude = ["*_pb2.py", "*_pb2.pyi"] - -[tool.pyright] -exclude = [ - # Defaults. - "**/node_modules", - "**/__pycache__", - "**/.*", - ".venv", - - # GRPC python files don't typecheck on their own. - # See https://github.com/grpc/grpc/issues/39555 - "**/*_pb2_grpc.py", - - # TODO: Work out the import issues to allow it to work. - "conformance/**", +[tool.uv] +constraint-dependencies = [ + "coverage==7.13.2", + "pytest==9.0.2", + "pytest-asyncio==1.3.0", + "pytest-cov==7.0.0", + "pytest-timeout==2.4.0", ] +[tool.uv.build-backend] +module-name = "connectrpc" + [tool.uv.workspace] members = ["connectrpc-otel", "example"] diff --git a/uv.lock b/uv.lock index 03e69a5..102fe8a 100644 --- a/uv.lock +++ b/uv.lock @@ -389,6 +389,7 @@ dev = [ { name = "pytest-timeout" }, { name = "pyvoy" }, { name = "ruff" }, + { name = "tombi" }, { name = "twisted", extra = ["http2", "tls"] }, { name = "typing-extensions" }, { name = "uvicorn" }, @@ -423,6 +424,7 @@ dev = [ { name = "pytest-timeout" }, { name = "pyvoy", specifier = "==0.3.0" }, { name = "ruff", specifier = "~=0.15.0" }, + { name = "tombi", specifier = "==0.9.9" }, { name = "twisted", extras = ["tls", "http2"], specifier = "==25.5.0" }, { name = "typing-extensions", specifier = "==4.15.0" }, { name = "uvicorn", specifier = "==0.42.0" }, @@ -1944,6 +1946,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/b1/74babcc824a57904e919f3af16d86c08b524c0691504baf038ef2d7f655c/taskgroup-0.2.2-py2.py3-none-any.whl", hash = "sha256:e2c53121609f4ae97303e9ea1524304b4de6faf9eb2c9280c7f87976479a52fb", size = 14237, upload-time = "2025-01-03T09:24:11.41Z" }, ] +[[package]] +name = "tombi" +version = "0.9.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/84/9bc2fa06c6636cecd37d0e21ec5c1dde9b6c0095259dea5fc54d201d2e4b/tombi-0.9.9.tar.gz", hash = "sha256:c435763a8cf506f6e392fccf06bd57f10c28111521e94e577e4acb8959a9456a", size = 557057, upload-time = "2026-03-21T01:56:03.704Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/47/680cf3ba0e5e09b3b05db04fdd884688a542d460b4aab3f25aae1d40d6ff/tombi-0.9.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a62b5c9e40709486b5b536bd3d19ec6a3e76935d5a9f0f9e2e251ad2ea2dde1e", size = 9357277, upload-time = "2026-03-21T01:55:54.355Z" }, + { url = "https://files.pythonhosted.org/packages/36/74/04703213a94d90912bdafb347726373b9c6b7129222dbcf56e78b1207168/tombi-0.9.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:42ab30668289b6ea2e8906992d528793dc9337a5de949f61d4dfec2adbc38a3f", size = 9019610, upload-time = "2026-03-21T01:55:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/b8/eb/60f54afd11d81a021299c5d741b46296df90c9b9bc4e8d8048b6c4e8790a/tombi-0.9.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99f1e91e68c7899de032526f6bb4e2271bf196b88aea5b3b49a131ce7206f4ee", size = 9259113, upload-time = "2026-03-21T01:55:42.255Z" }, + { url = "https://files.pythonhosted.org/packages/0e/98/4527f0e3f3a76fdb2d76d69d0616560c032fd65bcb5361ece395f5e2279f/tombi-0.9.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cff01b9cb5a2e9a2bf88d592515b40b33c37346be63d5b76affd47a2b58dbf0", size = 10426446, upload-time = "2026-03-21T01:55:48.917Z" }, + { url = "https://files.pythonhosted.org/packages/72/d1/bdfe25468356fa017761c12e9203dd3f5c790edfcce877da35e9b289a2f4/tombi-0.9.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9200c90c828c362b96cb8c6eaefeb7e12c45f53cb58024846684e1c0536bef14", size = 10577641, upload-time = "2026-03-21T01:55:44.253Z" }, + { url = "https://files.pythonhosted.org/packages/04/2f/4a0622115306ba0cb69181c22ec8522bbc4e573f5a6d59a31e796f4e0e7e/tombi-0.9.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ff411457ab01a0fe00785571b454545386f39d573e0ce9f0f24bab448a4b28e8", size = 9357340, upload-time = "2026-03-21T01:55:46.635Z" }, + { url = "https://files.pythonhosted.org/packages/70/57/d1710509396f8a87b7a74495288066e413af1554e32dd80db472214182c7/tombi-0.9.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f5670e11808c6d59b69be738e76a90f68283e5fa60405e06dee12359c554eb1", size = 9745547, upload-time = "2026-03-21T01:55:50.605Z" }, + { url = "https://files.pythonhosted.org/packages/66/dd/bbc906386c76501fc09912590170ff588c79b471df76436ba547d3b26024/tombi-0.9.9-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:deab61ee039249ccec30996b28930a631c20f6592171a67c526472697899229d", size = 9534489, upload-time = "2026-03-21T01:55:40.145Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ba/1712a07e8185891f5af37e3ec89433c1b35a4f2796d0ca545f957e7e612b/tombi-0.9.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1f06814906ec919b52947f702d4a44e2b9bd043056f893d991b44adc2b5f70c9", size = 9572706, upload-time = "2026-03-21T01:55:56.268Z" }, + { url = "https://files.pythonhosted.org/packages/51/87/e5c946816052306281dedd5587dd546f658b31a14425a2bc7d696d53e914/tombi-0.9.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:53838c73012a4aa123a7acf5d26b9a9b688ff60c33fb6cae023458bdaf25a572", size = 9271384, upload-time = "2026-03-21T01:55:58.317Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a4/c360343e4b9ecb5f9de5d92e063852ed80a975aba2ff2ee18e58f04d9f19/tombi-0.9.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:23db93e8097c010472d2ca92972c685e93e715b0236f1db3f900d6b69db05dc9", size = 9895966, upload-time = "2026-03-21T01:56:00.053Z" }, + { url = "https://files.pythonhosted.org/packages/c9/10/c01e89f20765b3491a86e43771f47b61969210cc313fdd4fb006abbace07/tombi-0.9.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:c71f071d4e614beaf18a59e54a3e8558fd1d87934578b8749b19a7551d73a4b4", size = 9951509, upload-time = "2026-03-21T01:56:02.05Z" }, + { url = "https://files.pythonhosted.org/packages/ce/cf/d9afdb1e377aaedae0cb70a45a1cfcd9022f22a8bc3ca85455c4721474d2/tombi-0.9.9-py3-none-win32.whl", hash = "sha256:7ec1b822121543e15c015e01a701fae00e8da478db1c100a60ff1cdd293bd87b", size = 7502079, upload-time = "2026-03-21T01:56:06.649Z" }, + { url = "https://files.pythonhosted.org/packages/5e/d7/f85282ac751396ef1cd74a4269ab8ee88147901ca0ba841ca0ed5dfbbb9d/tombi-0.9.9-py3-none-win_amd64.whl", hash = "sha256:8f8385421614621dacafcda0cf831693c98c45aaef78cc1484acd95aaf4a99fe", size = 8699726, upload-time = "2026-03-21T01:56:04.893Z" }, +] + [[package]] name = "tomli" version = "2.4.0" diff --git a/zensical.toml b/zensical.toml index bad4943..cc3174b 100644 --- a/zensical.toml +++ b/zensical.toml @@ -14,15 +14,22 @@ favicon = "img/favicon.png" repo = "fontawesome/brands/github" [project.markdown_extensions.attr_list] + [project.markdown_extensions.md_in_html] + [project.markdown_extensions.pymdownx.blocks.caption] + [project.markdown_extensions.pymdownx.highlight] anchor_linenums = true line_spans = "__span" pygments_lang_class = true + [project.markdown_extensions.pymdownx.inlinehilite] + [project.markdown_extensions.pymdownx.snippets] + [project.markdown_extensions.pymdownx.superfences] + [project.markdown_extensions.pymdownx.tabbed] alternate_style = true