From 696d5439dab907f41060b8e319a9657832b2eddb Mon Sep 17 00:00:00 2001 From: chaos Date: Tue, 19 Mar 2024 14:54:30 +0000 Subject: [PATCH] add statix-nano jq script for linting nix files in nano --- .gitignore | 4 +- extras/statix-nano/statix-nano-lint.nix | 12 ++++ extras/statix-nano/statix-nano-lint.sh | 15 ++++ extras/statix-nano/statix-to-nano-linter.jq | 70 +++++++++++++++++++ .../statix-nano/statix-to-nano-linter.test.jq | 39 +++++++++++ .../statix-nano/statix-to-nano-linter.test.sh | 7 ++ flake.nix | 2 +- home/dev/all/editors.nix | 6 +- home/dev/all/extra.nix | 1 + home/programming/editors/nano.nix | 0 home/programming/editors/nano/nano.nix | 54 ++++++++++++++ profiles/base/editors.nix | 3 + statix.toml | 3 +- 13 files changed, 212 insertions(+), 4 deletions(-) create mode 100644 extras/statix-nano/statix-nano-lint.nix create mode 100755 extras/statix-nano/statix-nano-lint.sh create mode 100755 extras/statix-nano/statix-to-nano-linter.jq create mode 100755 extras/statix-nano/statix-to-nano-linter.test.jq create mode 100755 extras/statix-nano/statix-to-nano-linter.test.sh delete mode 100644 home/programming/editors/nano.nix create mode 100644 home/programming/editors/nano/nano.nix create mode 100644 profiles/base/editors.nix diff --git a/.gitignore b/.gitignore index 1b0a8f7..1c3ddf8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ result -*.qcow2 \ No newline at end of file +*.qcow2 +*~x + \ No newline at end of file diff --git a/extras/statix-nano/statix-nano-lint.nix b/extras/statix-nano/statix-nano-lint.nix new file mode 100644 index 0000000..ec405cf --- /dev/null +++ b/extras/statix-nano/statix-nano-lint.nix @@ -0,0 +1,12 @@ +{pkgs, ...}: { + script = pkgs.writeShellScript "nano-lint-nix.sh" '' + #!/usr/bin/env bash + set -uxeo pipefail + + env SCRIPT_LIB_DIR=${builtins.path { + path = ./.; + filter = path: type: + path == toString ./statix-to-nano-linter.jq; + }} bash ${./statix-nano-lint.sh} $@ + ''; +} diff --git a/extras/statix-nano/statix-nano-lint.sh b/extras/statix-nano/statix-nano-lint.sh new file mode 100755 index 0000000..efcd739 --- /dev/null +++ b/extras/statix-nano/statix-nano-lint.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +set -uxe + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +if [ ! -z "${DEBUG:-}" ]; then + JQ_ARGS="--debug-trace" +else + JQ_ARGS="" +fi + + +statix check -o json "$@" | jq ${JQ_ARGS:-} -rnesM -L $SCRIPT_DIR -L "${SCRIPT_LIB_DIR:-}" 'include "statix-to-nano-linter"; main' + diff --git a/extras/statix-nano/statix-to-nano-linter.jq b/extras/statix-nano/statix-to-nano-linter.jq new file mode 100755 index 0000000..bbde833 --- /dev/null +++ b/extras/statix-nano/statix-to-nano-linter.jq @@ -0,0 +1,70 @@ +def lpad($len; $fill): + tostring | ($len - length) as $l | ($fill * $l)[:$l] + .; + +# Severity Enum: https://github.com/nerdypepper/statix/blob/d324490e45bcda1b664f28b6f88da8580deda76b/lib/src/lib.rs#L21 +# Warn/Error/Hint +def severity_or_unknown($severity): + if + (["Warn","Error","Hint"] | any(index($severity))) + then + $severity + else "Unknown" end; + +def severity_or_unknown: severity_or_unknown(.); + + +# Emulating how the fancy stderr displays messages +# https://github.com/nerdypepper/statix/blob/d324490e45bcda1b664f28b6f88da8580deda76b/bin/src/traits.rs#L112 +def severity_to_inital($severity): + {"Warn": "W", "Error": "E", "Hint": "I"} as $mapping | + ($mapping).[$severity] + // debug("severity '\($severity)' could not be be matched to an initial"); + +def severity_to_inital: severity_to_inital(.); + +# Emulating how fancy stderr via ariadne & how errfmt displays +# https://github.com/nerdypepper/statix/blob/d324490e45bcda1b664f28b6f88da8580deda76b/bin/src/traits.rs#L62 +def severity_to_name($severity): + { + "Warn": "Warning", + "Error", + "Hint": "Advice", + "Unknown" + } as $mapping | ($mapping).[$severity]; + +def severity_to_tag($severity; $code): + ($code | lpad(2; "0")) as $code | + if $severity != "Unknown" + then "[\(severity_to_inital($severity))\($code)]" + else "[\($code)?]" + end; + +def print_diagnostic($filename; $report; $issue; $diagnostic): + $diagnostic.at.from as $from | + $from.line as $line | + $from.column as $column | + severity_or_unknown($issue.severity) as $severity | + severity_to_name($severity) as $severity_name | + severity_to_tag($severity; $issue.code) as $severity_tag | + "\($filename):\($line):\($column): \($severity_tag) \($severity_name): \($issue.note)"; + +def process_input: + . as $root | + .file as $filename | + .report as $report | + $report[] as $issue | + $issue.diagnostics[] as $diagnostic | + print_diagnostic($filename; $report; $issue; $diagnostic); + +def process_inputs: + . as $inputs | + if length == 0 or (. == null) then halt else + [$inputs | .[] | process_input] | join("\n") | .+"\n" | halt_error(1) + end; + +def main: + [try input catch infinite] | .[0] | if isinfinite then halt else ., inputs | process_inputs end; + #| + #if + # isempty(.) or (. == null) + #then debug("x") else (. | process_input) end; diff --git a/extras/statix-nano/statix-to-nano-linter.test.jq b/extras/statix-nano/statix-to-nano-linter.test.jq new file mode 100755 index 0000000..627b1c2 --- /dev/null +++ b/extras/statix-nano/statix-to-nano-linter.test.jq @@ -0,0 +1,39 @@ +# severity_or_unknown tests +## All Valid Severities +include "statix-to-nano-linter"; . | severity_or_unknown +"Warn" +"Warn" + +include "statix-to-nano-linter"; severity_or_unknown +"Error" +"Error" + +include "statix-to-nano-linter"; severity_or_unknown +"Hint" +"Hint" + +## Invalid but used elsewhere in other code +include "statix-to-nano-linter"; severity_or_unknown +"Info" +"Unknown" + +include "statix-to-nano-linter"; severity_or_unknown +"Advice" +"Unknown" + +## Fake +include "statix-to-nano-linter"; severity_or_unknown +"beep" +"Unknown" + +## Technically True +include "statix-to-nano-linter"; severity_or_unknown +"Unknown" +"Unknown" + + +# severity_to_inital tests +# Valid +include "statix-to-nano-linter"; severity_to_inital +"Warn" +"W" \ No newline at end of file diff --git a/extras/statix-nano/statix-to-nano-linter.test.sh b/extras/statix-nano/statix-to-nano-linter.test.sh new file mode 100755 index 0000000..c5e9c24 --- /dev/null +++ b/extras/statix-nano/statix-to-nano-linter.test.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -x + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +jq -L $SCRIPT_DIR --run-tests $SCRIPT_DIR/statix-to-nano-linter.test.jq \ No newline at end of file diff --git a/flake.nix b/flake.nix index 2d9e6c9..1abf0ba 100644 --- a/flake.nix +++ b/flake.nix @@ -42,5 +42,5 @@ food-site.inputs.flake-compat.follows = "flake-compat"; }; - outputs = inputs: import ./outputs.nix inputs; + outputs = inputs: import ./outputs.nix inputs ; } diff --git a/home/dev/all/editors.nix b/home/dev/all/editors.nix index 4bfb5a5..8c0d267 100644 --- a/home/dev/all/editors.nix +++ b/home/dev/all/editors.nix @@ -1 +1,5 @@ -{pkgs, ...}: {home.packages = with pkgs; [nano];} +{tree, ...}: { + imports = with tree; [ + home.programming.editors.nano + ]; +} diff --git a/home/dev/all/extra.nix b/home/dev/all/extra.nix index 601ec28..ad2e433 100644 --- a/home/dev/all/extra.nix +++ b/home/dev/all/extra.nix @@ -10,6 +10,7 @@ python3 binutils # for strings qrencode + dos2unix # This saves a rebuild of already cached busybox (pkgs.runCommand "busybox-no-applets" {} '' diff --git a/home/programming/editors/nano.nix b/home/programming/editors/nano.nix deleted file mode 100644 index e69de29..0000000 diff --git a/home/programming/editors/nano/nano.nix b/home/programming/editors/nano/nano.nix new file mode 100644 index 0000000..2aed68c --- /dev/null +++ b/home/programming/editors/nano/nano.nix @@ -0,0 +1,54 @@ +{ + self, + pkgs, + config, + ... +} @ inputs: let + package = + if inputs ? "nixosConfig" + then inputs.nixosConfig.programs.nano.package + else pkgs.nano; +in { + home.packages = with pkgs; [package deadnix statix ]; + systemd.user.tmpfiles.rules = [ + "d ${config.xdg.cacheHome}/nano - ${config.home.username} users" + ]; + + xdg.configFile."nano/nanorc".text = '' + set softwrap + set tabsize 2 + set autoindent + set backup + set backupdir "${config.xdg.cacheHome}/nano" + set indicator + set magic + unset mouse + set nonewlines + set constantshow + set positionlog + set multibuffer + unset minibar + + bind ^I formatter all + bind M-I formatter all + bind Sh-M-I formatter all + + bind ^L linter all + bind M-L linter all + bind Sh-M-L linter all + + include "${package}/share/nano/*.nanorc" + include "${package}/share/nano/extra/*.nanorc" + include "${pkgs.nanorc}/share/*.nanorc" + + extendsyntax rust formatter rustfmt + extendsyntax nix formatter alejandra -t1 + extendsyntax nix linter ${pkgs.writeShellScript "nano-lint-nix.sh" (let + statix-nano = import "${self}/extras/statix-nano/statix-nano-lint.nix" inputs; + in '' + #!/usr/bin/env bash + set -uxeo pipefail + deadnix $@ -o json | jq -r '.file as $filename | .results | .[] | $filename + ":" + (.line|tostring) + ":" + (.column|tostring) + ": " + .message' + '')} + ''; +} diff --git a/profiles/base/editors.nix b/profiles/base/editors.nix new file mode 100644 index 0000000..e632598 --- /dev/null +++ b/profiles/base/editors.nix @@ -0,0 +1,3 @@ +{...}: { + programs.nano.syntaxHighlight = false; +} diff --git a/statix.toml b/statix.toml index c6fd647..4ddd6f4 100644 --- a/statix.toml +++ b/statix.toml @@ -1,3 +1,4 @@ disabled = [ - "empty_pattern" + "empty_pattern", + "repeated_keys" ]