Validation Package edal

Language: Python

e!DAL; data-submission

v0.0.4 released on 12/05/2025

by Jonathan Bauer

12 Downloads

e!DAL validation package for submission


Install with arc-validate

 arc-validate package install edal --version 0.0.4

Include in a PLANTDataHUB CQC pipeline

validation_packages:
  - name: edal
    version: 0.0.4

Description

This python package validates ARCs for the e!DAL

PGP research data repository.


Release notes

- fixed folder output path again


Browse code for v0.0.4 (python)
"""
---
Name: edal
MajorVersion: 0
MinorVersion: 0
PatchVersion: 4
Summary: e!DAL validation package for submission
Description: |
  This python package validates ARCs for the e!DAL
  PGP research data repository.
Publish: true
Authors:
  - FullName: Jonathan Bauer
    Email: bauer@nfdi4plants.org
    Affiliation: University of Freiburg
    AffiliationLink: https://uni-freiburg.de
Tags:
  - Name: e!DAL
  - Name: data-submission
ReleaseNotes: |
  - fixed folder output path again
CQCHookEndpoint: https://mira.ipk-gatersleben.de/submit
---
"""

# /// script
# requires-python = ">=3.14"
# dependencies = [
#     "anybadge",
#     "arctrl==3.0.0b13",
#     "argparse",
#     "junit-xml",
# ]
# ///

import anybadge, argparse, json
from arctrl import ARC
from junit_xml import TestSuite, TestCase
from pathlib import Path
import os

parser = argparse.ArgumentParser()
parser.add_argument(
    '-i', '--input',
    type=str,
    required=True,
    help='Path to the ARC directory'
)
parser.add_argument(
    '-o', '--output',
    type=str,
    required=True,
    help='Output directory'
)
args = parser.parse_args()

Path(args.output).mkdir(parents=True, exist_ok=True)
os.makedirs(f"{args.output}/.arc-validate-results/edal@0.0.4", exist_ok=True)

report_file: str = f"{args.output}/.arc-validate-results/edal@0.0.4/validation_report.xml"
summary_file: str = f"{args.output}/.arc-validate-results/edal@0.0.4/validation_summary.json"
badge_file: str = f"{args.output}/.arc-validate-results/edal@0.0.4/badge.svg"
test_cases = []
summary_data = {
    "Critical": {
        "HasFailures": "false",
        "Total": 0,
        "Passed": 0,
        "Failed": 0,
        "Errored": 0
    },
    "NonCritical": {
        "HasFailures": "false",
        "Total": 0,
        "Passed": 0,
        "Failed": 0,
        "Errored": 0
    },
    "ValidationPackage": {
        "Name": "edal",
        "Version": "0.0.1",
        "Summary": "ARC Validation for e!DAL data repository",
        "Description": "See summary :)"
    }
}

def add_test_case(name: str, failure: str = None):
    case = TestCase(name)
    summary_data["Critical"]["Total"] += 1
    if failure:
        case.add_failure_info(message=failure)
        summary_data["Critical"]["HasFailures"] = "true"
        summary_data["Critical"]["Failed"] += 1
    else:
        summary_data["Critical"]["Passed"] += 1
    test_cases.append(case)
    print(summary_data)

def create_report():
    ts = TestSuite("e!DAL validation tests", test_cases)
    print(TestSuite.to_xml_string([ts]))
    with open(report_file, 'w') as f:
        TestSuite.to_file(f, [ts], prettyprint=True)


def create_summary():
    summary_json = json.dumps(summary_data)

    print(f"Summary JSON: {summary_json}")

    with open(summary_file, 'w') as f:
        json.dump(summary_data, f, indent=4)

def create_badge(success: bool):
    color = 'green' if success else 'red' 
    value = 'Submit' if success else 'Reports' 
    badge = anybadge.Badge('e!DAL', value=value, default_color=color)
    badge.write_badge(badge_file, overwrite=True)

def validate_arc():
    arc = ARC.load(args.input)
    add_test_case("Title", None if arc.Title != "" else "No title found.")
    add_test_case("Description", None if arc.Description != "" else "No description found.")
    add_test_case("Contacts", None if check_contacts(arc.Contacts) else "No contacts found.")
    add_test_case("License", None if arc.License else "No license found.")

def check_contacts(contacts):
    if len(contacts) == 0:
        return False
    for c in contacts:
        if c.FirstName == "":
            print(f"No first name found for: {c}")
            return False
        if c.LastName == "":
            print(f"No last name found for: {c}")
            return False
        if c.Affiliation == "":
            print(f"No affiliation found for: {c}")
            return False
        if c.EMail == "":
            print(f"No email found for: {c}")
            return False
        if c.ORCID == "":
            print(f"No ORCID found for: {c}")
            return False
        print(f"Valid contact: {c}")
    
    return True

# TODO: lazy
valid = True
try:
    valid = validate_arc()
except Exception:
    valid = False
    # TODO fake 1 failed test
    print("No ARC found!")
    add_test_case("Error", "Given input directory is not an ARC.")

create_badge(valid)
create_report()
create_summary()

exit(0)

Available versions
Version Released on
0.0.4 12/05/2025
0.0.3 12/05/2025
0.0.2 12/05/2025
0.0.1 12/05/2025