diff --git a/.editorconfig b/.editorconfig index ea3959a..d4c724e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,6 +10,9 @@ trim_trailing_whitespace = true [*.py] indent_size = 4 +[*.bats] +indent_size = 2 + [*.nix] indent_size = 2 diff --git a/default.nix b/default.nix index 5044cbf..b5f2646 100644 --- a/default.nix +++ b/default.nix @@ -1,28 +1,60 @@ { stdenv, + lib, + bats, python3, python3Packages, + shellcheck-minimal, + shfmt, }: +let + fs = lib.fileset; +in stdenv.mkDerivation { pname = "mechanicaldiff"; version = "0.0.1"; - src = ./bin; + src = fs.toSource { + root = ./.; + fileset = fs.unions [ + ./.editorconfig + ./bin + ./test + ]; + }; buildInputs = [ python3 ]; + postPatch = '' + patchShebangs . + ''; + doCheck = true; - nativeCheckInputs = [ python3Packages.flake8 ]; + nativeCheckInputs = [ + (bats.withLibraries (p: [ + p.bats-assert + p.bats-support + p.bats-file + ])) + python3Packages.flake8 + shellcheck-minimal + shfmt + ]; checkPhase = '' - flake8 mechanicaldiff.py + runHook preCheck + flake8 bin/mechanicaldiff.py + shellcheck test/mechanicaldiff.bats + shfmt -d test/mechanicaldiff.bats + bats test + runHook postCheck ''; installPhase = '' mkdir -p $out/bin - cp mechanicaldiff.py $out/bin/mechanicaldiff + cp $src/bin/mechanicaldiff.py $out/bin/mechanicaldiff chmod +x $out/bin/mechanicaldiff ''; } diff --git a/flake.nix b/flake.nix index d97cd4f..e386431 100644 --- a/flake.nix +++ b/flake.nix @@ -15,6 +15,19 @@ in { packages.default = pkgs.callPackage ./default.nix { }; + devShells.default = pkgs.mkShell { + packages = [ + (pkgs.bats.withLibraries (p: [ + p.bats-assert + p.bats-support + p.bats-file + ])) + pkgs.python3 + pkgs.python3Packages.flake8 + pkgs.shellcheck + pkgs.shfmt + ]; + }; } ); } diff --git a/test/mechanicaldiff.bats b/test/mechanicaldiff.bats new file mode 100755 index 0000000..c415c7d --- /dev/null +++ b/test/mechanicaldiff.bats @@ -0,0 +1,50 @@ +#!/usr/bin/env bats + +setup() { + set -euo pipefail + + bats_load_library bats-support + bats_load_library bats-assert + + DIR="$(cd "$(dirname "$BATS_TEST_FILENAME")" >/dev/null 2>&1 && pwd)" + PATH="$DIR/../bin:$PATH" +} + +@test "keeps hunk when replacement matches" { + run bash -c 'cat <<"EOF" | mechanicaldiff.py foo bar +diff --git a/file.txt b/file.txt +index 1111111..2222222 100644 +--- a/file.txt ++++ b/file.txt +@@ -1,1 +1,1 @@ +-foo ++bar +EOF' + assert_success + expected="$( + cat <<'EOF' +diff --git a/file.txt b/file.txt +index 1111111..2222222 100644 +--- a/file.txt ++++ b/file.txt +@@ -1,1 +1,1 @@ +-foo ++bar +EOF + )" + assert_output "$expected" +} + +@test "drops diff when replacement does not match" { + run bash -c 'cat <<"EOF" | mechanicaldiff.py foo bar +diff --git a/file.txt b/file.txt +index 1111111..2222222 100644 +--- a/file.txt ++++ b/file.txt +@@ -1,1 +1,1 @@ +-foo ++baz +EOF' + assert_success + assert_output "" +}