{"id":11740133,"name":"lfreleng-actions/python-test-action","ecosystem":"actions","description":"Test a Python Project, generate coverage report","homepage":"","licenses":"other","normalized_licenses":["Other"],"repository_url":"https://github.com/lfreleng-actions/python-test-action","keywords_array":["github-actions","pytest","python","test","testing","tests"],"namespace":"lfreleng-actions","versions_count":16,"first_release_published_at":"2025-03-28T16:19:46.000Z","latest_release_published_at":"2026-04-13T15:11:34.000Z","latest_release_number":"v1.0.2","last_synced_at":"2026-04-20T15:03:49.314Z","created_at":"2025-06-06T18:53:46.688Z","updated_at":"2026-04-20T15:07:15.911Z","registry_url":"https://github.com/lfreleng-actions/python-test-action","install_command":null,"documentation_url":null,"metadata":{"name":"🧪 Python Test","description":"Test a Python Project, generate coverage report","inputs":{"python_version":{"description":"Python version used to run test","required":true},"editable":{"description":"Install Python package in editable mode","required":false,"default":"false"},"permit_fail":{"description":"Continue even when one or more tests fails","required":false,"default":"false"},"report_artefact":{"description":"Uploads test/coverage report bundle as artefact","required":false,"default":"true"},"artefact_name":{"description":"Custom name for uploaded artefact (to avoid conflicts)","required":false},"path_prefix":{"description":"Directory location containing Python project code","required":false,"default":"."},"tests_path":{"description":"Path relative to the project folder containing tests","required":false},"tox_tests":{"description":"Uses tox to perform tests","required":false,"default":"false"},"tox_envs":{"description":"Space separated list of tox environments to run","required":false},"github_token":{"description":"GitHub token for API access during tests","required":false},"pytest_args":{"description":"Additional pytest arguments (e.g., -n0 for serial execution)","required":false,"default":""}},"runs":{"using":"composite","steps":[{"name":"Setup action/environment","shell":"bash","env":{"GITHUB_TOKEN":"${{ inputs.github_token }}"},"run":"# Setup action/environment\n\n# Helper function to validate boolean inputs (case-insensitive)\nvalidate_boolean() {\n  local input_name=\"$1\"\n  local input_value=\"$2\"\n  local normalized=$(echo \"$input_value\" | tr '[:upper:]' '[:lower:]')\n\n  if [ \"$normalized\" != \"true\" ] \u0026\u0026 [ \"$normalized\" != \"false\" ]; then\n    echo \"⚠️ true/false not correctly passed for $input_name\"\n    echo \"⚠️ true/false not correctly passed for $input_name\" \\\n      \u003e\u003e \"$GITHUB_STEP_SUMMARY\"\n    return 1\n  fi\n  return 0\n}\n\n# Validate all boolean inputs\nvalidation_failed=0\nvalidate_boolean \"editable\" \"${{ inputs.editable }}\" \\\n  || validation_failed=1\nvalidate_boolean \"permit_fail\" \"${{ inputs.permit_fail }}\" \\\n  || validation_failed=1\nvalidate_boolean \"report_artefact\" \"${{ inputs.report_artefact }}\" \\\n  || validation_failed=1\nvalidate_boolean \"tox_tests\" \"${{ inputs.tox_tests }}\" \\\n  || validation_failed=1\n\nif [ $validation_failed -eq 1 ]; then\n  echo 'Error: Invalid boolean input(s) detected ❌'; exit 1\nfi\n\n# Store normalized boolean values to avoid re-normalizing later\neditable_lower=$(echo \"${{ inputs.editable }}\" | \\\n  tr '[:upper:]' '[:lower:]')\npermit_fail_lower=$(echo \"${{ inputs.permit_fail }}\" | \\\n  tr '[:upper:]' '[:lower:]')\nreport_artefact_lower=$(echo \"${{ inputs.report_artefact }}\" | \\\n  tr '[:upper:]' '[:lower:]')\ntox_tests_lower=$(echo \"${{ inputs.tox_tests }}\" | \\\n  tr '[:upper:]' '[:lower:]')\n\necho \"editable_lower=$editable_lower\" \u003e\u003e \"$GITHUB_ENV\"\necho \"permit_fail_lower=$permit_fail_lower\" \u003e\u003e \"$GITHUB_ENV\"\necho \"report_artefact_lower=$report_artefact_lower\" \u003e\u003e \"$GITHUB_ENV\"\necho \"tox_tests_lower=$tox_tests_lower\" \u003e\u003e \"$GITHUB_ENV\"\n\nif [ -z \"${{ inputs.python_version }}\" ]; then\n  echo 'Error: Python version was not provided ❌'; exit 1\nelse\n  echo \"Using Python: ${{ inputs.python_version }} 🐍\"\nfi\n\n# Verify path_prefix is a valid directory path\nif [ ! -d \"${{ inputs.path_prefix }}\" ]; then\n  echo 'Error: invalid path/prefix to project directory ❌'; exit 1\nfi\n\n# The coverage report location will also use this environment variable\ntox_envs=$(echo \"py${{ inputs.python_version }}\" | sed 's/\\.//g')\necho \"tox_envs=$tox_envs\" \u003e\u003e \"$GITHUB_ENV\"\n\n# Setup dedicated coverage report directory outside project path\ncoverage_dir=\"/tmp/coverage-$tox_envs\"\nmkdir -p \"$coverage_dir\"\necho \"coverage_dir=$coverage_dir\" \u003e\u003e \"$GITHUB_ENV\"\necho \"Coverage report output location: $coverage_dir 💬\"\n\nif [ \"f$permit_fail_lower\" = 'ftrue' ]; then\n  echo 'Warning: test failures will be permitted ⚠️'\nfi\n\n# Testing with TOX\nif [ \"f$tox_tests_lower\" = 'ftrue' ]; then\n  echo 'Using tox to perform tests 💬'\n  if [ -z \"${{ inputs.tox_envs }}\" ]; then\n    echo 'Using tox environment derived from matrix Python version'\n    echo \"Using current matrix python version: $tox_envs\"\n  else\n    tox_envs=\"${{ inputs.tox_envs }}\"\n    echo \"Testing with tox environments: ${{ inputs.tox_envs }} 💬\"\n  fi\n  echo \"tox_envs=$tox_envs\" \u003e\u003e \"$GITHUB_ENV\"\nfi\n\n# Check/setup test path\nif [ -n \"${{ inputs.tests_path }}\" ] \u0026\u0026 \\\n  [ ! -d \"${{ inputs.path_prefix }}/${{ inputs.tests_path }}\" ]; then\n  echo 'Error: invalid path/prefix to test directory ❌'\n  echo \"${{ inputs.path_prefix }}/${{ inputs.tests_path }}\"; exit 1\nfi\nif [ -n \"${{ inputs.tests_path }}\" ]; then\n  TESTS_PATH=\"${{ inputs.path_prefix }}/${{ inputs.tests_path }}\"\n# Otherwise search/use common locations\nelif [ -d \"${{ inputs.path_prefix }}/test\" ]; then\n  TESTS_PATH=\"${{ inputs.path_prefix }}/test\"\nelif [ -d \"${{ inputs.path_prefix }}/tests\" ]; then\n  TESTS_PATH=\"${{ inputs.path_prefix }}/tests\"\nelse\n  echo 'Error: could not determine path to tests ❌'; exit 1\nfi\necho \"Tests path: $TESTS_PATH 💬\"\necho \"tests_path=$TESTS_PATH\" \u003e\u003e \"$GITHUB_ENV\"\n"},{"name":"Validate and sanitize pytest arguments","shell":"bash","run":"# Validate and sanitize pytest arguments\n\n# Ring-fence this validation from the rest of the environment\nset -euo pipefail\n\npytest_args_input=\"${{ inputs.pytest_args }}\"\n\nif [ -z \"$pytest_args_input\" ]; then\n  echo \"No additional pytest arguments provided\"\n  echo \"VALIDATED_PYTEST_ARGS=\" \u003e\u003e \"$GITHUB_ENV\"\n  exit 0\nfi\n\necho \"Validating pytest arguments: '$pytest_args_input'\"\n\n# Security validation: Check for dangerous characters\n# Allow only: alphanumeric, spaces, hyphens, equals, commas, dots,\n# forward slashes, colons, and underscores\nif echo \"$pytest_args_input\" | grep -qE '[^a-zA-Z0-9 \\-=,\\./:_]'; then\n  echo \"Error: Invalid characters detected in pytest_args ❌\"\n  echo \"Allowed characters: alphanumeric, space, - = , . / : _\"\n  echo \"Provided: '$pytest_args_input'\"\n  exit 1\nfi\n\n# Check for command injection patterns\n# Note: Single characters like |, \u003e, \u003c, `, ), {, }\n#   are already blocked by regex\ndangerous_patterns=(\n  '\u0026\u0026' '||' ';' '$('\n)\n\nfor pattern in \"${dangerous_patterns[@]}\"; do\n  if echo \"$pytest_args_input\" | grep -qF \"$pattern\"; then\n    echo \"Error: Dangerous pattern '$pattern' detected in pytest_args ❌\"\n    exit 1\n  fi\ndone\n\n# Validate that arguments start with - or -- (pytest flags)\n# or are valid pytest expressions/paths\n# Note: Word splitting on spaces is intentional here to parse\n# individual arguments. Arguments with equals signs (e.g., --maxfail=2)\n# work correctly because they contain no spaces and remain intact as\n# single words.\nvalidated_args=\"\"\nfor arg in $pytest_args_input; do\n  # Allow pytest flags (starting with - or --)\n  if [[ \"$arg\" =~ ^--? ]]; then\n    validated_args=\"$validated_args $arg\"\n  # Allow pytest expressions (e.g., test_name, test_file.py)\n  elif [[ \"$arg\" =~ ^[a-zA-Z0-9_./:-]+$ ]]; then\n    validated_args=\"$validated_args $arg\"\n  else\n    echo \"Error: Invalid pytest argument format: '$arg' ❌\"\n    echo \"Check action documentation for further details\"\n    exit 1\n  fi\ndone\n\n# Trim leading/trailing spaces\nvalidated_args=$(echo \"$validated_args\" | xargs)\n\necho \"Validated pytest arguments: '$validated_args' ✅\"\necho \"VALIDATED_PYTEST_ARGS=$validated_args\" \u003e\u003e \"$GITHUB_ENV\"\n"},{"name":"Setup action/environment (continued)","shell":"bash","run":"# Setup pip install flags for editable mode\nPIP_EDITABLE_FLAG=\"\"\nif [ \"f$editable_lower\" = 'ftrue' ]; then\n  PIP_EDITABLE_FLAG=\"-e\"\n  echo \"Installing package in editable mode 💬\"\nelse\n  echo \"Installing package in standard (non-editable) mode 💬\"\nfi\necho \"PIP_EDITABLE_FLAG=$PIP_EDITABLE_FLAG\" \u003e\u003e \"$GITHUB_ENV\"\n"},{"name":"Check for data_file in pyproject.toml","uses":"lfreleng-actions/file-grep-regex-action@ba13750798b15e6acf23f3342a280ffc8148b950","id":"cov-run","with":{"flags":"-E","regex":"^data_file\\s*=.*","filename":"${{ inputs.path_prefix }}/pyproject.toml","no_fail":"true"}},{"name":"Warning: coverage temporary files","if":"steps.cov-run.outputs.extracted_string == ''","shell":"bash","run":"# Warning: coverage temporary files\necho \"Warning: coverage report temporary files ⚠️\"\necho \"Tests sensitive to file system content may break\"\necho \"Set data_file parameter in pyproject.toml to avoid this warning\"\n"},{"name":"Check for tox configuration file","if":"inputs.tox_tests == 'true'","id":"tox-config","uses":"lfreleng-actions/path-check-action@9606e61c870025bc956e63156d1d55c5df54426c","with":{"path":"${{ inputs.path_prefix }}/tox.ini"}},{"name":"Tox configuration file missing","if":"steps.tox-config.outputs.type != 'file' \u0026\u0026 inputs.tox_tests == 'true'","shell":"bash","run":"# Tox configuration file missing\necho 'Error: tox configuration file missing ❌'; exit 1\n"},{"name":"Set up Python ${{ inputs.python_version }}","uses":"actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405","with":{"python-version":"${{ inputs.python_version }}"}},{"name":"Cache Python dependencies","uses":"actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7","with":{"path":"~/.cache/pip\n~/.cache/pypoetry\n~/.cache/pipenv\n.venv\n.tox\n","key":"python-${{ runner.os }}-${{ inputs.python_version }}- ${{ hashFiles('**/requirements*.txt', '**/pyproject.toml', '**/poetry.lock', '**/Pipfile*', '**/setup.py', '**/setup.cfg') }}","restore-keys":"python-${{ runner.os }}-${{ inputs.python_version }}-\npython-${{ runner.os }}-\n"}},{"name":"Ensure pip is available","shell":"bash","run":"# Ensure pip is available\n# On some runners (e.g. ubuntu-24.04-arm), actions/setup-python\n# may not properly bootstrap pip for all Python versions\nif python -m pip --version \u003e /dev/null 2\u003e\u00261; then\n  echo \"python -m pip is available ✅\"\nelse\n  echo \"python -m pip not found; running ensurepip ⚠️\"\n  python -m ensurepip --upgrade\n  python -m pip install --upgrade pip\nfi\npython -m pip --version\necho \"pip module check succeeded ✅\"\n\n# Validate the pip executable is aligned with python -m pip\ncreate_pip_wrapper=false\nif pip --version \u003e /dev/null 2\u003e\u00261; then\n  echo \"pip executable found ✅\"\n  py_pip_loc=\"$(python -m pip -V 2\u003e/dev/null | awk '{print $4}')\"\n  exe_pip_loc=\"$(pip -V 2\u003e/dev/null | awk '{print $4}')\"\n  if [ -n \"$py_pip_loc\" ] \u0026\u0026 [ -n \"$exe_pip_loc\" ] \\\n     \u0026\u0026 [ \"$py_pip_loc\" != \"$exe_pip_loc\" ]; then\n    echo \"pip executable ($exe_pip_loc) does not match\" \\\n      \"python -m pip ($py_pip_loc); creating wrapper ⚠️\"\n    create_pip_wrapper=true\n  else\n    echo \"pip executable matches python -m pip ✅\"\n  fi\nelse\n  echo \"pip executable not found; creating wrapper ⚠️\"\n  create_pip_wrapper=true\nfi\n\nif [ \"$create_pip_wrapper\" = true ]; then\n  pip_wrapper=\"$(dirname \"$(command -v python)\")/pip\"\n  printf '#!/bin/sh\\nexec python -m pip \"$@\"\\n' \\\n    \u003e \"$pip_wrapper\"\n  chmod +x \"$pip_wrapper\"\n  echo \"pip wrapper created at: $pip_wrapper ✅\"\nfi\n"},{"name":"Performing tests [tox]","if":"steps.tox-config.outputs.type == 'file' \u0026\u0026 inputs.tox_tests == 'true'","shell":"bash","env":{"GITHUB_TOKEN":"${{ inputs.github_token }}"},"run":"# Performing tests [tox]\necho 'Installing: tox ⬇️'\n# Under Python 3.8, use a compatible tox release, latest for others\nif [[ \"${{ inputs.python_version }}\" == \"3.8\" ]]; then\n  echo 'Using tox\u003c4.0.0 for Python 3.8 compatibility'\n  pip install --disable-pip-version-check -q 'tox\u003c4.0.0'\nelse\n  echo 'Using latest tox version'\n  pip install --disable-pip-version-check -q tox\nfi\nif [ -n \"${{ env.tox_envs }}\" ]; then\n  for ENV in \"${{ env.tox_envs }}\"; do\n    echo \"Running: tox -c ${{ inputs.path_prefix }}/tox.ini -e $ENV 💬\"\n    tox -c \"${{ inputs.path_prefix }}/tox.ini\" -e \"$ENV\"\n  done\nelse\n  echo 'Running: tox -c ${{ inputs.path_prefix }}/tox.ini 💬'\n  tox -c \"${{ inputs.path_prefix }}/tox.ini\"\nfi\n"},{"name":"Install project and test/dev dependencies [pytest]","if":"inputs.tox_tests != 'true'","shell":"bash","env":{"GITHUB_TOKEN":"${{ inputs.github_token }}"},"run":"# Install project and test/dev dependencies\n\n# Important note: package installation order matters\n# Install the package (editable or not) before installing test runners\n# (like pytest and coverage) to ensure the latest code is used\necho 'Install project and test/dev dependencies (before pytest install)'\nif [ -f \"${{ inputs.path_prefix }}/pyproject.toml\" ]; then\n  echo \"Source: ${{ inputs.path_prefix }}/pyproject.toml ⬇️\"\n  # First try to install with test dependencies\n  # Note: ./ prefix is required to indicate local path, otherwise pip\n  # interprets the argument as a package name to download from PyPI\n  if pip install ${PIP_EDITABLE_FLAG} \\\n  \"./${{ inputs.path_prefix }}[test,dev]\"; then\n    echo 'Successfully installed test and dev dependencies ✅'\n  elif pip install ${PIP_EDITABLE_FLAG} \\\n    \"./${{ inputs.path_prefix }}[test]\"; then\n    echo 'Successfully installed test dependencies ✅'\n  else\n    echo 'Fallback: installing base package only ⚠️'\n    pip install ${PIP_EDITABLE_FLAG} \"./${{ inputs.path_prefix }}\"\n  fi\nelif [ -f \"${{ inputs.path_prefix }}/requirements.txt\" ]; then\n  echo \"Source: ${{ inputs.path_prefix }}/requirements.txt ⬇️\"\n  pip install -r \"${{ inputs.path_prefix }}/requirements.txt\"\nfi\n\necho 'Installing: pytest, pytest-cov, coverage[toml] ⬇️'\npip install --disable-pip-version-check -q \\\n  pytest \\\n  pytest-cov \\\n  coverage\\[toml\\]\n"},{"name":"Run tests and coverage report [pytest]","if":"inputs.tox_tests != 'true'","shell":"bash","env":{"GITHUB_TOKEN":"${{ inputs.github_token }}"},"run":"# Tests and coverage report [pytest]\n\n# Setup XML coverage report for upload as artefact\nif [ \"f$report_artefact_lower\" = 'ftrue' ]; then\n  coverage_flags=\"--cov-report=term-missing \\\n  --cov-report=xml:/tmp/coverage-$tox_envs/coverage.xml \\\n  --cov-config=${{ inputs.path_prefix }}/pyproject.toml\"\nelse\n  coverage_flags=\"\"\nfi\n\necho \"Running tests in: ${{ env.tests_path }} 🧪\"\nif [ \"f$permit_fail_lower\" = 'ftrue' ]; then\n  echo 'Warning: flag set to permit test failures ⚠️'\n  # Note: VALIDATED_PYTEST_ARGS is intentionally unquoted to allow word\n  # splitting for multiple arguments. This is safe because validation\n  # logic ensures only well-formed, safe arguments are present.\n  pytest \\\n    --rootdir=\"${{ inputs.path_prefix }}\" \\\n    $coverage_flags \\\n    ${{ env.VALIDATED_PYTEST_ARGS }} \\\n    ${{ env.tests_path }} || true\nelse\n  # Note: VALIDATED_PYTEST_ARGS is intentionally unquoted to allow word\n  # splitting for multiple arguments. This is safe because validation\n  # logic ensures only well-formed, safe arguments are present.\n  pytest \\\n    --rootdir=\"${{ inputs.path_prefix }}\" \\\n    $coverage_flags \\\n    ${{ env.VALIDATED_PYTEST_ARGS }} \\\n    ${{ env.tests_path }}\nfi\n"},{"name":"Upload test/coverage report","uses":"actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f","if":"env.report_artefact_lower == 'true'","with":{"name":"${{ inputs.artefact_name != '' \u0026\u0026 inputs.artefact_name || format('{0}-coverage.xml', env.tox_envs) }}","path":"${{ env.coverage_dir }}/coverage.xml","retention-days":90}}]},"default_branch":"main","path":null},"repo_metadata":{"id":284962404,"uuid":"954829781","full_name":"lfreleng-actions/python-test-action","owner":"lfreleng-actions","description":"Tests a Python project and generates coverage reports","archived":false,"fork":false,"pushed_at":"2026-04-17T12:05:35.000Z","size":345,"stargazers_count":0,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-17T14:13:32.550Z","etag":null,"topics":["github-actions","pytest","python","test","testing","tests"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lfreleng-actions.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-25T17:19:54.000Z","updated_at":"2026-04-17T12:05:40.000Z","dependencies_parsed_at":"2025-05-26T13:43:41.816Z","dependency_job_id":"72a14d81-734e-4c18-9c49-7260dc2e0a57","html_url":"https://github.com/lfreleng-actions/python-test-action","commit_stats":null,"previous_names":["lfreleng-actions/python-test-action"],"tags_count":16,"template":false,"template_full_name":"lfreleng-actions/actions-template","purl":"pkg:github/lfreleng-actions/python-test-action","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lfreleng-actions","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32052538,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T11:35:06.609Z","status":"ssl_error","status_checked_at":"2026-04-20T11:34:48.899Z","response_time":94,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"},"owner_record":{"login":"lfreleng-actions","name":"LF Release Engineering Actions","uuid":"202967442","kind":"organization","description":"GitHub Actions used by LF Release Engineering","email":"releng+gha@linuxfoundation.org","website":"https://docs.releng.linuxfoundation.org/","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/202967442?v=4","repositories_count":1,"last_synced_at":"2025-03-12T16:39:35.120Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/lfreleng-actions","funding_links":[],"total_stars":0,"followers":0,"following":0,"created_at":"2025-03-12T16:39:35.144Z","updated_at":"2025-03-12T16:39:35.144Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lfreleng-actions","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lfreleng-actions/repositories"},"tags":[{"name":"v1.0.2","sha":"82aa55cf21a6be32d8d5b365716b2b349e8058bd","kind":"tag","published_at":"2026-04-13T15:11:34.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v1.0.2","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v1.0.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v1.0.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v1.0.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v1.0.2/manifests"},{"name":"v1.0.1","sha":"92d4110d44ebc18fa4575c6b00203ff67d01a1cb","kind":"tag","published_at":"2025-12-09T23:44:32.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v1.0.1","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v1.0.1","dependencies_parsed_at":"2026-01-09T06:07:58.241Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v1.0.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v1.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v1.0.1/manifests"},{"name":"v1.0.0","sha":"0e430cc107b7b38edc42616d3542b38835d25014","kind":"tag","published_at":"2025-11-27T08:16:29.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v1.0.0","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v1.0.0","dependencies_parsed_at":"2026-01-09T06:07:58.165Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v1.0.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v1.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v1.0.0/manifests"},{"name":"v0.1.12","sha":"b997656111c9b547f8458b18baf6be139e2d2c6c","kind":"tag","published_at":"2025-10-07T12:37:33.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v0.1.12","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v0.1.12","dependencies_parsed_at":"2025-10-16T08:12:01.527Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v0.1.12","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.12","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.12/manifests"},{"name":"v0.1.11","sha":"bdde9e4e6221e858359f9036bd4f41ab3b1af90e","kind":"tag","published_at":"2025-07-10T15:35:57.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v0.1.11","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v0.1.11","dependencies_parsed_at":"2025-07-13T06:08:27.557Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v0.1.11","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.11/manifests"},{"name":"v0.1.10","sha":"5d253209cf755dde9307dfd12865112f61e9dad9","kind":"tag","published_at":"2025-07-08T20:20:33.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v0.1.10","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v0.1.10","dependencies_parsed_at":"2025-07-13T06:08:27.577Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v0.1.10","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.10/manifests"},{"name":"v0.1.9","sha":"7cea2a137cda179cec4c7c8aad715a555df22de9","kind":"tag","published_at":"2025-06-23T13:00:04.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v0.1.9","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v0.1.9","dependencies_parsed_at":"2025-06-25T04:40:44.083Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v0.1.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.9/manifests"},{"name":"v0.1.8","sha":"6b2c188df0f236834aea94810ecbf3bec2a564f9","kind":"tag","published_at":"2025-06-05T10:35:08.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v0.1.8","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v0.1.8","dependencies_parsed_at":"2025-06-11T07:12:31.442Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v0.1.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.8/manifests"},{"name":"v0.1.7","sha":"16adb21ca4866bebc75e7b35203ce5b376b01430","kind":"tag","published_at":"2025-05-26T13:29:03.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v0.1.7","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v0.1.7","dependencies_parsed_at":"2025-06-11T07:12:31.435Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v0.1.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.7/manifests"},{"name":"v0.1.6","sha":"b06828bf94ae4beef00d49cddc06839eca2d8f05","kind":"tag","published_at":"2025-04-09T02:16:57.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v0.1.6","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v0.1.6","dependencies_parsed_at":"2025-06-11T07:12:31.452Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v0.1.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.6/manifests"},{"name":"v0.1.5","sha":"febccead923b4775125496a6c12e0f7f136ea585","kind":"tag","published_at":"2025-04-09T01:35:47.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v0.1.5","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v0.1.5","dependencies_parsed_at":"2025-06-11T07:12:31.441Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v0.1.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.5/manifests"},{"name":"v0.1.4","sha":"99380277e7e6c80e65f3b342ce9e862af4522c60","kind":"tag","published_at":"2025-04-05T03:09:55.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v0.1.4","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v0.1.4","dependencies_parsed_at":"2025-06-11T07:12:31.435Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v0.1.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.4/manifests"},{"name":"v0.1.3","sha":"133acf37ea40beae68d97d85d18db9096d79ca6b","kind":"tag","published_at":"2025-04-05T02:36:19.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v0.1.3","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v0.1.3","dependencies_parsed_at":"2025-06-11T07:12:31.444Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v0.1.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.3/manifests"},{"name":"v0.1.2","sha":"133acf37ea40beae68d97d85d18db9096d79ca6b","kind":"tag","published_at":"2025-04-04T01:03:48.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v0.1.2","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v0.1.2","dependencies_parsed_at":"2025-06-11T07:12:31.439Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v0.1.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.2/manifests"},{"name":"v0.1.1","sha":"9954088a7dcbc59c83a81425e959d4680605ac54","kind":"tag","published_at":"2025-03-31T13:35:51.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v0.1.1","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v0.1.1","dependencies_parsed_at":"2025-06-11T07:12:31.438Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v0.1.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.1/manifests"},{"name":"v0.1.0","sha":"18e0f7c7a070bc01b39459d9035e93d78d27671d","kind":"tag","published_at":"2025-03-28T16:19:46.000Z","download_url":"https://codeload.github.com/lfreleng-actions/python-test-action/tar.gz/v0.1.0","html_url":"https://github.com/lfreleng-actions/python-test-action/releases/tag/v0.1.0","dependencies_parsed_at":"2025-06-11T07:12:31.452Z","dependency_job_id":null,"purl":"pkg:github/lfreleng-actions/python-test-action@v0.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/tags/v0.1.0/manifests"}]},"repo_metadata_updated_at":"2026-04-20T15:07:15.911Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":34.69762145748988,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":17.34881072874494},"purl":"pkg:githubactions/lfreleng-actions/python-test-action","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/actions/lfreleng-actions/python-test-action","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/actions/lfreleng-actions/python-test-action","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/actions/lfreleng-actions/python-test-action/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2026-04-14T10:18:08.458Z","issues_count":1,"pull_requests_count":83,"avg_time_to_close_issue":null,"avg_time_to_close_pull_request":98529.8309859155,"issues_closed_count":0,"pull_requests_closed_count":71,"pull_request_authors_count":4,"issue_authors_count":1,"avg_comments_per_issue":0.0,"avg_comments_per_pull_request":0.1686746987951807,"merged_pull_requests_count":69,"bot_issues_count":1,"bot_pull_requests_count":64,"past_year_issues_count":1,"past_year_pull_requests_count":64,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":102388.46153846153,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":52,"past_year_pull_request_authors_count":4,"past_year_issue_authors_count":1,"past_year_avg_comments_per_issue":0.0,"past_year_avg_comments_per_pull_request":0.109375,"past_year_bot_issues_count":1,"past_year_bot_pull_requests_count":51,"past_year_merged_pull_requests_count":50,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/lfreleng-actions%2Fpython-test-action/issues","maintainers":[{"login":"ChoiWonBeen","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ChoiWonBeen"}],"active_maintainers":[{"login":"ChoiWonBeen","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ChoiWonBeen"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/github%20actions/packages/lfreleng-actions%2Fpython-test-action/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/github%20actions/packages/lfreleng-actions%2Fpython-test-action/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/github%20actions/packages/lfreleng-actions%2Fpython-test-action/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/github%20actions/packages/lfreleng-actions%2Fpython-test-action/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/github%20actions/packages/lfreleng-actions%2Fpython-test-action/codemeta","maintainers":[]}