nix(feat): Add postgrest-with-git and postgrest-with-pgrst tools
This commit is contained in:
committed by
Steve Chavez
parent
c9f017c632
commit
f7b3608d4e
+1
-1
@@ -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; };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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);
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user