Skip to content

Commit

Permalink
Use a tox command to generate workflows
Browse files Browse the repository at this point in the history
  • Loading branch information
ocelotl committed Jul 10, 2024
1 parent 0affbb4 commit 1a107bc
Show file tree
Hide file tree
Showing 8 changed files with 213 additions and 180 deletions.
33 changes: 33 additions & 0 deletions .github/workflows/generate_contrib_workflows/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "generate_contrib_workflows"
dynamic = ["version"]
description = "A package to get contrib job information"
license = "Apache-2.0"
requires-python = ">=3.8"
authors = [
{ name = "OpenTelemetry Authors", email = "[email protected]" },
]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Typing :: Typed",
]
dependencies = ["Jinja2"]

[project.scripts]
generate_contrib_workflows = "generate_contrib_workflows:generate_contrib_workflows"

[tool.hatch.version]
path = "src/generate_contrib_workflows/version.py"
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
from configparser import ConfigParser
from sys import argv
from os.path import join
from pathlib import Path
from re import compile as re_compile
from jinja2 import Environment, FileSystemLoader


long_test_env_regex = re_compile(
r"py(?P<pypy>py)?3(\{(?P<cpython_versions>[\w,]+)\})?-test-"
r"(?P<name>[-\w]+\w)-?(\{(?P<test_versions>[\d,]+)\})?"
)
short_test_env_regex = re_compile(r"-test-")

tox_ini_path = join(str(Path(__file__).parents[2]), "tox.ini")


def _get_os_alias(os):
return os.replace("-latest", "")


def _get_python_version_alias(python_version):
if python_version == "py3":
return "pypy-3.8"

return f"3.{python_version.replace('3', '')}"


def get_test_jobs(tox_ini_path: Path) -> list:

config_parser = ConfigParser()
config_parser.read(tox_ini_path)

long_test_env_regex_counter = 0
short_test_env_regex_counter = 0

envs = {}

for env in config_parser["tox"]["envlist"].split():
env = env.strip()

if env.startswith(";"):
continue

long_test_env_regex_match = long_test_env_regex.match(env)
short_test_env_regex_match = short_test_env_regex.search(env)

if long_test_env_regex_match is not None:
long_test_env_regex_counter += 1

env_dict = long_test_env_regex_match.groupdict()
env_dict_name = env_dict["name"]

if env_dict_name not in envs.keys():
envs[env_dict_name] = []

python_test_versions = {"python_versions": [], "test_versions": []}

if env_dict["pypy"] is not None:
python_test_versions["python_versions"].append("py3")

if env_dict["cpython_versions"] is not None:
(
python_test_versions["python_versions"].
extend(
[
f"3{cpython_version}"
for cpython_version
in env_dict["cpython_versions"].split(",")
]
)
)

if env_dict["test_versions"] is not None:
(
python_test_versions["test_versions"].
extend(env_dict["test_versions"].split(","))
)

envs[env_dict_name].append(python_test_versions)

if short_test_env_regex_match is not None:
short_test_env_regex_counter += 1

assert short_test_env_regex_counter == long_test_env_regex_counter

sorted_envs = []

for key, value in envs.items():
sorted_envs.append([key, value])

sorted_envs = sorted(sorted_envs)

jobs = []

for os in ["ubuntu-latest"]:

for env_name, python_test_versions in sorted_envs:

for python_test_version in python_test_versions:

for python_version in python_test_version["python_versions"]:

tox_env = f"py{python_version}-test-{env_name}"

if python_test_version["test_versions"]:
for test_version in python_test_version["test_versions"]:

jobs.append(
{
"tox_env": f"{tox_env}-{test_version}",
"python_version": (
f"{_get_python_version_alias(python_version)}"
),
"os": os,
"ui_name": (
f"{env_name}-{test_version} "
f"{_get_python_version_alias(python_version)} "
f"{_get_os_alias(os)}"
),
"name": (
f"{env_name}_"
f"{test_version}_"
f"{python_version}_"
f"{os}"
)
}
)

else:
jobs.append(
{
"tox_env": f"{tox_env}",
"python_version": (
f"{_get_python_version_alias(python_version)}"
),
"os": os,
"ui_name": (
f"{env_name} "
f"{_get_python_version_alias(python_version)} "
f"{_get_os_alias(os)}"
),
"name": (
f"{env_name}_"
f"{python_version}_"
f"{os}"
)
}
)

return jobs


def generate_contrib_workflows():

tox_ini_path = Path(argv[1])
workflows_path = Path(argv[2])

with open(workflows_path.joinpath("test.yml"), "w") as test_yml_file:
test_yml_file.write(
Environment(
loader=FileSystemLoader(workflows_path)
).get_template("test.yml.j2").render(
jobs=get_test_jobs(tox_ini_path)
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__version__ = "0.1.0"
156 changes: 0 additions & 156 deletions .github/workflows/generate_tests.py

This file was deleted.

25 changes: 3 additions & 22 deletions .github/workflows/misc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
strategy:
fail-fast: false
matrix:
tox-environment: [ "docker-tests", "spellcheck", "docs", "generate" ]
tox-environment: [ "docker-tests", "spellcheck", "docs", "generate", "generate_contrib_workflows" ]
name: ${{ matrix.tox-environment }}
runs-on: ubuntu-20.04
steps:
Expand All @@ -38,24 +38,5 @@ jobs:
- name: Ensure generated code is up to date
if: matrix.tox-environment == 'generate'
run: git diff --exit-code || (echo 'Generated code is out of date, please run "tox -e generate" and commit the changes in this PR.' && exit 1)

check-tests:
name: check-tests
runs-on: ubuntu-latest
steps:
- name: Checkout Contrib Repo @ SHA - {{ github.sha }}
uses: actions/checkout@v4

- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install jinja
run: pip install Jinja2

- name: Run tests workflow generator
run: python .github/workflows/generate_tests.py

- name: Check tests workflow for updates
run: git diff --exit-code || (echo '.github/workflows/tests.yml is out of date, please run "python .github/workflows/generate_tests.py" and commit the changes in this PR.' && exit 1)
if: matrix.tox-environment == 'generate_contrib_workflows'
run: git diff --exit-code || (echo '.github/workflows/tests.yml is out of date, please run "tox -e generate_contrib_workflows" and commit the changes in this PR.' && exit 1)
Loading

0 comments on commit 1a107bc

Please sign in to comment.