import os
import re
import sys
from subprocess import Popen

_filename_re = re.compile(r"^bench_(.*?)\.py$")
bench_directory = os.path.abspath(os.path.dirname(__file__))


def list_benchmarks():
    result = []
    for name in os.listdir(bench_directory):
        match = _filename_re.match(name)
        if match is not None:
            result.append(match.group(1))
    result.sort(key=lambda x: (x.startswith("logging_"), x.lower()))
    return result


def run_bench(name):
    print(name)
    Popen(
        [sys.executable, "-m", "timeit", "-s", f"from bench_{name} import run", "run()"]
    ).wait()


def main():
    print("=" * 80)
    print("Running benchmark for MarkupSafe")
    print("-" * 80)
    os.chdir(bench_directory)
    for bench in list_benchmarks():
        run_bench(bench)
    print("-" * 80)


if __name__ == "__main__":
    main()
