[zh-TW] Add missing error responses (#4022) #12579
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| --- | |
| 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 |