From b324305afd0fa050060d5d2a2638fe9b7525213b Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Sat, 9 Aug 2025 09:27:58 -0500 Subject: [PATCH] Makefile parallelism causes trouble with subprocess patch --- .github/workflows/build.yml | 26 +-- Makefile | 8 + randsleep.py | 8 + subfunctions.py | 416 +++++++++++++++++++++++++++++++++++- 4 files changed, 433 insertions(+), 25 deletions(-) create mode 100644 Makefile create mode 100644 randsleep.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8a570ae..b217506 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,14 +17,11 @@ jobs: strategy: fail-fast: false matrix: - python-version: - - '3.13' - os-version: - - 'ubuntu-latest' - - 'windows-latest' - - 'macos-latest' + parallelism: + - 1 + - 10 - runs-on: ${{ matrix.os-version }} + runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: @@ -33,30 +30,23 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: ${{ matrix.python-version }} + python-version: '3.x' - name: Install deps run: | python -mpip install wheel python -mpip install coverage - - name: Inspect system details - run: | - python -v -mcoverage --help - python -c "import sys; print(sys.path)" - python -c "import coverage; print(coverage.__file__)" - - name: Coverage run: | - python -mcoverage run subfunctions.py 0 1 2 - python -mcoverage combine + make -j${{ matrix.parallelism }} python -mcoverage xml --include "*.py" python -mcoverage html --include "*.py" - python -mcoverage report --fail-under=90 --include "*.py" + python -mcoverage report --fail-under=100 --include "*.py" - name: Upload Coverage as artifact if: always() uses: actions/upload-artifact@v4 with: - name: coverage for ${{ matrix.python-version }} on ${{ matrix.os-version }} + name: coverage with parallelism ${{ matrix.parallelism }} path: coverage.xml diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a82cc0c --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +.PHONY: all test% +coverage: test1 test2 test3 test4 test5 test6 test7 test8 test9 test0 + python -mcoverage combine + python -mcoverage report --fail-under=100 + +test%: + python -mcoverage run -m randsleep + python -mcoverage run -m subfunctions --start=$$(($* * 10)) --stop=$$(($* * 10 + 10)) diff --git a/randsleep.py b/randsleep.py new file mode 100644 index 0000000..c52a012 --- /dev/null +++ b/randsleep.py @@ -0,0 +1,8 @@ +import time +import random + +def randsleep(): + time.sleep(random.random() * .3) + +if __name__ == '__main__': + randsleep() diff --git a/subfunctions.py b/subfunctions.py index 9bb989d..5f1cd6c 100644 --- a/subfunctions.py +++ b/subfunctions.py @@ -1,25 +1,427 @@ import subprocess import argparse +# (Gets coverage of the non-taken if branch) +import subfunctions +assert subfunctions.__name__ == 'subfunctions' + +import randsleep + +def f0(): + print("function 0") + + def f1(): print("function 1") + + def f2(): print("function 2") + + def f3(): print("function 3") -functions = [f1, f2, f3] + +def f4(): + print("function 4") + + +def f5(): + print("function 5") + + +def f6(): + print("function 6") + + +def f7(): + print("function 7") + + +def f8(): + print("function 8") + + +def f9(): + print("function 9") + + +def f10(): + print("function 10") + + +def f11(): + print("function 11") + + +def f12(): + print("function 12") + + +def f13(): + print("function 13") + + +def f14(): + print("function 14") + + +def f15(): + print("function 15") + + +def f16(): + print("function 16") + + +def f17(): + print("function 17") + + +def f18(): + print("function 18") + + +def f19(): + print("function 19") + + +def f20(): + print("function 20") + + +def f21(): + print("function 21") + + +def f22(): + print("function 22") + + +def f23(): + print("function 23") + + +def f24(): + print("function 24") + + +def f25(): + print("function 25") + + +def f26(): + print("function 26") + + +def f27(): + print("function 27") + + +def f28(): + print("function 28") + + +def f29(): + print("function 29") + + +def f30(): + print("function 30") + + +def f31(): + print("function 31") + + +def f32(): + print("function 32") + + +def f33(): + print("function 33") + + +def f34(): + print("function 34") + + +def f35(): + print("function 35") + + +def f36(): + print("function 36") + + +def f37(): + print("function 37") + + +def f38(): + print("function 38") + + +def f39(): + print("function 39") + + +def f40(): + print("function 40") + + +def f41(): + print("function 41") + + +def f42(): + print("function 42") + + +def f43(): + print("function 43") + + +def f44(): + print("function 44") + + +def f45(): + print("function 45") + + +def f46(): + print("function 46") + + +def f47(): + print("function 47") + + +def f48(): + print("function 48") + + +def f49(): + print("function 49") + + +def f50(): + print("function 50") + + +def f51(): + print("function 51") + + +def f52(): + print("function 52") + + +def f53(): + print("function 53") + + +def f54(): + print("function 54") + + +def f55(): + print("function 55") + + +def f56(): + print("function 56") + + +def f57(): + print("function 57") + + +def f58(): + print("function 58") + + +def f59(): + print("function 59") + + +def f60(): + print("function 60") + + +def f61(): + print("function 61") + + +def f62(): + print("function 62") + + +def f63(): + print("function 63") + + +def f64(): + print("function 64") + + +def f65(): + print("function 65") + + +def f66(): + print("function 66") + + +def f67(): + print("function 67") + + +def f68(): + print("function 68") + + +def f69(): + print("function 69") + + +def f70(): + print("function 70") + + +def f71(): + print("function 71") + + +def f72(): + print("function 72") + + +def f73(): + print("function 73") + + +def f74(): + print("function 74") + + +def f75(): + print("function 75") + + +def f76(): + print("function 76") + + +def f77(): + print("function 77") + + +def f78(): + print("function 78") + + +def f79(): + print("function 79") + + +def f80(): + print("function 80") + + +def f81(): + print("function 81") + + +def f82(): + print("function 82") + + +def f83(): + print("function 83") + + +def f84(): + print("function 84") + + +def f85(): + print("function 85") + + +def f86(): + print("function 86") + + +def f87(): + print("function 87") + + +def f88(): + print("function 88") + + +def f89(): + print("function 89") + + +def f90(): + print("function 90") + + +def f91(): + print("function 91") + + +def f92(): + print("function 92") + + +def f93(): + print("function 93") + + +def f94(): + print("function 94") + + +def f95(): + print("function 95") + + +def f96(): + print("function 96") + + +def f97(): + print("function 97") + + +def f98(): + print("function 98") + + +def f99(): + print("function 99") + + +functions = [f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,f25,f26,f27,f28,f29,f30,f31,f32,f33,f34,f35,f36,f37,f38,f39,f40,f41,f42,f43,f44,f45,f46,f47,f48,f49,f50,f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f62,f63,f64,f65,f66,f67,f68,f69,f70,f71,f72,f73,f74,f75,f76,f77,f78,f79,f80,f81,f82,f83,f84,f85,f86,f87,f88,f89,f90,f91,f92,f93,f94,f95,f96,f97,f98,f99] def main(): parser = argparse.ArgumentParser() - parser.add_argument("cases", nargs='+', type=int) + parser.add_argument("--start", type=int, default=0) + parser.add_argument("--stop", type=int, default=len(functions)) args = parser.parse_args() - - if len(args.cases) > 1: - for c in args.cases: - subprocess.call(["python", __file__, f"{c}"]) + + cases = list(range(args.start, args.stop)) + if len(cases) > 1: + for c in cases: + subprocess.call(["python", __file__, f"--start={c}", f"--stop={c+1}"]) else: - case = args.cases[0] + randsleep.randsleep() + case = cases[0] functions[case]() if __name__ == '__main__':