Merge master into staging-nixos

This commit is contained in:
nixpkgs-ci[bot]
2026-08-06 12:39:28 +00:00
committed by GitHub
76 changed files with 1271 additions and 435 deletions

View File

@@ -118,7 +118,7 @@ stdenvNoCC.mkDerivation (
--script ./anchor.min.js \
--script ./anchor-use.js \
--sidebar-depth 3 \
--nav ./nav.json \
--experimental-config ./nav.json \
--header ${./header.html}\
--no-navheader \
manual.md \

View File

@@ -1,3 +1,4 @@
{
"open": []
"open": [],
"items": []
}

View File

@@ -21,22 +21,22 @@ vscode-utils.buildVscodeMarketplaceExtension (finalAttrs: {
sources = {
"x86_64-linux" = {
arch = "linux-x64";
hash = "sha256-s1V+SxZ4O5EHcxE9ZxacnydNjfnK1Dv0y3YIPfsy3cs=";
hash = "sha256-3V4N8zHj7nB987ImVtBS84LGxdQgkDp14kTPps72fHo=";
};
"aarch64-linux" = {
arch = "linux-arm64";
hash = "sha256-G9bJ6xNCiC72gR0k89sTh96alnHguSE5cqqOVu/3kCg=";
hash = "sha256-6p09GcEfmSQs4nRuaFxQ1tKK25ENo2KOPkRQTPndNcw=";
};
"aarch64-darwin" = {
arch = "darwin-arm64";
hash = "sha256-ZDel1FfsiRbdw9pxn1H5nkOIlVdt1GLr68W2mBtl1mg=";
hash = "sha256-qbYE3f0fkxvfGyFAR8UPIFodOEYA0aJK6JK/r8PbI/k=";
};
};
in
{
name = "claude-code";
publisher = "anthropic";
version = "2.1.222";
version = "2.1.223";
}
// sources.${stdenvNoCC.hostPlatform.system}
or (throw "Unsupported system ${stdenvNoCC.hostPlatform.system}");

View File

@@ -10,11 +10,11 @@
buildMozillaMach rec {
pname = "firefox-beta";
binaryName = "firefox-beta";
version = "153.0b13";
version = "154.0b7";
applicationName = "Firefox Beta";
src = fetchurl {
url = "mirror://mozilla/firefox/releases/${version}/source/firefox-${version}.source.tar.xz";
sha512 = "fecfb1837d1907d54ed52bc40113804b6637352c2cbe6eb906f950d7749cbece32446b42c392102fa9e16591949619237dc2dbeb13bec18697ddd42e9ce8d4dd";
sha512 = "2a7da6938054f01a443da8d7cbaa38c99d76d90661f404754096041d9e8d5a27b118dcebd27687867706ba2540e5d453b8908e35f75a712220e812436d239dee";
};
meta = {

View File

@@ -0,0 +1,74 @@
{
lib,
fetchFromGitHub,
nix-update-script,
python3Packages,
versionCheckHook,
}:
python3Packages.buildPythonApplication (finalAttrs: {
pname = "agentsploit";
version = "1.6.3";
pyproject = true;
__structuredAttrs = true;
src = fetchFromGitHub {
owner = "agentsploit";
repo = "agentsploit";
tag = "v${finalAttrs.version}";
hash = "sha256-g9h+hM6ujm0uvkWZMoOkZ/wUGA77Yu6lEn1ZNHh6aTg=";
};
build-system = with python3Packages; [ hatchling ];
dependencies = with python3Packages; [
anthropic
anyio
fastapi
httpx
ics
jinja2
mcp
openai
pydantic
pyyaml
reportlab
rich
structlog
typer
uvicorn
];
nativeCheckInputs = with python3Packages; [
jsonschema
pytestCheckHook
pytest-asyncio
pytest-cov-stub
types-pyyaml
];
nativeInstallCheckInputs = [ versionCheckHook ];
disabledTestPaths = [
# Tests need network access
"tests/integration/"
];
doInstallCheck = true;
versionCheckProgramArg = [ "version" ];
pythonImportsCheck = [ "agentsploit" ];
passthru.updateScript = nix-update-script { };
meta = {
description = "Offensive security framework for AI agents and MCP servers";
homepage = "https://github.com/agentsploit/agentsploit";
changelog = "https://github.com/agentsploit/agentsploit/blob/${finalAttrs.src.rev}/CHANGELOG.md";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ fab ];
mainProgram = "agentsploit";
};
})

View File

@@ -26,7 +26,7 @@ let
in
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "amp-cli";
version = "0.0.1785170481-ga5b614";
version = "0.0.1785975399-gb63fe6";
src = finalAttrs.passthru.sources.${stdenvNoCC.hostPlatform.system};
@@ -77,9 +77,9 @@ stdenvNoCC.mkDerivation (finalAttrs: {
url = "https://static.ampcode.com/cli/${finalAttrs.version}/amp-${platform}.gz";
hash =
{
x86_64-linux = "sha256-/XzK8g9ES5vYC2Y/z/kuFnfpL42oZGn3GQ/Qw1vfUR4=";
aarch64-linux = "sha256-hpqGi0TxkDgo6ygstE/Bsg75OPskj3RmiiR7895go+g=";
aarch64-darwin = "sha256-A4POFqAD5e6WOhfAT6ibYmr+eEDFqkb8pDJSgu2GXZs=";
x86_64-linux = "sha256-bVkrQPLvRJdoxrA0laDKG9DnJvp3Q7hyCj9wxRPcJas=";
aarch64-linux = "sha256-z0m9FLX99Y3gBwOlWVBjCqume1Uz+OEMg7W5KRm+NLw=";
aarch64-darwin = "sha256-EoCJ3MT7zkSq5yfmdVy40J6LhjwHcFbtdmkkycmdF6E=";
}
.${system'};
}

View File

@@ -28,13 +28,13 @@
stdenv.mkDerivation {
pname = "android-translation-layer";
version = "0-unstable-2026-01-19";
version = "0-unstable-2026-07-30";
src = fetchFromGitLab {
owner = "android_translation_layer";
repo = "android_translation_layer";
rev = "bfcfb696d83c9769e1d99d3cb0d7a5908fe3c767";
hash = "sha256-BTVduEJhKEOFhqoG0lgqlcg2x4k9RWABURj2nQECaek=";
rev = "cf2c759fa93330f45df6107dcf8984cf49b29c64";
hash = "sha256-+TTntAnE/5j/FhGcdXRui3/p/sfkc83CKNdBf9Yage0=";
};
patches = [

View File

@@ -1,8 +1,8 @@
[
{
"pname": "AngleSharp",
"version": "1.4.0",
"hash": "sha256-xHpoMkhYSj7ejeMmI2e7ygef84QGZhttPjYOnLjITd0="
"version": "1.5.2",
"hash": "sha256-81rDtnwvR0SDXNNUnPirWIa782gwkgRlz1Fbzm2ywwc="
},
{
"pname": "CryptSharpStandard",
@@ -276,13 +276,13 @@
},
{
"pname": "JetBrains.Annotations.Sources",
"version": "2025.2.4",
"hash": "sha256-QrgVgGkrtQs4eSl2pkG4ozSJHEAVNfPb23BMZauhjcg="
"version": "2026.2.0",
"hash": "sha256-AqShNJbFCrtUbrqti44j6cUglBApw+VdXWFgsTrO3TU="
},
{
"pname": "Markdig.Signed",
"version": "1.2.0",
"hash": "sha256-dC75KeDfJOretrOkaH1Ai/uEYWvxjBosn4NMEhD+LCo="
"version": "1.3.2",
"hash": "sha256-jfZYxd91vssC/R89L92sEnswH7DTIpKb2fyckjAy1mE="
},
{
"pname": "Microsoft.ApplicationInsights",
@@ -291,8 +291,13 @@
},
{
"pname": "Microsoft.AspNetCore.OpenApi",
"version": "10.0.8",
"hash": "sha256-v2E7nwc4Nac8Ns5cQ2KmzLash9AEMbfQbMo2bFy7oZM="
"version": "10.0.10",
"hash": "sha256-Mbr8+mzZKu3iq5R4TbNY8r39bZI34SWWd7DfUHg2ETk="
},
{
"pname": "Microsoft.Bcl.Cryptography",
"version": "10.0.2",
"hash": "sha256-+OYtcWsd1qZcEXadYeA4t6+pyADg1APQCxpKUtP002M="
},
{
"pname": "Microsoft.CodeAnalysis.ResxSourceGenerator",
@@ -301,13 +306,13 @@
},
{
"pname": "Microsoft.CodeCoverage",
"version": "18.3.0",
"hash": "sha256-fqKglbYvEb/77+rmUvLyLZSwROM1P9OW03Ub307WYZ8="
"version": "18.4.0",
"hash": "sha256-px8qchiuY5rkujAZ1wGEjuuhZdZmsRSp+FCiTmRUA1A="
},
{
"pname": "Microsoft.DiaSymReader",
"version": "2.2.3",
"hash": "sha256-Wf2Hy/9o3xSKB9ZRXj3oUgr2CcUwu+BFn2BP2cX7KJQ="
"version": "2.2.9",
"hash": "sha256-ouOuoXyE0nz+ikwyz3C8C/CYkWa/sLlOXhkw65D+qCQ="
},
{
"pname": "Microsoft.Extensions.Configuration",
@@ -324,6 +329,11 @@
"version": "10.0.0",
"hash": "sha256-YSiWoA3VQR22k6+bSEAUqeG7UDzZlJfHWDTubUO5V8U="
},
{
"pname": "Microsoft.Extensions.Configuration.EnvironmentVariables",
"version": "10.0.0",
"hash": "sha256-UayfeqrAmNyfOkuhcBKfj8UpjQqV/ZMqWrDyxCSG1MA="
},
{
"pname": "Microsoft.Extensions.DependencyInjection",
"version": "10.0.0",
@@ -341,8 +351,8 @@
},
{
"pname": "Microsoft.Extensions.DependencyModel",
"version": "8.0.2",
"hash": "sha256-PyuO/MyCR9JtYqpA1l/nXGh+WLKCq34QuAXN9qNza9Q="
"version": "10.0.8",
"hash": "sha256-YX986Og+47sJnNonmoZCqa54HCaZhJ8fJl45qeRaaUQ="
},
{
"pname": "Microsoft.Extensions.Diagnostics.Abstractions",
@@ -396,28 +406,28 @@
},
{
"pname": "Microsoft.IdentityModel.Abstractions",
"version": "8.18.0",
"hash": "sha256-mkguJA4aXIVVQvSJ9Duq9mivbGXAIkLQp3a8PKy223A="
"version": "8.19.2",
"hash": "sha256-vNGK6u6V+S0MIaYTg+sSkRF4XUjM1K+cKuR1a9aRCLs="
},
{
"pname": "Microsoft.IdentityModel.JsonWebTokens",
"version": "8.18.0",
"hash": "sha256-MdqY9CGRs+fTLb3HYYcSfuzqDFo4Dpho4McFWWferjA="
"version": "8.19.2",
"hash": "sha256-j9ai0NrgytDsfQiIijp1Ib4jRGX9lgREQBoE6XW9SOc="
},
{
"pname": "Microsoft.IdentityModel.Logging",
"version": "8.18.0",
"hash": "sha256-09WyYskyL8gjjVDzoZBQAGXgsPmyagWftALSBCdt4gg="
"version": "8.19.2",
"hash": "sha256-ja8PAYUNwlfIrkL6EOuZ7SgZfRJwIORGG/ETDD1BtRE="
},
{
"pname": "Microsoft.IdentityModel.Tokens",
"version": "8.18.0",
"hash": "sha256-sFhonZW9G6H4ooQ6N/78fkZvADZ2Hf5WAS3FKd/ue1E="
"version": "8.19.2",
"hash": "sha256-POi3SzcK3+iB3104wXYh3ooVD1GbltwTUf+KMj//UYU="
},
{
"pname": "Microsoft.NET.Test.Sdk",
"version": "18.3.0",
"hash": "sha256-o2bILLF5i+XUoi8xZYgolU3CxLTdql5R/tEVWVnKFPU="
"version": "18.4.0",
"hash": "sha256-ak/emX4C4KQVzc0bSNK4bChS+dvb3FvxZbJNrmf/2+w="
},
{
"pname": "Microsoft.OpenApi",
@@ -426,73 +436,73 @@
},
{
"pname": "Microsoft.Testing.Extensions.CodeCoverage",
"version": "18.5.2",
"hash": "sha256-PkIEXfbyEwlxOIG4h420/TpWbbzAy7eV8RUy7iXHVtk="
"version": "18.9.0",
"hash": "sha256-tNtPxYAoOlYmfPcdx5towgbmGRMxBDocUiAlAfXIgqA="
},
{
"pname": "Microsoft.Testing.Extensions.Telemetry",
"version": "2.2.3",
"hash": "sha256-e70IRoXt5Aiwhxwd6nay0SBQD3ESXcAGh0lCucNtCAE="
"version": "2.3.2",
"hash": "sha256-3TancCfYy7OW9IU6q+zQv/ETlbBbcjxADrWVRQITytc="
},
{
"pname": "Microsoft.Testing.Extensions.TrxReport",
"version": "2.2.3",
"hash": "sha256-guXkeZ4AcbP9uu87/9IpSuZZdt03mFxShU/z2avv3oY="
"version": "2.3.2",
"hash": "sha256-YMuc6dHVBpP8vk/qBQcO0MXeelpcrr9Wgnpvwi2xEv0="
},
{
"pname": "Microsoft.Testing.Extensions.TrxReport.Abstractions",
"version": "2.2.3",
"hash": "sha256-eLb2Sm0lzQkgkdFdcZ76aIGShIf4lRPmpcMauUWN5QE="
"version": "2.3.2",
"hash": "sha256-MohDLqtLk1K93p1TnvYlaBNetpGoTZSep3xVQho3zb0="
},
{
"pname": "Microsoft.Testing.Extensions.VSTestBridge",
"version": "2.2.3",
"hash": "sha256-bSNPv1gAWEU7DVtqYS1qjbBN3lu9TTh6+/nDQCcIIHk="
"version": "2.3.2",
"hash": "sha256-9W4FmGvIfuwHQr3AFrCZ/uLhtJws5erQccw7ydT5yBU="
},
{
"pname": "Microsoft.Testing.Platform",
"version": "2.1.0",
"hash": "sha256-CbR0j0Dh65cMccO7L6ppx4b5iiXjqxjjfC9A85HeLuM="
"version": "2.3.0",
"hash": "sha256-9ZpWaMU5RmHXTJ3d/aM0WQ3u1IN0w2La4yrOqt7PB14="
},
{
"pname": "Microsoft.Testing.Platform",
"version": "2.2.3",
"hash": "sha256-Mz///qqkbdQsgpIjjAiHf/ptvjeQIsO6S99+tg+F8Fw="
"version": "2.3.2",
"hash": "sha256-kGOyHXenLNMpWyVTDWDh6/hP3qFtnHI5qIaet1udKWM="
},
{
"pname": "Microsoft.Testing.Platform.MSBuild",
"version": "2.2.3",
"hash": "sha256-mwt+i2y8UV30JrssGCx9kgjcZ+upWhAxEBs5fCXA/6k="
"version": "2.3.2",
"hash": "sha256-u0jsv5BU7gSBZlHoy94WlqM0QCJCFbEW1g19RxKn17Q="
},
{
"pname": "Microsoft.TestPlatform.ObjectModel",
"version": "18.3.0",
"hash": "sha256-3Y3OxAQsXl6sunQlSjfq31aLWykHQTj2o/TOVI/uy88="
"version": "18.4.0",
"hash": "sha256-ERL2goDaM0vUElW25DM/5lI2WplE5E6g9mhTegY0bC8="
},
{
"pname": "Microsoft.TestPlatform.TestHost",
"version": "18.3.0",
"hash": "sha256-OkR+XvipAHPQbHywTwN8lVcMpyRs2MUJKCxJ5OfKAFk="
"version": "18.4.0",
"hash": "sha256-S4T/6xHvov8jDcbcuZAOoutMAEudUb3dMP7MyxVa8Fo="
},
{
"pname": "MSTest",
"version": "4.2.3",
"hash": "sha256-G6agMAoiK8oMPTpq25i7zsUXXCDxGMP/UBU72Wky9t0="
"version": "4.3.2",
"hash": "sha256-wuyrsPndMA7FwEhwL+7mevm5WYF1nytvObPlAHIo5fU="
},
{
"pname": "MSTest.Analyzers",
"version": "4.2.3",
"hash": "sha256-XlSqWrZVG1nC/qDjNuSs51pM90nQ9QlQtwDKJQVsMPg="
"version": "4.3.2",
"hash": "sha256-mzMMs8H6u2pRnOb6UjA1pwSOKsULx2v18Stvp/cvxj0="
},
{
"pname": "MSTest.TestAdapter",
"version": "4.2.3",
"hash": "sha256-ckBpU7gg4LY2ZBPljRWz2yCj33vRf93Qm/JY7uGfeOs="
"version": "4.3.2",
"hash": "sha256-qiXoMftAKNEtN2LFwMd2e8EkBn03RfIk15CljjOuU0A="
},
{
"pname": "MSTest.TestFramework",
"version": "4.2.3",
"hash": "sha256-og5IO5g/fXm1y9hSNkqZ+libfD9o0dRm/8I9CF0J2So="
"version": "4.3.2",
"hash": "sha256-BQUOSbJd2LE5C4C5yx7MTozHaWxpo5R6mPC6EdzVHVk="
},
{
"pname": "Newtonsoft.Json",
@@ -521,58 +531,58 @@
},
{
"pname": "NLog",
"version": "6.1.3",
"hash": "sha256-s0sxfQ1tiWRSFVh/m/eIzEe4+ZgT02e9GZiwDAi7xp4="
"version": "6.1.4",
"hash": "sha256-76h0KhYh0B6NDrkV5MHhv8SqUSvhTF6CFKsao5nRBbQ="
},
{
"pname": "NLog.Extensions.Logging",
"version": "6.1.3",
"hash": "sha256-7Ryjk3FZqz6Cn8bCSK5OUf7VCQL9LA/bMCgwr5tpIys="
"version": "6.1.4",
"hash": "sha256-ChUPGAWJls61E3/w+3q9/jlxDaqGVxCbB6b6mHAPsI8="
},
{
"pname": "NLog.Web.AspNetCore",
"version": "6.1.3",
"hash": "sha256-FXxcK5kXO6qy/jw0lnphzhs9QF3u/i5A4GD13jqclUA="
"version": "6.1.4",
"hash": "sha256-PWrgqvrszRzOvk4tX0n70pa6wDea6eD+C/+2+QKFgoI="
},
{
"pname": "OpenTelemetry",
"version": "1.15.3",
"hash": "sha256-zOrEPW8noHfUINJtIWQYMTls2JLRUYm7aoyffjrMBLU="
"version": "1.17.0",
"hash": "sha256-z68MFp4PEANJeJ3O0nTfJcWosZ4eZl7Y5T93wVYKdKA="
},
{
"pname": "OpenTelemetry.Api",
"version": "1.15.3",
"hash": "sha256-vriWJD2xvBt6ir9u5o/aVPBqBJJA7S6IJhkjKDkeLfc="
"version": "1.17.0",
"hash": "sha256-r/Op/9OQhmL3H+XnkumD8BSdb6WwazolraVXCWDvfdA="
},
{
"pname": "OpenTelemetry.Api.ProviderBuilderExtensions",
"version": "1.15.3",
"hash": "sha256-Z4x0eA1dkCOJS5xYZ6ogMOk6H+ivvXuVj1mORyWMOSo="
"version": "1.17.0",
"hash": "sha256-dAzEFnvUGs0BjQ0Dpxl6ird18yk9ur3djAFVZXJktGM="
},
{
"pname": "OpenTelemetry.Exporter.Prometheus.AspNetCore",
"version": "1.15.3-beta.1",
"hash": "sha256-qgaIwTB9To17OifsThq1AsXg1Ms8sqnooAvf+gNJR8Y="
"version": "1.17.0-beta.1",
"hash": "sha256-5HpmgbBzLf1YX5FkdQHXKsq5rXgctNoSrUqc2iaNolc="
},
{
"pname": "OpenTelemetry.Extensions.Hosting",
"version": "1.15.3",
"hash": "sha256-5Z5/80xNttniodCF71s9cGXvDCkIc8Qdvpr969K5G0c="
"version": "1.17.0",
"hash": "sha256-wesl30ehEO8aIf4kDRRE2iHkMKnv6Ox/4LyQdmtLBnc="
},
{
"pname": "OpenTelemetry.Instrumentation.AspNetCore",
"version": "1.15.2",
"hash": "sha256-rfStn++qynwoTOa5H5IFwbAPn7sOgW/vebcfKvOusio="
"version": "1.17.0",
"hash": "sha256-ydRp8bo5vnHkNzUUHl631WAwbl2d78jQRWXLVvL/QEs="
},
{
"pname": "OpenTelemetry.Instrumentation.Http",
"version": "1.15.1",
"hash": "sha256-VG3zmUmFcN+mk7BkIcss1RjkcrVWrQMn8AUDTM4wpus="
"version": "1.17.0",
"hash": "sha256-QFGOiVZ91oDhu3e/C7vUWxq0v5fcaoaWkwbyWbzIhbo="
},
{
"pname": "OpenTelemetry.Instrumentation.Runtime",
"version": "1.15.1",
"hash": "sha256-wE0909zdzuGUB/KD/yEfLV9F5EvZGMmwjL2tpO4bOh4="
"version": "1.17.0",
"hash": "sha256-YCVl3X4hEqWeJ4buBA6wdQDwDXeR2Ae/fHyuySKqCX0="
},
{
"pname": "protobuf-net",
@@ -586,8 +596,8 @@
},
{
"pname": "Scalar.AspNetCore",
"version": "2.14.14",
"hash": "sha256-/9lh1yFvp8/ROxdQcJEhEtFwrpOCdRNwFfz8B53epVk="
"version": "2.16.15",
"hash": "sha256-XRzl2wnxnR84jshpKbQbosfU+D3wMAZx7Qs8PwmxXe4="
},
{
"pname": "SteamKit2",
@@ -596,33 +606,33 @@
},
{
"pname": "System.Composition",
"version": "10.0.8",
"hash": "sha256-sp1IzwdxzVZwEF3mOCkobc5SYUGm/u3FDZUPkekoxZs="
"version": "10.0.10",
"hash": "sha256-u3CKzFRnQ10eMC67s610GQj5/CaEGxxpDtQB028NbzA="
},
{
"pname": "System.Composition.AttributedModel",
"version": "10.0.8",
"hash": "sha256-6iUFdykgMj6yOG10qR3TOz6mrQnfDGsr4Q8WP65hBFU="
"version": "10.0.10",
"hash": "sha256-aGKpD94yaSuK0vmdV8tSPZ4BtHaFZ90H2XxbePvmaMs="
},
{
"pname": "System.Composition.Convention",
"version": "10.0.8",
"hash": "sha256-MIQePJ3OkWpA07U+xH1PwiV88WtSGBaTxUrA1j4hD6Y="
"version": "10.0.10",
"hash": "sha256-o+ptLKlKBZAYri+QVDCeP4ljfXDCQ176fUaI0FeHL2o="
},
{
"pname": "System.Composition.Hosting",
"version": "10.0.8",
"hash": "sha256-SOAD0Yz8A/XJ8tEi7Q8DL9H7FzTcgg8HAbnZYKiyZNk="
"version": "10.0.10",
"hash": "sha256-VMZs+YqwwIJsCpUiC+kdbDjG7l+qnjk7Nq4Tnbtg058="
},
{
"pname": "System.Composition.Runtime",
"version": "10.0.8",
"hash": "sha256-hRkoJ8S1oD4FKjnaDYwfzX2Pys6QvGiiX6YxrdGgAyA="
"version": "10.0.10",
"hash": "sha256-HTIvnvhcTdMdEv7Y20vK+VuQy9reqOfMQRKWjzeEr+I="
},
{
"pname": "System.Composition.TypedParts",
"version": "10.0.8",
"hash": "sha256-NYo2dvMJ9WU0BKIGDkuIpFQHkbZE1sGJAtY8fINFpqo="
"version": "10.0.10",
"hash": "sha256-Qx3V/LSM5jHwnHVl77w3G7jK3EhnFWgmWxCAJ1Fyres="
},
{
"pname": "System.IO.Hashing",
@@ -631,13 +641,13 @@
},
{
"pname": "System.Security.Cryptography.ProtectedData",
"version": "10.0.8",
"hash": "sha256-GYRQSkRnDWytMIQcoNrAVbJda5nzfbtg1HJuwRZVxH0="
"version": "10.0.10",
"hash": "sha256-sKm55fvpXHZIH5Jw+zTz06BwMb8Nog5+1LgxPyU5lbk="
},
{
"pname": "Tmds.DBus.Protocol",
"version": "0.93.0",
"hash": "sha256-Oi2SDkrhTG3v9KXlRsmXQWsRJbQYVqg9bgiao1pUD0k="
"version": "0.94.2",
"hash": "sha256-ZUxaReVMikjf3VqjUSSTovcjDTWJO8jHNKrvj1dgHJI="
},
{
"pname": "ZstdSharp.Port",

View File

@@ -21,13 +21,13 @@ in
buildDotnetModule rec {
pname = "archisteamfarm";
# nixpkgs-update: no auto update
version = "6.3.6.1";
version = "6.3.8.4";
src = fetchFromGitHub {
owner = "JustArchiNET";
repo = "ArchiSteamFarm";
tag = version;
hash = "sha256-C0n3e/t1Bq02vlrF/KyT7vlhtNDIbAsg9zAk9aKZ5/g=";
hash = "sha256-LCynvt8TzvfttqHMq0yAjrP5V8IK/dnpJogeh+6NWoY=";
};
dotnet-runtime = dotnetCorePackages.aspnetcore_10_0;

View File

@@ -7,7 +7,7 @@
buildNpmPackage rec {
pname = "asf-ui";
version = "a4d5a9a4fbd09ad2ed00ec09db8344175f120898";
version = "5e028bc91dd3c0238b602714d96713a205600248";
src = fetchFromGitHub {
owner = "JustArchiNET";
@@ -15,10 +15,10 @@ buildNpmPackage rec {
# updated by the update script
# this is always the commit that should be used with asf-ui from the latest asf version
rev = version;
hash = "sha256-PP9VT1F8EX5AgNr3OGsirDkUSVAzKHbBpJi6XBlEWeg=";
hash = "sha256-HdUdSrwTXALoT7qmcAYwaeaw1POus8++TBeoqIuEMDM=";
};
npmDepsHash = "sha256-bqwDKSaQt6ptfZC7B332Ig/BAZvJRQ/NaxPgA5VQ884=";
npmDepsHash = "sha256-Vhs5apBz951fcvIx8J+/oShit7rD4/RB919d40cjavs=";
installPhase = ''
runHook preInstall

View File

@@ -22,13 +22,13 @@
}:
stdenv.mkDerivation (finalAttrs: {
pname = "art-standalone";
version = "0-unstable-2025-10-09";
version = "0-unstable-2026-08-03";
src = fetchFromGitLab {
owner = "android_translation_layer";
repo = "art_standalone";
rev = "e78bf68917bcaaf58fef3960cd88793b3b7f39cc";
hash = "sha256-0r6Ap41AMSHhZpMJ5QoWiGGcHPj35et4kiA20xs9uLs=";
rev = "66a5d9079b159e9c5819bfeef4a6fff6a5f32719";
hash = "sha256-4dRKghsPP8XLCcCe6bQDzJVlggBdFWe3l2/ge35HIXA=";
};
patches = [

View File

@@ -13,11 +13,11 @@
stdenv.mkDerivation (finalAttrs: {
pname = "awakened-poe-trade";
version = "3.29.102";
version = "3.29.103";
src = fetchurl {
url = "https://github.com/SnosMe/awakened-poe-trade/releases/download/v${finalAttrs.version}/Awakened-PoE-Trade-${finalAttrs.version}.AppImage";
hash = "sha256-mjtdM8tEi+Gvf3B4gopEEqlNfp89+J4w1Jy+dyWtig8=";
hash = "sha256-Nxq9b58nmpvXs3xKWYi0IpI9QyYbrLPWJplA1l6hKzE=";
};
passthru = {

View File

@@ -14,13 +14,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "bionic-translation";
version = "0-unstable-2025-11-25";
version = "0-unstable-2026-08-03";
src = fetchFromGitLab {
owner = "android_translation_layer";
repo = "bionic_translation";
rev = "5c31d4366fbb0af70690e72e5a861e7b44ffb1ef";
hash = "sha256-dlHjx6+yymvIjDEs2TZexZUIUz32iKD0r+H4AJ89xig=";
rev = "484b1b05795784a5a57dbd4ffad21a3e680a33b2";
hash = "sha256-43VJPhN8/J/pJr8mdV9/n+hrVZLzh7aQhAJ8cT53BHc=";
};
nativeBuildInputs = [

View File

@@ -6,16 +6,16 @@
buildGoModule (finalAttrs: {
pname = "checkmate";
version = "0.9.3";
version = "1.3.3";
src = fetchFromGitHub {
owner = "adedayo";
repo = "checkmate";
rev = "v${finalAttrs.version}";
hash = "sha256-XzzN4oIG6E4NsMGl4HzFlgAGhkRieRn+jyA0bT8fcrg=";
hash = "sha256-FxBDeFdLORh76oHqrB+NXhz2nVH4bHJEF7ioSx+fngM=";
};
vendorHash = "sha256-D87b/LhHnu8xE0wRdB/wLIuf5NlqrVnKt2WAF29bdZo=";
vendorHash = "sha256-RM1jgnnCdGb06Uu7xoujjVjhYZSjGozesg+DFOjib1I=";
subPackages = [ "." ];

View File

@@ -1,47 +1,47 @@
{
"version": "2.1.222",
"commit": "fbf49312c28437bf9c2546b9ace3bd7b34eb6ff6",
"buildDate": "2026-08-04T01:46:04Z",
"version": "2.1.223",
"commit": "4535f69721056abf01650c73ee8a91c69ba00838",
"buildDate": "2026-08-05T21:55:19Z",
"platforms": {
"darwin-arm64": {
"binary": "claude",
"checksum": "c66a6cc6fa2e8145bb1a6e77831f2caf4b83690ff04650500dfa6e2c05ca997c",
"size": 271289792
"checksum": "fcbe0b8d47570c501302dd1ad31cc26ac2810f022c45fa253936a6961dee32bf",
"size": 272553824
},
"darwin-x64": {
"binary": "claude",
"checksum": "36bfc6482a25730dbb1cee72589e522c66c45a4dc9ebfdd8a76a8113b01b6188",
"size": 280847136
"checksum": "350e657428a6d34f7cf71f6738c5ebb6a1952ccb12fc1747f64297e065b1846f",
"size": 282118560
},
"linux-arm64": {
"binary": "claude",
"checksum": "a04be0a8d7fe0259571ab7411d51d85658d71a4a26ce62b60c908290372e6016",
"size": 286178232
"checksum": "60e83d8db0e894d0e54413e5e7daa256d180db660f51e139a51b614fc30cf3ac",
"size": 287423416
},
"linux-x64": {
"binary": "claude",
"checksum": "10caae8f22b915c26bfff0e013a4d45608c4f1ae287583626569156f447730e5",
"size": 289467400
"checksum": "98226474f802e3094d6a86c5ade8883c16206d0fcb5c400b7401c800063e99d7",
"size": 290728968
},
"linux-arm64-musl": {
"binary": "claude",
"checksum": "a3c3e3202ae8842a5e9d2b4ce1dcea9fa00d4e0ae27b5b3e8d778332ba3bb23c",
"size": 279491944
"checksum": "f41692eab23ebcd836d342fbc494d8783b1f19efb13d04fbf8461d2806ccb586",
"size": 280737128
},
"linux-x64-musl": {
"binary": "claude",
"checksum": "e0b0fb4005e1ac0ebcee136254c638722f1c49e171a23d0843c605d72aac9029",
"size": 284074576
"checksum": "8a4e561e8af19746d2defcf1a5661f5c0384c9c26dadd87d45e11b67802ad147",
"size": 285336144
},
"win32-x64": {
"binary": "claude.exe",
"checksum": "032cb799d2abfaa6ca440f6458304b9a2a250521063d21ebcea7f3c77c443db7",
"size": 279014048
"checksum": "a708ba811c4cc46907df358e22f2aa6da3dbc28192747e4d3c4a0869752fe722",
"size": 280233632
},
"win32-arm64": {
"binary": "claude.exe",
"checksum": "f760aa2782019e55b1e44fda9eddec85ca8499429da87efddd47ab18d4a716a2",
"size": 273687200
"checksum": "8efb44f04fda50fac3c7602276903e44ff82d48f1a29a41f1a5d98891a01864b",
"size": 274906784
}
},
"sdkCompat": {

View File

@@ -6,18 +6,18 @@
buildGoModule (finalAttrs: {
pname = "cnspec";
version = "13.30.1";
version = "13.32.1";
src = fetchFromGitHub {
owner = "mondoohq";
repo = "cnspec";
tag = "v${finalAttrs.version}";
hash = "sha256-u617olxSFcDd/6qK26SteiGOzEN+1shqntUzgw6bFq8=";
hash = "sha256-f4Cx525MsVrpXDTxDJeG0ddsaFb2aqGWhZCm20pD8lU=";
};
proxyVendor = true;
vendorHash = "sha256-VwaV6OHl9LPLD2BbIESRjG572W5uGH4514P3ue2f894=";
vendorHash = "sha256-cxFhSCIiNOrnicgqR1OC7vuEDQbQeEuCamb08elA++Y=";
subPackages = [ "apps/cnspec" ];

View File

@@ -6,14 +6,14 @@
python3Packages.buildPythonApplication (finalAttrs: {
pname = "contact";
version = "1.5.8";
version = "1.6.7";
pyproject = true;
src = fetchFromGitHub {
owner = "pdxlocations";
repo = "contact";
tag = finalAttrs.version;
hash = "sha256-YNDw/lAPuJIyK6abRnl5WOyv8+t/PTtmBvFWu7NTVwY=";
hash = "sha256-i+mWkHdDJAGiX0F4vTygU9oGqUeczSaziiOwRqAXa30=";
};
dependencies = [ python3Packages.meshtastic ];

View File

@@ -14,13 +14,13 @@
buildGoModule (finalAttrs: {
pname = "fence";
version = "0.1.64";
version = "0.1.66";
src = fetchFromGitHub {
owner = "fencesandbox";
repo = "fence";
tag = "v${finalAttrs.version}";
hash = "sha256-pBeTUcLs3fLGTkbmmUcikPDtGUQ4s3Q8XbKQYsPJTKw=";
hash = "sha256-I3nrM2W21n6YdYnE8OhjqBF0969EaWY0k9U6BJDGFHw=";
};
vendorHash = "sha256-WjhfAw8wgxvTbTkYwURm9vN2oSvQWiMP2RhwZDCQ0DU=";

View File

@@ -11,14 +11,14 @@
stdenv.mkDerivation (finalAttrs: {
pname = "fna3d";
version = "26.06";
version = "26.08";
src = fetchFromGitHub {
owner = "FNA-XNA";
repo = "FNA3D";
tag = finalAttrs.version;
fetchSubmodules = true;
hash = "sha256-p85nZzpegjXQTUv64Pxhn6BxBTUN5bOs73cgqLu79GI=";
hash = "sha256-KD2HSBvB7oiy4/AAYSi+bOEYYYyP3XqtYvjZOBIYzig=";
};
cmakeFlags = [

View File

@@ -18,14 +18,14 @@
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "jenkins";
version = "2.568.1";
version = "2.568.2";
strictDeps = true;
__structuredAttrs = true;
src = fetchurl {
url = "https://get.jenkins.io/war-stable/${finalAttrs.version}/jenkins.war";
hash = "sha256-WPJPOWX773cIYp++FY1RvxOP/Vd8rbyGtGNn6K0L64M=";
hash = "sha256-m7srMp5Scwun3s0aehCVmH9iUOx2H7IRV9uyy80e9ZA=";
};
nativeBuildInputs = [ makeWrapper ];

View File

@@ -11,16 +11,16 @@
buildGoModule (finalAttrs: {
pname = "kcl";
version = "0.12.7";
version = "0.12.8";
src = fetchFromGitHub {
owner = "kcl-lang";
repo = "cli";
rev = "v${finalAttrs.version}";
hash = "sha256-HPydO/gBJkMsqR3Eb3ymKprm5x7tr9//IKT052hiDNA=";
hash = "sha256-hw5Ul0+0OT9hI8Nmg5tozwfPnXcF2q+K6aAFPxcMkgY=";
};
vendorHash = "sha256-46qLRdB0epfZPuvNVYaLIAiTkI9kbAS6OM9OYC8cmmE=";
vendorHash = "sha256-WpUGScCd/laihQjC0oGKMYpOLMgfk/t7u3mrsCvf+Rk=";
subPackages = [ "cmd/kcl" ];

View File

@@ -57,10 +57,9 @@ python3Packages.buildPythonApplication (finalAttrs: {
bashate
];
# Tests output a few exceptions but still succeed
checkPhase = ''
runHook preCheck
stestr run -e <(echo "test_load_ok")
stestr run
runHook postCheck
'';

View File

@@ -0,0 +1,55 @@
{
lib,
fetchFromGitHub,
nix-update-script,
python3Packages,
versionCheckHook,
}:
python3Packages.buildPythonApplication (finalAttrs: {
pname = "kubexhunt";
version = "2.1";
pyproject = true;
__structuredAttrs = true;
src = fetchFromGitHub {
owner = "mr-xhunt";
repo = "kubeXhunt";
tag = "v${finalAttrs.version}";
hash = "sha256-MknzQhNLtuiW89TBYYU00xGgYZEbIKqMNk9I1SvzDzs=";
};
build-system = with python3Packages; [ setuptools ];
dependencies = with python3Packages; [
azure-identity
boto3
google-cloud-iam
neo4j
jinja2
];
nativeCheckInputs = with python3Packages; [
pytest-cov-stub
pytestCheckHook
safety
];
nativeInstallCheckInputs = [ versionCheckHook ];
pythonImportsCheck = [ "kubexhunt" ];
doInstallCheck = true;
passthru.updateScript = nix-update-script { };
meta = {
description = "Kubernetes security assessment toolkit";
homepage = "https://github.com/mr-xhunt/kubeXhunt";
changelog = "https://github.com/mr-xhunt/kubeXhunt/releases/tag/v${finalAttrs.version}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ fab ];
mainProgram = "kubexhunt";
};
})

View File

@@ -17,7 +17,7 @@ buildNpmPackage (finalAttrs: {
src
sourceRoot
;
hash = "sha256-X+RzRM1rRZZ2k1kjtk0JVXBIbEIuX5mk/zRzwjGKr1s=";
hash = "sha256-PArNKjdLqKJSEEKe94mguzKiNSwpYk56inenU3GL1mI=";
};
npmBuildScript = "build";

View File

@@ -22,7 +22,7 @@ buildNpmPackage (finalAttrs: {
pname = "${finalAttrs.pname}-npm-deps";
inherit version src;
inherit (finalAttrs) sourceRoot;
hash = "sha256-nZURiOcSgXZwXBkB43GPerXUF2RSTiEPnjsVLSyXKxw=";
hash = "sha256-rqtLjMp0nCfo1wDAeB5WxVtmL/TR3Ky3qaMaBohnH1M=";
};
npmBuildScript = "build";

View File

@@ -6,13 +6,13 @@
python3,
}:
let
version = "1.25.0";
version = "1.25.2";
src = fetchFromGitHub {
owner = "suitenumerique";
repo = "meet";
tag = "v${version}";
hash = "sha256-0+X7kqydIkISYh+zy8/dqOkhkNmkpCuRgyq32OKtbcY=";
hash = "sha256-gtChKd6sr2nHEmi0Z/nbuCCNsOD8iVIAFjqonZFgQ/Y=";
};
meta = {

View File

@@ -24,7 +24,7 @@
portmidi,
pugixml,
python3,
libsForQt5,
qt6,
rapidjson,
sqlite,
utf8proc,
@@ -36,14 +36,14 @@
stdenv.mkDerivation (finalAttrs: {
pname = "mame";
version = "0.287";
version = "0.289";
srcVersion = builtins.replaceStrings [ "." ] [ "" ] finalAttrs.version;
src = fetchFromGitHub {
owner = "mamedev";
repo = "mame";
rev = "mame${finalAttrs.srcVersion}";
hash = "sha256-d1Y3KrJwL8iDjQDqG6FRN82WzVAqTcY1YJaayUQO8sk=";
hash = "sha256-tbveDIOPZjEoTmo5rV2fR9An1I6X4P8Ec7HYHWL6H6U=";
};
outputs = [
@@ -88,7 +88,7 @@ stdenv.mkDerivation (finalAttrs: {
sdl3
sdl3-ttf
sqlite
libsForQt5.qtbase
qt6.qtbase
]
++ lib.optionals stdenv.hostPlatform.isLinux [
alsa-lib
@@ -108,7 +108,7 @@ stdenv.mkDerivation (finalAttrs: {
pkg-config
python3
which
libsForQt5.wrapQtAppsHook
qt6.wrapQtAppsHook
];
patches = [

View File

@@ -3,9 +3,9 @@ import hashlib
import html
import json
import re
import xml.sax.saxutils as xml
from abc import abstractmethod
from collections.abc import Mapping, Sequence
from dataclasses import dataclass
from pathlib import Path
from typing import Any, Callable, ClassVar, Generic, NamedTuple, cast, get_args
@@ -44,6 +44,7 @@ class BaseConverter(Converter[md.TR], Generic[md.TR]):
self._current_type = ['book']
try:
tokens = self._parse(infile.read_text())
self._prepend_config(infile, tokens)
self._postprocess(infile, outfile, tokens)
converted = self._renderer.render(tokens)
outfile.write_text(converted)
@@ -53,6 +54,9 @@ class BaseConverter(Converter[md.TR], Generic[md.TR]):
def _postprocess(self, infile: Path, outfile: Path, tokens: Sequence[Token]) -> None:
pass
def _prepend_config(self, infile: Path, tokens: list[Token]) -> None:
pass
def _handle_headings(self, tokens: list[Token], *, src: str, on_heading: Callable[[Token,str],None]) -> None:
# Headings in a globally numbered order
# h1 to h6
@@ -232,6 +236,7 @@ class RendererMixin(Renderer):
'included_preface': lambda *args: self._included_thing("preface", *args),
'included_parts': lambda *args: self._included_thing("part", *args),
'included_appendix': lambda *args: self._included_thing("appendix", *args),
'included_content': lambda *args: self._included_thing("content", *args),
'included_options': self.included_options,
}
@@ -264,7 +269,6 @@ class HTMLParameters(NamedTuple):
# structural depth of the navigation sidebar tree
sidebar_depth: int
media_dir: Path
sidebar_open: frozenset[str] = frozenset()
header: Path | None = None
no_navheader: bool = False
@@ -273,15 +277,18 @@ class ManualHTMLRenderer(RendererMixin, HTMLRenderer):
_in_dir: Path
_html_params: HTMLParameters
_redirects: Redirects | None
_sidebar_open: frozenset[str]
def __init__(self, toplevel_tag: str, revision: str, html_params: HTMLParameters,
manpage_urls: Mapping[str, str], xref_targets: dict[str, XrefTarget],
redirects: Redirects | None, in_dir: Path, base_path: Path):
redirects: Redirects | None, in_dir: Path, base_path: Path,
sidebar_open: frozenset[str]):
super().__init__(toplevel_tag, revision, manpage_urls, xref_targets)
self._in_dir = in_dir
self._base_path = base_path.absolute()
self._html_params = html_params
self._redirects = redirects
self._sidebar_open = sidebar_open
def _pull_image(self, src: str) -> str:
src_path = Path(src)
@@ -542,7 +549,10 @@ document.addEventListener("DOMContentLoaded", createObserver);
link = f'<a href="{e.target.href()}">{e.target.toc_html}</a>'
cls = html.escape(e.kind, True)
if children:
open_attr = " open" if e.target.id in self._html_params.sidebar_open else ""
# a group without an 'id' in the config gets open_id "".
# the empty key then fails the truth test, so the group stays closed.
key = e.target.id if e.open_id is None else e.open_id
open_attr = " open" if key and key in self._sidebar_open else ""
items.append(
f'<li class="{cls}">'
f'<details{open_attr}><summary>{link}</summary>{children}</details>'
@@ -607,6 +617,25 @@ document.addEventListener("DOMContentLoaded", createObserver);
def _to_base26(n: int) -> str:
return (_to_base26(n // 26) if n > 26 else "") + chr(ord("A") + n % 26)
@dataclass
class ConfigLeaf:
file: str
label: str | None = None
@dataclass
class ConfigGroup:
label: str
children: list["ConfigNode"]
id: str | None = None
ConfigNode = ConfigLeaf | ConfigGroup
@dataclass
class ConfigManifest:
items: list[ConfigNode]
open: frozenset[str]
class HTMLConverter(BaseConverter[ManualHTMLRenderer]):
INCLUDE_ARGS_NS = "html"
INCLUDE_FRAGMENT_ALLOWED_ARGS = { 'into-file' }
@@ -618,24 +647,127 @@ class HTMLConverter(BaseConverter[ManualHTMLRenderer]):
_xref_targets: dict[str, XrefTarget]
_redirection_targets: set[str]
_appendix_count: int = 0
_config_path: Path | None
_config: ConfigManifest | None
def _next_appendix_id(self) -> str:
self._appendix_count += 1
return _to_base26(self._appendix_count - 1)
def __init__(self, revision: str, html_params: HTMLParameters, manpage_urls: Mapping[str, str], redirects: Redirects | None = None):
def __init__(
self,
revision: str,
html_params: HTMLParameters,
manpage_urls: Mapping[str, str],
redirects: Redirects | None = None,
config_path: Path | None = None
):
super().__init__()
self._revision, self._html_params, self._manpage_urls, self._redirects = revision, html_params, manpage_urls, redirects
self._config_path = config_path
self._config = None
self._xref_targets = {}
self._redirection_targets = set()
# renderer not set on purpose since it has a dependency on the output path!
def convert(self, infile: Path, outfile: Path) -> None:
try:
self._config = self._load_config()
except Exception as e:
raise RuntimeError(f"failed to load config '{self._config_path}'") from e
sidebar_open = self._config.open if self._config is not None else frozenset()
self._renderer = ManualHTMLRenderer(
'book', self._revision, self._html_params, self._manpage_urls, self._xref_targets,
self._redirects, infile.parent, outfile.parent)
self._redirects, infile.parent, outfile.parent, sidebar_open)
super().convert(infile, outfile)
def _load_config(self) -> ConfigManifest | None:
if self._config_path is None:
return None
src = self._config_path.read_text()
config = json.loads(src)
if not isinstance(config, dict) or not isinstance(config.get('items'), list):
raise SrcError(
src=src,
description=f"config {self._config_path}: expected a top-level object with an 'items' array")
open_ids = config.get('open', [])
if not isinstance(open_ids, list) or not all(isinstance(i, str) for i in open_ids):
raise SrcError(
src=src,
description=f"config {self._config_path}: 'open' must be an array of strings")
items = self._parse_config_nodes(config['items'], "config items", src)
return ConfigManifest(items=items, open=frozenset(open_ids))
def _parse_config_nodes(self, items: Any, where: str, src: str) -> list[ConfigNode]:
return [self._parse_config_node(item, f"{where}[{idx}]", src)
for idx, item in enumerate(items)]
def _parse_config_node(self, item: Any, where: str, src: str) -> ConfigNode:
if not isinstance(item, dict):
raise SrcError(src=src, description=f"{where}: expected an object, got {type(item).__name__}")
label = item.get('label')
if label is not None and (not isinstance(label, str) or not label):
raise SrcError(src=src, description=f"{where}: 'label' must be a non-empty string")
has_file, has_children = 'file' in item, 'children' in item
if has_file == has_children:
raise SrcError(
src=src,
description=f"{where}: must have exactly one of 'file' or 'children'")
if has_file:
if not isinstance(item['file'], str):
raise SrcError(src=src, description=f"{where}: 'file' must be a string")
return ConfigLeaf(file=item['file'], label=label)
children = item['children']
if not isinstance(children, list) or not children:
raise SrcError(src=src, description=f"{where}: 'children' must be a non-empty array")
if not isinstance(label, str) or not label:
raise SrcError(src=src, description=f"{where}: a group requires a non-empty 'label'")
gid = item.get('id')
if gid is not None and (not isinstance(gid, str) or not gid):
raise SrcError(src=src, description=f"{where}: 'id' must be a non-empty string")
return ConfigGroup(label=label, children=self._parse_config_nodes(children, where, src), id=gid)
def _prepend_config(self, infile: Path, tokens: list[Token]) -> None:
if self._config is None:
return
assert self._config_path is not None
include = self._build_config_include(self._config.items, self._config_path.resolve())
# tokens 0 to 5 hold the title h1 triple and the subtitle h2 triple.
# _render_book renders tokens[6:] as the body.
# a change to the preamble must change this index too.
tokens[6:6] = [include]
def _build_config_include(self, nodes: list[ConfigNode], config_file: Path) -> Token:
included = [self._build_config_item(node, config_file) for node in nodes]
token = Token('included_content', '', 0, map=[0, 1])
token.meta['included'] = included
token.meta['include-args'] = {}
return token
def _build_config_item(self, node: ConfigNode, config_file: Path) -> tuple[list[Token], Path]:
if isinstance(node, ConfigLeaf):
path = (config_file.parent / node.file).resolve()
leaf_src = path.read_text()
self._base_paths.append(path)
self._current_type.append('content')
try:
fragment = self._parse(leaf_src)
finally:
self._current_type.pop()
self._base_paths.pop()
if node.label is not None:
fragment[1].meta['toc-label'] = node.label
return fragment, path
# TocEntry._collect_entries reads nav-label and nav-id.
# it builds the sidebar group from them.
group = self._build_config_include(node.children, config_file)
group.meta['nav-label'] = node.label
if node.id is not None:
group.meta['nav-id'] = node.id
return [group], config_file
def _parse(self, src: str, *, auto_id_prefix: None | str = None) -> list[Token]:
tokens = super()._parse(src,auto_id_prefix=auto_id_prefix)
for token in tokens:
@@ -747,10 +879,12 @@ class HTMLConverter(BaseConverter[ManualHTMLRenderer]):
title_html = self._renderer.renderInline(inlines.children[0:1])
else:
toc_html, title = title_html, title_html
if (toc_label := inlines.meta.get('toc-label')) is not None:
toc_html = html.escape(cast(str, toc_label))
title_html = (
f"<em>{title_html}</em>"
if typ == 'chapter'
else title_html if typ in [ 'book', 'part' ]
else title_html if typ in [ 'book', 'part', 'content' ]
else f'the section called “{title_html}”'
)
return XrefTarget(id, title_html, toc_html, re.sub('<.*?>', '', title), path, drop_fragment)
@@ -820,9 +954,14 @@ def _build_cli_html(p: argparse.ArgumentParser) -> None:
p.add_argument('--media-dir', default="media", type=Path)
p.add_argument('--redirects', type=Path)
p.add_argument('--sidebar-depth', default=2, type=int)
# nav metadata (JSON): {"open": ["anchor-id", ...]} selects which sidebar
# entries render expanded; omitted or absent means everything is collapsed.
p.add_argument('--nav', type=Path)
p.add_argument('--experimental-config', type=Path, help="""
JSON file of the following form
{ items: [ { file, label? } | { label, children: [...], id? } ], open: [ id, ... ] }
Files added through this flag prepend '--infile'
This flag will replace --infile and `{=include=}` directives in the future
""")
# Deprecated flags,
p.add_argument('--toc-depth', nargs='?', action=_DeprecatedDepthFlag, default=None)
p.add_argument('--chunk-toc-depth', nargs='?', action=_DeprecatedDepthFlag, default=None)
@@ -835,10 +974,6 @@ def _build_cli_html(p: argparse.ArgumentParser) -> None:
p.add_argument('outfile', type=Path)
def _run_cli_html(args: argparse.Namespace) -> None:
sidebar_open: frozenset[str] = frozenset()
if args.nav:
with open(args.nav) as nav_file:
sidebar_open = frozenset(json.load(nav_file).get("open", []))
with open(args.manpage_urls) as manpage_urls, open(Path(__file__).parent / "redirects.js") as redirects_script:
redirects = None
if args.redirects:
@@ -848,8 +983,8 @@ def _run_cli_html(args: argparse.Namespace) -> None:
md = HTMLConverter(
args.revision,
HTMLParameters(args.generator, args.stylesheet, args.script,
args.sidebar_depth, args.media_dir, sidebar_open, args.header, args.no_navheader),
json.load(manpage_urls), redirects)
args.sidebar_depth, args.media_dir, args.header, args.no_navheader),
json.load(manpage_urls), redirects, args.experimental_config)
md.convert(args.infile, args.outfile)
def build_cli(p: argparse.ArgumentParser) -> None:

View File

@@ -13,8 +13,10 @@ from .utils import Freezeable
# FragmentType is used to restrict structural include blocks.
FragmentType = Literal['preface', 'part', 'chapter', 'section', 'appendix']
# in the TOC all fragments are allowed, plus the all-encompassing book.
TocEntryType = Literal['book', 'preface', 'part', 'chapter', 'section', 'appendix', 'example', 'figure']
# the TOC allows every fragment type. it also allows the enclosing book.
# it allows 'example' and 'figure'.
# --experimental-config adds a generic 'content' kind.
TocEntryType = Literal['book', 'preface', 'part', 'chapter', 'section', 'appendix', 'example', 'figure', 'content']
def is_include(token: Token) -> bool:
return token.type == "fence" and token.info.startswith("{=include=} ")
@@ -145,6 +147,7 @@ class TocEntry(Freezeable):
next: TocEntry | None = None
children: list[TocEntry] = dc.field(default_factory=list)
starts_new_chunk: bool = False
open_id: str | None = None
@property
def root(self) -> TocEntry:
@@ -193,9 +196,21 @@ class TocEntry(Freezeable):
fragment_type_str = token.type[9:].removesuffix('s')
assert fragment_type_str in get_args(TocEntryType)
fragment_type = cast(TocEntryType, fragment_type_str)
for fragment, _path in included:
subentries = cls._collect_entries(xrefs, fragment, fragment_type)
entries[-1][1].children.append(subentries)
if (nav_label := token.meta.get('nav-label')) is not None:
children = [cls._collect_entries(xrefs, fragment, fragment_type)
for fragment, _path in included]
first = children[0].target
group = TocEntry(
fragment_type,
dc.replace(first, title_html=nav_label, toc_html=nav_label, title=nav_label),
children=children,
open_id=token.meta.get('nav-id', ''))
entries.append(('h1', group))
token.meta['TocEntry'] = group
else:
for fragment, _path in included:
subentries = cls._collect_entries(xrefs, fragment, fragment_type)
entries[-1][1].children.append(subentries)
elif token.type == 'heading_open' and (id := cast(str, token.attrs.get('id', ''))):
while len(entries) > 1 and entries[-1][0] >= token.tag:
entries[-2][1].children.append(entries.pop()[1])

View File

@@ -9,7 +9,7 @@ def render(tmp_path: Path, header: Path | None) -> str:
infile = tmp_path / "index.md"
infile.write_text(SAMPLE_BOOK)
outfile = tmp_path / "index.html"
params = HTMLParameters("", [], [], 2, sidebar_open = [], media_dir=tmp_path, header = header)
params = HTMLParameters("", [], [], 2, media_dir=tmp_path, header = header)
HTMLConverter("1.0.0", params, {}).convert(infile, outfile)
return outfile.read_text()

View File

@@ -1,7 +1,9 @@
import json
import xml.parsers.expat as expat
from html.entities import name2codepoint
from pathlib import Path
import pytest
from nixos_render_docs.manual import HTMLConverter, HTMLParameters
@@ -49,7 +51,7 @@ def _build(tmp_path: Path, sidebar_depth: int = 2, sidebar_open: frozenset[str]
out.mkdir(exist_ok=True)
conv = HTMLConverter(
"1.0.0",
HTMLParameters("test-gen", [], [], sidebar_depth, Path("media"), sidebar_open),
HTMLParameters("test-gen", [], [], sidebar_depth, Path("media")),
{},
)
conv.convert(tmp_path / "index.md", out / "index.html")
@@ -88,10 +90,42 @@ def test_sidebar_is_collapsible_tree(tmp_path: Path) -> None:
def test_nav_metadata_opens_selected_entries(tmp_path: Path) -> None:
# ids listed in the nav "open" set render as <details open>
html = _build(tmp_path, sidebar_depth=3, sidebar_open=frozenset({"chap-fpa"}))
assert '<details open><summary><a href="#chap-fpa"' in html
assert '<details><summary><a href="#part-builders"' in html
# the 'open' array expands a config group and an --infile heading.
html = _render_with_config(
tmp_path,
{
"items": [
{"label": "Guides", "id": "guides", "children": [
{"label": "Intro", "file": "intro.md"},
]},
],
"open": ["guides", "manual-chap"],
},
{"intro.md": "# Introduction {#intro}\n\nBody.\n"},
manual_chapter="# Manual chapter {#manual-chap}\n\n## Sub {#manual-sub}\n\nText.\n",
)
# the group opens by its own id. its link points at the child.
assert '<details open><summary><a href="#intro">Guides</a>' in html
assert '<details open><summary><a href="#manual-chap"' in html
def test_config_group_without_id_is_not_openable(tmp_path: Path) -> None:
# the config lists 'intro' in 'open'.
# the group has no id, so its key is empty. the group stays closed.
html = _render_with_config(
tmp_path,
{
"items": [
{"label": "Guides", "children": [
{"file": "intro.md"},
]},
],
"open": ["intro"],
},
{"intro.md": "# Introduction {#intro}\n\nBody.\n"},
)
assert '<details><summary><a href="#intro">Guides</a>' in html
assert "<details open>" not in html
def test_sidebar_depth_caps_the_tree(tmp_path: Path) -> None:
@@ -169,3 +203,179 @@ def test_output_is_well_formed_xhtml(tmp_path: Path) -> None:
assert {p.name for p in pages} == {"index.html", "chapter.html"}
for page in pages:
_parse_xhtml(page.read_text())
_DEFAULT_INDEX = (
"# Test manual {#book-test}\n\n"
"## Version 1\n\n"
"```{=include=} chapters\nmanual-chapter.md\n```\n"
)
_DEFAULT_MANUAL_CHAPTER = "# Manual chapter {#manual-chap}\n\nManual body.\n"
def _render_with_config(
tmp_path: Path,
config: object,
files: dict[str, str],
*,
index: str = _DEFAULT_INDEX,
manual_chapter: str = _DEFAULT_MANUAL_CHAPTER,
sidebar_depth: int = 6,
) -> str:
(tmp_path / "config.json").write_text(json.dumps(config))
(tmp_path / "manual-chapter.md").write_text(manual_chapter)
for name, content in files.items():
path = tmp_path / name
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(content)
(tmp_path / "index.md").write_text(index)
out = tmp_path / "out"
out.mkdir(exist_ok=True)
conv = HTMLConverter(
"1.0.0",
HTMLParameters("test-gen", [], [], sidebar_depth, Path("media")),
{},
config_path=tmp_path / "config.json",
)
conv.convert(tmp_path / "index.md", out / "index.html")
return (out / "index.html").read_text()
def test_config_content_renders_before_manual(tmp_path: Path) -> None:
html = _render_with_config(
tmp_path,
{"items": [{"label": "Intro", "file": "intro.md"}]},
{"intro.md": "# Introduction {#intro}\n\nConfig intro body.\n"},
)
assert "Config intro body." in html
assert "Manual body." in html
assert html.index("Config intro body.") < html.index("Manual body.")
def test_config_grouping_node_is_sidebar_only(tmp_path: Path) -> None:
html = _render_with_config(
tmp_path,
{
"items": [
{
"label": "Guides", "children": [
{"label": "Install", "file": "install.md"},
]
}
]
},
{"install.md": "# Install {#install}\n\nInstall body.\n"},
)
# the group adds no heading and no anchor to the body.
assert "Guides</h2>" not in html
assert 'id="guides"' not in html
# the child renders as a page.
assert '<h2 id="install" class="title" >Install' in html
assert "Install body." in html
# the sidebar nests the child under the group.
assert '<details><summary><a href="#install">Guides</a></summary>' in html
assert '<a href="#install">Install</a>' in html
def test_config_leaf_derives_id_and_label_from_file(tmp_path: Path) -> None:
# the sidebar link reuses the heading id. the label reuses the heading title.
html = _render_with_config(
tmp_path,
{"items": [{"file": "intro.md"}]},
{"intro.md": "# Introduction {#intro}\n\nBody.\n"},
)
assert '<h2 id="intro" class="title" >Introduction' in html
assert '<a href="#intro">Introduction</a>' in html
def test_config_leaf_label_differs_from_file_title(tmp_path: Path) -> None:
html = _render_with_config(
tmp_path,
{
"items": [
{"label": "Sidebar Label", "file": "leaf1.md"}
]
},
{"leaf1.md": "# File Title {#leaf1}\n\nBody.\n"},
)
assert '<h2 id="leaf1" class="title" >File Title' in html
assert '<a href="#leaf1">Sidebar Label</a>' in html
def test_config_tree_nests_arbitrarily_deep(tmp_path: Path) -> None:
html = _render_with_config(
tmp_path,
{
"items": [
{"label": "A", "children": [
{"label": "B", "children": [
{"label": "C", "file": "c.md"},
]},
]}
]
},
{"c.md": "# C File {#leaf-c}\n\nDeep body.\n"},
)
# only the leaf renders a heading. the groups A and B add no anchor.
assert '<h2 id="leaf-c" class="title"' in html
assert 'id="ga"' not in html and 'id="gb"' not in html
# the sidebar nests the groups.
# every group links to its first descendant page, #leaf-c.
assert '<details><summary><a href="#leaf-c">A</a></summary>' in html
assert '<details><summary><a href="#leaf-c">B</a></summary>' in html
assert '<a href="#leaf-c">C</a></li>' in html
assert html.index('>A</a>') < html.index('>B</a>') < html.index('>C</a>')
def test_config_id_is_cross_referenceable(tmp_path: Path) -> None:
html = _render_with_config(
tmp_path,
{
"items": [{"label": "Intro", "file": "intro.md"}]
},
{"intro.md": "# Introduction {#intro}\n\nBody.\n"},
manual_chapter="# Manual chapter {#manual-chap}\n\nSee [](#intro).\n",
)
assert '<a class="xref" href="#intro"' in html
assert ">Introduction</a>" in html
def test_config_duplicate_id_fails(tmp_path: Path) -> None:
with pytest.raises(RuntimeError) as excinfo:
_render_with_config(
tmp_path,
{
"items": [{"label": "Dup", "file": "dup.md"}]
},
{"dup.md": "# Dup file {#dup}\n\nBody.\n"},
manual_chapter="# Manual {#dup}\n\nBody.\n",
)
assert "duplicate id" in str(excinfo.value.__cause__)
def test_config_malformed_node_fails(tmp_path: Path) -> None:
with pytest.raises(RuntimeError) as excinfo:
_render_with_config(
tmp_path,
{"items": [{"label": "Bad", "file": "x.md", "children": []}]},
{},
)
assert "exactly one of" in str(excinfo.value.__cause__)
with pytest.raises(RuntimeError) as excinfo:
_render_with_config(
tmp_path,
{"items": [{"file": 123}]},
{},
)
assert "'file' must be a string" in str(excinfo.value.__cause__)
with pytest.raises(RuntimeError) as excinfo:
_render_with_config(
tmp_path,
{"items": [{"children": [{"file": "x.md"}]}]},
{"x.md": "# X {#x}\n\nB.\n"},
)
assert "a group requires a non-empty 'label'" in str(excinfo.value.__cause__)

View File

@@ -111,12 +111,12 @@ let
# vendored in-tree. Pre-stage the pin (tracks upstream's
# `LLAMA_CPP_VERSION` file) so the FetchContent step uses our copy
# instead of trying to clone over the network in the sandbox.
llamaCppVersion = "b10091";
llamaCppVersion = "b10242";
llamaCppSrc = fetchFromGitHub {
owner = "ggml-org";
repo = "llama.cpp";
tag = llamaCppVersion;
hash = "sha256-ZHQ9hBnE9GayZRt0jgO4svzaAUfhRUg6cFu5dSe8J1w=";
hash = "sha256-mBqO6h9eiSAXqiHy1H3aK2ACbz1aYagmjAN7IpXNTcw=";
};
wrapperOptions = [
@@ -152,13 +152,13 @@ let
in
goBuild (finalAttrs: {
pname = "ollama";
version = "0.32.5";
version = "0.32.6";
src = fetchFromGitHub {
owner = "ollama";
repo = "ollama";
tag = "v${finalAttrs.version}";
hash = "sha256-SqxFMKTGu5e6FdB5abuYez8Aejf7JY7C6e6GuOMYd4w=";
hash = "sha256-B1Svfufa7puiZy+pDHeOTpX3+PWOuNjpMnpE/K3rl3Q=";
};
vendorHash = "sha256-HMwoaFBMbpoy8f0I+O+i7kIa9BslLu3FcVWeaIOkpvs=";

View File

@@ -0,0 +1,57 @@
{
lib,
fetchFromGitHub,
nix-update-script,
python3Packages,
versionCheckHook,
}:
python3Packages.buildPythonApplication (finalAttrs: {
pname = "openhack";
version = "0.2.1";
pyproject = true;
__structuredAttrs = true;
src = fetchFromGitHub {
owner = "openhackai";
repo = "openhack";
tag = "v${finalAttrs.version}";
hash = "sha256-GY95oijrD/yTZI8DpbRVkCXRhMIw5Zsukt22tnglCVc=";
};
build-system = with python3Packages; [ hatchling ];
dependencies = with python3Packages; [
aiohttp
httpx
openai
playwright
prompt-toolkit
pydantic
pydantic-settings
pygments
rich
tree-sitter
tree-sitter-javascript
tree-sitter-python
tree-sitter-typescript
];
nativeInstallCheckInputs = [ versionCheckHook ];
doInstallCheck = true;
pythonImportsCheck = [ "openhack" ];
passthru.updateScript = nix-update-script { };
meta = {
description = "Open Source Agentic Security Scanner";
homepage = "https://github.com/openhackai/openhack";
changelog = "https://github.com/openhackai/openhack/releases/tag/${finalAttrs.src.tag}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ fab ];
mainProgram = "openhack";
};
})

View File

@@ -37,13 +37,13 @@ lib.checkListOfEnum "${pname}: theme tweaks" validTweaks tweaks
stdenvNoCC.mkDerivation
rec {
inherit pname;
version = "2025-04-25";
version = "2026-07-07";
src = fetchFromGitHub {
repo = "Orchis-theme";
owner = "vinceliuice";
rev = version;
hash = "sha256-+2/CsgJ+rdDpCp+r5B/zys3PtFgtnu+ohTEUOtJNd1Y=";
hash = "sha256-oX6+tPe0nGsl+OzFZCpbKvE00Z/xvP+NoHY7QZ9YAo0=";
};
nativeBuildInputs = [

View File

@@ -8,13 +8,13 @@
}:
buildGoModule (finalAttrs: {
pname = "ostui";
version = "1.3.5";
version = "1.3.6";
src = fetchFromSourcehut {
owner = "~ser";
repo = "ostui";
rev = "v${finalAttrs.version}";
hash = "sha256-9d5oaaRKIiU9SP13rnObBQO0DOqliF5SMiKxSas/Yqs=";
hash = "sha256-vHKY6uA3CRxZi3kBDNviLbVxSrXeZG6x8UhMS0GBxSg=";
};
vendorHash = "sha256-cCyOG6nqlw2DPbA1dCuki5cpDy9LmZV/3YGyB3nCreI=";

View File

@@ -0,0 +1,3 @@
{ python3Packages }:
python3Packages.toPythonApplication python3Packages.padne

View File

@@ -9,13 +9,13 @@
}:
buildDartApplication rec {
pname = "pana";
version = "0.23.14";
version = "0.23.16";
src = fetchFromGitHub {
owner = "dart-lang";
repo = "pana";
tag = version;
hash = "sha256-yBheou/u8TjL+MDhxd6AhWPJARLEcQF+ojmDqkv8zi4=";
hash = "sha256-cA707l5SGGh+tzD2TOx2eYEh3zfQawstFCTocgcnXJk=";
};
dartEntryPoints = {

View File

@@ -54,41 +54,41 @@
"dependency": "direct dev",
"description": {
"name": "build",
"sha256": "45d14a0fb23e018d8287c32fc98d726ce466b231928ed9b9200f29bd3ccd39ae",
"sha256": "b94f5da9ed3d081fd4ecc426c260998b5f4f4eb2f6d89b7e5472edef0b2b2a1b",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "4.0.7"
"version": "4.0.10"
},
"build_config": {
"dependency": "direct dev",
"description": {
"name": "build_config",
"sha256": "f2c223156a26eea323e6244b85141d76413a80aeee9fe0b380773789fabaf8ae",
"sha256": "94eaf6708fe64408c632ef2689ca3777b112f9421306ccf4f8c84d7c5c9f83f8",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.3.1"
"version": "1.3.2"
},
"build_daemon": {
"dependency": "transitive",
"description": {
"name": "build_daemon",
"sha256": "fd754058c342243718d5171a95f352cfc9fcf0cba8cfa26df67cb13a5836db78",
"sha256": "79e05eaf15a48d7230b053a4363b8eaac0cc234bbd0134c3229455481f55cbc6",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "4.1.2"
"version": "4.1.5"
},
"build_runner": {
"dependency": "direct dev",
"description": {
"name": "build_runner",
"sha256": "5367e521935b102bdf1e735d2aab461e36b2edca6517662d088dd04cc39f8d16",
"sha256": "90363d438bd9f84a4d5bbb83352251f57d2d9d771bc95a44e6a33fe25fa52774",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.15.1"
"version": "2.16.0"
},
"build_verify": {
"dependency": "direct dev",
@@ -124,11 +124,11 @@
"dependency": "transitive",
"description": {
"name": "built_value",
"sha256": "34e4067d30ce212937df995f03b69992eea683539ceeac7f679a1f1eba055b56",
"sha256": "31b24be6615ec7fcf70b3aa5a7469fe35826485e639a16dd7eb83ba30e4cc6a8",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "8.12.6"
"version": "8.12.7"
},
"checked_yaml": {
"dependency": "transitive",
@@ -154,11 +154,11 @@
"dependency": "direct main",
"description": {
"name": "cli_util",
"sha256": "5909d2c6b66817222779e1eedc19e0e28b76d1df7bd9856a4792ccb9881df358",
"sha256": "71e43f1976c3eae2d9468a5b4d6600bf8cae61508b87f27fa1799228935d48ab",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.5.1"
"version": "0.5.2"
},
"collection": {
"dependency": "direct main",
@@ -224,11 +224,11 @@
"dependency": "transitive",
"description": {
"name": "dart_style",
"sha256": "b60b8cb28aa514346eb8f6b005c60484ea65190f213b1986f6e391e0292d18f4",
"sha256": "3f88fc9c96c568d631356507355a2d1e983ee000c9ac008bdcb39b5bf53ce777",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.1.11"
"version": "3.1.12"
},
"ffi": {
"dependency": "transitive",
@@ -354,11 +354,11 @@
"dependency": "direct dev",
"description": {
"name": "json_serializable",
"sha256": "ffcd10cde35a93b2abbbcc26bd9971f4ca93763e8abe78d855e3c4177797e501",
"sha256": "e45aefa0324f08c683caafbb94b72837aa6193c61822799c916e45f4a263113d",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.14.0"
"version": "6.14.1"
},
"lints": {
"dependency": "direct main",
@@ -434,11 +434,11 @@
"dependency": "transitive",
"description": {
"name": "package_config",
"sha256": "f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc",
"sha256": "ffcf4cf3d6c0b74ac43708d9f56625506e8a68aa935abe9d267a7330f320eb5d",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.2.0"
"version": "3.0.0"
},
"path": {
"dependency": "direct main",
@@ -544,21 +544,21 @@
"dependency": "direct dev",
"description": {
"name": "source_gen",
"sha256": "ec37cc0e6694374cbef59ed79685572c870a54ede6fa30a3e420feb3adffea02",
"sha256": "a603f1fb984a7391ae5978d1b92bfaaa08b350dca5c825256f925818f7943bf5",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "4.2.3"
"version": "4.2.4"
},
"source_helper": {
"dependency": "transitive",
"description": {
"name": "source_helper",
"sha256": "4227d54ceefd0bb8ca4c8fcb96e1719dc53f1ee1b6e2ca9d7a6069da160e4eae",
"sha256": "5e6f216fdf6376c9f3852381ae037499797a3385377d388b011dac98d303c67c",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.3.12"
"version": "1.3.13"
},
"source_map_stack_trace": {
"dependency": "transitive",

View File

@@ -7,11 +7,11 @@
}:
let
pname = "qidi-studio";
version = "2.07.02.10";
version = "2.07.02.60";
src = fetchurl {
url = "https://github.com/QIDITECH/QIDIStudio/releases/download/v${version}/QIDIStudio_v0${version}_Ubuntu24.AppImage";
hash = "sha256-Ei5PV/XRWtCMlXF07AJu9UWplSr+8GdwAFvXwDE3TpM=";
hash = "sha256-1H0rLI3V8W1I+KIbolQg/Wat9WsACMy1RIdyU0s8seg=";
};
appimageContents = appimageTools.extract {

View File

@@ -4,7 +4,7 @@
fetchFromGitHub,
makeWrapper,
nodejs_24,
pnpm_10,
pnpm_11,
fetchPnpmDeps,
pnpmConfigHook,
python3,
@@ -15,18 +15,23 @@
yq-go,
cctools,
}:
let
nodejs = nodejs_24;
pnpm = pnpm_11;
in
stdenv.mkDerivation (finalAttrs: {
pname = "renovate";
version = "43.214.1";
version = "44.13.1";
__structuredAttrs = true;
strictDeps = true;
src = fetchFromGitHub {
owner = "renovatebot";
repo = "renovate";
tag = finalAttrs.version;
hash = "sha256-S5ixP4Dp/YDv23kE5lvmp/Px6GrF9B6/wwSiKUwVWhA=";
hash = "sha256-2N+dQnuQwQNt7SZlIYq0CT2dRMiOF947MJZZ8BhZpcI=";
};
postPatch = ''
@@ -38,7 +43,7 @@ stdenv.mkDerivation (finalAttrs: {
makeWrapper
nodejs
pnpmConfigHook
pnpm_10
pnpm
python3
yq-go
]
@@ -49,9 +54,9 @@ stdenv.mkDerivation (finalAttrs: {
pnpmDeps = fetchPnpmDeps {
inherit (finalAttrs) pname version src;
pnpm = pnpm_10;
fetcherVersion = 3;
hash = "sha256-A8aL5ZF0tFKi0uCXxOQMzxByAIVyt76wnLvolFVYKuI=";
inherit pnpm;
fetcherVersion = 4;
hash = "sha256-xm4H+PIpVcisw8wKz77+v6iCcwEpkpLZ6awtwXPNBc8=";
};
env.COREPACK_ENABLE_STRICT = 0;
@@ -61,25 +66,17 @@ stdenv.mkDerivation (finalAttrs: {
# relax nodejs version
yq '.engines.node = "${nodejs.version}"' -i package.json
''
# pnpm install gets run with --ignore-scripts so we need to manually build native dependencies (e.g. re2)
# Keep https://github.com/renovatebot/renovate/blob/main/pnpm-workspace.yaml#L9 in mind when updating,
# new native dependencies could bloat up binary size.
+ ''
pnpm rebuild
rm -rf node_modules/.pnpm/re2*/node_modules/re2/build/Release/{obj.target,.deps} \
node_modules/.pnpm/re2*/node_modules/re2/vendor
pnpm build
find -name 'node_modules' -type d -exec rm -rf {} \; || true
pnpm install --offline --prod --ignore-scripts
''
# The optional dependencies re2 and better-sqlite3 are not built by pnpm and need to be built manually.
# If re2 is not built, you will get an annoying warning when you run renovate.
# better-sqlite3 is required.
+ ''
pushd node_modules/.pnpm/re2*/node_modules/re2
mkdir -p $HOME/.node-gyp/${nodejs.version}
echo 9 > $HOME/.node-gyp/${nodejs.version}/installVersion
ln -sfv ${nodejs}/include $HOME/.node-gyp/${nodejs.version}
export npm_config_nodedir=${nodejs}
npm run rebuild
rm -rf build/Release/{obj.target,.deps} vendor
popd
pnpm prune --prod --ignore-scripts
runHook postBuild
'';

View File

@@ -9,7 +9,7 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "tuicr";
version = "0.20.0";
version = "0.21.0";
__structuredAttrs = true;
@@ -17,10 +17,10 @@ rustPlatform.buildRustPackage (finalAttrs: {
owner = "agavra";
repo = "tuicr";
tag = "v${finalAttrs.version}";
hash = "sha256-ByeWD4mC1DiH6L971mC7Qv6zUVmaf2lneewK2ZWXxg8=";
hash = "sha256-9QEDfDwb9Elm4R40/0pBz0EgTOoJJWWNraz2D0H6bAo=";
};
cargoHash = "sha256-MVDq+78HIwjqQiO7R/ZAXd16Bye0fktxbiRIzEOH7vQ=";
cargoHash = "sha256-efBYiq0FA9kpMwzHM2GiUC2rWyWC9QcgfCCVIu5bbPk=";
strictDeps = true;

View File

@@ -1,45 +1,28 @@
{
lib,
stdenvNoCC,
appimageTools,
fetchurl,
makeWrapper,
gitUpdater,
undmg,
}:
appimageTools.wrapType2 rec {
let
pname = "tutanota-desktop";
version = "355.260720.0";
src = fetchurl {
linuxSrc = fetchurl {
url = "https://github.com/tutao/tutanota/releases/download/tutanota-desktop-release-${version}/tutanota-desktop-linux.AppImage";
hash = "sha256-sdKth9sy5yQ9cs4xQg4/zsgdvitxByKl8NCJgo3lL4o=";
};
extraPkgs = pkgs: [ pkgs.libsecret ];
nativeBuildInputs = [ makeWrapper ];
extraInstallCommands =
let
appimageContents = appimageTools.extract { inherit pname version src; };
in
''
install -Dm 444 ${appimageContents}/tutanota-desktop.desktop -t $out/share/applications
cp -r ${appimageContents}/usr/share/icons/. $out/share/icons
substituteInPlace $out/share/applications/tutanota-desktop.desktop \
--replace 'Exec=AppRun' 'Exec=${pname}'
wrapProgram $out/bin/tutanota-desktop \
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}"
'';
passthru.updateScript = gitUpdater {
url = "https://github.com/tutao/tutanota";
rev-prefix = "tutanota-desktop-release-";
allowedVersions = ".+\\.[0-9]{6}\\..+";
darwinSrc = fetchurl {
url = "https://github.com/tutao/tutanota/releases/download/tutanota-desktop-release-${version}/tutanota-desktop-mac.dmg";
hash = "sha256-oVipeWX6kuy0JqlB92hjcVl3Szwve7Lz5gd/mC7ieVg=";
};
passthru.updateScript = ./update.sh;
meta = {
description = "Tuta official desktop client";
homepage = "https://tuta.com/";
@@ -48,6 +31,66 @@ appimageTools.wrapType2 rec {
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
maintainers = with lib.maintainers; [ s0ssh ];
mainProgram = "tutanota-desktop";
platforms = [ "x86_64-linux" ];
platforms = lib.platforms.darwin ++ [ "x86_64-linux" ];
};
}
linux = appimageTools.wrapType2 {
inherit
pname
version
passthru
meta
;
src = linuxSrc;
extraPkgs = pkgs: [ pkgs.libsecret ];
nativeBuildInputs = [ makeWrapper ];
extraInstallCommands =
let
appimageContents = appimageTools.extract {
inherit pname version;
src = linuxSrc;
};
in
''
install -Dm 444 ${appimageContents}/tutanota-desktop.desktop -t $out/share/applications
cp -r ${appimageContents}/usr/share/icons/. $out/share/icons
substituteInPlace $out/share/applications/tutanota-desktop.desktop \
--replace 'Exec=AppRun' 'Exec=${pname}'
wrapProgram $out/bin/tutanota-desktop \
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}"
'';
};
darwin = stdenvNoCC.mkDerivation {
inherit
pname
version
passthru
meta
;
src = darwinSrc;
sourceRoot = ".";
nativeBuildInputs = [
undmg
makeWrapper
];
installPhase = ''
runHook preInstall
mkdir -p "$out/Applications"
cp -R "Tuta Mail.app" "$out/Applications/"
makeWrapper "$out/Applications/Tuta Mail.app/Contents/MacOS/Tuta Mail" "$out/bin/tutanota-desktop"
runHook postInstall
'';
};
in
if stdenvNoCC.hostPlatform.isDarwin then darwin else linux

View File

@@ -0,0 +1,31 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p bash curl jq common-updater-scripts nixVersions.latest
set -euo pipefail
repo="tutao/tutanota"
tagPrefix="tutanota-desktop-release-"
latestTag=$(curl ${GITHUB_TOKEN:+-u ":$GITHUB_TOKEN"} -sSf \
"https://api.github.com/repos/$repo/releases?per_page=100" \
| jq -r --arg p "$tagPrefix" \
'[.[] | select(.prerelease == false) | select(.tag_name | startswith($p))] | .[0].tag_name')
version="${latestTag#"$tagPrefix"}"
currentVersion=$(nix-instantiate --eval -E "with import ./. { }; tutanota-desktop.version" | tr -d '"')
echo "tutanota-desktop: current=$currentVersion latest=$version"
if [[ "$version" == "$currentVersion" ]]; then
echo "tutanota-desktop: already up to date"
exit 0
fi
base="https://github.com/$repo/releases/download/$tagPrefix$version"
linuxHash=$(nix --extra-experimental-features nix-command hash convert --hash-algo sha256 --to sri \
"$(nix-prefetch-url "$base/tutanota-desktop-linux.AppImage")")
update-source-version tutanota-desktop "$version" "$linuxHash" --system=x86_64-linux --ignore-same-version
darwinHash=$(nix --extra-experimental-features nix-command hash convert --hash-algo sha256 --to sri \
"$(nix-prefetch-url "$base/tutanota-desktop-mac.dmg")")
update-source-version tutanota-desktop "$version" "$darwinHash" --system=aarch64-darwin --ignore-same-version

View File

@@ -8,16 +8,16 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "uutils-findutils";
version = "0.9.0";
version = "0.10.0";
src = fetchFromGitHub {
owner = "uutils";
repo = "findutils";
tag = finalAttrs.version;
hash = "sha256-ILMInyjOMYlgPxrOjvLoBfkcaZ4aj6GeA/jiGPpNjiI=";
hash = "sha256-0M3sOHVsIKG3rPthikommvKvHB1Q1RohogjS9LT5yU0=";
};
cargoHash = "sha256-/rQTcyRXtluPKPuuZKn/qD/3U0PQLIqyq777/ww3q/0=";
cargoHash = "sha256-6M3kLNtvZ1nsCAkVJExQBWV72Bf9Kq5iei7SVpYsYio=";
postInstall = ''
rm $out/bin/testing-commandline

View File

@@ -2,7 +2,6 @@
lib,
stdenv,
fetchFromGitHub,
fetchpatch,
cmake,
nix-update-script,
kdePackages,
@@ -14,7 +13,7 @@
stdenv.mkDerivation (finalAttrs: {
pname = "vermouth";
version = "1.9.7";
version = "2.0.1";
__structuredAttrs = true;
strictDeps = true;
@@ -23,18 +22,9 @@ stdenv.mkDerivation (finalAttrs: {
owner = "dekomote";
repo = "vermouth";
tag = "v${finalAttrs.version}";
hash = "sha256-hcsvTvvuzuqTGgOdWt3sxyoJqjZjlUPlnlYJUgNpV4g=";
hash = "sha256-5Bej9GJgOUqg3WI4kHkyWXjjTv+MmimZbCK4vxpBdeU=";
};
patches = [
# backport fix for desktop file generation
# FIXME: remove in next update
(fetchpatch {
url = "https://github.com/dekomote/vermouth/commit/436a201091505c142a88848135fe04e1ec996a1a.diff";
hash = "sha256-fIgcewbJOpi+qHPgOJRCr+67RbziPPGP4sC1dclydgQ=";
})
];
nativeBuildInputs = [
cmake
qt6.qtbase

View File

@@ -14,12 +14,12 @@
}:
let
version = "2.4.0";
version = "2.5.0";
src = fetchFromGitHub {
owner = "go-vikunja";
repo = "vikunja";
rev = "v${version}";
hash = "sha256-0yAFrq+qzLZLXPblWY2lkoJ2idzENR3YqdFNiDqep6U=";
hash = "sha256-qI4mkgcN9yYRmh5V+KzIHupX7uWsszV4Xb31OYvukxQ=";
};
frontend = stdenv.mkDerivation (finalAttrs: {
@@ -37,7 +37,7 @@ let
;
pnpm = pnpm_10;
fetcherVersion = 3;
hash = "sha256-MnkwuEaBEY81LXInDao2Fi+FvKFyvsVS/QeXdS4FhPQ=";
hash = "sha256-xZBgE4GM59Ihl5a3qgcmkjR4Q3wYlcsiDapiNEzBQOg=";
};
nativeBuildInputs = [
@@ -102,7 +102,7 @@ buildGoModule {
mage
];
vendorHash = "sha256-4JOwr6QCWglxXbRkcko2nsAxEhVbHDO1S2vI91NFM/8=";
vendorHash = "sha256-bn+bcGzeB0/KkhPNkbjK/EgKQG3iqVlJxtt6betGUNE=";
inherit frontend;

View File

@@ -39,7 +39,7 @@
stdenv.mkDerivation (finalAttrs: {
pname = "vte";
version = "0.84.0";
version = "0.84.1";
outputs = [
"out"
@@ -49,7 +49,7 @@ stdenv.mkDerivation (finalAttrs: {
src = fetchurl {
url = "mirror://gnome/sources/vte/${lib.versions.majorMinor finalAttrs.version}/vte-${finalAttrs.version}.tar.xz";
hash = "sha256-BBTjFYODaut4eNol9nxRX36IeZF+zDfJLia4Po2Pw+M=";
hash = "sha256-rKHKqEeK6827HWeJf7NRHrdgHeuuaBDhahW2+iXzGsg=";
};
patches = [

View File

@@ -29,14 +29,14 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "wezterm";
version = "0-unstable-2026-07-16";
version = "0-unstable-2026-08-05";
src = fetchFromGitHub {
owner = "wezterm";
repo = "wezterm";
rev = "76b606ec597a3c0263fa60321548637451c0a547";
rev = "4b1c3c151eb530e569f867e1461693c56fe89695";
fetchSubmodules = true;
hash = "sha256-FLU1R78C1xLPsJ1udBk9bW0BbVry4lGiC0kvPfMI66c=";
hash = "sha256-cZ5RDeHP9cBa1Qu6E96lRjKW4aC/wMJBZNpUZ2kAWuU=";
};
postPatch = ''
@@ -59,7 +59,7 @@ rustPlatform.buildRustPackage (finalAttrs: {
# https://github.com/wezterm/wezterm/blob/main/nix/flake.nix#L134
auditable = false;
cargoHash = "sha256-jY7lTOfbT74tAZ7he1xudCN7BUxZBzY+8+e1d2g2v4I=";
cargoHash = "sha256-4jm0uMj0/6fcLHSvd7y12h1QjQ/VavkmNc5L/ebQez0=";
nativeBuildInputs = [
installShellFiles

View File

@@ -8,16 +8,16 @@
buildGoModule (finalAttrs: {
pname = "woodpecker-plugin-git";
version = "2.9.2";
version = "2.9.3";
src = fetchFromGitHub {
owner = "woodpecker-ci";
repo = "plugin-git";
tag = finalAttrs.version;
hash = "sha256-vfHYEZpOAdf88Wqf6/PtbVsymKmQhBr0y2UOGmTGdjY=";
hash = "sha256-sXKR7DEcCVB6y2aHVB/57iacaijC4vLqV7/Mddrev48=";
};
vendorHash = "sha256-zCcYAWO0hn6iLxTxOsjn2bS0+sHuzpq3K24N9jd+qPY=";
vendorHash = "sha256-I3G3Skq7gltFEkL1gJDWTRlbKKnebW9zvoGGGKoQJuI=";
env.CGO_ENABLED = "0";

View File

@@ -13,14 +13,14 @@
buildNpmPackage (finalAttrs: {
pname = "zennotes-desktop";
version = "2.22.1";
npmDepsHash = "sha256-JBZ1gWGyasfoSXkZp2cd0HPuqQ9XKh4sWOesAfGHp6I=";
version = "2.23.0";
npmDepsHash = "sha256-qvfYrSzzIIuLQoWpDvXC4dt+OexEJNrz3nqjnycxo6I=";
src = fetchFromGitHub {
owner = "ZenNotes";
repo = "zennotes";
tag = "v${finalAttrs.version}";
hash = "sha256-nSHl5O7xUbt/g18LV41Bgrcn6FwZXVHmZdaQXVVoDio=";
hash = "sha256-aGr1K6kSvpDELky0S/tH9cq6pbVivN4jTXrmbKE95vc=";
};
npmWorkspace = "apps/desktop";

View File

@@ -24,7 +24,7 @@ let
in
stdenv.mkDerivation (finalAttrs: {
pname = "zmx";
version = "0.6.0";
version = "0.7.0";
__structuredAttrs = true;
strictDeps = true;
@@ -32,13 +32,13 @@ stdenv.mkDerivation (finalAttrs: {
owner = "neurosnap";
repo = "zmx";
tag = "v${finalAttrs.version}";
hash = "sha256-OkXtVf/LdBrZL6FH9TGx+mIhUXt2eSugLxZyMd+HL6k=";
hash = "sha256-cWTeFRycSZFEbjCYIzKplNhV9SDM1kDl8CeQPOR3uyk=";
};
zigDeps = zig.fetchDeps {
inherit (finalAttrs) src pname version;
fetchAll = true;
hash = "sha256-TwKoeaE4g5G7t7smKoqHkCCh998nSqKx5k6sO2vDlGs=";
hash = "sha256-w2jTusfDpW5Vk0lVhi2VNEGtir2n0NKQePsKSE2jpmc=";
};
postConfigure = ''
@@ -58,6 +58,10 @@ stdenv.mkDerivation (finalAttrs: {
doCheck = true;
preCheck = ''
export ZMX_DIR="$TMPDIR/zmx-test"
'';
postInstall = lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
installShellCompletion --cmd ${finalAttrs.meta.mainProgram} \
--bash <($out/bin/zmx completions bash) \

View File

@@ -12,14 +12,14 @@
buildPythonPackage (finalAttrs: {
pname = "afsapi";
version = "1.0.1";
version = "1.0.2";
pyproject = true;
src = fetchFromGitHub {
owner = "wlcrs";
repo = "python-afsapi";
tag = finalAttrs.version;
hash = "sha256-OMz8zJrU1qymvhD9mnf248687wpqfgUnXna7Cbr83No=";
hash = "sha256-ZfP8LboBDrxXULtocOTZJ0Ku/zgear4NW5ckcHUKXc4=";
};
build-system = [

View File

@@ -358,13 +358,13 @@
buildPythonPackage (finalAttrs: {
pname = "boto3-stubs";
version = "1.43.62";
version = "1.43.64";
pyproject = true;
src = fetchPypi {
pname = "boto3_stubs";
inherit (finalAttrs) version;
hash = "sha256-pUG/DSBCStQnlAuJOP/zS+oo/A05mQa989GTNxAWRVo=";
hash = "sha256-coJym7MD6kvZ5WhSBJ8Sr1Y768p3wD/A6geIZCfMUDU=";
};
build-system = [ setuptools ];

View File

@@ -14,14 +14,14 @@
buildPythonPackage (finalAttrs: {
pname = "claude-agent-sdk";
version = "0.2.110";
version = "0.2.130";
pyproject = true;
src = fetchFromGitHub {
owner = "anthropics";
repo = "claude-agent-sdk-python";
tag = "v${finalAttrs.version}";
hash = "sha256-tz26ueGAMFM7sD95FoAzhKHvNo7NV9fYZoKfJy/t8Lw=";
hash = "sha256-7hFgXoQ1OlKMrHWc2nhfqPuj1pDRw5OfIOgeGlc4CFw=";
};
build-system = [ hatchling ];
@@ -48,6 +48,11 @@ buildPythonPackage (finalAttrs: {
"test_query_with_async_iterable"
];
disabledTestPaths = [
# Tests require claude code with is non-free
"tests/test_close_cancellation.py"
];
meta = {
description = "Python SDK for Claude Agent";
homepage = "https://github.com/anthropics/claude-agent-sdk-python";

View File

@@ -7,21 +7,24 @@
numpy,
pandas,
pytestCheckHook,
setuptools,
}:
buildPythonPackage rec {
buildPythonPackage (finalAttrs: {
pname = "debuglater";
version = "1.4.4";
format = "setuptools";
pyproject = true;
src = fetchFromGitHub {
owner = "ploomber";
repo = "debuglater";
tag = version;
tag = finalAttrs.version;
hash = "sha256-o9IAk3EN8ghEft7Y7Xx+sEjWMNgoyiZ0eiBqnCyXkm8=";
};
propagatedBuildInputs = [ colorama ];
build-system = [ setuptools ];
dependencies = [ colorama ];
optional-dependencies = {
all = [ dill ];
@@ -32,15 +35,20 @@ buildPythonPackage rec {
pandas
pytestCheckHook
]
++ optional-dependencies.all;
++ lib.flatten (builtins.attrValues finalAttrs.passthru.optional-dependencies);
pythonImportsCheck = [ "debuglater" ];
disabledTests = [
# Assertion error
"test_data_structures"
];
meta = {
description = "Module for post-mortem debugging of Python programs";
homepage = "https://github.com/ploomber/debuglater";
changelog = "https://github.com/ploomber/debuglater/blob/${version}/CHANGELOG.md";
changelog = "https://github.com/ploomber/debuglater/blob/${finalAttrs.src.tag}/CHANGELOG.md";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ fab ];
};
}
})

View File

@@ -5,6 +5,7 @@
buildPythonPackage,
fetchFromGitHub,
writableTmpDirAsHomeHook,
nix-update-script,
cudaPackages,
@@ -37,6 +38,7 @@
callPackage,
cudaSupport ? config.cudaSupport,
withMkl ? stdenv.hostPlatform.isx86_64 && config.allowUnfree,
}:
let
@@ -61,7 +63,7 @@ in
buildPythonPackage (finalAttrs: {
pname = "emerge";
version = "2.8.1";
version = "2.8.2";
pyproject = true;
__structuredAttrs = true;
@@ -69,7 +71,7 @@ buildPythonPackage (finalAttrs: {
owner = "FennisRobert";
repo = "EMerge";
tag = "v${finalAttrs.version}";
hash = "sha256-TArhxtPAGEmPI4L+/pgy+RhV9atAZ5Ig0TkUDoV+eXQ=";
hash = "sha256-wxJeSiHfYTY7mRll8cxJSpdciun+uw5V7FLTUKuHu28=";
};
postPatch = ''
@@ -103,7 +105,7 @@ buildPythonPackage (finalAttrs: {
];
buildInputs =
lib.optionals stdenv.hostPlatform.isx86_64 [
lib.optionals withMkl [
mkl
]
++ lib.optionals cudaSupport [
@@ -145,11 +147,16 @@ buildPythonPackage (finalAttrs: {
;
tests = callPackage ./tests { };
updateScript = nix-update-script {
extraArgs = [ "--version-regex=^v(2\\.[0-9].*)$" ];
};
};
meta = {
description = "Electromagnetic field computation program";
homepage = "https://github.com/FennisRobert/EMerge";
mainProgram = "emerge";
license = lib.licenses.gpl2Plus;
maintainers = with lib.maintainers; [ eljamm ];
teams = with lib.teams; [ ngi ];

View File

@@ -2,6 +2,7 @@
lib,
buildPythonPackage,
fetchFromGitHub,
nix-update-script,
# build-system
hatchling,
@@ -51,6 +52,11 @@ buildPythonPackage (finalAttrs: {
"emsutil"
];
# TODO: remove after new release (>0.8.3)
passthru.updateScript = nix-update-script {
extraArgs = [ "--version=branch" ];
};
meta = {
description = "Utilities for the EMerge software suite";
homepage = "https://github.com/FennisRobert/emsutil";

View File

@@ -15,12 +15,12 @@
buildPythonPackage (finalAttrs: {
pname = "gehomesdk";
version = "2026.7.2";
version = "2026.8.0";
pyproject = true;
src = fetchPypi {
inherit (finalAttrs) pname version;
hash = "sha256-dSx+fmQU8UJTVaBaNWyJh302CDb7LcyELSnL0B0sbjk=";
hash = "sha256-4WGkodI608LmlHpzYfPIrexZBNAsImmj2B55+WJgq2E=";
};
build-system = [ setuptools ];

View File

@@ -9,13 +9,13 @@
buildPythonPackage (finalAttrs: {
pname = "google-cloud-access-context-manager";
version = "0.6.0";
version = "0.6.1";
pyproject = true;
src = fetchPypi {
pname = "google_cloud_access_context_manager";
inherit (finalAttrs) version;
hash = "sha256-dgJn+6H4voY24qjXwwICfzECYP/4BRxGuLCbl9VGjuA=";
hash = "sha256-TZmOSoHEJPUfbFxqrLJ9eAYRbTC1VscIrAqJw3/lGtg=";
};
build-system = [ setuptools ];

View File

@@ -6,23 +6,28 @@
hatchling,
jinja2,
nltk,
pyprojectVersionPatchHook,
sqlglot,
}:
buildPythonPackage rec {
buildPythonPackage (finalAttrs: {
pname = "hakuin";
version = "0.2.2";
pyproject = true;
__structuredAttrs = true;
src = fetchFromGitHub {
owner = "pruzko";
repo = "hakuin";
tag = version;
tag = finalAttrs.version;
hash = "sha256-97nh+woUsCXcoO2i5KprCwJiE24V3mg91qcNgy7bpgg=";
};
build-system = [ hatchling ];
nativeBuildInputs = [ pyprojectVersionPatchHook ];
dependencies = [
aiohttp
jinja2
@@ -40,5 +45,6 @@ buildPythonPackage rec {
homepage = "https://github.com/pruzko/hakuin";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ fab ];
mainProgram = "hk";
};
}
})

View File

@@ -69,11 +69,8 @@ buildPythonPackage rec {
]
++ lib.concatAttrValues optional-dependencies;
# test_keystoneauth_betamax_fixture is incompatible with urllib3 2.0.0
# https://bugs.launchpad.net/keystoneauth/+bug/2020112
checkPhase = ''
stestr run \
-E "keystoneauth1.tests.unit.test_betamax_fixture.TestBetamaxFixture.test_keystoneauth_betamax_fixture"
stestr run
'';
pythonImportsCheck = [ "keystoneauth1" ];

View File

@@ -335,8 +335,8 @@ in
"sha256-3JYcWKFk0dKJg/qn+EBvxeAO5xh5PXCU3dTEWDr1oXI=";
mypy-boto3-connect =
buildMypyBoto3Package "connect" "1.43.58"
"sha256-lDeveEiymjAvHh3JoGLQR1dP8h6n/4+UMIt6LVIYmPc=";
buildMypyBoto3Package "connect" "1.43.64"
"sha256-zWW/IqPu2ado8nc+ggaY+7/jko3HBfjcDPRUoM5p7z0=";
mypy-boto3-connect-contact-lens =
buildMypyBoto3Package "connect-contact-lens" "1.43.0"
@@ -399,8 +399,8 @@ in
"sha256-4VGCEZbno4w3H5+bc+2/f4ZkgefUDgWOOBkuGTVqvWk=";
mypy-boto3-directconnect =
buildMypyBoto3Package "directconnect" "1.43.35"
"sha256-EaazNjN3MOBQLjSaLi01grlO9evVVu0ST5ZOf1dAk9M=";
buildMypyBoto3Package "directconnect" "1.43.63"
"sha256-ncNugcKv/gD//CzbxTeDJK5wuXeaVhIET0xr9aA2NIA=";
mypy-boto3-discovery =
buildMypyBoto3Package "discovery" "1.43.0"
@@ -431,8 +431,8 @@ in
"sha256-LE8moRJrwRp3T4UGkj+vdRyq9Qw7t/UxcQm1Dw3/Dfs=";
mypy-boto3-dynamodb =
buildMypyBoto3Package "dynamodb" "1.43.0"
"sha256-8M6jjgWPHQc2HstV2PQGZdgktCz0hkckx/zMi/OUb80=";
buildMypyBoto3Package "dynamodb" "1.43.64"
"sha256-hZfd19X5LPAOeqCHWZPlzwmYjwF+70G5TUfAjnZ1tdA=";
mypy-boto3-dynamodbstreams =
buildMypyBoto3Package "dynamodbstreams" "1.43.0"
@@ -443,8 +443,8 @@ in
"sha256-dXNkOcMonYrBh4yzeubd+v3mW42s9XpmpfvgbtgoJgY=";
mypy-boto3-ec2 =
buildMypyBoto3Package "ec2" "1.43.59"
"sha256-cAk90nXgbA1YkS9DQr+oM/zJH1+1p5V5g/nlG+Fo3i0=";
buildMypyBoto3Package "ec2" "1.43.64"
"sha256-4gEYjeyfYdWjolPQvClPEZlUxIfUTZcU3nsq8kLDHOU=";
mypy-boto3-ec2-instance-connect =
buildMypyBoto3Package "ec2-instance-connect" "1.43.0"
@@ -602,8 +602,8 @@ in
"sha256-oPQuxAKSUTpHGyq1J80W57cISh+d+4IGN8ClJdhkfnw=";
mypy-boto3-iam =
buildMypyBoto3Package "iam" "1.43.60"
"sha256-Sh82poyz+WLAAPIFYgQ0bRwZYWoSJ5l8VweyY55zTYM=";
buildMypyBoto3Package "iam" "1.43.64"
"sha256-EUU75nZ9iJzC7j7SFCNjPBYXN6MUac7hZw9ekzkt3zk=";
mypy-boto3-identitystore =
buildMypyBoto3Package "identitystore" "1.43.0"
@@ -622,8 +622,8 @@ in
"sha256-9P8m5QYikdsimepaivrYcb/tP1iThyPZWFMkyo24+bo=";
mypy-boto3-inspector2 =
buildMypyBoto3Package "inspector2" "1.43.53"
"sha256-eY0CZnh9rwCj3gnNUsN9x65urg8641Yd6QsowbxJipk=";
buildMypyBoto3Package "inspector2" "1.43.64"
"sha256-7xAA1OyNETjna5Yehnnzd8u3OJF8P3lMsBFE0/0tx/4=";
mypy-boto3-internetmonitor =
buildMypyBoto3Package "internetmonitor" "1.43.0"
@@ -858,8 +858,8 @@ in
"sha256-ZlvcxMsMtkPwzyBpxGWffcD2g73aNIU6WG7jYn66ZjU=";
mypy-boto3-mediaconvert =
buildMypyBoto3Package "mediaconvert" "1.43.39"
"sha256-3s5d1ZZ+XoVjYP3uZ2zuaAjH76fbj0j0a5v2H3Ji8vA=";
buildMypyBoto3Package "mediaconvert" "1.43.63"
"sha256-qvQo6w4QfSTVfmJhu7tZFGV6///8pJwEijs3oLT/nTg=";
mypy-boto3-medialive =
buildMypyBoto3Package "medialive" "1.43.27"
@@ -946,8 +946,8 @@ in
"sha256-rkVxsY4MQ+eB3uQhD3kI7bBpCHiDVcQDNUXA5zUyeok=";
mypy-boto3-network-firewall =
buildMypyBoto3Package "network-firewall" "1.43.62"
"sha256-byxKwV6TDM/mo/my8h9aVDzbYMywCVSU/RfyNv9sW6Q=";
buildMypyBoto3Package "network-firewall" "1.43.63"
"sha256-tb67mpqB0urStehtFhyqMiZGCzjokt7GoLSMINH8U00=";
mypy-boto3-networkmanager =
buildMypyBoto3Package "networkmanager" "1.43.0"
@@ -982,8 +982,8 @@ in
"sha256-JEuEjo0htTuDCZx2nNJK2Zq59oSUqkMf4BrNamerfVk=";
mypy-boto3-organizations =
buildMypyBoto3Package "organizations" "1.43.52"
"sha256-Z3hs0TLev/W3O9GI7k9oo3gSR9lRkn/dlo46ILyMDWo=";
buildMypyBoto3Package "organizations" "1.43.64"
"sha256-kyUieR7tYYUGbEOi6ftCEDD07+QfcyJ2cOWqrk2FVAs=";
mypy-boto3-osis =
buildMypyBoto3Package "osis" "1.43.0"
@@ -1310,8 +1310,8 @@ in
"sha256-V1og1LY/ORrXbfFVs4vF8LYe30/kvG71F3rWwXmNSJ4=";
mypy-boto3-sso-admin =
buildMypyBoto3Package "sso-admin" "1.43.38"
"sha256-XItUg7rif3WcSEFp5+7vLqibBz9j43OpmA+whTlu/iM=";
buildMypyBoto3Package "sso-admin" "1.43.64"
"sha256-wesA1gX4AOwwJs5LKmr6O+MZV8mJFpGh/Gh1wluUvgk=";
mypy-boto3-sso-oidc =
buildMypyBoto3Package "sso-oidc" "1.43.0"
@@ -1394,8 +1394,8 @@ in
"sha256-zwxwpve6uEpXNyMQzaFPIEqDI/JoP5ks2wmO5gqLf7c=";
mypy-boto3-wafv2 =
buildMypyBoto3Package "wafv2" "1.43.59"
"sha256-QxQd/4lPo4kDjmeTrXrF+Eon+EYKG5kRZ1bAIsu2K6s=";
buildMypyBoto3Package "wafv2" "1.43.63"
"sha256-8hUgFNVUOcsjOyECvMlw0S0uG6A8XTv2EBWi06Cj2QY=";
mypy-boto3-wellarchitected =
buildMypyBoto3Package "wellarchitected" "1.43.0"
@@ -1422,8 +1422,8 @@ in
"sha256-2glzIKBlui8YPvzI74bT4ADqEZ0lH9CuZqHtwz64Z3k=";
mypy-boto3-workspaces =
buildMypyBoto3Package "workspaces" "1.43.30"
"sha256-1OsfLVGw+V5J8nV343HEp8JOHpk81UawKRmAoE/eBNc=";
buildMypyBoto3Package "workspaces" "1.43.64"
"sha256-zfdA0TU8uzHfqWOt1o16Y6ANoN9PPtth8J9/DARMc+A=";
mypy-boto3-workspaces-web =
buildMypyBoto3Package "workspaces-web" "1.43.0"

View File

@@ -59,7 +59,7 @@ buildPythonPackage rec {
checkPhase = ''
runHook preCheck
stestr run -e <(echo "oslo_db.tests.sqlalchemy.test_utils.TestModelQuery.test_project_filter_allow_none")
stestr run
runHook postCheck
'';

View File

@@ -40,10 +40,7 @@ buildPythonPackage rec {
checkPhase = ''
runHook preCheck
stestr run -e <(echo "
# list is not deduped
oslo_i18n.tests.test_gettextutils.GettextTest.test_get_available_languages
")
stestr run
runHook postCheck
'';

View File

@@ -1,26 +1,34 @@
{
lib,
buildPythonPackage,
ddt,
docutils,
elasticsearch,
fetchPypi,
netaddr,
opentelemetry-exporter-otlp,
opentelemetry-sdk,
oslo-concurrency,
oslo-config,
oslo-serialization,
oslo-utils,
prettytable,
pymongo,
redis,
requests,
setuptools,
stestrCheckHook,
webob,
}:
buildPythonPackage rec {
pname = "osprofiler";
version = "4.3.0";
version = "4.4.0";
pyproject = true;
src = fetchPypi {
inherit pname version;
hash = "sha256-d6jaKyO7X5BIBUvVzMRdCshFdMqKiO8SC4+sbohk4kw=";
hash = "sha256-bgjffu9q/A0tAngT1A5DyyKPDrPrNEHWFJXCgA6/oyA=";
};
build-system = [ setuptools ];
@@ -36,11 +44,16 @@ buildPythonPackage rec {
webob
];
# NOTE(vinetos): OSProfiler depends on jeager-client which use opentracing
# Opentracing and jeager-client are archived since 2022.
# As this package is made only to support old OpenStack clients and bindings,
# We do not really care
doCheck = false;
nativeCheckInputs = [
ddt
docutils
elasticsearch
opentelemetry-exporter-otlp
opentelemetry-sdk
pymongo
redis
stestrCheckHook
];
pythonImportsCheck = [ "osprofiler" ];

View File

@@ -0,0 +1,156 @@
{
lib,
stdenv,
buildPythonPackage,
fetchFromGitHub,
kicad,
# build-time
cmake,
ninja,
pkg-config,
python,
# run-time
boost,
gmp,
mpfr,
# build-system
nanobind,
scikit-build-core,
setuptools,
setuptools-scm,
wheel,
# dependencies
lxml,
numpy,
pygerber,
pyopengl,
pyside6,
scipy,
sexpdata,
shapely,
# tests
pytestCheckHook,
typeguard,
}:
buildPythonPackage (finalAttrs: {
pname = "padne";
version = "0.3";
pyproject = true;
dontUseCmakeConfigure = true; # handled by python
__structuredAttrs = true;
src = fetchFromGitHub {
owner = "atx";
repo = "padne";
tag = "v${finalAttrs.version}";
hash = "sha256-eFrBjmLZQnfMG7nl9gHPb0Qr8MCAdhjzRIp5n1IzguM=";
fetchSubmodules = true;
};
postPatch = ''
# `padne` tries to import `pcbnew` directly from `KiCad`, falling back to
# `kigadgets` if that fails.
# However, `kigadgets` only supports KiCad v5-v9, whereas Nixpkgs is on
# v10, so drop it as a dependency to avoid a broken fallback.
sed -i '/kigadgets/d' pyproject.toml
'';
nativeBuildInputs = [
cmake
ninja
pkg-config
];
buildInputs = [
boost
gmp
mpfr
nanobind
];
cmakeFlags = [
(lib.cmakeFeature "nanobind_DIR" "${nanobind}/${python.sitePackages}/nanobind/cmake")
];
build-system = [
nanobind
scikit-build-core
setuptools
setuptools-scm
wheel
];
dependencies = [
kicad
lxml
numpy
finalAttrs.passthru.pygerber
pyopengl
pyside6
scipy
sexpdata
shapely
];
pythonImportsCheck = [
"padne"
];
nativeCheckInputs = [
pytestCheckHook
typeguard
];
preCheck = ''
# remove src module, so tests use the installed module, instead
mv padne _padne
'';
disabledTests = lib.optionals stdenv.hostPlatform.isAarch64 [
# AssertionError: Center distance 4.8999999999999995 not ~5.0
"test_basic_rectangle_distance_map"
];
passthru = {
# Padne needs a more recent version of `pygerber` than the one in Nixpkgs,
# which is currently the 2.4.3 stable release.
pygerber = pygerber.overrideAttrs {
version = "2.4.3-unstable-2026-03-20";
src = fetchFromGitHub {
owner = "Argmaster";
repo = "pygerber";
rev = "5446d44d424897e1b1a68c48c160ed9b4e828f44";
hash = "sha256-AhLIBh1dAmmOLBw6XaJIeYhUAh1BSv/ALVc4qOfD7g4=";
};
# TODO:
# 46 failed, 592 passed, 1 xfailed, 61 warnings, 96 errors in 16.52s
dontUsePytestCheck = true;
};
};
meta = {
description = "KiCad-focused Power Delivery Network Simulator";
longDescription = ''
Padne is a KiCad-native power delivery network analysis tool.
It uses the finite element method in order to simulate the voltage drop
induced by DC currents on printed circuit boards.
This allows easy identification of resistive bottlenecks, design of high
current distribution networks or implementing complex heating elements.
'';
homepage = "https://github.com/atx/padne";
changelog = "https://github.com/atx/padne/releases/tag/${finalAttrs.src.tag}";
mainProgram = "padne";
license = with lib.licenses; [ gpl3Plus ];
maintainers = with lib.maintainers; [ eljamm ];
teams = with lib.teams; [ ngi ];
};
})

View File

@@ -62,19 +62,7 @@ buildPythonPackage rec {
checkPhase = ''
runHook preCheck
# File "/build/python-cinderclient-9.6.0/cinderclient/client.py", line 196, in request
# if raise_exc and resp.status_code >= 400:
# ^^^^^^^^^^^^^^^^^^^^^^^
#
# TypeError: '>=' not supported between instances of 'Mock' and 'int'
stestr run -e <(echo "
cinderclient.tests.unit.test_client.ClientTest.test_keystone_request_raises_auth_failure_exception
cinderclient.tests.unit.test_client.ClientTest.test_sessionclient_request_method
cinderclient.tests.unit.test_client.ClientTest.test_sessionclient_request_method_raises_badrequest
cinderclient.tests.unit.test_client.ClientTest.test_sessionclient_request_method_raises_overlimit
cinderclient.tests.unit.test_shell.ShellTest.test_password_prompted
cinderclient.tests.unit.test_shell.TestLoadVersionedActions.test_load_versioned_actions_with_help
")
stestr run
runHook postCheck
'';

View File

@@ -26,23 +26,10 @@ let
disabledTests = [
# Skip tests which require networking.
"test_http_chunked_response"
"test_v1_download_has_no_stray_output_to_stdout"
"test_v2_requests_valid_cert_verification"
"test_download_has_no_stray_output_to_stdout"
"test_v1_requests_cert_verification_no_compression"
"test_v1_requests_cert_verification"
"test_v2_download_has_no_stray_output_to_stdout"
"test_v2_requests_bad_ca"
"test_v2_requests_bad_cert"
"test_v2_requests_cert_verification_no_compression"
"test_v2_requests_cert_verification"
"test_v2_requests_valid_cert_no_key"
"test_v2_requests_valid_cert_verification_no_compression"
"test_log_request_id_once"
# asserts exact amount of mock calls
"test_cache_schemas_gets_when_forced"
"test_cache_schemas_gets_when_not_exists"
"glanceclient.tests.unit.test_http.TestClient.test_http_chunked_response"
"glanceclient.tests.unit.test_http.TestClient.test_log_request_id_once"
"glanceclient.tests.unit.test_http.TestClient.test_log_request_id_once"
''glanceclient\.tests\.unit\.test_ssl\.TestHTTPSVerifyCert\..*''
];
in
buildPythonPackage {

View File

@@ -69,16 +69,7 @@ buildPythonPackage rec {
checkPhase = ''
runHook preCheck
stestr run -e <(echo "
ironicclient.tests.unit.osc.v1.test_baremetal_chassis.TestChassisCreate.test_chassis_create_no_options
ironicclient.tests.unit.osc.v1.test_baremetal_chassis.TestChassisCreate.test_chassis_create_with_description
ironicclient.tests.unit.osc.v1.test_baremetal_chassis.TestChassisCreate.test_chassis_create_with_extra
ironicclient.tests.unit.osc.v1.test_baremetal_chassis.TestChassisCreate.test_chassis_create_with_uuid
ironicclient.tests.unit.osc.v1.test_baremetal_conductor.TestBaremetalConductorShow.test_conductor_show
ironicclient.tests.unit.osc.v1.test_baremetal_node.TestBaremetalCreate
ironicclient.tests.unit.osc.v1.test_baremetal_node.TestBaremetalShow.test_baremetal_show
ironicclient.tests.unit.osc.v1.test_baremetal_node.TestNodeHistoryEventGet.test_baremetal_node_history_list
")
stestr run
runHook postCheck
'';

View File

@@ -55,10 +55,7 @@ buildPythonPackage rec {
multiprocess
];
checkPhase = ''
# Skip tests that fail due to setuptools>=66.0.0 rejecting PEP 440
# non-conforming versions. See
# https://github.com/pypa/setuptools/issues/2497 for details.
stestr run -E "tests.test_plugins.(PluginsTestScenarios.test_plugin_version_comparison|PluginsTestScenarios.test_plugin_version_object_comparison|PluginsTest.test_plugin_equal|PluginsTest.test_plugin_not_equal)"
stestr run
'';
meta = {

View File

@@ -3,6 +3,7 @@
buildPythonPackage,
cliff,
fetchFromGitHub,
fetchpatch,
keystoneauth1,
openstackdocstheme,
openstacksdk,
@@ -36,6 +37,14 @@ buildPythonPackage rec {
hash = "sha256-FNfee7d8gTcsTdv7lxqDbniUiKQvUXHRSkAlNOCn/k4=";
};
patches = [
# Fix unit test failure caused by osprofiler 4.4.0
(fetchpatch {
url = "https://github.com/openstack/python-mistralclient/commit/4cee2bb25a4d15e7dd1802f3e7e75520177446db.patch";
hash = "sha256-H8JSvPFcHZJsnIWpV0WPvkqyvmg8SBbpsUzqcZeFBwA=";
})
];
env.PBR_VERSION = version;
nativeBuildInputs = [
@@ -83,7 +92,7 @@ buildPythonPackage rec {
meta = {
description = "OpenStack Mistral Command-line Client";
homepage = "https://opendev.org/openstack/python-mistralclient/";
homepage = "https://github.com/openstack/python-mistralclient";
license = lib.licenses.asl20;
mainProgram = "mistral";
teams = [ lib.teams.openstack ];

View File

@@ -22,14 +22,14 @@
buildPythonPackage (finalAttrs: {
pname = "rioxarray";
version = "0.22.0";
version = "0.23.0";
pyproject = true;
src = fetchFromGitHub {
owner = "corteva";
repo = "rioxarray";
tag = finalAttrs.version;
hash = "sha256-+0TJeEjAKIqi6cbLZiv14dPKW8Xza+4tn/Erzn88ZS0=";
hash = "sha256-3zRfoCHINLZt88tIu9wSOyZGzQEryxMSWhfEBcviKSQ=";
};
build-system = [ setuptools ];

View File

@@ -15,14 +15,14 @@
buildPythonPackage (finalAttrs: {
pname = "streamlit-folium";
version = "0.27.3";
version = "0.27.4";
pyproject = true;
src = fetchFromGitHub {
owner = "randyzwitch";
repo = "streamlit-folium";
tag = "v${finalAttrs.version}";
hash = "sha256-nxUK8o9OqdD0/tktSncTgxk3q4nAhmmR8A7isZsxsFI=";
hash = "sha256-DpkAwbSi8nQ2E9ItxCq89ubPGn5u8/caYj0GaGuTnR4=";
};
postPatch = ''

View File

@@ -7,16 +7,16 @@
pytest-cov-stub,
}:
buildPythonPackage rec {
buildPythonPackage (finalAttrs: {
pname = "tiered-debug";
version = "1.4.0";
version = "1.5.1";
pyproject = true;
src = fetchFromGitHub {
owner = "untergeek";
repo = "tiered-debug";
tag = "v${version}";
hash = "sha256-lGt2cnT5Pjb87msgnDawn2gg2VtWXwniHM1wTjHU/x4=";
tag = "v${finalAttrs.version}";
hash = "sha256-PIqRReT+m5nlq9koD88XJMeUvUsRwrXCqZDTylZGgPg=";
};
build-system = [ hatchling ];
@@ -37,8 +37,8 @@ buildPythonPackage rec {
meta = {
description = "Python logging helper module that allows for multiple tiers of debug logging";
homepage = "https://github.com/untergeek/tiered-debug";
changelog = "https://github.com/untergeek/tiered-debug/releases/tag/${src.tag}";
changelog = "https://github.com/untergeek/tiered-debug/releases/tag/${finalAttrs.src.tag}";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ fab ];
};
}
})

View File

@@ -0,0 +1,41 @@
{
lib,
buildPythonPackage,
fetchFromGitHub,
setuptools,
tree-sitter,
}:
buildPythonPackage (finalAttrs: {
pname = "tree-sitter-typescript";
version = "0.23.2";
pyproject = true;
src = fetchFromGitHub {
owner = "tree-sitter";
repo = "tree-sitter-typescript";
tag = "v${finalAttrs.version}";
hash = "sha256-CU55+YoFJb6zWbJnbd38B7iEGkhukSVpBN7sli6GkGY=";
};
build-system = [ setuptools ];
optional-dependencies = {
core = [
tree-sitter
];
};
# There are no tests
doCheck = false;
pythonImportsCheck = [ "tree_sitter_typescript" ];
meta = {
description = "TypeScript grammar for tree-sitter";
homepage = "https://github.com/tree-sitter/tree-sitter-typescript";
changelog = "https://github.com/tree-sitter/tree-sitter-typescript/releases/tag/v${finalAttrs.src.tag}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ fab ];
};
})

View File

@@ -12793,6 +12793,8 @@ self: super: with self; {
paddlex = callPackage ../development/python-modules/paddlex { };
padne = callPackage ../development/python-modules/padne { };
pagelabels = callPackage ../development/python-modules/pagelabels { };
paginate = callPackage ../development/python-modules/paginate { };
@@ -20760,6 +20762,8 @@ self: super: with self; {
tree-sitter-sql = callPackage ../development/python-modules/tree-sitter-sql { };
tree-sitter-typescript = callPackage ../development/python-modules/tree-sitter-typescript { };
tree-sitter-yaml = callPackage ../development/python-modules/tree-sitter-yaml { };
tree-sitter-zeek = callPackage ../development/python-modules/tree-sitter-zeek { };