Skip to content

Commit

Permalink
add a workflow to test changes
Browse files Browse the repository at this point in the history
  • Loading branch information
eskerda committed Sep 17, 2024
1 parent e403312 commit 75117e6
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 24 deletions.
41 changes: 41 additions & 0 deletions .github/workflows/test_changes.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: pybikes

env:
PYBIKES_CYCLOCITY: ${{ secrets.PYBIKES_CYCLOCITY }}
PYBIKES_BYSYKKEL: ${{ secrets.PYBIKES_BYSYKKEL }}
PYBIKES_WEELO_CLIENT_ID: ${{ secrets.PYBIKES_WEELO_CLIENT_ID }}
PYBIKES_WEELO_CLIENT_SECRET: ${{ secrets.PYBIKES_WEELO_CLIENT_SECRET }}
PYBIKES_DEUTSCHEBAHN_CLIENT_ID: ${{ secrets.PYBIKES_DEUTSCHEBAHN_CLIENT_ID }}
PYBIKES_DEUTSCHEBAHN_CLIENT_SECRET: ${{ secrets.PYBIKES_DEUTSCHEBAHN_CLIENT_SECRET }}

on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]

jobs:
test:
run-name: Test instance changes on this branch
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: make install
- name: Test instance changes on this branch
run: make test-changes T_FLAGS+='-n 10 --json-report --json-report-file=report/report.json'
# Only run summary once
- name: summary
if: (success() || failure()) && matrix.python-version == '3.8'
run: |
make github-summary >> $GITHUB_STEP_SUMMARY
3 changes: 3 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,6 @@ def pytest_configure(config):
config.addinivalue_line(
"markers", "update: mark a test that uses network and might fail"
)
config.addinivalue_line(
"markers", "changes: mark a test as a gen test about changes"
)
57 changes: 33 additions & 24 deletions tests/test_changes.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import git
import inspect

from warnings import warn
from importlib.util import spec_from_file_location, module_from_spec

from pytest import mark
Expand All @@ -34,35 +35,43 @@ def is_system(obj):
return True


g = git.cmd.Git(os.getcwd())
changed_files = g.diff('--name-only', 'master').splitlines()
clss = set()
def generate_tests_from_changes():
g = git.cmd.Git(os.getcwd())
changed_files = g.diff('--name-only', 'origin/master').splitlines()
clss = set()


for file in changed_files:
if re.match(r'pybikes/data/.*\.json', file):
# Extract classes from json file
match = re.search(r'pybikes/data/(.*)\.json', file)
if not match:
continue
schema = match.group(1)
[clss.add(cls) for cls, _ in get_instances(schema)]
elif re.match(r'pybikes/.*\.py', file):
# Extract bike share classes from file
spec = spec_from_file_location('some.mod', file)
mod = module_from_spec(spec)
spec.loader.exec_module(mod)
systems = filter(lambda m: is_system(m[1]), inspect.getmembers(mod))
[clss.add(cls) for cls, _ in systems]
for file in changed_files:
if re.match(r'pybikes/data/.*\.json', file):
# Extract classes from json file
match = re.search(r'pybikes/data/(.*)\.json', file)
if not match:
continue
schema = match.group(1)
[clss.add(cls) for cls, _ in get_instances(schema)]
elif re.match(r'pybikes/.*\.py', file):
# Extract bike share classes from file
spec = spec_from_file_location('some.mod', file)
mod = module_from_spec(spec)
spec.loader.exec_module(mod)
systems = filter(lambda m: is_system(m[1]), inspect.getmembers(mod))
[clss.add(cls) for cls, _ in systems]


for cls in sorted(clss):
test_cls = get_test_cls(cls)
test_cls = mark.changes(test_cls)
# decorate with pytest mark
globals()[test_cls.__name__] = test_cls


# non-optimal not-required
try:
generate_tests_from_changes()
except Exception as e:
warn("Failed generating tests from branch changes: " + str(e))

# Force pytest to succeed when no tests are marked with 'changes'
@mark.changes
def test_dummy():
assert True

for cls in sorted(clss):
test_cls = get_test_cls(cls)
test_cls = mark.changes(test_cls)
# decorate with pytest mark
globals()[test_cls.__name__] = test_cls

0 comments on commit 75117e6

Please sign in to comment.