nix(feat): Add postgrest-with-git and postgrest-with-pgrst tools

This commit is contained in:
Wolfgang Walther
2022-06-03 22:19:16 -05:00
committed by Steve Chavez
parent c9f017c632
commit f7b3608d4e
5 changed files with 156 additions and 25 deletions
+1 -1
View File
@@ -148,5 +148,5 @@ rec {
}; };
withTools = withTools =
pkgs.callPackage nix/tools/withTools.nix { inherit postgresqlVersions; }; pkgs.callPackage nix/tools/withTools.nix { inherit devCabalOptions postgresqlVersions postgrest; };
} }
+2 -2
View File
@@ -72,8 +72,8 @@ let
inRootDir = true; inRootDir = true;
} }
'' ''
${withTools}/bin/postgrest-with-all ${tests}/bin/postgrest-test-spec ${withTools.withPgAll} ${tests}/bin/postgrest-test-spec
${withTools}/bin/postgrest-with-all ${tests}/bin/postgrest-test-querycost ${withTools.withPgAll} ${tests}/bin/postgrest-test-querycost
${tests}/bin/postgrest-test-doctests ${tests}/bin/postgrest-test-doctests
${tests}/bin/postgrest-test-spec-idempotence ${tests}/bin/postgrest-test-spec-idempotence
${tests}/bin/postgrest-test-io ${tests}/bin/postgrest-test-io
+1 -1
View File
@@ -17,7 +17,7 @@ let
withPath = [ postgrestProfiled curl ]; withPath = [ postgrestProfiled curl ];
} }
'' ''
${withTools.latest} test/memory-tests.sh ${withTools.withPg} test/memory-tests.sh
''; '';
in in
+8 -8
View File
@@ -24,7 +24,7 @@ let
withEnv = postgrest.env; withEnv = postgrest.env;
} }
'' ''
${withTools.latest} ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:spec ${withTools.withPg} ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:spec
''; '';
testQuerycost = testQuerycost =
@@ -36,7 +36,7 @@ let
withEnv = postgrest.env; withEnv = postgrest.env;
} }
'' ''
${withTools.latest} ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:querycost ${withTools.withPg} ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:querycost
''; '';
testDoctests = testDoctests =
@@ -66,7 +66,7 @@ let
withEnv = postgrest.env; withEnv = postgrest.env;
} }
'' ''
${withTools.latest} ${runtimeShell} -c " \ ${withTools.withPg} ${runtimeShell} -c " \
${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:spec && \ ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:spec && \
${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:spec" ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:spec"
''; '';
@@ -92,7 +92,7 @@ let
} }
'' ''
${cabal-install}/bin/cabal v2-build ${devCabalOptions} ${cabal-install}/bin/cabal v2-build ${devCabalOptions}
${cabal-install}/bin/cabal v2-exec ${withTools.latest} \ ${cabal-install}/bin/cabal v2-exec ${withTools.withPg} \
${ioTestPython}/bin/pytest -- -v test/io-tests "''${_arg_leftovers[@]}" ${ioTestPython}/bin/pytest -- -v test/io-tests "''${_arg_leftovers[@]}"
''; '';
@@ -106,7 +106,7 @@ let
withPath = [ jq ]; withPath = [ jq ];
} }
'' ''
${withTools.latest} \ ${withTools.withPg} \
${cabal-install}/bin/cabal v2-run ${devCabalOptions} --verbose=0 -- \ ${cabal-install}/bin/cabal v2-run ${devCabalOptions} --verbose=0 -- \
postgrest --dump-schema \ postgrest --dump-schema \
| ${yq}/bin/yq -y . | ${yq}/bin/yq -y .
@@ -135,14 +135,14 @@ let
# collect all tests # collect all tests
HPCTIXFILE="$tmpdir"/io.tix \ HPCTIXFILE="$tmpdir"/io.tix \
${withTools.latest} ${cabal-install}/bin/cabal v2-exec ${devCabalOptions} \ ${withTools.withPg} ${cabal-install}/bin/cabal v2-exec ${devCabalOptions} \
${ioTestPython}/bin/pytest -- -v test/io-tests ${ioTestPython}/bin/pytest -- -v test/io-tests
HPCTIXFILE="$tmpdir"/spec.tix \ HPCTIXFILE="$tmpdir"/spec.tix \
${withTools.latest} ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:spec ${withTools.withPg} ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:spec
HPCTIXFILE="$tmpdir"/querycost.tix \ HPCTIXFILE="$tmpdir"/querycost.tix \
${withTools.latest} ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:querycost ${withTools.withPg} ${cabal-install}/bin/cabal v2-run ${devCabalOptions} test:querycost
# Note: No coverage for doctests, as doctests leverage GHCi and GHCi does not support hpc # Note: No coverage for doctests, as doctests leverage GHCi and GHCi does not support hpc
+144 -13
View File
@@ -1,9 +1,14 @@
{ bashCompletion { bashCompletion
, buildToolbox , buildToolbox
, cabal-install
, checkedShellScript , checkedShellScript
, curl
, devCabalOptions
, git
, lib , lib
, postgresqlVersions , postgresqlVersions
, writeTextFile , postgrest
, writeText
}: }:
let let
withTmpDb = withTmpDb =
@@ -78,27 +83,27 @@ let
''; '';
# Helper script for running a command against all PostgreSQL versions. # Helper script for running a command against all PostgreSQL versions.
withAll = withPgAll =
let let
runners = runners =
builtins.map builtins.map
(pg: (version:
'' ''
cat << EOF cat << EOF
Running against ${pg.name}... Running against ${version.name}...
EOF EOF
trap 'echo "Failed on ${pg.name}"' exit trap 'echo "Failed on ${version.name}"' exit
(${withTmpDb pg} "$_arg_command" "''${_arg_leftovers[@]}") (${withTmpDb version} "$_arg_command" "''${_arg_leftovers[@]}")
trap "" exit trap "" exit
cat << EOF cat << EOF
Done running against ${pg.name}. Done running against ${version.name}.
EOF EOF
'') '')
@@ -119,15 +124,141 @@ let
(lib.concatStringsSep "\n\n" runners); (lib.concatStringsSep "\n\n" runners);
# Create a `postgrest-with-postgresql-` for each PostgreSQL version # Create a `postgrest-with-postgresql-` for each PostgreSQL version
withVersions = builtins.map withTmpDb postgresqlVersions; withPgVersions = builtins.map withTmpDb postgresqlVersions;
withPg = builtins.head withPgVersions;
withGit =
checkedShellScript
{
name = "postgrest-with-git";
docs =
''
Create a new worktree of the postgrest repo in a temporary directory and
check out <commit>, then run <command> with arguments inside the temporary folder.
'';
args =
[
"ARG_POSITIONAL_SINGLE([commit], [Commit-ish reference to run command with])"
"ARG_POSITIONAL_SINGLE([command], [Command to run])"
"ARG_LEFTOVERS([command arguments])"
];
addCommandCompletion = true; # TODO: first positional argument needs git commit completion
inRootDir = true;
}
''
# not using withTmpDir here, because we don't want to keep the directory on error
tmpdir="$(mktemp -d)"
trap 'rm -rf "$tmpdir"' EXIT
${git}/bin/git worktree add -f "$tmpdir" "$_arg_commit" > /dev/null
cd "$tmpdir"
("$_arg_command" "''${_arg_leftovers[@]}")
${git}/bin/git worktree remove -f "$tmpdir" > /dev/null
'';
legacyConfig =
writeText "legacy.conf"
''
# Using this config file to support older postgrest versions for `postgrest-loadtest-against`
db-uri="$(PGRST_DB_URI)"
db-schema="$(PGRST_DB_SCHEMAS)"
db-anon-role="$(PGRST_DB_ANON_ROLE)"
db-pool="$(PGRST_DB_POOL)"
server-unix-socket="$(PGRST_SERVER_UNIX_SOCKET)"
log-level="$(PGRST_LOG_LEVEL)"
'';
waitForPgrstPid =
checkedShellScript
{
name = "postgrest-wait-for-pgrst-pid";
docs = "Wait for PostgREST to be running. Needs to be a separate command for timeout to work below.";
args = [
"ARG_USE_ENV([PGRST_SERVER_UNIX_SOCKET], [], [Unix socket to check for running PostgREST instance])"
];
}
''
# ARG_USE_ENV only adds defaults or docs for environment variables
# We manually implement a required check here
# See also: https://github.com/matejak/argbash/issues/80
: "''${PGRST_SERVER_UNIX_SOCKET:?PGRST_SERVER_UNIX_SOCKET is required}"
until [ -S "$PGRST_SERVER_UNIX_SOCKET" ]
do
sleep 0.1
done
# return pid of postgrest process
lsof -t -c '/^postgrest$/' "$PGRST_SERVER_UNIX_SOCKET"
'';
waitForPgrstReady =
checkedShellScript
{
name = "postgrest-wait-for-pgrst-ready";
docs = "Wait for PostgREST to be ready to serve requests. Needs to be a separate command for timeout to work below.";
args = [
"ARG_USE_ENV([PGRST_SERVER_UNIX_SOCKET], [], [Unix socket to check for running PostgREST instance])"
];
}
''
# ARG_USE_ENV only adds defaults or docs for environment variables
# We manually implement a required check here
# See also: https://github.com/matejak/argbash/issues/80
: "''${PGRST_SERVER_UNIX_SOCKET:?PGRST_SERVER_UNIX_SOCKET is required}"
function check_status () {
${curl}/bin/curl -s -o /dev/null -w "%{http_code}" --unix-socket "$PGRST_SERVER_UNIX_SOCKET" http://localhost/
}
while [[ "$(check_status)" != "200" ]];
do sleep 0.1;
done
'';
withPgrst =
checkedShellScript
{
name = "postgrest-with-pgrst";
docs = "Build and run PostgREST and run <command> with PGRST_SERVER_UNIX_SOCKET set.";
args =
[
"ARG_POSITIONAL_SINGLE([command], [Command to run])"
"ARG_LEFTOVERS([command arguments])"
];
addCommandCompletion = true;
inRootDir = true;
withEnv = postgrest.env;
withTmpDir = true;
}
''
export PGRST_SERVER_UNIX_SOCKET="$tmpdir"/postgrest.socket
${cabal-install}/bin/cabal v2-build ${devCabalOptions} > "$tmpdir"/build.log 2>&1
${cabal-install}/bin/cabal v2-run ${devCabalOptions} --verbose=0 -- \
postgrest ${legacyConfig} > "$tmpdir"/run.log 2>&1 &
# to get the pid of the postgrest process, we need to jump through some hoops
# $! will return the pid of cabal - but killing this, will not propagate to postgrest
pid=$(timeout -s TERM 1 ${waitForPgrstPid})
cleanup() {
kill "$pid" || true
}
trap cleanup EXIT
timeout -s TERM 5 ${waitForPgrstReady}
("$_arg_command" "''${_arg_leftovers[@]}")
'';
in in
buildToolbox buildToolbox
{ {
name = "postgrest-with"; name = "postgrest-with";
tools = [ withAll ] ++ withVersions; tools = [ withPgAll withGit withPgrst ] ++ withPgVersions;
extra = { # make withTools available for other nix files
# make withTools.latest available for other nix files extra = { inherit withGit withPg withPgAll withPgrst; };
latest = withTmpDb (builtins.head postgresqlVersions);
};
} }