Skip to content
Snippets Groups Projects
modules_matrix.py 4.17 KiB
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" modules_matrix """

import argparse
import csv
import itertools
import json
import os.path

def arg_parse():
    """
    Argument parser
    """
    parser = argparse.ArgumentParser(
        description="Module_matrix"
    )
    parser.add_argument('--json',
                        action='store_true',
                        help="get json")
    return parser.parse_args()

def get_data(filename):
    """Function to read the data from the input CSV file to use in the analysis"""
    reader = []  # Just in case the file open fails
    with open(filename, 'r') as fdata:
        reader = csv.reader(fdata, delimiter=',')
        return list(reader)  # Only return the reader when you have finished.

def get_datalist():
    """Get data list"""
    datalist = []
    for name in ['karolina', 'dgx', 'barbora']:
        path = os.path.join('scripts', f"{name}.csv")
        datalist += get_data(path)
    return datalist

def get_counts(datalist):
    """Get counts"""
    counts = {}
    for i in datalist:
        counts[i[0]] = counts.get(i[0], 0) + int(i[1])
    return counts

def get_matrix():
    """Get matrix"""
    chars = ['K', 'B', 'D']
    arr = []
    mask = ''.join(reversed(chars))
    for bits in itertools.product([0, 1], repeat=len(chars)):
        sbit = "".join(str(bit) for bit in bits)
        nst = ""
        for i, _ in enumerate(sbit):
            if sbit[i] == "1":
                nst += mask[i]
            else:
                nst += "-"
        arr.append(nst)
    return arr

def get_software(datalist):
    """Get software"""
    matrix = get_matrix()
    counts = get_counts(datalist)
    software = {}
    prev = ''
    for mat, i in sorted(counts.items()):
        split = mat.split('/')
        if len(split) > 1:
            if split[0] != prev:
                software[split[0]] = {}
            software[split[0]][split[1]] = '`' + matrix[i] + '`'
            prev = split[0]
    return software

def packages_json(software):
    """Packages JSON"""
    packages = {}
    for module in sorted(software.items(), key=lambda i: i[0].lower()):
        packages[module[0]] = sorted(module[1])[-1]
    data = {'total': len(packages), 'projects': packages}
    return data

def print_software(software):
    """Print software"""
    for module in sorted(software.items(), key=lambda i: i[0].lower()):
        software_name = module[0]
        versions = []
        clusters = []
        for key in sorted(module[1].keys()):
            versions.append(key)
            clusters.append(module[1][key])
        print(f"| {software_name} | {'<br>'.join(versions)} | {'<br>'.join(clusters)} |")
    print()
    print('---8<--- "modules_matrix_search.md"')

def print_hint():
    """Print hint"""
    print('!!! Hint "Cluster Acronyms"')
    print('    ```')
    print('    D B K')
    print('    | | |')
    print('    | | +----> Karolina')
    print('    | +------> Barbora')
    print('    +--------> DGX')
    print('    ```')
    print()
    print("| Module <br><form><input id=\"searchInput\" placeholder=\"🔍 Filter\""
          " style=\"width: 8rem; border-radius: 0.2rem; color: black;"
          " padding-left: .2rem;\"></form> | Versions | Clusters |")
    print("| ------ | -------- | -------- |")

def print_changelog():
    """Print changelog"""
    print('**Modules Changelog**<br>')
    print('You can see the modules changelog for each supercomputer here:<br>')
    print('[DGX modules changelog][1]<br>')
    print('[Barbora modules changelog][2]<br>')
    print('[Karolina modules changelog][3]<br>')

def print_links():
    """Print links"""
    print('[1]: https://code.it4i.cz/sccs/it4i-modules/-/blob/master/dgx-changelog.md')
    print('[2]: https://code.it4i.cz/sccs/it4i-modules/-/blob/master/barbora-changelog.md')
    print('[3]: https://code.it4i.cz/sccs/it4i-modules/-/blob/master/karolina-changelog.md')

def main():
    """Main function"""
    arg = arg_parse()
    datalist = get_datalist()
    software = get_software(datalist)

    if arg.json:
        print(json.dumps(packages_json(software)))
    else:
        print_changelog()
        print_hint()
        print_software(software)
        print_links()

if __name__ == "__main__":
    main()