#!/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()