@@ -13,16 +13,28 @@ permissions:
1313
1414jobs :
1515 # Determine which tests to run based on changed files
16- changes :
16+ detect- changes :
1717 runs-on : ubuntu-latest
1818 outputs :
19+ single-parser : ${{ steps.detect-parser.outputs.parser }}
20+ run-all-tests : ${{ steps.detect-parser.outputs.run-all }}
1921 schema-generation : ${{ steps.filter.outputs.schema-generation }}
2022 steps :
2123 - uses : actions/checkout@v4
2224 - uses : dorny/paths-filter@v3
2325 id : filter
2426 with :
27+ list-files : json
2528 filters : |
29+ parsers:
30+ - 'src/allotropy/parsers/**'
31+ - 'tests/parsers/**'
32+ non-parser:
33+ - 'src/allotropy/!(parsers)/**'
34+ - 'tests/!(parsers)/**'
35+ - 'pyproject.toml'
36+ - 'scripts/**'
37+ - '.github/**'
2638 schema-generation:
2739 - 'src/allotropy/allotrope/schemas/**'
2840 - 'src/allotropy/allotrope/schema_parser/**'
3345 - 'scripts/download_schema.py'
3446 - 'tests/allotrope/schema_parser/**'
3547 - 'pyproject.toml'
48+ - name : Detect single parser changes
49+ id : detect-parser
50+ run : |
51+ if [[ "${{ steps.filter.outputs.non-parser }}" == "true" ]]; then
52+ echo "Changes detected outside parsers, running all tests"
53+ echo "run-all=true" >> $GITHUB_OUTPUT
54+ echo "parser=" >> $GITHUB_OUTPUT
55+ elif [[ "${{ steps.filter.outputs.parsers }}" == "true" ]]; then
56+ # Get list of changed files in parsers directory
57+ FILES=$(echo '${{ steps.filter.outputs.parsers_files }}' | jq -r '.[]')
58+
59+ # Extract unique parser directories from both src and tests
60+ SRC_PARSERS=$(echo "$FILES" | grep '^src/allotropy/parsers/' | cut -d'/' -f4 | grep -v '^utils$' | grep -v '^__pycache__$')
61+ TEST_PARSERS=$(echo "$FILES" | grep '^tests/parsers/' | cut -d'/' -f3 | grep -v '^__pycache__$')
62+
63+ # Combine and get unique parsers
64+ ALL_PARSERS=$(echo -e "$SRC_PARSERS\n$TEST_PARSERS" | sort -u | grep -v '^$')
65+
66+ # Count unique parsers
67+ PARSER_COUNT=$(echo "$ALL_PARSERS" | grep -v '^$' | wc -l)
68+
69+ if [[ $PARSER_COUNT -eq 1 ]]; then
70+ PARSER=$(echo "$ALL_PARSERS" | head -n1)
71+ # Check if it's actually a parser directory (not utils, shared, etc)
72+ if [[ "$PARSER" != "utils" && "$PARSER" != "__pycache__" && -d "tests/parsers/$PARSER" ]]; then
73+ echo "Single parser detected: $PARSER"
74+ echo "run-all=false" >> $GITHUB_OUTPUT
75+ echo "parser=$PARSER" >> $GITHUB_OUTPUT
76+ else
77+ echo "Changes in shared parser utilities, running all tests"
78+ echo "run-all=true" >> $GITHUB_OUTPUT
79+ echo "parser=" >> $GITHUB_OUTPUT
80+ fi
81+ else
82+ echo "Multiple parsers changed, running all tests"
83+ echo "run-all=true" >> $GITHUB_OUTPUT
84+ echo "parser=" >> $GITHUB_OUTPUT
85+ fi
86+ else
87+ echo "No parser changes detected, running all tests"
88+ echo "run-all=true" >> $GITHUB_OUTPUT
89+ echo "parser=" >> $GITHUB_OUTPUT
90+ fi
91+
3692 test_py_310 :
93+ needs : detect-changes
3794 runs-on : ubuntu-latest
3895 name : Tests (python 3.10)
3996
@@ -49,10 +106,18 @@ jobs:
49106 - name : Install click
50107 run : pip install click!=8.3.0
51108 - name : Run Tests (excluding schema generation)
52- run : hatch run test_all.py3.10:pytest -n 2 tests --ignore=tests/allotrope/schema_parser/generate_schemas_test.py
53- timeout-minutes : 10
109+ run : |
110+ if [[ "${{ needs.detect-changes.outputs.run-all }}" == "true" ]]; then
111+ echo "Running all tests"
112+ hatch run test_all.py3.10:pytest -n 2 tests --ignore=tests/allotrope/schema_parser/generate_schemas_test.py
113+ else
114+ echo "Running tests for parser: ${{ needs.detect-changes.outputs.single-parser }}"
115+ hatch run test_all.py3.10:pytest -n 2 tests/parsers/${{ needs.detect-changes.outputs.single-parser }} tests/parser_factory_test.py::test_table_contents
116+ fi
117+ timeout-minutes : 15
54118
55119 test_py_311 :
120+ needs : detect-changes
56121 runs-on : ubuntu-latest
57122 name : Tests (python 3.11)
58123
@@ -69,10 +134,18 @@ jobs:
69134 - name : Install click
70135 run : pip install click!=8.3.0
71136 - name : Run Tests (excluding schema generation)
72- run : hatch run test_all.py3.11:pytest -n 2 tests --ignore=tests/allotrope/schema_parser/generate_schemas_test.py
73- timeout-minutes : 10
137+ run : |
138+ if [[ "${{ needs.detect-changes.outputs.run-all }}" == "true" ]]; then
139+ echo "Running all tests"
140+ hatch run test_all.py3.11:pytest -n 2 tests --ignore=tests/allotrope/schema_parser/generate_schemas_test.py
141+ else
142+ echo "Running tests for parser: ${{ needs.detect-changes.outputs.single-parser }}"
143+ hatch run test_all.py3.11:pytest -n 2 tests/parsers/${{ needs.detect-changes.outputs.single-parser }} tests/parser_factory_test.py::test_table_contents
144+ fi
145+ timeout-minutes : 15
74146
75147 test_py_312 :
148+ needs : detect-changes
76149 runs-on : ubuntu-latest
77150 name : Tests (python 3.12)
78151
@@ -88,14 +161,21 @@ jobs:
88161 - name : Install click
89162 run : pip install click!=8.3.0
90163 - name : Run Tests (excluding schema generation)
91- run : hatch run test_all.py3.12:pytest -n 2 tests --ignore=tests/allotrope/schema_parser/generate_schemas_test.py
92- timeout-minutes : 10
164+ run : |
165+ if [[ "${{ needs.detect-changes.outputs.run-all }}" == "true" ]]; then
166+ echo "Running all tests"
167+ hatch run test_all.py3.12:pytest -n 2 tests --ignore=tests/allotrope/schema_parser/generate_schemas_test.py
168+ else
169+ echo "Running tests for parser: ${{ needs.detect-changes.outputs.single-parser }}"
170+ hatch run test_all.py3.12:pytest -n 2 tests/parsers/${{ needs.detect-changes.outputs.single-parser }} tests/parser_factory_test.py::test_table_contents
171+ fi
172+ timeout-minutes : 15
93173
94174 # Schema generation test - only runs when relevant files change or on main branch
95175 schema_generation_test :
96- needs : changes
176+ needs : detect- changes
97177 # Always run on main branch, otherwise only when schema files change
98- if : ${{ github.ref == 'refs/heads/main' || needs.changes.outputs.schema-generation == 'true' }}
178+ if : ${{ github.ref == 'refs/heads/main' || needs.detect- changes.outputs.schema-generation == 'true' }}
99179 runs-on : ubuntu-latest
100180 name : Schema Generation Test
101181 strategy :
@@ -146,4 +226,4 @@ jobs:
146226 - name : Check PR title
147227 run : ./scripts/check_title
148228 env :
149- PR_TITLE : ${{ github.event.pull_request.title }}
229+ PR_TITLE : ${{ github.event.pull_request.title }}
0 commit comments