Skip to content
Snippets Groups Projects
modules_matrix.py 4.15 KiB
Newer Older
Lukáš Krupčík's avatar
Lukáš Krupčík committed
#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" modules_matrix """

from __future__ import print_function

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

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 form 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=',')
        # returns all the data from the csv file in list form
#        print(list(reader))
        return list(reader)  # only return the reader when you have finished.

def get_datalist():
    """ get_datalist """
    datalist = []
    for name in ['anselm', 'salomon', 'uv2000', 'phi', 'dgx', 'barbora']:
        path = os.path.join('scripts', "{}.csv".format(name))
        datalist += get_data(path)
    return datalist

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

def get_matrix():
    """ get_matrix """
    #     1    2    4    8    16   32
    chars = ['A', 'S', 'U', 'P', 'D', 'B']
    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 = dict()
    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],
                                     key=packaging.specifiers.LegacyVersion)[len(module[1]) - 1]
    data = {'total': len(packages), 'projects': packages}
    return data

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

def print_hint():
    """ print_hint """
    print('!!! Hint "Cluster Acronyms"')
    print('    ```')
    print('    B D P U S A')
    print('    | | | | | |')
    print('    | | | | | +----> Anselm')
    print('    | | | | +------> Salomon')
    print('    | | | +--------> UV2000')
    print('    | | +----------> Phi')
    print('    | +------------> DGX-2')
    print('    +--------------> Barbora')
    print('    ```')
    print()
    print("{} {} {}".format('| 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 main():
    """
    main function
    """
    arg = arg_parse()
    datalist = get_datalist()
    software = get_software(datalist)

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

if __name__ == "__main__":
    main()