Skip to content

[zh-TW] Add missing error responses (#4022) #12579

[zh-TW] Add missing error responses (#4022)

[zh-TW] Add missing error responses (#4022) #12579

Workflow file for this run

---
name: CI
# yamllint disable-line rule:truthy
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
pull-requests: read
concurrency:
# yamllint disable-line rule:line-length
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v7
with:
python-version: "3.13"
cache: "pip"
- run: script/setup
- run: python3 -m script.intentfest add_language test_add_language_generates_valid_data "CI Added Language"
- name: Register intentfest problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/intentfest.json"
- name: Run lint
run: script/lint
- name: Get changed files
if: github.event_name == 'pull_request'
id: changed-files
uses: step-security/changed-files@v47
with:
json: true
escape_json: false
- name: Extract affected languages
if: github.event_name == 'pull_request'
id: extract-languages
env:
CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
run: |
echo "::group::Get changed files"
echo $CHANGED_FILES
echo "::endgroup::"
# Files changed outside the language directories (sentences/responses/tests).
OTHER_FILES=$(echo "$CHANGED_FILES" | jq -r '.[]' | \
grep -vE '^(sentences|responses|tests)/' || true)
# languages.yaml (e.g. leader edits) and the regenerated CODEOWNERS are
# metadata only: they don't affect sentence tests, over-matching, or
# pruning. Any *other* out-of-language-dir file still forces a full run.
if [ -n "$OTHER_FILES" ]; then
NON_META_FILES=$(echo "$OTHER_FILES" | \
grep -vE '^(languages\.yaml|CODEOWNERS)$' || true)
if [ -n "$NON_META_FILES" ]; then
echo "Running full tests due to changes outside language directories:"
echo "$NON_META_FILES"
exit 0
fi
fi
# Get unique language codes from changed files
LANGUAGES=$(echo "$CHANGED_FILES" | jq -r '.[]' | \
grep -oE '^(sentences|responses|tests)/([^/ ]+)/' | \
cut -d'/' -f2 | sort -u | tr '\n' ',' | sed 's/,$//')
# sr-Latn is generated from sr (see `transliterate`): pull in the paired
# language whenever either side changed, so the test/over-match/prune
# sweep below covers the generated content too, not just its source.
if echo ",$LANGUAGES," | grep -q ',sr,'; then
LANGUAGES="$LANGUAGES,sr-Latn"
elif echo ",$LANGUAGES," | grep -q ',sr-Latn,'; then
LANGUAGES="$LANGUAGES,sr"
fi
if [ -n "$LANGUAGES" ]; then
echo "languages=$LANGUAGES" | tee -a $GITHUB_OUTPUT
elif [ -n "$OTHER_FILES" ]; then
# Only languages.yaml/CODEOWNERS changed and no language directories
# were touched: validate + codeowners --check still run below, but the
# per-language test/over-match/prune sweep is skipped.
echo "meta_only=true" | tee -a $GITHUB_OUTPUT
fi
- name: Run intentfest validate
env:
LANGUAGES: ${{ steps.extract-languages.outputs.languages }}
CHANGED_FILES_JSON: ${{ steps.changed-files.outputs.all_changed_files }}
IS_PR: ${{ github.event_name == 'pull_request' }}
run: |
if [ "$IS_PR" = "true" ] && [ -n "${LANGUAGES}" ] && [ -n "${CHANGED_FILES_JSON}" ]; then
echo "Running intentfest validate for languages=${{ steps.extract-languages.outputs.languages }}"
python3 -m script.intentfest validate --language "${LANGUAGES}" --changed-files-json "${CHANGED_FILES_JSON}"
else
echo "Running full intentfest validate"
python3 -m script.intentfest validate
fi
- name: Run tests
if: steps.extract-languages.outputs.meta_only != 'true'
env:
is_pr: ${{ github.event_name == 'pull_request' }}
run: |
if [ "$is_pr" = "true" ] && [ -n "${{ steps.extract-languages.outputs.languages }}" ]; then
script/test --language ${{ steps.extract-languages.outputs.languages }}
else
script/test
fi
# Cross-intent over-matching: the slot-combination suite only checks
# intent.name within one intent, so it can't catch one intent stealing
# another's utterance. This gate re-recognizes every test sentence against
# the language's whole merged Intents.
- name: Check cross-intent over-matching
if: steps.extract-languages.outputs.meta_only != 'true'
env:
LANGUAGES: ${{ steps.extract-languages.outputs.languages }}
is_pr: ${{ github.event_name == 'pull_request' }}
run: |
if [ "$is_pr" = "true" ] && [ -n "${LANGUAGES}" ]; then
langs=$(echo "${LANGUAGES}" | tr ',' ' ')
else
langs=$(for d in sentences/*/; do l=${d#sentences/}; l=${l%/}; if find "$d" -mindepth 1 -maxdepth 1 -type d | grep -q .; then echo "$l"; fi; done)
fi
rc=0
for l in $langs; do
echo "::group::check_overmatch $l"
python3 -m script.intentfest check_overmatch --language "$l" || rc=1
echo "::endgroup::"
done
exit $rc
# Fully-migrated languages must carry no dead rules/lists (partial and
# unmigrated languages are skipped by the tool).
- name: Check for prunable dead rules/lists
if: steps.extract-languages.outputs.meta_only != 'true'
env:
LANGUAGES: ${{ steps.extract-languages.outputs.languages }}
is_pr: ${{ github.event_name == 'pull_request' }}
run: |
if [ "$is_pr" = "true" ] && [ -n "${LANGUAGES}" ]; then
langs=$(echo "${LANGUAGES}" | tr ',' ' ')
else
langs=$(for d in sentences/*/; do l=${d#sentences/}; l=${l%/}; if find "$d" -mindepth 1 -maxdepth 1 -type d | grep -q .; then echo "$l"; fi; done)
fi
rc=0
for l in $langs; do
echo "::group::prune --check $l"
python3 -m script.intentfest prune --language "$l" --check || rc=1
echo "::endgroup::"
done
exit $rc
- run: python3 -m script.intentfest parse --language en --sentence 'turn on the lights in the kitchen'
- run: python3 -m script.intentfest codeowners --check
# sr-Latn is generated from sr (same content, transliterated to Latin
# script); this catches both drift and direct edits to sr-Latn.
- run: python3 -m script.intentfest transliterate --check