From e62ad0c831e35a5ed3c30afcb59c0de4b628cc26 Mon Sep 17 00:00:00 2001 From: Matteo Cherubini Date: Sat, 27 Jun 2026 12:15:58 +0200 Subject: [PATCH] feat: Add `slug.sh --raw` for deterministic raw file slugging --- skills/ingest/scripts/slug.sh | 12 ++++++++++++ tests/slug.bats | 30 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 tests/slug.bats diff --git a/skills/ingest/scripts/slug.sh b/skills/ingest/scripts/slug.sh index 2f7fdc5..b026b6b 100755 --- a/skills/ingest/scripts/slug.sh +++ b/skills/ingest/scripts/slug.sh @@ -7,6 +7,18 @@ # ============================================================================= set -euo pipefail +if [[ "${1:-}" == "--raw" ]]; then + raw="${2:?usage: slug.sh --raw }" + rel="${raw#raw/}"; rel="${rel#*/}" # strip "raw/" and the bucket name + rel="${rel%.*}" # strip extension + slug="$(printf '%s\n' "$rel" | tr '/' '\n' \ + | sed -E 's/[^a-zA-Z0-9]+/-/g; s/-{2,}/-/g; s/^-+//; s/-+$//' \ + | tr '[:upper:]' '[:lower:]' | paste -sd- -)" + [[ -n "$slug" ]] || { echo "slug: empty result for input '${raw}'" >&2; exit 1; } + printf '%s\n' "$slug" + exit 0 +fi + input="${1:?usage: slug.sh }" # Strip directory and extension when given a path diff --git a/tests/slug.bats b/tests/slug.bats new file mode 100644 index 0000000..75410b4 --- /dev/null +++ b/tests/slug.bats @@ -0,0 +1,30 @@ +#!/usr/bin/env bats + +setup() { + load 'helpers' + SLUG="${SKILL_SCRIPTS}/slug.sh" +} + +@test "slug --raw: flat file remains unchanged" { + run bash "$SLUG" --raw "raw/articles/il-pane.md" + [ "$status" -eq 0 ] + [ "$output" = "il-pane" ] +} + +@test "slug --raw: nested file gets folder prefix" { + run bash "$SLUG" --raw "raw/articles/cibo/il-pane.md" + [ "$status" -eq 0 ] + [ "$output" = "cibo-il-pane" ] +} + +@test "slug --raw: distinct subdirs avoid collision" { + s1="$(bash "$SLUG" --raw "raw/articles/cibo/pane.md")" + s2="$(bash "$SLUG" --raw "raw/articles/storia/pane.md")" + [ "$s1" != "$s2" ] +} + +@test "slug --raw: Bash and Python-calling-bash agree (single implementation)" { + b="$(bash "$SLUG" --raw "raw/articles/cibo/il-pane.md")" + p="$(python3 -c "import subprocess;print(subprocess.check_output(['bash','$SLUG','--raw','raw/articles/cibo/il-pane.md'],text=True).strip())")" + [ "$b" = "$p" ] +}