Skip to content
Snippets Groups Projects
modules_matrix.py 4.15 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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()