From 24d63e5ad740accfc83cd3a08dbae1f9ac6356c3 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Wed, 18 Mar 2026 13:04:53 +0100 Subject: [PATCH 1/5] Clean up data generation, add test, include ldjson --- .../test_overview_available_software.yml | 6 - .../workflows/update_available_software.yml | 6 - docs/available_software/data/.gitkeep | 0 .../available_software/available_software.py | 867 +---- .../available_software/check_json_updates.py | 34 - scripts/available_software/requirements.txt | 2 - .../tests/data/bash_mock.sh | 19 - .../tests/data/data_avail_simple_generic.txt | 14 - .../tests/data/data_avail_simple_zen2.txt | 16 - .../data/data_avail_target_amd_intel.txt | 1 - .../tests/data/data_avail_target_simple.txt | 1 - .../tests/data/data_show_science.txt | 34 - .../tests/data/data_swap_generic.txt | 1 - .../tests/data/data_swap_zen2.txt | 1 - .../data/eessi_api_metadata_software.json | 3082 +++++++++++++++++ .../tests/data/lmod_mock.sh | 63 - .../tests/data/test_json_simple_sol.json | 1 - .../data/test_json_simple_sol_detail.json | 1 - .../tests/data/test_md_simple_sol.md | 10 - .../test_md_template_detailed_science_sol.md | 50 - .../available_software/tests/detail/.gitkeep | 0 .../tests/reference_detail/CUDA-Samples.md | 42 + .../tests/reference_detail/ESPResSo.md | 46 + .../tests/reference_detail/PMIx.md | 77 + .../tests/reference_detail/Salmon.md | 44 + .../tests/reference_detail/hatchling.md | 151 + .../tests/reference_detail/xterm.md | 42 + scripts/available_software/tests/test_data.py | 33 - scripts/available_software/tests/test_json.py | 77 - scripts/available_software/tests/test_md.py | 44 +- .../available_software/tests/test_module.py | 43 - 31 files changed, 3630 insertions(+), 1178 deletions(-) create mode 100644 docs/available_software/data/.gitkeep delete mode 100755 scripts/available_software/check_json_updates.py delete mode 100755 scripts/available_software/tests/data/bash_mock.sh delete mode 100644 scripts/available_software/tests/data/data_avail_simple_generic.txt delete mode 100644 scripts/available_software/tests/data/data_avail_simple_zen2.txt delete mode 100644 scripts/available_software/tests/data/data_avail_target_amd_intel.txt delete mode 100644 scripts/available_software/tests/data/data_avail_target_simple.txt delete mode 100644 scripts/available_software/tests/data/data_show_science.txt delete mode 100644 scripts/available_software/tests/data/data_swap_generic.txt delete mode 100644 scripts/available_software/tests/data/data_swap_zen2.txt create mode 100644 scripts/available_software/tests/data/eessi_api_metadata_software.json delete mode 100755 scripts/available_software/tests/data/lmod_mock.sh delete mode 100644 scripts/available_software/tests/data/test_json_simple_sol.json delete mode 100644 scripts/available_software/tests/data/test_json_simple_sol_detail.json delete mode 100644 scripts/available_software/tests/data/test_md_simple_sol.md delete mode 100644 scripts/available_software/tests/data/test_md_template_detailed_science_sol.md create mode 100644 scripts/available_software/tests/detail/.gitkeep create mode 100644 scripts/available_software/tests/reference_detail/CUDA-Samples.md create mode 100644 scripts/available_software/tests/reference_detail/ESPResSo.md create mode 100644 scripts/available_software/tests/reference_detail/PMIx.md create mode 100644 scripts/available_software/tests/reference_detail/Salmon.md create mode 100644 scripts/available_software/tests/reference_detail/hatchling.md create mode 100644 scripts/available_software/tests/reference_detail/xterm.md delete mode 100644 scripts/available_software/tests/test_data.py delete mode 100644 scripts/available_software/tests/test_json.py delete mode 100644 scripts/available_software/tests/test_module.py diff --git a/.github/workflows/test_overview_available_software.yml b/.github/workflows/test_overview_available_software.yml index d188f0bce6..03d30fe31a 100644 --- a/.github/workflows/test_overview_available_software.yml +++ b/.github/workflows/test_overview_available_software.yml @@ -17,18 +17,12 @@ jobs: python-version: '3.10' architecture: x64 - - name: Mount EESSI - uses: eessi/github-action-eessi@e1f8f20638ea417a18d23ab29443ee34794ff900 # v3.1.0 - with: - eessi_stack_version: '2023.06' - - name: test overview available software id: test_overview_available_software run: | # install required Python packages in virtual environment python -m venv venv . venv/bin/activate - pip install -r mkdocs-ldjson-plugin/requirements.txt pip install -r scripts/available_software/requirements.txt # download https://eessi.io/api_data/data/eessi_api_metadata_software.json diff --git a/.github/workflows/update_available_software.yml b/.github/workflows/update_available_software.yml index 6a9a5d9b26..289c365638 100644 --- a/.github/workflows/update_available_software.yml +++ b/.github/workflows/update_available_software.yml @@ -17,11 +17,6 @@ jobs: python-version: '3.10' architecture: x64 - - name: Mount EESSI - uses: eessi/github-action-eessi@e1f8f20638ea417a18d23ab29443ee34794ff900 # v3.1.0 - with: - eessi_stack_version: '2023.06' - - name: update overview of available software id: update_available_software run: | @@ -38,7 +33,6 @@ jobs: curl -OL https://eessi.io/api_data/data/eessi_api_metadata_software.json cd - - export TIME_GENERATED_TEMPLATE="{{ generated_time }}" python scripts/available_software/available_software.py ./scripts/update_generated_time.sh mkdocs.yml diff --git a/docs/available_software/data/.gitkeep b/docs/available_software/data/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/scripts/available_software/available_software.py b/scripts/available_software/available_software.py index 87821cb0cf..881a5ae2a4 100644 --- a/scripts/available_software/available_software.py +++ b/scripts/available_software/available_software.py @@ -11,390 +11,43 @@ @author: Michiel Lachaert (Ghent University) @author: Lara Peeters (Ghent University) """ + import copy import json import os -import re -import subprocess -import sys -import time import yaml -from typing import Union, Tuple -from string import Template -import numpy as np -from mdutils.mdutils import MdUtils from mdutils.tools.Table import Table -from natsort import natsorted -from functools import cmp_to_key - -EESSI_TOPDIR = "/cvmfs/software.eessi.io/versions/2023.06" - -# some CPU targets are excluded for now, because software layer is too incomplete currently -EXCLUDE_CPU_TARGETS = [] +from string import Template -AARCH64 = 'aarch64' -AMD = 'amd' -GENERIC = 'generic' -INTEL = 'intel' -NVIDIA = 'nvidia' -X86_64 = 'x86_64' +AARCH64 = "aarch64" +AMD = "amd" +GENERIC = "generic" +INTEL = "intel" +NVIDIA = "nvidia" +X86_64 = "x86_64" # -------------------------------------------------------------------------------------------------------- # MAIN # -------------------------------------------------------------------------------------------------------- + def main(): os.environ["SHELL"] = "/bin/bash" root_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - path_data_dir = os.path.join(root_dir, "docs/available_software/data") - - # Generate the JSON overviews - modules = modules_eessi() - print(modules) - print("Generate JSON overview... ", end="", flush=True) - generate_json_overview(modules, path_data_dir) - print("Done!") - - # Generate the JSON detail - json_data = generate_json_detailed_data(modules) - json_data = get_extra_info_eessi(json_data) - print("Generate JSON detailed... ", end="", flush=True) - json_path = generate_json_detailed(json_data, path_data_dir) - print("Done!") - - # Generate detail markdown pages - #print("Generate detailed pages... ", end="", flush=True) - #generate_detail_pages(json_path, os.path.join(root_dir, "docs/available_software/detail")) - #print("Done!") + # Allow for test data and target + target_directory = os.environ.get("AVAIL_SOFTWARE_TEST_DIRECTORY") or os.path.join( + root_dir, "docs", "available_software" + ) + path_data_dir = os.path.join(target_directory, "data") # Generate software-specific pages using data from https://eessi.io/api_data/data/eessi_api_metadata_software.json print("Generating software-specific pages... ", end="", flush=True) - api_data_software_json = os.path.join(root_dir, 'docs', 'available_software', 'data', 'eessi_api_metadata_software.json') - generate_software_pages(api_data_software_json, os.path.join(root_dir, 'docs', 'available_software', 'detail')) + api_data_software_json = os.path.join(path_data_dir, "eessi_api_metadata_software.json") + generate_software_pages(api_data_software_json, os.path.join(target_directory, "detail")) print("Done!") -# -------------------------------------------------------------------------------------------------------- -# Functions to run bash commands -# -------------------------------------------------------------------------------------------------------- - -def bash_command(cmd: str) -> np.ndarray: - bash = os.getenv("SHELL") - proc = subprocess.run( - [bash, '-c', cmd], - encoding="utf-8", - stdout=subprocess.PIPE, - stderr=subprocess.PIPE - ) - - return np.array(proc.stdout.split()) - - -# -------------------------------------------------------------------------------------------------------- -# Functions to run "module" commands -# -------------------------------------------------------------------------------------------------------- - -def module(*args, filter_fn=lambda x: x) -> np.ndarray: - """ - Function to run "module" commands. - - @param args: Extra arguments for the module command. - @param filter_fn: Filter function on the output. - @return: Array with the output of the module command. - """ - lmod = os.getenv('LMOD_CMD') - if lmod is None: - sys.stderr.write("Lmod not found (via $LMOD_CMD)!\n") - sys.exit(1) - - proc = subprocess.run( - [lmod, "python", "--terse"] + list(args), - encoding="utf-8", - stderr=subprocess.PIPE, - stdout=subprocess.PIPE - ) - exec(proc.stdout) - return filter_fn(np.array(proc.stderr.strip().split("\n"))) - - -def module_avail(name: str = "", filter_fn=lambda x: x) -> np.ndarray: - """ - Function to run "module avail" commands. - - @param name: Module name, or empty string to return all available modules. - @param filter_fn: Filter on the output. - @return: List of all available modules of name, or all if name is not given. - """ - return module("avail", name, filter_fn=filter_fn) - - -def module_swap(name: str) -> None: - """ - Function to run "module swap" commands. - - @param name: Name of module you want to swap to. - """ - module("swap", name) - - -def module_use(path: str) -> None: - """ - Function to run "module use" commands. - - @param path: Path to the directory with all the modules you want to use. - """ - module("use", path) - - -def module_unuse(path: str) -> None: - """ - Function to run "module unuse" commands. - - @param path: Path to the directory with all the modules you want to unuse. - """ - module("unuse", path) - - -def module_whatis(name: str) -> dict: - """ - Function to run "module whatis" commands. - - @param name: Name of module you want the whatis info for. - """ - whatis = {} - data = module("show", name) - for line in data[np.char.startswith(data, "whatis")]: - content = re.sub(pattern=r'whatis\((.*)\)', repl='\\1', string=line).strip('"') - key, value = tuple(content.split(":", maxsplit=1)) - whatis[key.strip()] = value.strip() - return whatis - - -def module_info(info: str) -> dict: - """ - Function to parse through lua file. - - @param info: String with the contents of the lua file. - """ - whatis = {} - data = np.array(info.split("\n")) - # index of start description to handle multi lined description - i = np.flatnonzero(np.char.startswith(data, "whatis([==[Description"))[0] - if np.char.endswith(data[i], "]==])"): - content = re.sub(pattern=r'whatis\(\[==\[(.*)\]==\]\)', repl='\\1', string=data[i]).strip('"') - else: - description = re.sub(pattern=r'whatis\(\[==\[(.*)', repl='\\1', string=data[i]).strip('"') - while not np.char.endswith(data[i], "]==])"): - i += 1 - description += data[i] - content = re.sub(pattern=r'(.*)\]==\]\)', repl='\\1', string=description).strip('"') - key, value = tuple(content.split(":", maxsplit=1)) - whatis[key.strip()] = value.strip() - - for line in data[np.char.startswith(data, "whatis")]: - if not np.char.startswith(line, "whatis([==[Description"): - content = re.sub(pattern=r'whatis\(\[==\[(.*)\]==\]\)', repl='\\1', string=line).strip('"') - key, value = tuple(content.split(":", maxsplit=1)) - whatis[key.strip()] = value.strip() - return whatis - - -# -------------------------------------------------------------------------------------------------------- -# Fetch data EESSI -# -------------------------------------------------------------------------------------------------------- - -def filter_fn_eessi_modules(data: np.ndarray) -> np.ndarray: - """ - Filter function for the output of all software modules for EESSI (excl. 'target'). - @param data: Output - @return: Filtered output - """ - return data[~np.char.endswith(data, ":")] - - -def targets_eessi() -> np.ndarray: - """ - Returns all the target names of EESSI. - @return: target names - """ - if not os.path.exists(EESSI_TOPDIR): - sys.stderr.write(f"ERROR: {EESSI_TOPDIR} does not exist!\n") - sys.exit(1) - - commands = [ - f"find {EESSI_TOPDIR}/software/linux/*/* -maxdepth 0 \\( ! -name 'intel' -a ! " - "-name 'amd' -a ! -name 'nvidia' \\) -type d", - f'find {EESSI_TOPDIR}/software/linux/*/{{amd,intel,nvidia}}/* -maxdepth 0 -type d' - ] - targets = np.array([]) - - for command in commands: - targets = np.concatenate([targets, bash_command(command)]) - - return targets - - -def eessi_target_compare(a, b): - """ - A comparison function to compare the EESSI targets and order them. - First the main architecture is ordered alphabetically, then within them - the CPU targets are again ordered alphabetically, except for the - generic target, which always comes first. Targets that include an extra - vendor subdir always after those without a vendor subdir. - @return: 0, 1, -1 - """ - if a == b: - return 0 - - a_split = a.rsplit('/') - b_split = b.rsplit('/') - - # We first compare the main architecture (aarch64, x86_64, ...), which is the 7th field - if a_split[7] == b_split[7]: - # Check if one item is for generic builds (last field), These should always be listed first - if a_split[-1] == 'generic': - return -1 - if b_split[-1] == 'generic': - return 1 - # If the number of fields are not equal, one has an extra vendor subdirectory (e.g. amd, intel, nvidia). - # These should always come after the ones without this extra level. - if len(a_split) != len(b_split): - return 1 if len(a_split) > len(b_split) else -1 - - # In all other cases we just do an alphabetical sort of the strings. - return 1 if a > b else -1 - - -def modules_eessi() -> dict: - """ - Returns names of all software module that are installed on EESSI. - They are grouped by target. - @return: Dictionary with all the modules per target - """ - print("Start collecting modules:") - data = {} - - modulepath = os.getenv('MODULEPATH') - if modulepath: - module_unuse(modulepath) - - targets = targets_eessi() - - # Order targets - eessi_target_compare_key = cmp_to_key(eessi_target_compare) - ordered_targets = sorted(targets, key=eessi_target_compare_key) - - targets = [t for t in ordered_targets if not any(t.endswith(x) for x in EXCLUDE_CPU_TARGETS)] - - for target in targets: - print(f"\t Collecting available modules for {target}... ", end="", flush=True) - module_use(target + "/modules/all/") - data[target] = module_avail(filter_fn=filter_fn_eessi_modules) - print(f"found {len(data[target])} modules!") - module_unuse(os.getenv('MODULEPATH')) - - print("All data collected!\n") - return data - - -def get_extra_info_eessi(json_data) -> dict: - """ - add Description, homepage and a list of extensions (only for software with extensions) - @return: Dictionary with all the modules and their site_packages - """ - modules = json_data['software'] - for software in modules: - for mod in modules[software]['versions']: - if software == "Java": - # TODO handle specific naming schema for Java - # code cannot handle "Java/11(@Java/11.0.20)" - continue - base_path = modules[software]['versions'][mod]['targets'][0] + '/modules/all/' - path = base_path + mod + ".lua" - f = open(path, 'r') - info = f.read() - if info != "": - whatis = module_info(info) - json_data['software'][software]['description'] = whatis['Description'] - if "Homepage" in whatis.keys(): - json_data['software'][software]['homepage'] = whatis['Homepage'] - if "Extensions" in whatis.keys(): - json_data["software"][software]["versions"][mod]["extensions"] = whatis['Extensions'] - return json_data - - -# -------------------------------------------------------------------------------------------------------- -# Util functions -# -------------------------------------------------------------------------------------------------------- - -def analyze_module(mod: str) -> Tuple: - return ( - mod.split("/", 1)[0], - mod.split("/", 1)[1] if "/" in mod else "" - ) - - -def mod_names_to_software_names(mod_list: np.ndarray) -> np.ndarray: - """ - Convert a list of module names to a list of the software names. - - @param mod_list: List of the module names - @return: List of the corresponding software names - """ - return np.unique([analyze_module(mod)[0] for mod in mod_list]) - - -def get_unique_software_names(data: Union[dict, list, np.ndarray]) -> Union[dict, list, np.ndarray]: - """ - Simplify list of modules by removing versions and duplicates. - - @param data: List of modules - @return: List of software names. - """ - - if isinstance(data, dict): - simplified_data = {target: mod_names_to_software_names(data[target]) for target in data} - else: - simplified_data = mod_names_to_software_names(data) - - return simplified_data - - -def dict_sort(dictionary: dict) -> dict: - """ - Sort a dictionary by key. - - @param dictionary: A dictionary - @return: Sorted dictionary - """ - return dict(natsorted(dictionary.items())) - - -# -------------------------------------------------------------------------------------------------------- -# Generate detailed markdown -# -------------------------------------------------------------------------------------------------------- - -def generate_software_table_data(software_data: dict, targets: list) -> list: - """ - Construct the data for the detailed software table. - - @param software_data: Software specific data. - @param targets: List with all the target names - @return: 1D list with all the data for the table - """ - table_data = [" "] + [target[57:] for target in targets] - - for module_name, available in list(software_data.items())[::-1]: - row = [module_name] - - for target in targets: - row += ("x" if target in available["targets"] else "-") - table_data += row - - return table_data - - # LD+JSON Template with placeholders ldjson_template = Template(""" { @@ -430,103 +83,28 @@ def generate_software_table_data(software_data: dict, targets: list) -> list: """) -def generate_software_detail_page( - software_name: str, - software_data: dict, - generated_time: str, - targets: list, - path: str -) -> None: - """ - Generate one software specific detail page. - - @param software_name: Name of the software - @param software_data: Additional information about the software (version, etc...) - @param generated_time: Timestamp when the data was generated - @param targets: List with all the target names - @param path: Path of the directory where the detailed page will be created. - """ - sorted_versions = dict_sort(software_data["versions"]) - newest_version = list(sorted_versions.keys())[-1] - ldjson_software_data = copy.deepcopy(software_data) - - filename = f"{path}/{software_name}.md" - md_file = MdUtils(file_name=filename, title=f"{software_name}") - if 'description' in software_data.keys(): - description = software_data['description'] - md_file.new_paragraph(f"{description}") - else: - ldjson_software_data['description'] = '' - if 'homepage' in software_data.keys(): - homepage = software_data['homepage'] - md_file.new_paragraph(f"{homepage}") - else: - ldjson_software_data["homepage"] = '' - - md_file.new_header(level=1, title="Available modules") - - md_file.new_paragraph(f"The overview below shows which {software_name} installations are available per " - f"target architecture in EESSI, ordered based on software version (new to old).") - md_file.new_paragraph(f"To start using {software_name}, load one of these modules using a `module load` command " - f"like:") - md_file.insert_code(f"module load {newest_version}", language="shell") - md_file.new_paragraph(f"(This data was automatically generated on {generated_time})", bold_italics_code="i") - md_file.new_line() - - md_file.new_table( - columns=len(targets) + 1, - rows=len(sorted_versions) + 1, - text=generate_software_table_data(sorted_versions, targets) - ) - - for version, details in list(sorted_versions.items())[::-1]: - if 'extensions' in details: - md_file.new_paragraph(f"### {version}") - md_file.new_paragraph("This is a list of extensions included in the module:") - packages = details['extensions'] - md_file.new_paragraph(f"{packages}") - - md_file.create_md_file() - - with open(filename) as f: - read_data = f.read() - with open(filename, 'w') as f: - # Add the software name - ldjson_software_data['name'] = software_name - # Just output the supported versions (with toolchains) - ldjson_software_data["version"] = list(sorted_versions.keys()) - # Make the description safe for json (and remove surrounding quotes) - ldjson_software_data['description'] = json.dumps(ldjson_software_data['description'])[1:-1] - json_str = ldjson_template.substitute(ldjson_software_data) # Replace placeholders - json_topmatter = json.loads(json_str) - # Remove the TOC - json_topmatter["hide"] = ["toc"] - yaml_topmatter = yaml.dump(json_topmatter) - f.write("---\n" + yaml_topmatter + "---\n" + read_data) - - def format_cpu_arch_list(cpu_archs): res = [] # generic CPU targets - gen_cpu_targets = [c for c in cpu_archs if c.endswith('/' + GENERIC)] - res.append("`generic`: " + ', '.join(['`' + x.split('/', maxsplit=1)[0] + '`' for x in gen_cpu_targets]) + "
") + gen_cpu_targets = [c for c in cpu_archs if c.endswith("/" + GENERIC)] + res.append("`generic`: " + ", ".join(["`" + x.split("/", maxsplit=1)[0] + "`" for x in gen_cpu_targets]) + "
") # Arm CPU targets - arm_cpu_targets = [c for c in cpu_archs if c.startswith(AARCH64) and not c.endswith('/' + GENERIC)] + arm_cpu_targets = [c for c in cpu_archs if c.startswith(AARCH64) and not c.endswith("/" + GENERIC)] label = 'Arm' - res.append(label + ": " + ', '.join(['`' + x.split('/', maxsplit=1)[1] + '`' for x in arm_cpu_targets]) + "
") + res.append(label + ": " + ", ".join(["`" + x.split("/", maxsplit=1)[1] + "`" for x in arm_cpu_targets]) + "
") # x86_64 AMD CPU targets - amd_cpu_targets = [c for c in cpu_archs if c.startswith(X86_64 + '/' + AMD)] + amd_cpu_targets = [c for c in cpu_archs if c.startswith(X86_64 + "/" + AMD)] label = 'AMD' - res.append(label + ": " + ', '.join(['`' + x.split('/', maxsplit=2)[2] + '`' for x in amd_cpu_targets]) + "
") + res.append(label + ": " + ", ".join(["`" + x.split("/", maxsplit=2)[2] + "`" for x in amd_cpu_targets]) + "
") # x86_64 Intel CPU targets - intel_cpu_targets = [c for c in cpu_archs if c.startswith(X86_64 + '/' + INTEL)] + intel_cpu_targets = [c for c in cpu_archs if c.startswith(X86_64 + "/" + INTEL)] label = 'Intel' - res.append(label + ": " + ', '.join(['`' + x.split('/', maxsplit=2)[2] + '`' for x in intel_cpu_targets]) + "
") + res.append(label + ": " + ", ".join(["`" + x.split("/", maxsplit=2)[2] + "`" for x in intel_cpu_targets]) + "
") return res @@ -538,25 +116,25 @@ def format_gpu_arch_list(gpu_archs): all_gpu_archs = set([y for x in gpu_archs.values() for y in x]) # AMD GPU targets - amd_gpu_targets = sorted([g for g in all_gpu_archs if g.startswith(AMD + '/')]) + amd_gpu_targets = sorted([g for g in all_gpu_archs if g.startswith(AMD + "/")]) if amd_gpu_targets: label = 'AMD' - res.append(label + ": " + ', '.join(['`' + x.split('/', maxsplit=1)[1] + '`' for x in amd_gpu_targets]) + "
") + res.append( + label + ": " + ", ".join(["`" + x.split("/", maxsplit=1)[1] + "`" for x in amd_gpu_targets]) + "
" + ) # NVIDIA GPU targets - nvidia_gpu_targets = sorted([g for g in all_gpu_archs if g.startswith(NVIDIA + '/')]) + nvidia_gpu_targets = sorted([g for g in all_gpu_archs if g.startswith(NVIDIA + "/")]) if nvidia_gpu_targets: label = 'NVIDIA' - res.append(label + ": " + ', '.join(['`' + x.split('/', maxsplit=1)[1] + '`' for x in nvidia_gpu_targets]) + "
") + res.append( + label + ": " + ", ".join(["`" + x.split("/", maxsplit=1)[1] + "`" for x in nvidia_gpu_targets]) + "
" + ) return res -def generate_software_page( - software_name: str, - software_data: dict, - path: str -) -> None: +def generate_software_page(software_name: str, software_data: dict, path: str) -> None: """ Generate one software specific detail page. @@ -570,80 +148,96 @@ def generate_software_page( md_lines = [ f"# {software_name}", - '', + "", ] - if 'description' in software_data.keys(): - description = software_data['description'] - md_lines.extend([ - '', - f"{description}", - '', - ]) - - if 'homepage' in software_data.keys(): - homepage = software_data['homepage'] + if "description" in software_data.keys(): + description = software_data["description"] + md_lines.extend( + [ + "", + f"{description}", + "", + ] + ) + + if "homepage" in software_data.keys(): + homepage = software_data["homepage"] md_lines.append(f'homepage: [{homepage}]({homepage})') - md_lines.extend([ - '', - "## Available installations", - '', - ]) + md_lines.extend( + [ + "", + "## Available installations", + "", + ] + ) - table_data = [f'{software_name} version', 'Supported CPU targets', 'Supported GPU targets', 'EESSI version', 'Module'] + table_data = [ + f"{software_name} version", + "Supported CPU targets", + "Supported GPU targets", + "EESSI version", + "Module", + ] n_cols = len(table_data) n_rows = 1 - for version in sorted(software_data['versions'], key=lambda x: x['version']): - cpu_targets = format_cpu_arch_list(version['cpu_arch']) - gpu_targets = format_gpu_arch_list(version['gpu_arch']) - - req_mods = version['required_modules'] - if req_mods and req_mods[0].get('module_name') == 'EESSI': - eessi_version = req_mods[0]['module_version'] - eessi_version_no_dots = eessi_version.replace('.', '') + for version in sorted(software_data["versions"], key=lambda x: x["version"]): + cpu_targets = format_cpu_arch_list(version["cpu_arch"]) + gpu_targets = format_gpu_arch_list(version["gpu_arch"]) + + req_mods = version["required_modules"] + if req_mods and req_mods[0].get("module_name") == "EESSI": + eessi_version = req_mods[0]["module_version"] + eessi_version_no_dots = eessi_version.replace(".", "") eessi_version_label = f'{eessi_version}' else: eessi_version_label = "*???*" - table_data.extend([ - version['version'], - ''.join(cpu_targets), - ''.join(gpu_targets) or '*(none)*', + table_data.extend( + [ + version["version"], + "".join(cpu_targets), + "".join(gpu_targets) or "*(none)*", eessi_version_label, - '`' + version['module']['full_module_name'] + '`', - ]) + "`" + version["module"]["full_module_name"] + "`", + ] + ) n_rows += 1 table = Table().create_table(columns=n_cols, rows=n_rows, text=table_data) md_lines.extend(table.splitlines()) exts = {} - for version in software_data['versions']: - for ext_data in version['extensions']: - ext_details = exts.setdefault(ext_data['name'], {}) - ext_version = ext_details.setdefault(ext_data['version'], set()) - ext_version.add(version['module']['full_module_name']) + for version in software_data["versions"]: + for ext_data in version["extensions"]: + ext_details = exts.setdefault(ext_data["name"], {}) + ext_version = ext_details.setdefault(ext_data["version"], set()) + ext_version.add(version["module"]["full_module_name"]) if exts: - md_lines.extend([ - '', - f'## Extensions', - '', - f"Overview of extensions included in {software_name} installations", - '', - ]) - - table_header = ['`%s` version', f'{software_name} modules that include it'] + md_lines.extend( + [ + "", + "## Extensions", + "", + f"Overview of extensions included in {software_name} installations", + "", + ] + ) + + table_header = ["`%s` version", f"{software_name} modules that include it"] n_cols = len(table_header) for ext_name, ext_details in sorted(exts.items(), key=lambda x: x[0].lower()): - md_lines.extend([ - '', - f'### {ext_name}', - '', - ]) + md_lines.extend( + [ + "", + f"### {ext_name}", + "", + ] + ) table_data = table_header[:] table_data[0] = table_data[0] % ext_name @@ -651,37 +245,44 @@ def generate_software_page( n_rows = 1 for ext_version, ext_version_mods in sorted(ext_details.items(), key=lambda x: x[0]): n_rows += 1 - table_data.extend([ - ext_version, - '
'.join('`' + m + '`' for m in ext_version_mods), - ]) + table_data.extend( + [ + ext_version, + "
".join("`" + m + "`" for m in sorted(ext_version_mods)), + ] + ) table = Table().create_table(columns=n_cols, rows=n_rows, text=table_data) md_lines.extend(table.splitlines()) - md_txt = '\n'.join(md_lines) + md_txt = "\n".join(md_lines) - with open(filename, 'w') as fp: + with open(filename, "w") as fp: fp.write(md_txt) - -def generate_detail_pages(json_path, dest_path) -> None: - """ - Generate all the detailed pages for all the software that is available. - """ - - with open(json_path) as json_data: - data = json.load(json_data) - - all_targets = data["targets"] - - time_generated_template = os.environ.get('TIME_GENERATED_TEMPLATE') - for software, content in data["software"].items(): - if time_generated_template: - time_generated = time_generated_template - else: - time_generated = data["time_generated"] - generate_software_detail_page(software, content, time_generated, all_targets, dest_path) + # Add ldjson data topmatter + with open(filename) as f: + read_data = f.read() + ldjson_software_data = copy.deepcopy(software_data) + if "description" not in software_data.keys(): + ldjson_software_data["description"] = "" + if "homepage" not in software_data.keys(): + ldjson_software_data["homepage"] = "" + with open(filename, "w") as f: + # Add the software name + ldjson_software_data["name"] = software_name + # Just output the supported versionsq + ldjson_software_data["version"] = sorted( + list(set([version["version"] for version in software_data["versions"]])), reverse=True + ) + # Make the description safe for json (and remove surrounding quotes) + ldjson_software_data["description"] = json.dumps(ldjson_software_data["description"])[1:-1] + json_str = ldjson_template.substitute(ldjson_software_data) # Replace placeholders + json_topmatter = json.loads(json_str) + # Remove the TOC + json_topmatter["hide"] = ["toc"] + yaml_topmatter = yaml.dump(json_topmatter) + f.write("---\n" + yaml_topmatter + "---\n" + read_data) def generate_software_pages(json_path, dest_path) -> None: @@ -692,211 +293,9 @@ def generate_software_pages(json_path, dest_path) -> None: with open(json_path) as json_data: data = json.load(json_data) - for name in data['software']: - generate_software_page(name, data['software'][name], dest_path) - - -# -------------------------------------------------------------------------------------------------------- -# Generate overview markdown -# -------------------------------------------------------------------------------------------------------- - -def generate_table_data(avail_mods: dict) -> Tuple[np.ndarray, int, int]: - """ - Generate data that can be used to construct a MarkDown table. - - @param avail_mods: Available modules - @return: Returns tuple (Table data, #col, #row) - """ - avail_mods = get_unique_software_names(avail_mods) - all_modules = get_unique_software_names(np.concatenate(list(avail_mods.values()))) - - final = np.array([" "]) - final = np.append(final, list(avail_mods.keys())) - - for package in all_modules: - final = np.append(final, package) - - for target in avail_mods: - final = np.append(final, "X" if package in avail_mods[target] else " ") - - return final, len(avail_mods.keys()) + 1, len(all_modules) + 1 - - -def generate_module_table(data: dict, md_file: MdUtils) -> None: - """ - Generate the general table of the overview. - - @param data: Dict with all the data. Keys are the target names. - @param md_file: MdUtils object. - """ - print("Generating markdown table... ", end="", flush=True) - structured, col, row = generate_table_data(data) - md_file.new_table(columns=col, rows=row, text=list(structured), text_align='center') - print("Done!") - - -def generate_markdown_overview(modules: dict) -> None: - """ - Generate the general overview in a markdown file. - It generates a list of all the available software and indicates for which target it is available. - """ - md_fn = 'module_overview.md' - md_file = MdUtils(file_name=md_fn, title='Overview of available modules per target architecture in EESSI') - generate_module_table(modules, md_file) - md_file.create_md_file() - print(f"Module overview created at {md_fn}") - - -# -------------------------------------------------------------------------------------------------------- -# Generate JSON -# -------------------------------------------------------------------------------------------------------- -# ----------- -# OVERVIEW -# ----------- - -# FORMAT OVERVIEW JSON -# { -# "targets": [ -# "/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", -# "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2" -# ], -# "modules": { -# "Markov": [1, 0], -# "cfd": [1, 1], -# "llm": [0, 1], -# "science": [1, 1] -# } -# } -def generate_json_overview_data(modules: dict) -> dict: - """ - Generate the data for the json overview in the above format. - - @param modules: Dictionary with all the modules per target. Keys are the target names. - @return: Dictionary with the required JSON structure. - - """ - json_data = { - "targets": list(modules.keys()), - "modules": {}, - "time_generated": time.strftime("%a, %d %b %Y at %H:%M:%S %Z") - } - avail_software = get_unique_software_names(modules) - all_software = get_unique_software_names(np.concatenate(list(modules.values()))) - - # creates a list of booleans for each software that indicates - # if the software is available for the corresponding target. - for soft in all_software: - available = [] - for target in json_data["targets"]: - available.append(int(soft in avail_software[target])) - json_data["modules"][soft] = available - return json_data - - -def generate_json_overview(modules: dict, path_data_dir: str) -> str: - """ - Generate the overview in a JSON format. - - @param modules: Dictionary with all the modules per target. Keys are the target names. - @param path_data_dir: Path to the directory where the JSON will be placed. - @return: Absolute path to the json file. - """ - - # get data - json_data = generate_json_overview_data(modules) - - filepath = os.path.join(path_data_dir, "json_data.json") - # write it to a file - with open(filepath, 'w') as outfile: - json.dump(json_data, outfile) - - return filepath - - -# ----------- -# DETAILED -# ----------- - -# FORMAT DETAILED JSON: -# -# { -# "targets": [ -# "/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", -# "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2" -# ], -# "software": { -# "cfd": { -# "targets": [ -# "/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", -# "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2" -# ], -# "versions": { -# "2.3.1": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic"], -# "2.3.2": [ -# "/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", -# "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2" -# ] -# } -# } -# } -# } - -def generate_json_detailed_data(modules: dict) -> dict: - """ - Generate the data for the detailed JSON in the above format. - - @param modules: Dictionary with all the modules per target. Keys are the target names. - @return: Dictionary with the required JSON structure. - """ - json_data = { - "targets": list(modules.keys()), - "software": {}, - "time_generated": time.strftime("%a, %d %b %Y at %H:%M:%S %Z") - } - - # Loop over every module in every target - for target in modules: - for mod in modules[target]: - software, version = analyze_module(mod) - - # Exclude modules with no version - if version != "": - # If the software is not yet present, add it. - if software not in json_data["software"]: - json_data["software"][software] = { - "targets": [], - "versions": {} - } - - # If the version is not yet present, add it. - if mod not in json_data["software"][software]["versions"]: - json_data["software"][software]["versions"][mod] = {'targets': []} - - # If the target is not yet present, add it. - if target not in json_data["software"][software]["targets"]: - json_data["software"][software]["targets"].append(target) - - # If the target is not yet present, add it. - if target not in json_data["software"][software]["versions"][mod]["targets"]: - json_data["software"][software]["versions"][mod]["targets"].append(target) - - return json_data - - -def generate_json_detailed(json_data: dict, path_data_dir: str) -> str: - """ - Generate the detailed JSON. - - @param modules: Dictionary with all the modules per target. Keys are the target names. - @param path_data_dir: Path to the directory where the JSON will be placed. - @return: Absolute path to the json file. - """ - filepath = os.path.join(path_data_dir, "json_data_detail.json") - with open(filepath, 'w') as outfile: - json.dump(json_data, outfile) - - return filepath + for name in data["software"]: + generate_software_page(name, data["software"][name], dest_path) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/scripts/available_software/check_json_updates.py b/scripts/available_software/check_json_updates.py deleted file mode 100755 index 16cc1058e6..0000000000 --- a/scripts/available_software/check_json_updates.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2023-2023 Ghent University -# -# SPDX license identifier: GPL-3.0-or-later -# -""" -Python script to check for differences between provided JSON files -that contain data on available software. - -@author: Kenneth Hoste (Ghent University) -""" -import json -import sys - -if len(sys.argv) != 3: - sys.stderr.write(f"Usage: {sys.argv[0]} \n") - sys.exit(1) - -json1_path = sys.argv[1] -json2_path = sys.argv[2] - -with open(json1_path) as json1: - json1_data = json.load(json1) -with open(json2_path) as json2: - json2_data = json.load(json2) - -json1_data_filtered = {k: v for (k, v) in json1_data.items() if k != 'time_generated'} -json2_data_filtered = {k: v for (k, v) in json2_data.items() if k != 'time_generated'} - -if json1_data_filtered == json2_data_filtered: - print("no changes") -else: - print("differences found") diff --git a/scripts/available_software/requirements.txt b/scripts/available_software/requirements.txt index 389a40b377..6d558a8c4d 100644 --- a/scripts/available_software/requirements.txt +++ b/scripts/available_software/requirements.txt @@ -1,4 +1,2 @@ mdutils -numpy -natsort pyyaml diff --git a/scripts/available_software/tests/data/bash_mock.sh b/scripts/available_software/tests/data/bash_mock.sh deleted file mode 100755 index 5f0e1090f1..0000000000 --- a/scripts/available_software/tests/data/bash_mock.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -# Return an error when a variable is not set. -set -u - - -# example: /bin/bash -c "echo hello" -bash="$0" -cflag="$1" -cmd="$2" - -# Emulate find command. -if echo "$cmd" | grep -q -E "find"; then - if echo "$cmd" | grep -q -E "amd,intel"; then - cat "${MOCK_FILE_AVAIL_TARGET_AMD_INTEL}" >&1 - else - cat "${MOCK_FILE_AVAIL_TARGET}" >&1 - fi -fi diff --git a/scripts/available_software/tests/data/data_avail_simple_generic.txt b/scripts/available_software/tests/data/data_avail_simple_generic.txt deleted file mode 100644 index de988a5679..0000000000 --- a/scripts/available_software/tests/data/data_avail_simple_generic.txt +++ /dev/null @@ -1,14 +0,0 @@ -/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/generic/modules/all: -cfd/1.0 -cfd/2.0 -cfd/24 -cfd/5.0 -cfd/2.0afqsdf -Markov/hidden-1.0.5 -Markov/hidden-1.0.10 -Markov/ -science/ -science/5.3.0 -science/5.3.0 -science/5.3.0 -science/7.2.0 diff --git a/scripts/available_software/tests/data/data_avail_simple_zen2.txt b/scripts/available_software/tests/data/data_avail_simple_zen2.txt deleted file mode 100644 index 482528b56d..0000000000 --- a/scripts/available_software/tests/data/data_avail_simple_zen2.txt +++ /dev/null @@ -1,16 +0,0 @@ -/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2/modules/all: -cfd/1.0 -cfd/2.0 -cfd/3.0 -cfd/24 -cfd/ -cfd/5.0 -cfd/2.0afqsdf -llm/20230627 -llm/20230627 -llm/20230627 -science/ -science/5.3.0 -science/5.3.0 -science/5.3.0 -science/7.2.0 diff --git a/scripts/available_software/tests/data/data_avail_target_amd_intel.txt b/scripts/available_software/tests/data/data_avail_target_amd_intel.txt deleted file mode 100644 index adf051fdf0..0000000000 --- a/scripts/available_software/tests/data/data_avail_target_amd_intel.txt +++ /dev/null @@ -1 +0,0 @@ -/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2 diff --git a/scripts/available_software/tests/data/data_avail_target_simple.txt b/scripts/available_software/tests/data/data_avail_target_simple.txt deleted file mode 100644 index e622f8c27e..0000000000 --- a/scripts/available_software/tests/data/data_avail_target_simple.txt +++ /dev/null @@ -1 +0,0 @@ -/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic diff --git a/scripts/available_software/tests/data/data_show_science.txt b/scripts/available_software/tests/data/data_show_science.txt deleted file mode 100644 index e009c98580..0000000000 --- a/scripts/available_software/tests/data/data_show_science.txt +++ /dev/null @@ -1,34 +0,0 @@ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - /apps/gent/RHEL8/zen2-ib/modules/all/SciPy-bundle/2022.05-foss-2022a.lua: -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -help([[ -Description -=========== -Bundle for scientific software - - -More information -================ - - Homepage: https://science.com/ - - -Included extensions -=================== -beniget-0.4.1, Bottleneck-1.3.4 -]]) -whatis("Description: Bundle for scientific software") -whatis("Homepage: https://science.com/") -whatis("URL: https://science.com/") -whatis("Extensions: ext-1.2.3, ext-2.3.4") -conflict("SciPy-bundle") -prepend_path("CMAKE_PREFIX_PATH","/apps/gent/RHEL8/zen2-ib/software/SciPy-bundle/2022.05-foss-2022a") -prepend_path("LIBRARY_PATH","/apps/gent/RHEL8/zen2-ib/software/SciPy-bundle/2022.05-foss-2022a/lib") -prepend_path("PATH","/apps/gent/RHEL8/zen2-ib/software/SciPy-bundle/2022.05-foss-2022a/bin") -setenv("EBROOTSCIPYMINBUNDLE","/apps/gent/RHEL8/zen2-ib/software/SciPy-bundle/2022.05-foss-2022a") -setenv("EBVERSIONSCIPYMINBUNDLE","2022.05") -setenv("EBDEVELSCIPYMINBUNDLE","/apps/gent/RHEL8/zen2-ib/software/SciPy-bundle/2022.05-foss-2022a/easybuild/SciPy-bundle-2022.05-foss-2022a-easybuild-devel") -prepend_path("PYTHONPATH","/apps/gent/RHEL8/zen2-ib/software/SciPy-bundle/2022.05-foss-2022a/lib/python3.10/site-packages") -prepend_path("CPATH","/apps/gent/RHEL8/zen2-ib/software/SciPy-bundle/2022.05-foss-2022a/lib/python3.10/site-packages/numpy/core/include") -prepend_path("LD_LIBRARY_PATH","/apps/gent/RHEL8/zen2-ib/software/SciPy-bundle/2022.05-foss-2022a/lib/python3.10/site-packages/numpy/core/lib") -prepend_path("LIBRARY_PATH","/apps/gent/RHEL8/zen2-ib/software/SciPy-bundle/2022.05-foss-2022a/lib/python3.10/site-packages/numpy/core/lib") -setenv("EBEXTSLISTSCIPYMINBUNDLE","numpy-1.22.3,ply-3.11,gast-0.5.3,beniget-0.4.1,pythran-0.11.0,scipy-1.8.1,mpi4py-3.1.3,numexpr-2.8.1,Bottleneck-1.3.4,pandas-1.4.2,mpmath-1.2.1,deap-1.3.1") diff --git a/scripts/available_software/tests/data/data_swap_generic.txt b/scripts/available_software/tests/data/data_swap_generic.txt deleted file mode 100644 index 6fc8f8348a..0000000000 --- a/scripts/available_software/tests/data/data_swap_generic.txt +++ /dev/null @@ -1 +0,0 @@ -os.environ["MOCK_FILE_AVAIL"] = os.getenv('TESTS_PATH') + "/data/data_avail_simple_generic.txt" diff --git a/scripts/available_software/tests/data/data_swap_zen2.txt b/scripts/available_software/tests/data/data_swap_zen2.txt deleted file mode 100644 index 99f9e4ef6f..0000000000 --- a/scripts/available_software/tests/data/data_swap_zen2.txt +++ /dev/null @@ -1 +0,0 @@ -os.environ["MOCK_FILE_AVAIL"] = os.getenv('TESTS_PATH') + "/data/data_avail_simple_zen2.txt" diff --git a/scripts/available_software/tests/data/eessi_api_metadata_software.json b/scripts/available_software/tests/data/eessi_api_metadata_software.json new file mode 100644 index 0000000000..6864a24939 --- /dev/null +++ b/scripts/available_software/tests/data/eessi_api_metadata_software.json @@ -0,0 +1,3082 @@ +{ + "timestamp": "2026-03-18T02:15:12.970204Z", + "architectures_map": { + "2023.06": { + "aarch64/generic": "aarch64/generic", + "aarch64/a64fx": "aarch64/a64fx", + "aarch64/neoverse_n1": "aarch64/neoverse_n1", + "aarch64/neoverse_v1": "aarch64/neoverse_v1", + "aarch64/nvidia/grace": "aarch64/nvidia/grace", + "x86_64/generic": "x86_64/generic", + "x86_64/amd/zen2": "x86_64/amd/zen2", + "x86_64/amd/zen3": "x86_64/amd/zen3", + "x86_64/amd/zen4": "x86_64/amd/zen4", + "x86_64/intel/haswell": "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512": "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids": "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake": "x86_64/intel/icelake", + "x86_64/intel/cascadelake": "x86_64/intel/cascadelake" + }, + "2025.06": { + "aarch64/generic": "aarch64/generic", + "aarch64/a64fx": "aarch64/a64fx", + "aarch64/neoverse_n1": "aarch64/neoverse_n1", + "aarch64/neoverse_v1": "aarch64/neoverse_v1", + "aarch64/nvidia/grace": "aarch64/nvidia/grace", + "x86_64/generic": "x86_64/generic", + "x86_64/amd/zen2": "x86_64/amd/zen2", + "x86_64/amd/zen3": "x86_64/amd/zen3", + "x86_64/amd/zen4": "x86_64/amd/zen4", + "x86_64/intel/haswell": "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512": "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids": "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake": "x86_64/intel/icelake", + "x86_64/intel/cascadelake": "x86_64/intel/cascadelake" + } + }, + "gpu_architectures_map": {}, + "category_details": {}, + "software": { + "CUDA-Samples": { + "versions": [ + { + "homepage": "https://github.com/NVIDIA/cuda-samples", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "GCC", + "version": "12.3.0" + }, + "toolchain_families_compatibility": [ + "2023a_foss" + ], + "module": { + "full_module_name": "CUDA-Samples/12.1-GCC-12.3.0-CUDA-12.1.1", + "module_name": "CUDA-Samples", + "module_version": "12.1-GCC-12.3.0-CUDA-12.1.1" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2023.06", + "module_name": "EESSI", + "module_version": "2023.06" + }, + { + "full_module_name": "GCCcore/12.3.0", + "module_name": "GCCcore", + "module_version": "12.3.0" + }, + { + "full_module_name": "GCC/12.3.0", + "module_name": "GCC", + "module_version": "12.3.0" + }, + { + "full_module_name": "CUDA-Samples/12.1-GCC-12.3.0-CUDA-12.1.1", + "module_name": "CUDA-Samples", + "module_version": "12.1-GCC-12.3.0-CUDA-12.1.1" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": { + "aarch64/generic": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "aarch64/neoverse_n1": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "aarch64/neoverse_v1": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "aarch64/nvidia/grace": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/generic": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/amd/zen2": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/amd/zen3": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/amd/zen4": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/intel/haswell": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/intel/skylake_avx512": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/intel/sapphirerapids": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/intel/icelake": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/intel/cascadelake": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ] + }, + "description": "Samples for CUDA Developers which demonstrates features in CUDA Toolkit", + "version": "12.1", + "versionsuffix": "-CUDA-12.1.1", + "extensions": [] + } + ], + "homepage": "https://github.com/NVIDIA/cuda-samples", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "description": "Samples for CUDA Developers which demonstrates features in CUDA Toolkit" + }, + "ESPResSo": { + "versions": [ + { + "homepage": "https://espressomd.org/wordpress", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "foss", + "version": "2023a" + }, + "toolchain_families_compatibility": [ + "2023a_foss" + ], + "module": { + "full_module_name": "ESPResSo/4.2.2-foss-2023a-CUDA-12.1.1", + "module_name": "ESPResSo", + "module_version": "4.2.2-foss-2023a-CUDA-12.1.1" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2023.06", + "module_name": "EESSI", + "module_version": "2023.06" + }, + { + "full_module_name": "GCCcore/12.3.0", + "module_name": "GCCcore", + "module_version": "12.3.0" + }, + { + "full_module_name": "GCC/12.3.0", + "module_name": "GCC", + "module_version": "12.3.0" + }, + { + "full_module_name": "numactl/2.0.16-GCCcore-12.3.0", + "module_name": "numactl", + "module_version": "2.0.16-GCCcore-12.3.0" + }, + { + "full_module_name": "libxml2/2.11.4-GCCcore-12.3.0", + "module_name": "libxml2", + "module_version": "2.11.4-GCCcore-12.3.0" + }, + { + "full_module_name": "libpciaccess/0.17-GCCcore-12.3.0", + "module_name": "libpciaccess", + "module_version": "0.17-GCCcore-12.3.0" + }, + { + "full_module_name": "hwloc/2.9.1-GCCcore-12.3.0", + "module_name": "hwloc", + "module_version": "2.9.1-GCCcore-12.3.0" + }, + { + "full_module_name": "OpenSSL/1.1", + "module_name": "OpenSSL", + "module_version": "1.1" + }, + { + "full_module_name": "libevent/2.1.12-GCCcore-12.3.0", + "module_name": "libevent", + "module_version": "2.1.12-GCCcore-12.3.0" + }, + { + "full_module_name": "UCX/1.14.1-GCCcore-12.3.0", + "module_name": "UCX", + "module_version": "1.14.1-GCCcore-12.3.0" + }, + { + "full_module_name": "libfabric/1.18.0-GCCcore-12.3.0", + "module_name": "libfabric", + "module_version": "1.18.0-GCCcore-12.3.0" + }, + { + "full_module_name": "PMIx/4.2.4-GCCcore-12.3.0", + "module_name": "PMIx", + "module_version": "4.2.4-GCCcore-12.3.0" + }, + { + "full_module_name": "UCC/1.2.0-GCCcore-12.3.0", + "module_name": "UCC", + "module_version": "1.2.0-GCCcore-12.3.0" + }, + { + "full_module_name": "OpenMPI/4.1.5-GCC-12.3.0", + "module_name": "OpenMPI", + "module_version": "4.1.5-GCC-12.3.0" + }, + { + "full_module_name": "OpenBLAS/0.3.23-GCC-12.3.0", + "module_name": "OpenBLAS", + "module_version": "0.3.23-GCC-12.3.0" + }, + { + "full_module_name": "FlexiBLAS/3.3.1-GCC-12.3.0", + "module_name": "FlexiBLAS", + "module_version": "3.3.1-GCC-12.3.0" + }, + { + "full_module_name": "FFTW/3.3.10-GCC-12.3.0", + "module_name": "FFTW", + "module_version": "3.3.10-GCC-12.3.0" + }, + { + "full_module_name": "gompi/2023a", + "module_name": "gompi", + "module_version": "2023a" + }, + { + "full_module_name": "FFTW.MPI/3.3.10-gompi-2023a", + "module_name": "FFTW.MPI", + "module_version": "3.3.10-gompi-2023a" + }, + { + "full_module_name": "ScaLAPACK/2.2.0-gompi-2023a-fb", + "module_name": "ScaLAPACK", + "module_version": "2.2.0-gompi-2023a-fb" + }, + { + "full_module_name": "foss/2023a", + "module_name": "foss", + "module_version": "2023a" + }, + { + "full_module_name": "Tcl/8.6.13-GCCcore-12.3.0", + "module_name": "Tcl", + "module_version": "8.6.13-GCCcore-12.3.0" + }, + { + "full_module_name": "SQLite/3.42.0-GCCcore-12.3.0", + "module_name": "SQLite", + "module_version": "3.42.0-GCCcore-12.3.0" + }, + { + "full_module_name": "libffi/3.4.4-GCCcore-12.3.0", + "module_name": "libffi", + "module_version": "3.4.4-GCCcore-12.3.0" + }, + { + "full_module_name": "Python/3.11.3-GCCcore-12.3.0", + "module_name": "Python", + "module_version": "3.11.3-GCCcore-12.3.0" + }, + { + "full_module_name": "gfbf/2023a", + "module_name": "gfbf", + "module_version": "2023a" + }, + { + "full_module_name": "cffi/1.15.1-GCCcore-12.3.0", + "module_name": "cffi", + "module_version": "1.15.1-GCCcore-12.3.0" + }, + { + "full_module_name": "cryptography/41.0.1-GCCcore-12.3.0", + "module_name": "cryptography", + "module_version": "41.0.1-GCCcore-12.3.0" + }, + { + "full_module_name": "virtualenv/20.23.1-GCCcore-12.3.0", + "module_name": "virtualenv", + "module_version": "20.23.1-GCCcore-12.3.0" + }, + { + "full_module_name": "Python-bundle-PyPI/2023.06-GCCcore-12.3.0", + "module_name": "Python-bundle-PyPI", + "module_version": "2023.06-GCCcore-12.3.0" + }, + { + "full_module_name": "pybind11/2.11.1-GCCcore-12.3.0", + "module_name": "pybind11", + "module_version": "2.11.1-GCCcore-12.3.0" + }, + { + "full_module_name": "SciPy-bundle/2023.07-gfbf-2023a", + "module_name": "SciPy-bundle", + "module_version": "2023.07-gfbf-2023a" + }, + { + "full_module_name": "gzip/1.12-GCCcore-12.3.0", + "module_name": "gzip", + "module_version": "1.12-GCCcore-12.3.0" + }, + { + "full_module_name": "lz4/1.9.4-GCCcore-12.3.0", + "module_name": "lz4", + "module_version": "1.9.4-GCCcore-12.3.0" + }, + { + "full_module_name": "zstd/1.5.5-GCCcore-12.3.0", + "module_name": "zstd", + "module_version": "1.5.5-GCCcore-12.3.0" + }, + { + "full_module_name": "ICU/73.2-GCCcore-12.3.0", + "module_name": "ICU", + "module_version": "73.2-GCCcore-12.3.0" + }, + { + "full_module_name": "Boost.MPI/1.82.0-gompi-2023a", + "module_name": "Boost.MPI", + "module_version": "1.82.0-gompi-2023a" + }, + { + "full_module_name": "Szip/2.1.1-GCCcore-12.3.0", + "module_name": "Szip", + "module_version": "2.1.1-GCCcore-12.3.0" + }, + { + "full_module_name": "HDF5/1.14.0-gompi-2023a", + "module_name": "HDF5", + "module_version": "1.14.0-gompi-2023a" + }, + { + "full_module_name": "expat/2.5.0-GCCcore-12.3.0", + "module_name": "expat", + "module_version": "2.5.0-GCCcore-12.3.0" + }, + { + "full_module_name": "libpng/1.6.39-GCCcore-12.3.0", + "module_name": "libpng", + "module_version": "1.6.39-GCCcore-12.3.0" + }, + { + "full_module_name": "Brotli/1.0.9-GCCcore-12.3.0", + "module_name": "Brotli", + "module_version": "1.0.9-GCCcore-12.3.0" + }, + { + "full_module_name": "freetype/2.13.0-GCCcore-12.3.0", + "module_name": "freetype", + "module_version": "2.13.0-GCCcore-12.3.0" + }, + { + "full_module_name": "fontconfig/2.14.2-GCCcore-12.3.0", + "module_name": "fontconfig", + "module_version": "2.14.2-GCCcore-12.3.0" + }, + { + "full_module_name": "xorg-macros/1.20.0-GCCcore-12.3.0", + "module_name": "xorg-macros", + "module_version": "1.20.0-GCCcore-12.3.0" + }, + { + "full_module_name": "X11/20230603-GCCcore-12.3.0", + "module_name": "X11", + "module_version": "20230603-GCCcore-12.3.0" + }, + { + "full_module_name": "libdrm/2.4.115-GCCcore-12.3.0", + "module_name": "libdrm", + "module_version": "2.4.115-GCCcore-12.3.0" + }, + { + "full_module_name": "libglvnd/1.6.0-GCCcore-12.3.0", + "module_name": "libglvnd", + "module_version": "1.6.0-GCCcore-12.3.0" + }, + { + "full_module_name": "libunwind/1.6.2-GCCcore-12.3.0", + "module_name": "libunwind", + "module_version": "1.6.2-GCCcore-12.3.0" + }, + { + "full_module_name": "LLVM/16.0.6-GCCcore-12.3.0", + "module_name": "LLVM", + "module_version": "16.0.6-GCCcore-12.3.0" + }, + { + "full_module_name": "Mesa/23.1.4-GCCcore-12.3.0", + "module_name": "Mesa", + "module_version": "23.1.4-GCCcore-12.3.0" + }, + { + "full_module_name": "GSL/2.7-GCC-12.3.0", + "module_name": "GSL", + "module_version": "2.7-GCC-12.3.0" + }, + { + "full_module_name": "OpenPGM/5.2.122-GCCcore-12.3.0", + "module_name": "OpenPGM", + "module_version": "5.2.122-GCCcore-12.3.0" + }, + { + "full_module_name": "libsodium/1.0.18-GCCcore-12.3.0", + "module_name": "libsodium", + "module_version": "1.0.18-GCCcore-12.3.0" + }, + { + "full_module_name": "ZeroMQ/4.3.4-GCCcore-12.3.0", + "module_name": "ZeroMQ", + "module_version": "4.3.4-GCCcore-12.3.0" + }, + { + "full_module_name": "libxslt/1.1.38-GCCcore-12.3.0", + "module_name": "libxslt", + "module_version": "1.1.38-GCCcore-12.3.0" + }, + { + "full_module_name": "lxml/4.9.2-GCCcore-12.3.0", + "module_name": "lxml", + "module_version": "4.9.2-GCCcore-12.3.0" + }, + { + "full_module_name": "hatchling/1.18.0-GCCcore-12.3.0", + "module_name": "hatchling", + "module_version": "1.18.0-GCCcore-12.3.0" + }, + { + "full_module_name": "BeautifulSoup/4.12.2-GCCcore-12.3.0", + "module_name": "BeautifulSoup", + "module_version": "4.12.2-GCCcore-12.3.0" + }, + { + "full_module_name": "IPython/8.14.0-GCCcore-12.3.0", + "module_name": "IPython", + "module_version": "8.14.0-GCCcore-12.3.0" + }, + { + "full_module_name": "typing-extensions/4.9.0-GCCcore-12.3.0", + "module_name": "typing-extensions", + "module_version": "4.9.0-GCCcore-12.3.0" + }, + { + "full_module_name": "Pint/0.23-GCCcore-12.3.0", + "module_name": "Pint", + "module_version": "0.23-GCCcore-12.3.0" + }, + { + "full_module_name": "ESPResSo/4.2.2-foss-2023a-CUDA-12.1.1", + "module_name": "ESPResSo", + "module_version": "4.2.2-foss-2023a-CUDA-12.1.1" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": { + "aarch64/generic": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "aarch64/neoverse_n1": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "aarch64/neoverse_v1": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "aarch64/nvidia/grace": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/generic": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/amd/zen2": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/amd/zen3": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/amd/zen4": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/intel/haswell": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/intel/skylake_avx512": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/intel/sapphirerapids": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/intel/icelake": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/intel/cascadelake": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ] + }, + "description": "A software package for performing and analyzing scientific Molecular Dynamics simulations.", + "version": "4.2.2", + "versionsuffix": "-CUDA-12.1.1", + "extensions": [] + }, + { + "homepage": "https://espressomd.org/wordpress", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "foss", + "version": "2023a" + }, + "toolchain_families_compatibility": [ + "2023a_foss" + ], + "module": { + "full_module_name": "ESPResSo/4.2.1-foss-2023a", + "module_name": "ESPResSo", + "module_version": "4.2.1-foss-2023a" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2023.06", + "module_name": "EESSI", + "module_version": "2023.06" + }, + { + "full_module_name": "GCCcore/12.3.0", + "module_name": "GCCcore", + "module_version": "12.3.0" + }, + { + "full_module_name": "GCC/12.3.0", + "module_name": "GCC", + "module_version": "12.3.0" + }, + { + "full_module_name": "numactl/2.0.16-GCCcore-12.3.0", + "module_name": "numactl", + "module_version": "2.0.16-GCCcore-12.3.0" + }, + { + "full_module_name": "libxml2/2.11.4-GCCcore-12.3.0", + "module_name": "libxml2", + "module_version": "2.11.4-GCCcore-12.3.0" + }, + { + "full_module_name": "libpciaccess/0.17-GCCcore-12.3.0", + "module_name": "libpciaccess", + "module_version": "0.17-GCCcore-12.3.0" + }, + { + "full_module_name": "hwloc/2.9.1-GCCcore-12.3.0", + "module_name": "hwloc", + "module_version": "2.9.1-GCCcore-12.3.0" + }, + { + "full_module_name": "OpenSSL/1.1", + "module_name": "OpenSSL", + "module_version": "1.1" + }, + { + "full_module_name": "libevent/2.1.12-GCCcore-12.3.0", + "module_name": "libevent", + "module_version": "2.1.12-GCCcore-12.3.0" + }, + { + "full_module_name": "UCX/1.14.1-GCCcore-12.3.0", + "module_name": "UCX", + "module_version": "1.14.1-GCCcore-12.3.0" + }, + { + "full_module_name": "libfabric/1.18.0-GCCcore-12.3.0", + "module_name": "libfabric", + "module_version": "1.18.0-GCCcore-12.3.0" + }, + { + "full_module_name": "PMIx/4.2.4-GCCcore-12.3.0", + "module_name": "PMIx", + "module_version": "4.2.4-GCCcore-12.3.0" + }, + { + "full_module_name": "UCC/1.2.0-GCCcore-12.3.0", + "module_name": "UCC", + "module_version": "1.2.0-GCCcore-12.3.0" + }, + { + "full_module_name": "OpenMPI/4.1.5-GCC-12.3.0", + "module_name": "OpenMPI", + "module_version": "4.1.5-GCC-12.3.0" + }, + { + "full_module_name": "OpenBLAS/0.3.23-GCC-12.3.0", + "module_name": "OpenBLAS", + "module_version": "0.3.23-GCC-12.3.0" + }, + { + "full_module_name": "FlexiBLAS/3.3.1-GCC-12.3.0", + "module_name": "FlexiBLAS", + "module_version": "3.3.1-GCC-12.3.0" + }, + { + "full_module_name": "FFTW/3.3.10-GCC-12.3.0", + "module_name": "FFTW", + "module_version": "3.3.10-GCC-12.3.0" + }, + { + "full_module_name": "gompi/2023a", + "module_name": "gompi", + "module_version": "2023a" + }, + { + "full_module_name": "FFTW.MPI/3.3.10-gompi-2023a", + "module_name": "FFTW.MPI", + "module_version": "3.3.10-gompi-2023a" + }, + { + "full_module_name": "ScaLAPACK/2.2.0-gompi-2023a-fb", + "module_name": "ScaLAPACK", + "module_version": "2.2.0-gompi-2023a-fb" + }, + { + "full_module_name": "foss/2023a", + "module_name": "foss", + "module_version": "2023a" + }, + { + "full_module_name": "Tcl/8.6.13-GCCcore-12.3.0", + "module_name": "Tcl", + "module_version": "8.6.13-GCCcore-12.3.0" + }, + { + "full_module_name": "SQLite/3.42.0-GCCcore-12.3.0", + "module_name": "SQLite", + "module_version": "3.42.0-GCCcore-12.3.0" + }, + { + "full_module_name": "libffi/3.4.4-GCCcore-12.3.0", + "module_name": "libffi", + "module_version": "3.4.4-GCCcore-12.3.0" + }, + { + "full_module_name": "Python/3.11.3-GCCcore-12.3.0", + "module_name": "Python", + "module_version": "3.11.3-GCCcore-12.3.0" + }, + { + "full_module_name": "gfbf/2023a", + "module_name": "gfbf", + "module_version": "2023a" + }, + { + "full_module_name": "cffi/1.15.1-GCCcore-12.3.0", + "module_name": "cffi", + "module_version": "1.15.1-GCCcore-12.3.0" + }, + { + "full_module_name": "cryptography/41.0.1-GCCcore-12.3.0", + "module_name": "cryptography", + "module_version": "41.0.1-GCCcore-12.3.0" + }, + { + "full_module_name": "virtualenv/20.23.1-GCCcore-12.3.0", + "module_name": "virtualenv", + "module_version": "20.23.1-GCCcore-12.3.0" + }, + { + "full_module_name": "Python-bundle-PyPI/2023.06-GCCcore-12.3.0", + "module_name": "Python-bundle-PyPI", + "module_version": "2023.06-GCCcore-12.3.0" + }, + { + "full_module_name": "pybind11/2.11.1-GCCcore-12.3.0", + "module_name": "pybind11", + "module_version": "2.11.1-GCCcore-12.3.0" + }, + { + "full_module_name": "SciPy-bundle/2023.07-gfbf-2023a", + "module_name": "SciPy-bundle", + "module_version": "2023.07-gfbf-2023a" + }, + { + "full_module_name": "gzip/1.12-GCCcore-12.3.0", + "module_name": "gzip", + "module_version": "1.12-GCCcore-12.3.0" + }, + { + "full_module_name": "lz4/1.9.4-GCCcore-12.3.0", + "module_name": "lz4", + "module_version": "1.9.4-GCCcore-12.3.0" + }, + { + "full_module_name": "zstd/1.5.5-GCCcore-12.3.0", + "module_name": "zstd", + "module_version": "1.5.5-GCCcore-12.3.0" + }, + { + "full_module_name": "ICU/73.2-GCCcore-12.3.0", + "module_name": "ICU", + "module_version": "73.2-GCCcore-12.3.0" + }, + { + "full_module_name": "Boost.MPI/1.82.0-gompi-2023a", + "module_name": "Boost.MPI", + "module_version": "1.82.0-gompi-2023a" + }, + { + "full_module_name": "Szip/2.1.1-GCCcore-12.3.0", + "module_name": "Szip", + "module_version": "2.1.1-GCCcore-12.3.0" + }, + { + "full_module_name": "HDF5/1.14.0-gompi-2023a", + "module_name": "HDF5", + "module_version": "1.14.0-gompi-2023a" + }, + { + "full_module_name": "expat/2.5.0-GCCcore-12.3.0", + "module_name": "expat", + "module_version": "2.5.0-GCCcore-12.3.0" + }, + { + "full_module_name": "libpng/1.6.39-GCCcore-12.3.0", + "module_name": "libpng", + "module_version": "1.6.39-GCCcore-12.3.0" + }, + { + "full_module_name": "Brotli/1.0.9-GCCcore-12.3.0", + "module_name": "Brotli", + "module_version": "1.0.9-GCCcore-12.3.0" + }, + { + "full_module_name": "freetype/2.13.0-GCCcore-12.3.0", + "module_name": "freetype", + "module_version": "2.13.0-GCCcore-12.3.0" + }, + { + "full_module_name": "fontconfig/2.14.2-GCCcore-12.3.0", + "module_name": "fontconfig", + "module_version": "2.14.2-GCCcore-12.3.0" + }, + { + "full_module_name": "xorg-macros/1.20.0-GCCcore-12.3.0", + "module_name": "xorg-macros", + "module_version": "1.20.0-GCCcore-12.3.0" + }, + { + "full_module_name": "X11/20230603-GCCcore-12.3.0", + "module_name": "X11", + "module_version": "20230603-GCCcore-12.3.0" + }, + { + "full_module_name": "libdrm/2.4.115-GCCcore-12.3.0", + "module_name": "libdrm", + "module_version": "2.4.115-GCCcore-12.3.0" + }, + { + "full_module_name": "libglvnd/1.6.0-GCCcore-12.3.0", + "module_name": "libglvnd", + "module_version": "1.6.0-GCCcore-12.3.0" + }, + { + "full_module_name": "libunwind/1.6.2-GCCcore-12.3.0", + "module_name": "libunwind", + "module_version": "1.6.2-GCCcore-12.3.0" + }, + { + "full_module_name": "LLVM/16.0.6-GCCcore-12.3.0", + "module_name": "LLVM", + "module_version": "16.0.6-GCCcore-12.3.0" + }, + { + "full_module_name": "Mesa/23.1.4-GCCcore-12.3.0", + "module_name": "Mesa", + "module_version": "23.1.4-GCCcore-12.3.0" + }, + { + "full_module_name": "GSL/2.7-GCC-12.3.0", + "module_name": "GSL", + "module_version": "2.7-GCC-12.3.0" + }, + { + "full_module_name": "OpenPGM/5.2.122-GCCcore-12.3.0", + "module_name": "OpenPGM", + "module_version": "5.2.122-GCCcore-12.3.0" + }, + { + "full_module_name": "libsodium/1.0.18-GCCcore-12.3.0", + "module_name": "libsodium", + "module_version": "1.0.18-GCCcore-12.3.0" + }, + { + "full_module_name": "ZeroMQ/4.3.4-GCCcore-12.3.0", + "module_name": "ZeroMQ", + "module_version": "4.3.4-GCCcore-12.3.0" + }, + { + "full_module_name": "libxslt/1.1.38-GCCcore-12.3.0", + "module_name": "libxslt", + "module_version": "1.1.38-GCCcore-12.3.0" + }, + { + "full_module_name": "lxml/4.9.2-GCCcore-12.3.0", + "module_name": "lxml", + "module_version": "4.9.2-GCCcore-12.3.0" + }, + { + "full_module_name": "hatchling/1.18.0-GCCcore-12.3.0", + "module_name": "hatchling", + "module_version": "1.18.0-GCCcore-12.3.0" + }, + { + "full_module_name": "BeautifulSoup/4.12.2-GCCcore-12.3.0", + "module_name": "BeautifulSoup", + "module_version": "4.12.2-GCCcore-12.3.0" + }, + { + "full_module_name": "IPython/8.14.0-GCCcore-12.3.0", + "module_name": "IPython", + "module_version": "8.14.0-GCCcore-12.3.0" + }, + { + "full_module_name": "typing-extensions/4.9.0-GCCcore-12.3.0", + "module_name": "typing-extensions", + "module_version": "4.9.0-GCCcore-12.3.0" + }, + { + "full_module_name": "Pint/0.23-GCCcore-12.3.0", + "module_name": "Pint", + "module_version": "0.23-GCCcore-12.3.0" + }, + { + "full_module_name": "ESPResSo/4.2.1-foss-2023a", + "module_name": "ESPResSo", + "module_version": "4.2.1-foss-2023a" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "A software package for performing and analyzing scientific Molecular Dynamics simulations.", + "version": "4.2.1", + "versionsuffix": "", + "extensions": [] + }, + { + "homepage": "https://espressomd.org/wordpress", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "foss", + "version": "2023a" + }, + "toolchain_families_compatibility": [ + "2023a_foss" + ], + "module": { + "full_module_name": "ESPResSo/4.2.2-foss-2023a", + "module_name": "ESPResSo", + "module_version": "4.2.2-foss-2023a" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2023.06", + "module_name": "EESSI", + "module_version": "2023.06" + }, + { + "full_module_name": "GCCcore/12.3.0", + "module_name": "GCCcore", + "module_version": "12.3.0" + }, + { + "full_module_name": "GCC/12.3.0", + "module_name": "GCC", + "module_version": "12.3.0" + }, + { + "full_module_name": "numactl/2.0.16-GCCcore-12.3.0", + "module_name": "numactl", + "module_version": "2.0.16-GCCcore-12.3.0" + }, + { + "full_module_name": "libxml2/2.11.4-GCCcore-12.3.0", + "module_name": "libxml2", + "module_version": "2.11.4-GCCcore-12.3.0" + }, + { + "full_module_name": "libpciaccess/0.17-GCCcore-12.3.0", + "module_name": "libpciaccess", + "module_version": "0.17-GCCcore-12.3.0" + }, + { + "full_module_name": "hwloc/2.9.1-GCCcore-12.3.0", + "module_name": "hwloc", + "module_version": "2.9.1-GCCcore-12.3.0" + }, + { + "full_module_name": "OpenSSL/1.1", + "module_name": "OpenSSL", + "module_version": "1.1" + }, + { + "full_module_name": "libevent/2.1.12-GCCcore-12.3.0", + "module_name": "libevent", + "module_version": "2.1.12-GCCcore-12.3.0" + }, + { + "full_module_name": "UCX/1.14.1-GCCcore-12.3.0", + "module_name": "UCX", + "module_version": "1.14.1-GCCcore-12.3.0" + }, + { + "full_module_name": "libfabric/1.18.0-GCCcore-12.3.0", + "module_name": "libfabric", + "module_version": "1.18.0-GCCcore-12.3.0" + }, + { + "full_module_name": "PMIx/4.2.4-GCCcore-12.3.0", + "module_name": "PMIx", + "module_version": "4.2.4-GCCcore-12.3.0" + }, + { + "full_module_name": "UCC/1.2.0-GCCcore-12.3.0", + "module_name": "UCC", + "module_version": "1.2.0-GCCcore-12.3.0" + }, + { + "full_module_name": "OpenMPI/4.1.5-GCC-12.3.0", + "module_name": "OpenMPI", + "module_version": "4.1.5-GCC-12.3.0" + }, + { + "full_module_name": "OpenBLAS/0.3.23-GCC-12.3.0", + "module_name": "OpenBLAS", + "module_version": "0.3.23-GCC-12.3.0" + }, + { + "full_module_name": "FlexiBLAS/3.3.1-GCC-12.3.0", + "module_name": "FlexiBLAS", + "module_version": "3.3.1-GCC-12.3.0" + }, + { + "full_module_name": "FFTW/3.3.10-GCC-12.3.0", + "module_name": "FFTW", + "module_version": "3.3.10-GCC-12.3.0" + }, + { + "full_module_name": "gompi/2023a", + "module_name": "gompi", + "module_version": "2023a" + }, + { + "full_module_name": "FFTW.MPI/3.3.10-gompi-2023a", + "module_name": "FFTW.MPI", + "module_version": "3.3.10-gompi-2023a" + }, + { + "full_module_name": "ScaLAPACK/2.2.0-gompi-2023a-fb", + "module_name": "ScaLAPACK", + "module_version": "2.2.0-gompi-2023a-fb" + }, + { + "full_module_name": "foss/2023a", + "module_name": "foss", + "module_version": "2023a" + }, + { + "full_module_name": "Tcl/8.6.13-GCCcore-12.3.0", + "module_name": "Tcl", + "module_version": "8.6.13-GCCcore-12.3.0" + }, + { + "full_module_name": "SQLite/3.42.0-GCCcore-12.3.0", + "module_name": "SQLite", + "module_version": "3.42.0-GCCcore-12.3.0" + }, + { + "full_module_name": "libffi/3.4.4-GCCcore-12.3.0", + "module_name": "libffi", + "module_version": "3.4.4-GCCcore-12.3.0" + }, + { + "full_module_name": "Python/3.11.3-GCCcore-12.3.0", + "module_name": "Python", + "module_version": "3.11.3-GCCcore-12.3.0" + }, + { + "full_module_name": "gfbf/2023a", + "module_name": "gfbf", + "module_version": "2023a" + }, + { + "full_module_name": "cffi/1.15.1-GCCcore-12.3.0", + "module_name": "cffi", + "module_version": "1.15.1-GCCcore-12.3.0" + }, + { + "full_module_name": "cryptography/41.0.1-GCCcore-12.3.0", + "module_name": "cryptography", + "module_version": "41.0.1-GCCcore-12.3.0" + }, + { + "full_module_name": "virtualenv/20.23.1-GCCcore-12.3.0", + "module_name": "virtualenv", + "module_version": "20.23.1-GCCcore-12.3.0" + }, + { + "full_module_name": "Python-bundle-PyPI/2023.06-GCCcore-12.3.0", + "module_name": "Python-bundle-PyPI", + "module_version": "2023.06-GCCcore-12.3.0" + }, + { + "full_module_name": "pybind11/2.11.1-GCCcore-12.3.0", + "module_name": "pybind11", + "module_version": "2.11.1-GCCcore-12.3.0" + }, + { + "full_module_name": "SciPy-bundle/2023.07-gfbf-2023a", + "module_name": "SciPy-bundle", + "module_version": "2023.07-gfbf-2023a" + }, + { + "full_module_name": "gzip/1.12-GCCcore-12.3.0", + "module_name": "gzip", + "module_version": "1.12-GCCcore-12.3.0" + }, + { + "full_module_name": "lz4/1.9.4-GCCcore-12.3.0", + "module_name": "lz4", + "module_version": "1.9.4-GCCcore-12.3.0" + }, + { + "full_module_name": "zstd/1.5.5-GCCcore-12.3.0", + "module_name": "zstd", + "module_version": "1.5.5-GCCcore-12.3.0" + }, + { + "full_module_name": "ICU/73.2-GCCcore-12.3.0", + "module_name": "ICU", + "module_version": "73.2-GCCcore-12.3.0" + }, + { + "full_module_name": "Boost.MPI/1.82.0-gompi-2023a", + "module_name": "Boost.MPI", + "module_version": "1.82.0-gompi-2023a" + }, + { + "full_module_name": "Szip/2.1.1-GCCcore-12.3.0", + "module_name": "Szip", + "module_version": "2.1.1-GCCcore-12.3.0" + }, + { + "full_module_name": "HDF5/1.14.0-gompi-2023a", + "module_name": "HDF5", + "module_version": "1.14.0-gompi-2023a" + }, + { + "full_module_name": "expat/2.5.0-GCCcore-12.3.0", + "module_name": "expat", + "module_version": "2.5.0-GCCcore-12.3.0" + }, + { + "full_module_name": "libpng/1.6.39-GCCcore-12.3.0", + "module_name": "libpng", + "module_version": "1.6.39-GCCcore-12.3.0" + }, + { + "full_module_name": "Brotli/1.0.9-GCCcore-12.3.0", + "module_name": "Brotli", + "module_version": "1.0.9-GCCcore-12.3.0" + }, + { + "full_module_name": "freetype/2.13.0-GCCcore-12.3.0", + "module_name": "freetype", + "module_version": "2.13.0-GCCcore-12.3.0" + }, + { + "full_module_name": "fontconfig/2.14.2-GCCcore-12.3.0", + "module_name": "fontconfig", + "module_version": "2.14.2-GCCcore-12.3.0" + }, + { + "full_module_name": "xorg-macros/1.20.0-GCCcore-12.3.0", + "module_name": "xorg-macros", + "module_version": "1.20.0-GCCcore-12.3.0" + }, + { + "full_module_name": "X11/20230603-GCCcore-12.3.0", + "module_name": "X11", + "module_version": "20230603-GCCcore-12.3.0" + }, + { + "full_module_name": "libdrm/2.4.115-GCCcore-12.3.0", + "module_name": "libdrm", + "module_version": "2.4.115-GCCcore-12.3.0" + }, + { + "full_module_name": "libglvnd/1.6.0-GCCcore-12.3.0", + "module_name": "libglvnd", + "module_version": "1.6.0-GCCcore-12.3.0" + }, + { + "full_module_name": "libunwind/1.6.2-GCCcore-12.3.0", + "module_name": "libunwind", + "module_version": "1.6.2-GCCcore-12.3.0" + }, + { + "full_module_name": "LLVM/16.0.6-GCCcore-12.3.0", + "module_name": "LLVM", + "module_version": "16.0.6-GCCcore-12.3.0" + }, + { + "full_module_name": "Mesa/23.1.4-GCCcore-12.3.0", + "module_name": "Mesa", + "module_version": "23.1.4-GCCcore-12.3.0" + }, + { + "full_module_name": "GSL/2.7-GCC-12.3.0", + "module_name": "GSL", + "module_version": "2.7-GCC-12.3.0" + }, + { + "full_module_name": "OpenPGM/5.2.122-GCCcore-12.3.0", + "module_name": "OpenPGM", + "module_version": "5.2.122-GCCcore-12.3.0" + }, + { + "full_module_name": "libsodium/1.0.18-GCCcore-12.3.0", + "module_name": "libsodium", + "module_version": "1.0.18-GCCcore-12.3.0" + }, + { + "full_module_name": "ZeroMQ/4.3.4-GCCcore-12.3.0", + "module_name": "ZeroMQ", + "module_version": "4.3.4-GCCcore-12.3.0" + }, + { + "full_module_name": "libxslt/1.1.38-GCCcore-12.3.0", + "module_name": "libxslt", + "module_version": "1.1.38-GCCcore-12.3.0" + }, + { + "full_module_name": "lxml/4.9.2-GCCcore-12.3.0", + "module_name": "lxml", + "module_version": "4.9.2-GCCcore-12.3.0" + }, + { + "full_module_name": "hatchling/1.18.0-GCCcore-12.3.0", + "module_name": "hatchling", + "module_version": "1.18.0-GCCcore-12.3.0" + }, + { + "full_module_name": "BeautifulSoup/4.12.2-GCCcore-12.3.0", + "module_name": "BeautifulSoup", + "module_version": "4.12.2-GCCcore-12.3.0" + }, + { + "full_module_name": "IPython/8.14.0-GCCcore-12.3.0", + "module_name": "IPython", + "module_version": "8.14.0-GCCcore-12.3.0" + }, + { + "full_module_name": "typing-extensions/4.9.0-GCCcore-12.3.0", + "module_name": "typing-extensions", + "module_version": "4.9.0-GCCcore-12.3.0" + }, + { + "full_module_name": "Pint/0.23-GCCcore-12.3.0", + "module_name": "Pint", + "module_version": "0.23-GCCcore-12.3.0" + }, + { + "full_module_name": "ESPResSo/4.2.2-foss-2023a", + "module_name": "ESPResSo", + "module_version": "4.2.2-foss-2023a" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "A software package for performing and analyzing scientific Molecular Dynamics simulations.", + "version": "4.2.2", + "versionsuffix": "", + "extensions": [] + }, + { + "homepage": "https://espressomd.org/wordpress", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "foss", + "version": "2023b" + }, + "toolchain_families_compatibility": [ + "2023b_foss" + ], + "module": { + "full_module_name": "ESPResSo/4.2.2-foss-2023b", + "module_name": "ESPResSo", + "module_version": "4.2.2-foss-2023b" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2023.06", + "module_name": "EESSI", + "module_version": "2023.06" + }, + { + "full_module_name": "GCCcore/13.2.0", + "module_name": "GCCcore", + "module_version": "13.2.0" + }, + { + "full_module_name": "GCC/13.2.0", + "module_name": "GCC", + "module_version": "13.2.0" + }, + { + "full_module_name": "numactl/2.0.16-GCCcore-13.2.0", + "module_name": "numactl", + "module_version": "2.0.16-GCCcore-13.2.0" + }, + { + "full_module_name": "libxml2/2.11.5-GCCcore-13.2.0", + "module_name": "libxml2", + "module_version": "2.11.5-GCCcore-13.2.0" + }, + { + "full_module_name": "libpciaccess/0.17-GCCcore-13.2.0", + "module_name": "libpciaccess", + "module_version": "0.17-GCCcore-13.2.0" + }, + { + "full_module_name": "hwloc/2.9.2-GCCcore-13.2.0", + "module_name": "hwloc", + "module_version": "2.9.2-GCCcore-13.2.0" + }, + { + "full_module_name": "OpenSSL/1.1", + "module_name": "OpenSSL", + "module_version": "1.1" + }, + { + "full_module_name": "libevent/2.1.12-GCCcore-13.2.0", + "module_name": "libevent", + "module_version": "2.1.12-GCCcore-13.2.0" + }, + { + "full_module_name": "UCX/1.15.0-GCCcore-13.2.0", + "module_name": "UCX", + "module_version": "1.15.0-GCCcore-13.2.0" + }, + { + "full_module_name": "libfabric/1.19.0-GCCcore-13.2.0", + "module_name": "libfabric", + "module_version": "1.19.0-GCCcore-13.2.0" + }, + { + "full_module_name": "PMIx/4.2.6-GCCcore-13.2.0", + "module_name": "PMIx", + "module_version": "4.2.6-GCCcore-13.2.0" + }, + { + "full_module_name": "UCC/1.2.0-GCCcore-13.2.0", + "module_name": "UCC", + "module_version": "1.2.0-GCCcore-13.2.0" + }, + { + "full_module_name": "OpenMPI/4.1.6-GCC-13.2.0", + "module_name": "OpenMPI", + "module_version": "4.1.6-GCC-13.2.0" + }, + { + "full_module_name": "OpenBLAS/0.3.24-GCC-13.2.0", + "module_name": "OpenBLAS", + "module_version": "0.3.24-GCC-13.2.0" + }, + { + "full_module_name": "FlexiBLAS/3.3.1-GCC-13.2.0", + "module_name": "FlexiBLAS", + "module_version": "3.3.1-GCC-13.2.0" + }, + { + "full_module_name": "FFTW/3.3.10-GCC-13.2.0", + "module_name": "FFTW", + "module_version": "3.3.10-GCC-13.2.0" + }, + { + "full_module_name": "gompi/2023b", + "module_name": "gompi", + "module_version": "2023b" + }, + { + "full_module_name": "FFTW.MPI/3.3.10-gompi-2023b", + "module_name": "FFTW.MPI", + "module_version": "3.3.10-gompi-2023b" + }, + { + "full_module_name": "ScaLAPACK/2.2.0-gompi-2023b-fb", + "module_name": "ScaLAPACK", + "module_version": "2.2.0-gompi-2023b-fb" + }, + { + "full_module_name": "foss/2023b", + "module_name": "foss", + "module_version": "2023b" + }, + { + "full_module_name": "Tcl/8.6.13-GCCcore-13.2.0", + "module_name": "Tcl", + "module_version": "8.6.13-GCCcore-13.2.0" + }, + { + "full_module_name": "SQLite/3.43.1-GCCcore-13.2.0", + "module_name": "SQLite", + "module_version": "3.43.1-GCCcore-13.2.0" + }, + { + "full_module_name": "libffi/3.4.4-GCCcore-13.2.0", + "module_name": "libffi", + "module_version": "3.4.4-GCCcore-13.2.0" + }, + { + "full_module_name": "Python/3.11.5-GCCcore-13.2.0", + "module_name": "Python", + "module_version": "3.11.5-GCCcore-13.2.0" + }, + { + "full_module_name": "gfbf/2023b", + "module_name": "gfbf", + "module_version": "2023b" + }, + { + "full_module_name": "cffi/1.15.1-GCCcore-13.2.0", + "module_name": "cffi", + "module_version": "1.15.1-GCCcore-13.2.0" + }, + { + "full_module_name": "cryptography/41.0.5-GCCcore-13.2.0", + "module_name": "cryptography", + "module_version": "41.0.5-GCCcore-13.2.0" + }, + { + "full_module_name": "virtualenv/20.24.6-GCCcore-13.2.0", + "module_name": "virtualenv", + "module_version": "20.24.6-GCCcore-13.2.0" + }, + { + "full_module_name": "Python-bundle-PyPI/2023.10-GCCcore-13.2.0", + "module_name": "Python-bundle-PyPI", + "module_version": "2023.10-GCCcore-13.2.0" + }, + { + "full_module_name": "pybind11/2.11.1-GCCcore-13.2.0", + "module_name": "pybind11", + "module_version": "2.11.1-GCCcore-13.2.0" + }, + { + "full_module_name": "SciPy-bundle/2023.11-gfbf-2023b", + "module_name": "SciPy-bundle", + "module_version": "2023.11-gfbf-2023b" + }, + { + "full_module_name": "gzip/1.13-GCCcore-13.2.0", + "module_name": "gzip", + "module_version": "1.13-GCCcore-13.2.0" + }, + { + "full_module_name": "lz4/1.9.4-GCCcore-13.2.0", + "module_name": "lz4", + "module_version": "1.9.4-GCCcore-13.2.0" + }, + { + "full_module_name": "zstd/1.5.5-GCCcore-13.2.0", + "module_name": "zstd", + "module_version": "1.5.5-GCCcore-13.2.0" + }, + { + "full_module_name": "ICU/74.1-GCCcore-13.2.0", + "module_name": "ICU", + "module_version": "74.1-GCCcore-13.2.0" + }, + { + "full_module_name": "Boost.MPI/1.83.0-gompi-2023b", + "module_name": "Boost.MPI", + "module_version": "1.83.0-gompi-2023b" + }, + { + "full_module_name": "Szip/2.1.1-GCCcore-13.2.0", + "module_name": "Szip", + "module_version": "2.1.1-GCCcore-13.2.0" + }, + { + "full_module_name": "HDF5/1.14.3-gompi-2023b", + "module_name": "HDF5", + "module_version": "1.14.3-gompi-2023b" + }, + { + "full_module_name": "expat/2.5.0-GCCcore-13.2.0", + "module_name": "expat", + "module_version": "2.5.0-GCCcore-13.2.0" + }, + { + "full_module_name": "libpng/1.6.40-GCCcore-13.2.0", + "module_name": "libpng", + "module_version": "1.6.40-GCCcore-13.2.0" + }, + { + "full_module_name": "Brotli/1.1.0-GCCcore-13.2.0", + "module_name": "Brotli", + "module_version": "1.1.0-GCCcore-13.2.0" + }, + { + "full_module_name": "freetype/2.13.2-GCCcore-13.2.0", + "module_name": "freetype", + "module_version": "2.13.2-GCCcore-13.2.0" + }, + { + "full_module_name": "fontconfig/2.14.2-GCCcore-13.2.0", + "module_name": "fontconfig", + "module_version": "2.14.2-GCCcore-13.2.0" + }, + { + "full_module_name": "xorg-macros/1.20.0-GCCcore-13.2.0", + "module_name": "xorg-macros", + "module_version": "1.20.0-GCCcore-13.2.0" + }, + { + "full_module_name": "X11/20231019-GCCcore-13.2.0", + "module_name": "X11", + "module_version": "20231019-GCCcore-13.2.0" + }, + { + "full_module_name": "libdrm/2.4.117-GCCcore-13.2.0", + "module_name": "libdrm", + "module_version": "2.4.117-GCCcore-13.2.0" + }, + { + "full_module_name": "libglvnd/1.7.0-GCCcore-13.2.0", + "module_name": "libglvnd", + "module_version": "1.7.0-GCCcore-13.2.0" + }, + { + "full_module_name": "libunwind/1.6.2-GCCcore-13.2.0", + "module_name": "libunwind", + "module_version": "1.6.2-GCCcore-13.2.0" + }, + { + "full_module_name": "LLVM/16.0.6-GCCcore-13.2.0", + "module_name": "LLVM", + "module_version": "16.0.6-GCCcore-13.2.0" + }, + { + "full_module_name": "Mesa/23.1.9-GCCcore-13.2.0", + "module_name": "Mesa", + "module_version": "23.1.9-GCCcore-13.2.0" + }, + { + "full_module_name": "GSL/2.7-GCC-13.2.0", + "module_name": "GSL", + "module_version": "2.7-GCC-13.2.0" + }, + { + "full_module_name": "OpenPGM/5.2.122-GCCcore-13.2.0", + "module_name": "OpenPGM", + "module_version": "5.2.122-GCCcore-13.2.0" + }, + { + "full_module_name": "libsodium/1.0.19-GCCcore-13.2.0", + "module_name": "libsodium", + "module_version": "1.0.19-GCCcore-13.2.0" + }, + { + "full_module_name": "ZeroMQ/4.3.5-GCCcore-13.2.0", + "module_name": "ZeroMQ", + "module_version": "4.3.5-GCCcore-13.2.0" + }, + { + "full_module_name": "libxslt/1.1.38-GCCcore-13.2.0", + "module_name": "libxslt", + "module_version": "1.1.38-GCCcore-13.2.0" + }, + { + "full_module_name": "lxml/4.9.3-GCCcore-13.2.0", + "module_name": "lxml", + "module_version": "4.9.3-GCCcore-13.2.0" + }, + { + "full_module_name": "jedi/0.19.1-GCCcore-13.2.0", + "module_name": "jedi", + "module_version": "0.19.1-GCCcore-13.2.0" + }, + { + "full_module_name": "IPython/8.17.2-GCCcore-13.2.0", + "module_name": "IPython", + "module_version": "8.17.2-GCCcore-13.2.0" + }, + { + "full_module_name": "Pint/0.24-GCCcore-13.2.0", + "module_name": "Pint", + "module_version": "0.24-GCCcore-13.2.0" + }, + { + "full_module_name": "ESPResSo/4.2.2-foss-2023b", + "module_name": "ESPResSo", + "module_version": "4.2.2-foss-2023b" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "A software package for performing and analyzing scientific Molecular Dynamics simulations.", + "version": "4.2.2", + "versionsuffix": "", + "extensions": [] + } + ], + "homepage": "https://espressomd.org/wordpress", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "description": "A software package for performing and analyzing scientific Molecular Dynamics simulations." + }, + "PMIx": { + "versions": [ + { + "homepage": "https://pmix.org/", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "GCCcore", + "version": "12.2.0" + }, + "toolchain_families_compatibility": [ + "2022b_foss" + ], + "module": { + "full_module_name": "PMIx/4.2.2-GCCcore-12.2.0", + "module_name": "PMIx", + "module_version": "4.2.2-GCCcore-12.2.0" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2023.06", + "module_name": "EESSI", + "module_version": "2023.06" + }, + { + "full_module_name": "GCCcore/12.2.0", + "module_name": "GCCcore", + "module_version": "12.2.0" + }, + { + "full_module_name": "OpenSSL/1.1", + "module_name": "OpenSSL", + "module_version": "1.1" + }, + { + "full_module_name": "libevent/2.1.12-GCCcore-12.2.0", + "module_name": "libevent", + "module_version": "2.1.12-GCCcore-12.2.0" + }, + { + "full_module_name": "numactl/2.0.16-GCCcore-12.2.0", + "module_name": "numactl", + "module_version": "2.0.16-GCCcore-12.2.0" + }, + { + "full_module_name": "libxml2/2.10.3-GCCcore-12.2.0", + "module_name": "libxml2", + "module_version": "2.10.3-GCCcore-12.2.0" + }, + { + "full_module_name": "libpciaccess/0.17-GCCcore-12.2.0", + "module_name": "libpciaccess", + "module_version": "0.17-GCCcore-12.2.0" + }, + { + "full_module_name": "hwloc/2.8.0-GCCcore-12.2.0", + "module_name": "hwloc", + "module_version": "2.8.0-GCCcore-12.2.0" + }, + { + "full_module_name": "PMIx/4.2.2-GCCcore-12.2.0", + "module_name": "PMIx", + "module_version": "4.2.2-GCCcore-12.2.0" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "Process Management for Exascale Environments\nPMI Exascale (PMIx) represents an attempt to\nprovide an extended version of the PMI standard specifically designed\nto support clusters up to and including exascale sizes. The overall\nobjective of the project is not to branch the existing pseudo-standard\ndefinitions - in fact, PMIx fully supports both of the existing PMI-1\nand PMI-2 APIs - but rather to (a) augment and extend those APIs to\neliminate some current restrictions that impact scalability, and (b)\nprovide a reference implementation of the PMI-server that demonstrates\nthe desired level of scalability.\n", + "version": "4.2.2", + "versionsuffix": "", + "extensions": [] + }, + { + "homepage": "https://pmix.org/", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "GCCcore", + "version": "12.3.0" + }, + "toolchain_families_compatibility": [ + "2023a_foss" + ], + "module": { + "full_module_name": "PMIx/4.2.4-GCCcore-12.3.0", + "module_name": "PMIx", + "module_version": "4.2.4-GCCcore-12.3.0" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2023.06", + "module_name": "EESSI", + "module_version": "2023.06" + }, + { + "full_module_name": "GCCcore/12.3.0", + "module_name": "GCCcore", + "module_version": "12.3.0" + }, + { + "full_module_name": "OpenSSL/1.1", + "module_name": "OpenSSL", + "module_version": "1.1" + }, + { + "full_module_name": "libevent/2.1.12-GCCcore-12.3.0", + "module_name": "libevent", + "module_version": "2.1.12-GCCcore-12.3.0" + }, + { + "full_module_name": "numactl/2.0.16-GCCcore-12.3.0", + "module_name": "numactl", + "module_version": "2.0.16-GCCcore-12.3.0" + }, + { + "full_module_name": "libxml2/2.11.4-GCCcore-12.3.0", + "module_name": "libxml2", + "module_version": "2.11.4-GCCcore-12.3.0" + }, + { + "full_module_name": "libpciaccess/0.17-GCCcore-12.3.0", + "module_name": "libpciaccess", + "module_version": "0.17-GCCcore-12.3.0" + }, + { + "full_module_name": "hwloc/2.9.1-GCCcore-12.3.0", + "module_name": "hwloc", + "module_version": "2.9.1-GCCcore-12.3.0" + }, + { + "full_module_name": "PMIx/4.2.4-GCCcore-12.3.0", + "module_name": "PMIx", + "module_version": "4.2.4-GCCcore-12.3.0" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "Process Management for Exascale Environments\nPMI Exascale (PMIx) represents an attempt to\nprovide an extended version of the PMI standard specifically designed\nto support clusters up to and including exascale sizes. The overall\nobjective of the project is not to branch the existing pseudo-standard\ndefinitions - in fact, PMIx fully supports both of the existing PMI-1\nand PMI-2 APIs - but rather to (a) augment and extend those APIs to\neliminate some current restrictions that impact scalability, and (b)\nprovide a reference implementation of the PMI-server that demonstrates\nthe desired level of scalability.\n", + "version": "4.2.4", + "versionsuffix": "", + "extensions": [] + }, + { + "homepage": "https://pmix.org/", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "GCCcore", + "version": "13.2.0" + }, + "toolchain_families_compatibility": [ + "2023b_foss" + ], + "module": { + "full_module_name": "PMIx/4.2.6-GCCcore-13.2.0", + "module_name": "PMIx", + "module_version": "4.2.6-GCCcore-13.2.0" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2023.06", + "module_name": "EESSI", + "module_version": "2023.06" + }, + { + "full_module_name": "GCCcore/13.2.0", + "module_name": "GCCcore", + "module_version": "13.2.0" + }, + { + "full_module_name": "OpenSSL/1.1", + "module_name": "OpenSSL", + "module_version": "1.1" + }, + { + "full_module_name": "libevent/2.1.12-GCCcore-13.2.0", + "module_name": "libevent", + "module_version": "2.1.12-GCCcore-13.2.0" + }, + { + "full_module_name": "numactl/2.0.16-GCCcore-13.2.0", + "module_name": "numactl", + "module_version": "2.0.16-GCCcore-13.2.0" + }, + { + "full_module_name": "libxml2/2.11.5-GCCcore-13.2.0", + "module_name": "libxml2", + "module_version": "2.11.5-GCCcore-13.2.0" + }, + { + "full_module_name": "libpciaccess/0.17-GCCcore-13.2.0", + "module_name": "libpciaccess", + "module_version": "0.17-GCCcore-13.2.0" + }, + { + "full_module_name": "hwloc/2.9.2-GCCcore-13.2.0", + "module_name": "hwloc", + "module_version": "2.9.2-GCCcore-13.2.0" + }, + { + "full_module_name": "PMIx/4.2.6-GCCcore-13.2.0", + "module_name": "PMIx", + "module_version": "4.2.6-GCCcore-13.2.0" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "Process Management for Exascale Environments\nPMI Exascale (PMIx) represents an attempt to\nprovide an extended version of the PMI standard specifically designed\nto support clusters up to and including exascale sizes. The overall\nobjective of the project is not to branch the existing pseudo-standard\ndefinitions - in fact, PMIx fully supports both of the existing PMI-1\nand PMI-2 APIs - but rather to (a) augment and extend those APIs to\neliminate some current restrictions that impact scalability, and (b)\nprovide a reference implementation of the PMI-server that demonstrates\nthe desired level of scalability.\n", + "version": "4.2.6", + "versionsuffix": "", + "extensions": [] + }, + { + "homepage": "https://pmix.org/", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "GCCcore", + "version": "13.3.0" + }, + "toolchain_families_compatibility": [ + "2024a_foss" + ], + "module": { + "full_module_name": "PMIx/5.0.2-GCCcore-13.3.0", + "module_name": "PMIx", + "module_version": "5.0.2-GCCcore-13.3.0" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2025.06", + "module_name": "EESSI", + "module_version": "2025.06" + }, + { + "full_module_name": "GCCcore/13.3.0", + "module_name": "GCCcore", + "module_version": "13.3.0" + }, + { + "full_module_name": "OpenSSL/3", + "module_name": "OpenSSL", + "module_version": "3" + }, + { + "full_module_name": "libevent/2.1.12-GCCcore-13.3.0", + "module_name": "libevent", + "module_version": "2.1.12-GCCcore-13.3.0" + }, + { + "full_module_name": "numactl/2.0.18-GCCcore-13.3.0", + "module_name": "numactl", + "module_version": "2.0.18-GCCcore-13.3.0" + }, + { + "full_module_name": "libxml2/2.12.7-GCCcore-13.3.0", + "module_name": "libxml2", + "module_version": "2.12.7-GCCcore-13.3.0" + }, + { + "full_module_name": "libpciaccess/0.18.1-GCCcore-13.3.0", + "module_name": "libpciaccess", + "module_version": "0.18.1-GCCcore-13.3.0" + }, + { + "full_module_name": "hwloc/2.10.0-GCCcore-13.3.0", + "module_name": "hwloc", + "module_version": "2.10.0-GCCcore-13.3.0" + }, + { + "full_module_name": "PMIx/5.0.2-GCCcore-13.3.0", + "module_name": "PMIx", + "module_version": "5.0.2-GCCcore-13.3.0" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "Process Management for Exascale Environments\nPMI Exascale (PMIx) represents an attempt to\nprovide an extended version of the PMI standard specifically designed\nto support clusters up to and including exascale sizes. The overall\nobjective of the project is not to branch the existing pseudo-standard\ndefinitions - in fact, PMIx fully supports both of the existing PMI-1\nand PMI-2 APIs - but rather to (a) augment and extend those APIs to\neliminate some current restrictions that impact scalability, and (b)\nprovide a reference implementation of the PMI-server that demonstrates\nthe desired level of scalability.\n", + "version": "5.0.2", + "versionsuffix": "", + "extensions": [] + }, + { + "homepage": "https://pmix.org/", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "GCCcore", + "version": "14.2.0" + }, + "toolchain_families_compatibility": [ + "2025a_foss" + ], + "module": { + "full_module_name": "PMIx/5.0.6-GCCcore-14.2.0", + "module_name": "PMIx", + "module_version": "5.0.6-GCCcore-14.2.0" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2025.06", + "module_name": "EESSI", + "module_version": "2025.06" + }, + { + "full_module_name": "GCCcore/14.2.0", + "module_name": "GCCcore", + "module_version": "14.2.0" + }, + { + "full_module_name": "OpenSSL/3", + "module_name": "OpenSSL", + "module_version": "3" + }, + { + "full_module_name": "libevent/2.1.12-GCCcore-14.2.0", + "module_name": "libevent", + "module_version": "2.1.12-GCCcore-14.2.0" + }, + { + "full_module_name": "numactl/2.0.19-GCCcore-14.2.0", + "module_name": "numactl", + "module_version": "2.0.19-GCCcore-14.2.0" + }, + { + "full_module_name": "libxml2/2.13.4-GCCcore-14.2.0", + "module_name": "libxml2", + "module_version": "2.13.4-GCCcore-14.2.0" + }, + { + "full_module_name": "libpciaccess/0.18.1-GCCcore-14.2.0", + "module_name": "libpciaccess", + "module_version": "0.18.1-GCCcore-14.2.0" + }, + { + "full_module_name": "hwloc/2.11.2-GCCcore-14.2.0", + "module_name": "hwloc", + "module_version": "2.11.2-GCCcore-14.2.0" + }, + { + "full_module_name": "PMIx/5.0.6-GCCcore-14.2.0", + "module_name": "PMIx", + "module_version": "5.0.6-GCCcore-14.2.0" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "Process Management for Exascale Environments\nPMI Exascale (PMIx) represents an attempt to\nprovide an extended version of the PMI standard specifically designed\nto support clusters up to and including exascale sizes. The overall\nobjective of the project is not to branch the existing pseudo-standard\ndefinitions - in fact, PMIx fully supports both of the existing PMI-1\nand PMI-2 APIs - but rather to (a) augment and extend those APIs to\neliminate some current restrictions that impact scalability, and (b)\nprovide a reference implementation of the PMI-server that demonstrates\nthe desired level of scalability.\n", + "version": "5.0.6", + "versionsuffix": "", + "extensions": [] + }, + { + "homepage": "https://pmix.org/", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "GCCcore", + "version": "14.3.0" + }, + "toolchain_families_compatibility": [ + "2025b_foss" + ], + "module": { + "full_module_name": "PMIx/5.0.8-GCCcore-14.3.0", + "module_name": "PMIx", + "module_version": "5.0.8-GCCcore-14.3.0" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2025.06", + "module_name": "EESSI", + "module_version": "2025.06" + }, + { + "full_module_name": "GCCcore/14.3.0", + "module_name": "GCCcore", + "module_version": "14.3.0" + }, + { + "full_module_name": "OpenSSL/3", + "module_name": "OpenSSL", + "module_version": "3" + }, + { + "full_module_name": "libevent/2.1.12-GCCcore-14.3.0", + "module_name": "libevent", + "module_version": "2.1.12-GCCcore-14.3.0" + }, + { + "full_module_name": "numactl/2.0.19-GCCcore-14.3.0", + "module_name": "numactl", + "module_version": "2.0.19-GCCcore-14.3.0" + }, + { + "full_module_name": "libxml2/2.14.3-GCCcore-14.3.0", + "module_name": "libxml2", + "module_version": "2.14.3-GCCcore-14.3.0" + }, + { + "full_module_name": "libpciaccess/0.18.1-GCCcore-14.3.0", + "module_name": "libpciaccess", + "module_version": "0.18.1-GCCcore-14.3.0" + }, + { + "full_module_name": "hwloc/2.12.1-GCCcore-14.3.0", + "module_name": "hwloc", + "module_version": "2.12.1-GCCcore-14.3.0" + }, + { + "full_module_name": "PMIx/5.0.8-GCCcore-14.3.0", + "module_name": "PMIx", + "module_version": "5.0.8-GCCcore-14.3.0" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "Process Management for Exascale Environments\nPMI Exascale (PMIx) represents an attempt to\nprovide an extended version of the PMI standard specifically designed\nto support clusters up to and including exascale sizes. The overall\nobjective of the project is not to branch the existing pseudo-standard\ndefinitions - in fact, PMIx fully supports both of the existing PMI-1\nand PMI-2 APIs - but rather to (a) augment and extend those APIs to\neliminate some current restrictions that impact scalability, and (b)\nprovide a reference implementation of the PMI-server that demonstrates\nthe desired level of scalability.\n", + "version": "5.0.8", + "versionsuffix": "", + "extensions": [] + } + ], + "homepage": "https://pmix.org/", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "description": "Process Management for Exascale Environments\nPMI Exascale (PMIx) represents an attempt to\nprovide an extended version of the PMI standard specifically designed\nto support clusters up to and including exascale sizes. The overall\nobjective of the project is not to branch the existing pseudo-standard\ndefinitions - in fact, PMIx fully supports both of the existing PMI-1\nand PMI-2 APIs - but rather to (a) augment and extend those APIs to\neliminate some current restrictions that impact scalability, and (b)\nprovide a reference implementation of the PMI-server that demonstrates\nthe desired level of scalability.\n" + }, + "Salmon": { + "versions": [ + { + "homepage": "https://github.com/COMBINE-lab/salmon", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "GCC", + "version": "12.3.0" + }, + "toolchain_families_compatibility": [ + "2023a_foss" + ], + "module": { + "full_module_name": "Salmon/1.10.3-GCC-12.3.0", + "module_name": "Salmon", + "module_version": "1.10.3-GCC-12.3.0" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2023.06", + "module_name": "EESSI", + "module_version": "2023.06" + }, + { + "full_module_name": "GCCcore/12.3.0", + "module_name": "GCCcore", + "module_version": "12.3.0" + }, + { + "full_module_name": "GCC/12.3.0", + "module_name": "GCC", + "module_version": "12.3.0" + }, + { + "full_module_name": "gzip/1.12-GCCcore-12.3.0", + "module_name": "gzip", + "module_version": "1.12-GCCcore-12.3.0" + }, + { + "full_module_name": "lz4/1.9.4-GCCcore-12.3.0", + "module_name": "lz4", + "module_version": "1.9.4-GCCcore-12.3.0" + }, + { + "full_module_name": "zstd/1.5.5-GCCcore-12.3.0", + "module_name": "zstd", + "module_version": "1.5.5-GCCcore-12.3.0" + }, + { + "full_module_name": "ICU/73.2-GCCcore-12.3.0", + "module_name": "ICU", + "module_version": "73.2-GCCcore-12.3.0" + }, + { + "full_module_name": "Boost/1.82.0-GCC-12.3.0", + "module_name": "Boost", + "module_version": "1.82.0-GCC-12.3.0" + }, + { + "full_module_name": "numactl/2.0.16-GCCcore-12.3.0", + "module_name": "numactl", + "module_version": "2.0.16-GCCcore-12.3.0" + }, + { + "full_module_name": "libxml2/2.11.4-GCCcore-12.3.0", + "module_name": "libxml2", + "module_version": "2.11.4-GCCcore-12.3.0" + }, + { + "full_module_name": "libpciaccess/0.17-GCCcore-12.3.0", + "module_name": "libpciaccess", + "module_version": "0.17-GCCcore-12.3.0" + }, + { + "full_module_name": "hwloc/2.9.1-GCCcore-12.3.0", + "module_name": "hwloc", + "module_version": "2.9.1-GCCcore-12.3.0" + }, + { + "full_module_name": "tbb/2021.11.0-GCCcore-12.3.0", + "module_name": "tbb", + "module_version": "2021.11.0-GCCcore-12.3.0" + }, + { + "full_module_name": "OpenSSL/1.1", + "module_name": "OpenSSL", + "module_version": "1.1" + }, + { + "full_module_name": "cURL/8.0.1-GCCcore-12.3.0", + "module_name": "cURL", + "module_version": "8.0.1-GCCcore-12.3.0" + }, + { + "full_module_name": "libiconv/1.17-GCCcore-12.3.0", + "module_name": "libiconv", + "module_version": "1.17-GCCcore-12.3.0" + }, + { + "full_module_name": "Salmon/1.10.3-GCC-12.3.0", + "module_name": "Salmon", + "module_version": "1.10.3-GCC-12.3.0" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "Salmon is a wicked-fast program to produce a highly-accurate,\n transcript-level quantification estimate from RNA-seq data.", + "version": "1.10.3", + "versionsuffix": "", + "extensions": [] + } + ], + "homepage": "https://github.com/COMBINE-lab/salmon", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "description": "Salmon is a wicked-fast program to produce a highly-accurate,\n transcript-level quantification estimate from RNA-seq data." + }, + "hatchling": { + "versions": [ + { + "homepage": "https://hatch.pypa.io", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "GCCcore", + "version": "12.3.0" + }, + "toolchain_families_compatibility": [ + "2023a_foss" + ], + "module": { + "full_module_name": "hatchling/1.18.0-GCCcore-12.3.0", + "module_name": "hatchling", + "module_version": "1.18.0-GCCcore-12.3.0" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2023.06", + "module_name": "EESSI", + "module_version": "2023.06" + }, + { + "full_module_name": "GCCcore/12.3.0", + "module_name": "GCCcore", + "module_version": "12.3.0" + }, + { + "full_module_name": "Tcl/8.6.13-GCCcore-12.3.0", + "module_name": "Tcl", + "module_version": "8.6.13-GCCcore-12.3.0" + }, + { + "full_module_name": "SQLite/3.42.0-GCCcore-12.3.0", + "module_name": "SQLite", + "module_version": "3.42.0-GCCcore-12.3.0" + }, + { + "full_module_name": "libffi/3.4.4-GCCcore-12.3.0", + "module_name": "libffi", + "module_version": "3.4.4-GCCcore-12.3.0" + }, + { + "full_module_name": "OpenSSL/1.1", + "module_name": "OpenSSL", + "module_version": "1.1" + }, + { + "full_module_name": "Python/3.11.3-GCCcore-12.3.0", + "module_name": "Python", + "module_version": "3.11.3-GCCcore-12.3.0" + }, + { + "full_module_name": "hatchling/1.18.0-GCCcore-12.3.0", + "module_name": "hatchling", + "module_version": "1.18.0-GCCcore-12.3.0" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "Extensible, standards compliant build backend used by Hatch,\na modern, extensible Python project manager.", + "version": "1.18.0", + "versionsuffix": "", + "extensions": [ + { + "type": "python", + "name": "pathspec", + "version": "0.11.1" + }, + { + "type": "python", + "name": "pluggy", + "version": "1.2.0" + }, + { + "type": "python", + "name": "editables", + "version": "0.3" + }, + { + "type": "python", + "name": "trove_classifiers", + "version": "2023.5.24" + }, + { + "type": "python", + "name": "hatchling", + "version": "1.18.0" + }, + { + "type": "python", + "name": "hatch_vcs", + "version": "0.3.0" + }, + { + "type": "python", + "name": "hatch_fancy_pypi_readme", + "version": "23.1.0" + }, + { + "type": "python", + "name": "hatch-requirements-txt", + "version": "0.4.1" + } + ] + }, + { + "homepage": "https://hatch.pypa.io", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "GCCcore", + "version": "13.2.0" + }, + "toolchain_families_compatibility": [ + "2023b_foss" + ], + "module": { + "full_module_name": "hatchling/1.18.0-GCCcore-13.2.0", + "module_name": "hatchling", + "module_version": "1.18.0-GCCcore-13.2.0" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2023.06", + "module_name": "EESSI", + "module_version": "2023.06" + }, + { + "full_module_name": "GCCcore/13.2.0", + "module_name": "GCCcore", + "module_version": "13.2.0" + }, + { + "full_module_name": "Tcl/8.6.13-GCCcore-13.2.0", + "module_name": "Tcl", + "module_version": "8.6.13-GCCcore-13.2.0" + }, + { + "full_module_name": "SQLite/3.43.1-GCCcore-13.2.0", + "module_name": "SQLite", + "module_version": "3.43.1-GCCcore-13.2.0" + }, + { + "full_module_name": "libffi/3.4.4-GCCcore-13.2.0", + "module_name": "libffi", + "module_version": "3.4.4-GCCcore-13.2.0" + }, + { + "full_module_name": "OpenSSL/1.1", + "module_name": "OpenSSL", + "module_version": "1.1" + }, + { + "full_module_name": "Python/3.11.5-GCCcore-13.2.0", + "module_name": "Python", + "module_version": "3.11.5-GCCcore-13.2.0" + }, + { + "full_module_name": "hatchling/1.18.0-GCCcore-13.2.0", + "module_name": "hatchling", + "module_version": "1.18.0-GCCcore-13.2.0" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "Extensible, standards compliant build backend used by Hatch,\na modern, extensible Python project manager.", + "version": "1.18.0", + "versionsuffix": "", + "extensions": [ + { + "type": "python", + "name": "pathspec", + "version": "0.11.2" + }, + { + "type": "python", + "name": "pluggy", + "version": "1.3.0" + }, + { + "type": "python", + "name": "editables", + "version": "0.5" + }, + { + "type": "python", + "name": "trove_classifiers", + "version": "2023.10.18" + }, + { + "type": "python", + "name": "hatchling", + "version": "1.18.0" + }, + { + "type": "python", + "name": "hatch_vcs", + "version": "0.3.0" + }, + { + "type": "python", + "name": "hatch_fancy_pypi_readme", + "version": "23.1.0" + }, + { + "type": "python", + "name": "hatch-requirements-txt", + "version": "0.4.1" + } + ] + }, + { + "homepage": "https://hatch.pypa.io", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "GCCcore", + "version": "13.3.0" + }, + "toolchain_families_compatibility": [ + "2024a_foss" + ], + "module": { + "full_module_name": "hatchling/1.24.2-GCCcore-13.3.0", + "module_name": "hatchling", + "module_version": "1.24.2-GCCcore-13.3.0" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2025.06", + "module_name": "EESSI", + "module_version": "2025.06" + }, + { + "full_module_name": "GCCcore/13.3.0", + "module_name": "GCCcore", + "module_version": "13.3.0" + }, + { + "full_module_name": "Tcl/8.6.14-GCCcore-13.3.0", + "module_name": "Tcl", + "module_version": "8.6.14-GCCcore-13.3.0" + }, + { + "full_module_name": "SQLite/3.45.3-GCCcore-13.3.0", + "module_name": "SQLite", + "module_version": "3.45.3-GCCcore-13.3.0" + }, + { + "full_module_name": "libffi/3.4.5-GCCcore-13.3.0", + "module_name": "libffi", + "module_version": "3.4.5-GCCcore-13.3.0" + }, + { + "full_module_name": "OpenSSL/3", + "module_name": "OpenSSL", + "module_version": "3" + }, + { + "full_module_name": "Python/3.12.3-GCCcore-13.3.0", + "module_name": "Python", + "module_version": "3.12.3-GCCcore-13.3.0" + }, + { + "full_module_name": "hatchling/1.24.2-GCCcore-13.3.0", + "module_name": "hatchling", + "module_version": "1.24.2-GCCcore-13.3.0" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "Extensible, standards compliant build backend used by Hatch,\na modern, extensible Python project manager.", + "version": "1.24.2", + "versionsuffix": "", + "extensions": [ + { + "type": "python", + "name": "pathspec", + "version": "0.12.1" + }, + { + "type": "python", + "name": "pluggy", + "version": "1.5.0" + }, + { + "type": "python", + "name": "editables", + "version": "0.5" + }, + { + "type": "python", + "name": "trove-classifiers", + "version": "2024.5.22" + }, + { + "type": "python", + "name": "hatchling", + "version": "1.24.2" + }, + { + "type": "python", + "name": "hatch-vcs", + "version": "0.4.0" + }, + { + "type": "python", + "name": "hatch-fancy-pypi-readme", + "version": "24.1.0" + }, + { + "type": "python", + "name": "hatch-requirements-txt", + "version": "0.4.1" + } + ] + }, + { + "homepage": "https://hatch.pypa.io", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "GCCcore", + "version": "14.2.0" + }, + "toolchain_families_compatibility": [ + "2025a_foss" + ], + "module": { + "full_module_name": "hatchling/1.27.0-GCCcore-14.2.0", + "module_name": "hatchling", + "module_version": "1.27.0-GCCcore-14.2.0" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2025.06", + "module_name": "EESSI", + "module_version": "2025.06" + }, + { + "full_module_name": "GCCcore/14.2.0", + "module_name": "GCCcore", + "module_version": "14.2.0" + }, + { + "full_module_name": "Tcl/8.6.16-GCCcore-14.2.0", + "module_name": "Tcl", + "module_version": "8.6.16-GCCcore-14.2.0" + }, + { + "full_module_name": "SQLite/3.47.2-GCCcore-14.2.0", + "module_name": "SQLite", + "module_version": "3.47.2-GCCcore-14.2.0" + }, + { + "full_module_name": "libffi/3.4.5-GCCcore-14.2.0", + "module_name": "libffi", + "module_version": "3.4.5-GCCcore-14.2.0" + }, + { + "full_module_name": "OpenSSL/3", + "module_name": "OpenSSL", + "module_version": "3" + }, + { + "full_module_name": "Python/3.13.1-GCCcore-14.2.0", + "module_name": "Python", + "module_version": "3.13.1-GCCcore-14.2.0" + }, + { + "full_module_name": "hatchling/1.27.0-GCCcore-14.2.0", + "module_name": "hatchling", + "module_version": "1.27.0-GCCcore-14.2.0" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "Extensible, standards compliant build backend used by Hatch,\na modern, extensible Python project manager.", + "version": "1.27.0", + "versionsuffix": "", + "extensions": [ + { + "type": "python", + "name": "pathspec", + "version": "0.12.1" + }, + { + "type": "python", + "name": "pluggy", + "version": "1.5.0" + }, + { + "type": "python", + "name": "editables", + "version": "0.5" + }, + { + "type": "python", + "name": "trove-classifiers", + "version": "2025.2.18.16" + }, + { + "type": "python", + "name": "hatchling", + "version": "1.27.0" + }, + { + "type": "python", + "name": "hatch-vcs", + "version": "0.4.0" + }, + { + "type": "python", + "name": "hatch-fancy-pypi-readme", + "version": "24.1.0" + }, + { + "type": "python", + "name": "hatch-requirements-txt", + "version": "0.4.1" + } + ] + }, + { + "homepage": "https://hatch.pypa.io", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "GCCcore", + "version": "14.3.0" + }, + "toolchain_families_compatibility": [ + "2025b_foss" + ], + "module": { + "full_module_name": "hatchling/1.27.0-GCCcore-14.3.0", + "module_name": "hatchling", + "module_version": "1.27.0-GCCcore-14.3.0" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2025.06", + "module_name": "EESSI", + "module_version": "2025.06" + }, + { + "full_module_name": "GCCcore/14.3.0", + "module_name": "GCCcore", + "module_version": "14.3.0" + }, + { + "full_module_name": "libtommath/1.3.0-GCCcore-14.3.0", + "module_name": "libtommath", + "module_version": "1.3.0-GCCcore-14.3.0" + }, + { + "full_module_name": "Tcl/9.0.1-GCCcore-14.3.0", + "module_name": "Tcl", + "module_version": "9.0.1-GCCcore-14.3.0" + }, + { + "full_module_name": "SQLite/3.50.1-GCCcore-14.3.0", + "module_name": "SQLite", + "module_version": "3.50.1-GCCcore-14.3.0" + }, + { + "full_module_name": "libffi/3.5.1-GCCcore-14.3.0", + "module_name": "libffi", + "module_version": "3.5.1-GCCcore-14.3.0" + }, + { + "full_module_name": "OpenSSL/3", + "module_name": "OpenSSL", + "module_version": "3" + }, + { + "full_module_name": "Python/3.13.5-GCCcore-14.3.0", + "module_name": "Python", + "module_version": "3.13.5-GCCcore-14.3.0" + }, + { + "full_module_name": "hatchling/1.27.0-GCCcore-14.3.0", + "module_name": "hatchling", + "module_version": "1.27.0-GCCcore-14.3.0" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "Extensible, standards compliant build backend used by Hatch,\na modern, extensible Python project manager.", + "version": "1.27.0", + "versionsuffix": "", + "extensions": [ + { + "type": "python", + "name": "pathspec", + "version": "0.12.1" + }, + { + "type": "python", + "name": "pluggy", + "version": "1.6.0" + }, + { + "type": "python", + "name": "editables", + "version": "0.5" + }, + { + "type": "python", + "name": "trove-classifiers", + "version": "2025.5.9.12" + }, + { + "type": "python", + "name": "hatchling", + "version": "1.27.0" + }, + { + "type": "python", + "name": "hatch-vcs", + "version": "0.5.0" + }, + { + "type": "python", + "name": "hatch-fancy-pypi-readme", + "version": "25.1.0" + }, + { + "type": "python", + "name": "hatch-requirements-txt", + "version": "0.4.1" + }, + { + "type": "python", + "name": "hatch-docstring-description", + "version": "1.1.1" + } + ] + } + ], + "homepage": "https://hatch.pypa.io", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "description": "Extensible, standards compliant build backend used by Hatch,\na modern, extensible Python project manager." + }, + "xterm": { + "versions": [ + { + "homepage": "https://xterm.dev/", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "toolchain": { + "name": "GCCcore", + "version": "13.3.0" + }, + "toolchain_families_compatibility": [ + "2024a_foss" + ], + "module": { + "full_module_name": "xterm/402-GCCcore-13.3.0", + "module_name": "xterm", + "module_version": "402-GCCcore-13.3.0" + }, + "required_modules": [ + { + "full_module_name": "EESSI/2025.06", + "module_name": "EESSI", + "module_version": "2025.06" + }, + { + "full_module_name": "GCCcore/13.3.0", + "module_name": "GCCcore", + "module_version": "13.3.0" + }, + { + "full_module_name": "expat/2.6.2-GCCcore-13.3.0", + "module_name": "expat", + "module_version": "2.6.2-GCCcore-13.3.0" + }, + { + "full_module_name": "libpng/1.6.43-GCCcore-13.3.0", + "module_name": "libpng", + "module_version": "1.6.43-GCCcore-13.3.0" + }, + { + "full_module_name": "Brotli/1.1.0-GCCcore-13.3.0", + "module_name": "Brotli", + "module_version": "1.1.0-GCCcore-13.3.0" + }, + { + "full_module_name": "freetype/2.13.2-GCCcore-13.3.0", + "module_name": "freetype", + "module_version": "2.13.2-GCCcore-13.3.0" + }, + { + "full_module_name": "fontconfig/2.15.0-GCCcore-13.3.0", + "module_name": "fontconfig", + "module_version": "2.15.0-GCCcore-13.3.0" + }, + { + "full_module_name": "xorg-macros/1.20.1-GCCcore-13.3.0", + "module_name": "xorg-macros", + "module_version": "1.20.1-GCCcore-13.3.0" + }, + { + "full_module_name": "libpciaccess/0.18.1-GCCcore-13.3.0", + "module_name": "libpciaccess", + "module_version": "0.18.1-GCCcore-13.3.0" + }, + { + "full_module_name": "X11/20240607-GCCcore-13.3.0", + "module_name": "X11", + "module_version": "20240607-GCCcore-13.3.0" + }, + { + "full_module_name": "xterm/402-GCCcore-13.3.0", + "module_name": "xterm", + "module_version": "402-GCCcore-13.3.0" + } + ], + "cpu_arch": [ + "aarch64/generic", + "aarch64/a64fx", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "x86_64/generic", + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/skylake_avx512", + "x86_64/intel/sapphirerapids", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake" + ], + "gpu_arch": {}, + "description": "X11 terminal emulator for the X Window System", + "version": "402", + "versionsuffix": "", + "extensions": [] + } + ], + "homepage": "https://xterm.dev/", + "license": [], + "image": "", + "categories": [], + "identifier": "", + "description": "X11 terminal emulator for the X Window System" + } + } +} \ No newline at end of file diff --git a/scripts/available_software/tests/data/lmod_mock.sh b/scripts/available_software/tests/data/lmod_mock.sh deleted file mode 100755 index 8fecc18b37..0000000000 --- a/scripts/available_software/tests/data/lmod_mock.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash - -# Return an error when a variable is not set. -set -u - - -# example: $LMOD_CMD python --terse avail cluster/ -python="$1" -terse="$2" -mod_cmd="$3" -mod_args="${4:-}" - -# Emulated avail command. -if [ "$mod_cmd" = "avail" ]; then - cat "${MOCK_FILE_AVAIL}" >&2 - -# Emulated swap command. -elif [ "$mod_cmd" = "swap" ]; then - # extract the target name from the 4th argument - target=$(echo "$mod_args" | cut -d "/" -f 1) - target_name=$(echo "$mod_args" | cut -d "/" -f 2) - - if [ "$target" = "target" ]; then - # Substitute TARGET by the target_name - cat ${MOCK_FILE_SWAP/TARGET/${target_name}} >&1 - else - echo "${mod_args} is not a target." >&2 - exit 1 - fi - - -# Emulate show command -elif [ "$mod_cmd" = "show" ]; then - cat "${MOCK_FILE_SHOW}" >&2 - - -elif [ "$mod_cmd" = "use" ]; then - cvmfs=$(echo "$mod_args" | cut -d "/" -f 2) - repo=$(echo "$mod_args" | cut -d "/" -f 3) - if [ "cvmfs" = "cvmfs" ]; then - if echo "$mod_args" | grep -q -E "amd"; then - target_name=$(echo "$mod_args" | cut -d "/" -f 10) - # Substitute TARGET by the target_name - cat ${MOCK_FILE_SWAP/TARGET/${target_name}} >&1 - elif echo "$mod_args" | grep -q -E "intel"; then - target_name=$(echo "$mod_args" | cut -d "/" -f 10) - # Substitute TARGET by the target_name - cat ${MOCK_FILE_SWAP/TARGET/${target_name}} >&1 - else - target_name=$(echo "$mod_args" | cut -d "/" -f 9) - # Substitute TARGET by the target_name - cat ${MOCK_FILE_SWAP/TARGET/${target_name}} >&1 - fi - else - echo "${mod_arg} in not a cvmfs repo" - exit 1 - fi - - -else - echo "Module subcommand '${mod_cmd}' not supported yet in $0" >&2 - exit 1 -fi diff --git a/scripts/available_software/tests/data/test_json_simple_sol.json b/scripts/available_software/tests/data/test_json_simple_sol.json deleted file mode 100644 index 5d14435a70..0000000000 --- a/scripts/available_software/tests/data/test_json_simple_sol.json +++ /dev/null @@ -1 +0,0 @@ -{"time_generated":"dummy", "targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2"], "modules": {"Markov": [1, 0], "cfd": [1, 1], "llm": [0, 1], "science": [1, 1]}} diff --git a/scripts/available_software/tests/data/test_json_simple_sol_detail.json b/scripts/available_software/tests/data/test_json_simple_sol_detail.json deleted file mode 100644 index e5df36b947..0000000000 --- a/scripts/available_software/tests/data/test_json_simple_sol_detail.json +++ /dev/null @@ -1 +0,0 @@ -{"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2"], "software": {"cfd": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2"], "versions": {"cfd/1.0": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2"]}, "cfd/2.0": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2"]}, "cfd/24": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2"]}, "cfd/5.0": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2"]}, "cfd/2.0afqsdf": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2"]}, "cfd/3.0": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2"]}}}, "Markov": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic"], "versions": {"Markov/hidden-1.0.5": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic"]}, "Markov/hidden-1.0.10": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic"]}}}, "science": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2"], "versions": {"science/5.3.0": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2"]}, "science/7.2.0": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic", "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2"]}}}, "llm": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2"], "versions": {"llm/20230627": {"targets": ["/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2"]}}}}, "time_generated": "Thu, 31 Aug 2023 at 14:00:22 CEST"} diff --git a/scripts/available_software/tests/data/test_md_simple_sol.md b/scripts/available_software/tests/data/test_md_simple_sol.md deleted file mode 100644 index 88812fe34e..0000000000 --- a/scripts/available_software/tests/data/test_md_simple_sol.md +++ /dev/null @@ -1,10 +0,0 @@ - -Overview Modules -================ - -| |/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic|/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2| -| :---: | :---: | :---: | -|Markov|X| | -|cfd|X|X| -|llm| |X| -|science|X|X| diff --git a/scripts/available_software/tests/data/test_md_template_detailed_science_sol.md b/scripts/available_software/tests/data/test_md_template_detailed_science_sol.md deleted file mode 100644 index b63029196b..0000000000 --- a/scripts/available_software/tests/data/test_md_template_detailed_science_sol.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -hide: -- toc -json_ld: - '@context': https://schema.org - '@type': SoftwareApplication - applicationCategory: DeveloperApplication - description: '' - license: Not confirmed - name: science - offers: - '@type': Offer - price: 0 - operatingSystem: LINUX - review: - '@type': Review - author: - '@type': Organization - name: EESSI - reviewBody: Application has been successfully made available on all architectures - supported by EESSI - reviewRating: - '@type': Rating - ratingValue: 5 - softwareRequirements: See https://www.eessi.io/docs/ for how to make EESSI available - on your system - softwareVersion: '[''science/5.3.0'', ''science/7.2.0'']' - url: '' ---- - -science -======= - -# Available modules - - -The overview below shows which science installations are available per target architecture in EESSI, ordered based on software version (new to old). - -To start using science, load one of these modules using a `module load` command like: - -```shell -module load science/7.2.0 -``` - -*(This data was automatically generated on {{ generated_date }})* - -| |aarch64/generic|x86_64/amd/zen2| -| :---: | :---: | :---: | -|science/7.2.0|x|x| -|science/5.3.0|x|x| diff --git a/scripts/available_software/tests/detail/.gitkeep b/scripts/available_software/tests/detail/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/scripts/available_software/tests/reference_detail/CUDA-Samples.md b/scripts/available_software/tests/reference_detail/CUDA-Samples.md new file mode 100644 index 0000000000..65870e367d --- /dev/null +++ b/scripts/available_software/tests/reference_detail/CUDA-Samples.md @@ -0,0 +1,42 @@ +--- +hide: +- toc +json_ld: + '@context': https://schema.org + '@type': SoftwareApplication + applicationCategory: DeveloperApplication + description: Samples for CUDA Developers which demonstrates features in CUDA Toolkit + license: Not confirmed + name: CUDA-Samples + offers: + '@type': Offer + price: 0 + operatingSystem: LINUX + review: + '@type': Review + author: + '@type': Organization + name: EESSI + reviewBody: Application has been successfully made available on all architectures + supported by EESSI + reviewRating: + '@type': Rating + ratingValue: 5 + softwareRequirements: See https://www.eessi.io/docs/ for how to make EESSI available + on your system + softwareVersion: '[''12.1'']' + url: https://github.com/NVIDIA/cuda-samples +--- +# CUDA-Samples + + +Samples for CUDA Developers which demonstrates features in CUDA Toolkit + +homepage: [https://github.com/NVIDIA/cuda-samples](https://github.com/NVIDIA/cuda-samples) + +## Available installations + + +|CUDA-Samples version|Supported CPU targets|Supported GPU targets|EESSI version|Module| +| --- | --- | --- | --- | --- | +|12.1|`generic`: `aarch64`, `x86_64`
Arm: `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|NVIDIA: `cc70`, `cc80`, `cc90`
|2023.06|`CUDA-Samples/12.1-GCC-12.3.0-CUDA-12.1.1`| \ No newline at end of file diff --git a/scripts/available_software/tests/reference_detail/ESPResSo.md b/scripts/available_software/tests/reference_detail/ESPResSo.md new file mode 100644 index 0000000000..c5daed77ec --- /dev/null +++ b/scripts/available_software/tests/reference_detail/ESPResSo.md @@ -0,0 +1,46 @@ +--- +hide: +- toc +json_ld: + '@context': https://schema.org + '@type': SoftwareApplication + applicationCategory: DeveloperApplication + description: A software package for performing and analyzing scientific Molecular + Dynamics simulations. + license: Not confirmed + name: ESPResSo + offers: + '@type': Offer + price: 0 + operatingSystem: LINUX + review: + '@type': Review + author: + '@type': Organization + name: EESSI + reviewBody: Application has been successfully made available on all architectures + supported by EESSI + reviewRating: + '@type': Rating + ratingValue: 5 + softwareRequirements: See https://www.eessi.io/docs/ for how to make EESSI available + on your system + softwareVersion: '[''4.2.2'', ''4.2.1'']' + url: https://espressomd.org/wordpress +--- +# ESPResSo + + +A software package for performing and analyzing scientific Molecular Dynamics simulations. + +homepage: [https://espressomd.org/wordpress](https://espressomd.org/wordpress) + +## Available installations + + +|ESPResSo version|Supported CPU targets|Supported GPU targets|EESSI version|Module| +| --- | --- | --- | --- | --- | +|4.2.1|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2023.06|`ESPResSo/4.2.1-foss-2023a`| +|4.2.2|`generic`: `aarch64`, `x86_64`
Arm: `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|NVIDIA: `cc70`, `cc80`, `cc90`
|2023.06|`ESPResSo/4.2.2-foss-2023a-CUDA-12.1.1`| +|4.2.2|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2023.06|`ESPResSo/4.2.2-foss-2023a`| +|4.2.2|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2023.06|`ESPResSo/4.2.2-foss-2023b`| \ No newline at end of file diff --git a/scripts/available_software/tests/reference_detail/PMIx.md b/scripts/available_software/tests/reference_detail/PMIx.md new file mode 100644 index 0000000000..d748061fc0 --- /dev/null +++ b/scripts/available_software/tests/reference_detail/PMIx.md @@ -0,0 +1,77 @@ +--- +hide: +- toc +json_ld: + '@context': https://schema.org + '@type': SoftwareApplication + applicationCategory: DeveloperApplication + description: 'Process Management for Exascale Environments + + PMI Exascale (PMIx) represents an attempt to + + provide an extended version of the PMI standard specifically designed + + to support clusters up to and including exascale sizes. The overall + + objective of the project is not to branch the existing pseudo-standard + + definitions - in fact, PMIx fully supports both of the existing PMI-1 + + and PMI-2 APIs - but rather to (a) augment and extend those APIs to + + eliminate some current restrictions that impact scalability, and (b) + + provide a reference implementation of the PMI-server that demonstrates + + the desired level of scalability. + + ' + license: Not confirmed + name: PMIx + offers: + '@type': Offer + price: 0 + operatingSystem: LINUX + review: + '@type': Review + author: + '@type': Organization + name: EESSI + reviewBody: Application has been successfully made available on all architectures + supported by EESSI + reviewRating: + '@type': Rating + ratingValue: 5 + softwareRequirements: See https://www.eessi.io/docs/ for how to make EESSI available + on your system + softwareVersion: '[''5.0.8'', ''5.0.6'', ''5.0.2'', ''4.2.6'', ''4.2.4'', ''4.2.2'']' + url: https://pmix.org/ +--- +# PMIx + + +Process Management for Exascale Environments +PMI Exascale (PMIx) represents an attempt to +provide an extended version of the PMI standard specifically designed +to support clusters up to and including exascale sizes. The overall +objective of the project is not to branch the existing pseudo-standard +definitions - in fact, PMIx fully supports both of the existing PMI-1 +and PMI-2 APIs - but rather to (a) augment and extend those APIs to +eliminate some current restrictions that impact scalability, and (b) +provide a reference implementation of the PMI-server that demonstrates +the desired level of scalability. + + +homepage: [https://pmix.org/](https://pmix.org/) + +## Available installations + + +|PMIx version|Supported CPU targets|Supported GPU targets|EESSI version|Module| +| --- | --- | --- | --- | --- | +|4.2.2|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2023.06|`PMIx/4.2.2-GCCcore-12.2.0`| +|4.2.4|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2023.06|`PMIx/4.2.4-GCCcore-12.3.0`| +|4.2.6|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2023.06|`PMIx/4.2.6-GCCcore-13.2.0`| +|5.0.2|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2025.06|`PMIx/5.0.2-GCCcore-13.3.0`| +|5.0.6|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2025.06|`PMIx/5.0.6-GCCcore-14.2.0`| +|5.0.8|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2025.06|`PMIx/5.0.8-GCCcore-14.3.0`| \ No newline at end of file diff --git a/scripts/available_software/tests/reference_detail/Salmon.md b/scripts/available_software/tests/reference_detail/Salmon.md new file mode 100644 index 0000000000..5258926b74 --- /dev/null +++ b/scripts/available_software/tests/reference_detail/Salmon.md @@ -0,0 +1,44 @@ +--- +hide: +- toc +json_ld: + '@context': https://schema.org + '@type': SoftwareApplication + applicationCategory: DeveloperApplication + description: "Salmon is a wicked-fast program to produce a highly-accurate,\n transcript-level\ + \ quantification estimate from RNA-seq data." + license: Not confirmed + name: Salmon + offers: + '@type': Offer + price: 0 + operatingSystem: LINUX + review: + '@type': Review + author: + '@type': Organization + name: EESSI + reviewBody: Application has been successfully made available on all architectures + supported by EESSI + reviewRating: + '@type': Rating + ratingValue: 5 + softwareRequirements: See https://www.eessi.io/docs/ for how to make EESSI available + on your system + softwareVersion: '[''1.10.3'']' + url: https://github.com/COMBINE-lab/salmon +--- +# Salmon + + +Salmon is a wicked-fast program to produce a highly-accurate, + transcript-level quantification estimate from RNA-seq data. + +homepage: [https://github.com/COMBINE-lab/salmon](https://github.com/COMBINE-lab/salmon) + +## Available installations + + +|Salmon version|Supported CPU targets|Supported GPU targets|EESSI version|Module| +| --- | --- | --- | --- | --- | +|1.10.3|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2023.06|`Salmon/1.10.3-GCC-12.3.0`| \ No newline at end of file diff --git a/scripts/available_software/tests/reference_detail/hatchling.md b/scripts/available_software/tests/reference_detail/hatchling.md new file mode 100644 index 0000000000..7443073e6a --- /dev/null +++ b/scripts/available_software/tests/reference_detail/hatchling.md @@ -0,0 +1,151 @@ +--- +hide: +- toc +json_ld: + '@context': https://schema.org + '@type': SoftwareApplication + applicationCategory: DeveloperApplication + description: 'Extensible, standards compliant build backend used by Hatch, + + a modern, extensible Python project manager.' + license: Not confirmed + name: hatchling + offers: + '@type': Offer + price: 0 + operatingSystem: LINUX + review: + '@type': Review + author: + '@type': Organization + name: EESSI + reviewBody: Application has been successfully made available on all architectures + supported by EESSI + reviewRating: + '@type': Rating + ratingValue: 5 + softwareRequirements: See https://www.eessi.io/docs/ for how to make EESSI available + on your system + softwareVersion: '[''1.27.0'', ''1.24.2'', ''1.18.0'']' + url: https://hatch.pypa.io +--- +# hatchling + + +Extensible, standards compliant build backend used by Hatch, +a modern, extensible Python project manager. + +homepage: [https://hatch.pypa.io](https://hatch.pypa.io) + +## Available installations + + +|hatchling version|Supported CPU targets|Supported GPU targets|EESSI version|Module| +| --- | --- | --- | --- | --- | +|1.18.0|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2023.06|`hatchling/1.18.0-GCCcore-12.3.0`| +|1.18.0|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2023.06|`hatchling/1.18.0-GCCcore-13.2.0`| +|1.24.2|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2025.06|`hatchling/1.24.2-GCCcore-13.3.0`| +|1.27.0|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2025.06|`hatchling/1.27.0-GCCcore-14.2.0`| +|1.27.0|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2025.06|`hatchling/1.27.0-GCCcore-14.3.0`| + +## Extensions + +Overview of extensions included in hatchling installations + + +### editables + + +|`editables` version|hatchling modules that include it| +| --- | --- | +|0.3|`hatchling/1.18.0-GCCcore-12.3.0`| +|0.5|`hatchling/1.18.0-GCCcore-13.2.0`
`hatchling/1.24.2-GCCcore-13.3.0`
`hatchling/1.27.0-GCCcore-14.2.0`
`hatchling/1.27.0-GCCcore-14.3.0`| + +### hatch-docstring-description + + +|`hatch-docstring-description` version|hatchling modules that include it| +| --- | --- | +|1.1.1|`hatchling/1.27.0-GCCcore-14.3.0`| + +### hatch-fancy-pypi-readme + + +|`hatch-fancy-pypi-readme` version|hatchling modules that include it| +| --- | --- | +|24.1.0|`hatchling/1.24.2-GCCcore-13.3.0`
`hatchling/1.27.0-GCCcore-14.2.0`| +|25.1.0|`hatchling/1.27.0-GCCcore-14.3.0`| + +### hatch-requirements-txt + + +|`hatch-requirements-txt` version|hatchling modules that include it| +| --- | --- | +|0.4.1|`hatchling/1.18.0-GCCcore-12.3.0`
`hatchling/1.18.0-GCCcore-13.2.0`
`hatchling/1.24.2-GCCcore-13.3.0`
`hatchling/1.27.0-GCCcore-14.2.0`
`hatchling/1.27.0-GCCcore-14.3.0`| + +### hatch-vcs + + +|`hatch-vcs` version|hatchling modules that include it| +| --- | --- | +|0.4.0|`hatchling/1.24.2-GCCcore-13.3.0`
`hatchling/1.27.0-GCCcore-14.2.0`| +|0.5.0|`hatchling/1.27.0-GCCcore-14.3.0`| + +### hatch_fancy_pypi_readme + + +|`hatch_fancy_pypi_readme` version|hatchling modules that include it| +| --- | --- | +|23.1.0|`hatchling/1.18.0-GCCcore-12.3.0`
`hatchling/1.18.0-GCCcore-13.2.0`| + +### hatch_vcs + + +|`hatch_vcs` version|hatchling modules that include it| +| --- | --- | +|0.3.0|`hatchling/1.18.0-GCCcore-12.3.0`
`hatchling/1.18.0-GCCcore-13.2.0`| + +### hatchling + + +|`hatchling` version|hatchling modules that include it| +| --- | --- | +|1.18.0|`hatchling/1.18.0-GCCcore-12.3.0`
`hatchling/1.18.0-GCCcore-13.2.0`| +|1.24.2|`hatchling/1.24.2-GCCcore-13.3.0`| +|1.27.0|`hatchling/1.27.0-GCCcore-14.2.0`
`hatchling/1.27.0-GCCcore-14.3.0`| + +### pathspec + + +|`pathspec` version|hatchling modules that include it| +| --- | --- | +|0.11.1|`hatchling/1.18.0-GCCcore-12.3.0`| +|0.11.2|`hatchling/1.18.0-GCCcore-13.2.0`| +|0.12.1|`hatchling/1.24.2-GCCcore-13.3.0`
`hatchling/1.27.0-GCCcore-14.2.0`
`hatchling/1.27.0-GCCcore-14.3.0`| + +### pluggy + + +|`pluggy` version|hatchling modules that include it| +| --- | --- | +|1.2.0|`hatchling/1.18.0-GCCcore-12.3.0`| +|1.3.0|`hatchling/1.18.0-GCCcore-13.2.0`| +|1.5.0|`hatchling/1.24.2-GCCcore-13.3.0`
`hatchling/1.27.0-GCCcore-14.2.0`| +|1.6.0|`hatchling/1.27.0-GCCcore-14.3.0`| + +### trove-classifiers + + +|`trove-classifiers` version|hatchling modules that include it| +| --- | --- | +|2024.5.22|`hatchling/1.24.2-GCCcore-13.3.0`| +|2025.2.18.16|`hatchling/1.27.0-GCCcore-14.2.0`| +|2025.5.9.12|`hatchling/1.27.0-GCCcore-14.3.0`| + +### trove_classifiers + + +|`trove_classifiers` version|hatchling modules that include it| +| --- | --- | +|2023.10.18|`hatchling/1.18.0-GCCcore-13.2.0`| +|2023.5.24|`hatchling/1.18.0-GCCcore-12.3.0`| \ No newline at end of file diff --git a/scripts/available_software/tests/reference_detail/xterm.md b/scripts/available_software/tests/reference_detail/xterm.md new file mode 100644 index 0000000000..e4f2e34d45 --- /dev/null +++ b/scripts/available_software/tests/reference_detail/xterm.md @@ -0,0 +1,42 @@ +--- +hide: +- toc +json_ld: + '@context': https://schema.org + '@type': SoftwareApplication + applicationCategory: DeveloperApplication + description: X11 terminal emulator for the X Window System + license: Not confirmed + name: xterm + offers: + '@type': Offer + price: 0 + operatingSystem: LINUX + review: + '@type': Review + author: + '@type': Organization + name: EESSI + reviewBody: Application has been successfully made available on all architectures + supported by EESSI + reviewRating: + '@type': Rating + ratingValue: 5 + softwareRequirements: See https://www.eessi.io/docs/ for how to make EESSI available + on your system + softwareVersion: '[''402'']' + url: https://xterm.dev/ +--- +# xterm + + +X11 terminal emulator for the X Window System + +homepage: [https://xterm.dev/](https://xterm.dev/) + +## Available installations + + +|xterm version|Supported CPU targets|Supported GPU targets|EESSI version|Module| +| --- | --- | --- | --- | --- | +|402|`generic`: `aarch64`, `x86_64`
Arm: `a64fx`, `neoverse_n1`, `neoverse_v1`, `nvidia/grace`
AMD: `zen2`, `zen3`, `zen4`
Intel: `haswell`, `skylake_avx512`, `sapphirerapids`, `icelake`, `cascadelake`
|*(none)*|2025.06|`xterm/402-GCCcore-13.3.0`| \ No newline at end of file diff --git a/scripts/available_software/tests/test_data.py b/scripts/available_software/tests/test_data.py deleted file mode 100644 index ddfdac459e..0000000000 --- a/scripts/available_software/tests/test_data.py +++ /dev/null @@ -1,33 +0,0 @@ -import os -from available_software import modules_eessi, get_unique_software_names - -GENERIC = "/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic" -ZEN2 = "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2" - - -class TestData: - # --------------------------- - # Class level setup/teardown - # --------------------------- - path = os.path.dirname(os.path.realpath(__file__)) - - @classmethod - def setup_class(cls): - os.environ["TESTS_PATH"] = cls.path - os.environ["LMOD_CMD"] = cls.path + "/data/lmod_mock.sh" - os.environ["SHELL"] = cls.path + "/data/bash_mock.sh" - os.environ["MOCK_FILE_SWAP"] = cls.path + "/data/data_swap_TARGET.txt" - os.environ["MOCK_FILE_AVAIL_TARGET"] = cls.path + "/data/data_avail_target_simple.txt" - os.environ["MOCK_FILE_AVAIL_TARGET_AMD_INTEL"] = cls.path + "/data/data_avail_target_amd_intel.txt" - - # --------------------------- - # Module tests - # --------------------------- - - def test_data_eessi(self): - sol = modules_eessi() - assert len(sol) == 2 - assert len(sol[GENERIC]) == 13 - assert len(sol[ZEN2]) == 15 - assert list(get_unique_software_names(sol[GENERIC])) == ["Markov", "cfd", "science"] - assert list(get_unique_software_names(sol[ZEN2])) == ["cfd", "llm", "science"] diff --git a/scripts/available_software/tests/test_json.py b/scripts/available_software/tests/test_json.py deleted file mode 100644 index e12d0666bc..0000000000 --- a/scripts/available_software/tests/test_json.py +++ /dev/null @@ -1,77 +0,0 @@ -from available_software import (generate_json_overview_data, - generate_json_overview, - modules_eessi, - generate_json_detailed, - generate_json_detailed_data) -import os -import json - -GENERIC_ARM = "/cvmfs/software.eessi.io/versions/2023.06/software/linux/aarch64/generic" -ZEN2 = "/cvmfs/software.eessi.io/versions/2023.06/software/linux/x86_64/amd/zen2" - - -class TestJSON: - # --------------------------- - # Class level setup/teardown - # --------------------------- - - path = os.path.dirname(os.path.realpath(__file__)) - - @classmethod - def setup_class(cls): - os.environ["TESTS_PATH"] = cls.path - os.environ["LMOD_CMD"] = cls.path + "/data/lmod_mock.sh" - os.environ["MOCK_FILE_SWAP"] = cls.path + "/data/data_swap_TARGET.txt" - os.environ["MOCK_FILE_AVAIL_TARGET"] = cls.path + "/data/data_avail_target_simple.txt" - os.environ["MOCK_FILE_SHOW"] = cls.path + "/data/data_show_science.txt" - - @classmethod - def teardown_class(cls): - if os.path.exists("json_data.json"): - os.remove("json_data.json") - os.remove("json_data_detail.json") - - # --------------------------- - # Markdown tests - # --------------------------- - - def test_json_generate_simple(self): - modules = modules_eessi() - json_data = generate_json_overview_data(modules) - assert len(json_data.keys()) == 3 - assert list(json_data["targets"]) == [GENERIC_ARM, ZEN2] - assert json_data["modules"] == { - "Markov": [1, 0], - "cfd": [1, 1], - "llm": [0, 1], - "science": [1, 1] - } - - def test_json_simple(self): - modules = modules_eessi() - json_path = generate_json_overview(modules, ".") - with open(json_path) as json_data: - data_generated = json.load(json_data) - - with open(self.path + "/data/test_json_simple_sol.json") as json_data: - data_solution = json.load(json_data) - - assert len(data_generated) == 3 - assert data_generated["modules"] == data_solution["modules"] - assert data_generated["targets"] == data_solution["targets"] - - def test_json_detail_simple(self): - modules = modules_eessi() - json_data = generate_json_detailed_data(modules) - json_path = generate_json_detailed(json_data, ".") - assert os.path.exists("json_data_detail.json") - - with open(json_path) as json_data: - data_generated = json.load(json_data) - - with open(self.path + "/data/test_json_simple_sol_detail.json") as json_data: - data_solution = json.load(json_data) - - assert len(data_generated) == 3 - assert data_generated["targets"] == data_solution["targets"] - assert data_generated["software"] == data_solution["software"] diff --git a/scripts/available_software/tests/test_md.py b/scripts/available_software/tests/test_md.py index 02fc16142d..e0b26000f5 100644 --- a/scripts/available_software/tests/test_md.py +++ b/scripts/available_software/tests/test_md.py @@ -1,6 +1,5 @@ from mdutils.mdutils import MdUtils -from available_software import get_unique_software_names, modules_eessi, generate_table_data, generate_module_table -from available_software import generate_detail_pages +import available_software import os import filecmp import shutil @@ -15,41 +14,24 @@ class TestMarkdown: @classmethod def setup_class(cls): - os.environ["TESTS_PATH"] = cls.path - os.environ["LMOD_CMD"] = cls.path + "/data/lmod_mock.sh" - os.environ["MOCK_FILE_SWAP"] = cls.path + "/data/data_swap_TARGET.txt" - os.environ["MOCK_FILE_AVAIL_TARGET"] = cls.path + "/data/data_avail_target_simple.txt" + os.environ["AVAIL_SOFTWARE_TEST_DIRECTORY"] = cls.path @classmethod def teardown_class(cls): - if os.path.exists("test_simple.md"): - os.remove("test_simple.md") - if os.path.exists("detailed_md"): - shutil.rmtree("detailed_md") + directory = os.path.join(cls.path, "detail") + if os.path.exists(directory): + for file in os.listdir(directory): + if file.endswith('.md'): + os.remove(os.path.join(directory, file)) # --------------------------- # Markdown tests # --------------------------- - def test_table_generate_simple(self): - simple_data = get_unique_software_names(modules_eessi()) - table_data, col, row = generate_table_data(simple_data) - assert col == 3 - assert row == 5 - assert len(table_data) == 15 - - def test_md_simple(self): - md_file = MdUtils(file_name='test_simple', title='Overview Modules') - simple_data = get_unique_software_names(modules_eessi()) - generate_module_table(simple_data, md_file) - md_file.create_md_file() - assert os.path.exists("test_simple.md") - assert filecmp.cmp(self.path + "/data/test_md_simple_sol.md", "test_simple.md") - def test_md_detailed_template(self): - os.environ["TIME_GENERATED_TEMPLATE"] = "{{ generated_date }}" - os.mkdir('detailed_md') - generate_detail_pages(self.path + "/data/test_json_simple_sol_detail.json", 'detailed_md') - del os.environ["TIME_GENERATED_TEMPLATE"] - assert os.path.exists("detailed_md/science.md") - assert filecmp.cmp(self.path + "/data/test_md_template_detailed_science_sol.md", "detailed_md/science.md") + markdown_target = "detail" + available_software.main() + for markdown_file in os.listdir(os.path.join(self.path, "reference_detail")): + target_markdown_file = os.path.join(self.path, markdown_target, markdown_file) + assert os.path.exists(target_markdown_file) + assert filecmp.cmp(target_markdown_file, os.path.join(self.path, "reference_detail", markdown_file)) diff --git a/scripts/available_software/tests/test_module.py b/scripts/available_software/tests/test_module.py deleted file mode 100644 index 4af33d1782..0000000000 --- a/scripts/available_software/tests/test_module.py +++ /dev/null @@ -1,43 +0,0 @@ -import os -from available_software import module_avail, filter_fn_eessi_modules, module_whatis - - -class TestModule: - # --------------------------- - # Class level setup/teardown - # --------------------------- - path = os.path.dirname(os.path.realpath(__file__)) - - @classmethod - def setup_class(cls): - os.environ["TESTS_PATH"] = cls.path - os.environ["LMOD_CMD"] = cls.path + "/data/lmod_mock.sh" - - # --------------------------- - # Module tests - # --------------------------- - - def test_avail(self): - os.environ["MOCK_FILE_AVAIL"] = self.path + "/data/data_avail_simple_zen2.txt" - output = module_avail() - assert len(output) == 16 - - def test_avail_filtered(self): - os.environ["MOCK_FILE_AVAIL"] = self.path + "/data/data_avail_simple_zen2.txt" - output = module_avail(filter_fn=filter_fn_eessi_modules) - assert len(output) == 15 - assert list(output) == [ - "cfd/1.0", "cfd/2.0", "cfd/3.0", "cfd/24", "cfd/", "cfd/5.0", - "cfd/2.0afqsdf", "llm/20230627", "llm/20230627", "llm/20230627", "science/", - "science/5.3.0", "science/5.3.0", "science/5.3.0", "science/7.2.0" - ] - - def test_whatis(self): - os.environ["MOCK_FILE_SHOW"] = self.path + "/data/data_show_science.txt" - data = module_whatis("science") - assert data == { - "Description": "Bundle for scientific software", - "Homepage": "https://science.com/", - "URL": "https://science.com/", - "Extensions": "ext-1.2.3, ext-2.3.4" - } From 73ea2ee4fc19b5e40d81af79bedbe4c826a6eb6e Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Wed, 18 Mar 2026 13:10:56 +0100 Subject: [PATCH 2/5] Fix lint issues --- scripts/available_software/tests/test_md.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/available_software/tests/test_md.py b/scripts/available_software/tests/test_md.py index e0b26000f5..1466672234 100644 --- a/scripts/available_software/tests/test_md.py +++ b/scripts/available_software/tests/test_md.py @@ -1,8 +1,6 @@ -from mdutils.mdutils import MdUtils import available_software import os import filecmp -import shutil class TestMarkdown: @@ -21,7 +19,7 @@ def teardown_class(cls): directory = os.path.join(cls.path, "detail") if os.path.exists(directory): for file in os.listdir(directory): - if file.endswith('.md'): + if file.endswith(".md"): os.remove(os.path.join(directory, file)) # --------------------------- From 550e2f9a11428bbf87d310894be72798051c5853 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Wed, 18 Mar 2026 13:15:33 +0100 Subject: [PATCH 3/5] Don't initialise EESSI if we don't need it --- .github/workflows/script_module_list.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/script_module_list.yml b/.github/workflows/script_module_list.yml index c9f04fe54e..23f9734e7d 100644 --- a/.github/workflows/script_module_list.yml +++ b/.github/workflows/script_module_list.yml @@ -34,12 +34,6 @@ jobs: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 - - name: Make EESSI available - uses: eessi/github-action-eessi@v3 - - name: Set up Python - uses: eessi/github-action-eessi@v3 - with: - python-version: '3.7' - name: Install dependencies run: | python -m venv venv From f1156566188562ce86e2e3ff383840348beb7b53 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Wed, 18 Mar 2026 13:35:06 +0100 Subject: [PATCH 4/5] Don't remove the data folder, we keep it around but empty --- .github/workflows/test_overview_available_software.yml | 7 ++----- .github/workflows/update_available_software.yml | 4 ++-- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test_overview_available_software.yml b/.github/workflows/test_overview_available_software.yml index 03d30fe31a..672872286a 100644 --- a/.github/workflows/test_overview_available_software.yml +++ b/.github/workflows/test_overview_available_software.yml @@ -36,14 +36,11 @@ jobs: python scripts/available_software/available_software.py ./scripts/update_generated_time.sh mkdocs.yml - # determine whether pull request should be opened: + # determine whether pull request would need to be opened: # if detailed software pages in docs/available_software/detail have been updated, then a PR should be opened if [[ $(git status --porcelain ./docs/available_software/detail) ]]; then echo "Software pages have been changed, PR should be opened" git diff ./docs/available_software/detail else echo "Software pages have not been changed, no need to open PR" - fi - - # remove the data directory containing the original JSON file, or it'll end up in the PR being opened - rm -r ${data_dir} + fi \ No newline at end of file diff --git a/.github/workflows/update_available_software.yml b/.github/workflows/update_available_software.yml index 289c365638..e4f97008c5 100644 --- a/.github/workflows/update_available_software.yml +++ b/.github/workflows/update_available_software.yml @@ -48,8 +48,8 @@ jobs: echo "json_data_changed=no" >> $GITHUB_OUTPUT fi - # remove the data directory containing the original JSON file, or it'll end up in the PR being opened - rm -r ${data_dir} + # remove the JSON file in the data directory, or it'll end up in the PR being opened + rm -r ${data_dir}/*.json - name: create pull request uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 From c77ad7d6cc07deaea35bee564969505babaa564d Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Wed, 18 Mar 2026 13:36:42 +0100 Subject: [PATCH 5/5] Restore newline --- .github/workflows/test_overview_available_software.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_overview_available_software.yml b/.github/workflows/test_overview_available_software.yml index 672872286a..8b9372a10b 100644 --- a/.github/workflows/test_overview_available_software.yml +++ b/.github/workflows/test_overview_available_software.yml @@ -43,4 +43,4 @@ jobs: git diff ./docs/available_software/detail else echo "Software pages have not been changed, no need to open PR" - fi \ No newline at end of file + fi