Skip to content

Commit 3105c86

Browse files
committed
improve software overview: sort alphabetically across software project + extensions, move main.py to docs/available_software/macros.py, add comments
1 parent c2d2b12 commit 3105c86

File tree

5 files changed

+74
-35
lines changed

5 files changed

+74
-35
lines changed

docs/available_software/css/software.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
/*
2+
* CSS sytlesheet for software overview, see docs/available_software/
3+
*/
4+
15
.software-name {
26
font-size: 0.9rem;
37
font-weight: 700;

docs/available_software/index.md

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
{% set data = load_json_eessi_software() %}
22
{% set software = data.software %}
3-
{% set extensions = data.extensions %}
43

54
# Software available in EESSI
65

7-
<em>{{ data.n_software }} unique software projects are currently available in EESSI (+ {{ data.n_extensions }} unique extensions)</em>
6+
Overview of software available in [EESSI's production repository `software.eessi.io`](../repositories/software.eessi.io.md).
87

8+
<em>{{ data.n_software }} unique software projects (+ {{ data.n_extensions }} unique extensions)</em>
9+
10+
!!! warning "Details on GPU installations not included yet"
11+
12+
The overview currently doesn't expose information about GPU installations of software yet.
13+
14+
This will be resolved soon.
15+
16+
<!-- see also docs/available_software/javascripts/software-filter.js -->
917
<input type="search" id="software-search" class="md-input"
1018
placeholder="Filter software..."
1119
style="width:100%; margin-bottom:1rem;">
@@ -14,6 +22,24 @@
1422

1523
{% for pkg in software %}
1624
{% set pkg_slug = pkg.name | replace(' ', '-') %}
25+
{% if pkg.is_extension -%}
26+
- <span class="software-item software-card"
27+
data-search="name:{{ pkg.name }} extension ext_type:{{ pkg.type }}" >
28+
<span class="software-name"><a href="https://eessi.io/docs/available_software/detail/{{ pkg_slug }}">{{ pkg.name }}</a></span>
29+
<span class="software-more-info"><small>(extension)</small></span>
30+
<br/>
31+
<p class="software-description">
32+
{{ pkg.name }} is a {% if pkg.type == "python" -%} Python package{% elif pkg.type == "r" -%}R library{% elif pkg.type == "perl" -%}Perl module{% endif %}
33+
that is included as extension in the following software installations:
34+
<ul>
35+
{% for parent in pkg.all_parent_names %}
36+
{% set parent_slug = parent | replace(' ', '-') %}
37+
<li><a href="https://eessi.io/docs/available_software/detail/{{ parent_slug }}">{{ parent }}</a></li>
38+
{% endfor %}
39+
</p>
40+
</ul>
41+
</span>
42+
{% else -%}
1743
- <span class="software-item software-card"
1844
data-search="name:{{ pkg.name }} {{ pkg.homepage }} {{ pkg.description }} {{ pkg.cpu_families }} {{ pkg.eessi_versions }} ">
1945

@@ -30,30 +56,14 @@
3056
<br/>
3157
<span class="software-cpus">Supported CPU families: {% if 'AMD' in pkg.cpu_families -%}<span class="software-cpu-amd">AMD</span>{% endif %}{% if 'Intel' in pkg.cpu_families -%}<span class="software-cpu-intel">Intel</span>{% endif %}{% if 'Arm' in pkg.cpu_families -%}<span class="software-cpu-arm">Arm</span>{% endif %}{% if 'RISC-V' in pkg.cpu_families -%}<span class="software-cpu-riscv">RISC-V</span>{% endif %}</span>
3258
<br/>
33-
<span class="software-gpus">Supported GPU families: <span class="software-gpu-amd">AMD</span> <span class="software-gpu-nvidia">NVIDIA</span></span>
59+
<span class="software-gpus">Supported GPU families: {% if pkg.gpu_families == '' -%}<em>(none)</em>{% else -%}{% if 'AMD' in pkg.gpu_families -%}<span class="software-gpu-amd">AMD</span>{% endif %}{% if 'NVIDIA' in pkg.gpu_families -%}<span class="software-gpu-nvidia">NVIDIA</span>{% endif %}{% endif %}</span>
3460
<br/>
3561
</span>
36-
{% endfor %}
37-
38-
{% for ext in extensions.values() %}
39-
{% set ext_slug = ext.name | replace(' ', '-') %}
40-
- <span class="software-item software-card"
41-
data-search="name:{{ ext.name }} extension" >
42-
<span class="software-name"><a href="https://eessi.io/docs/available_software/detail/{{ ext_slug }}">{{ ext.name }}</a> <em>(extension)</em></span>
43-
<br/>
44-
<p class="software-description">
45-
{% if ext.type == "python" -%} Python package{% elif ext.type == "r" -%}R library{% elif ext.type == "perl" -%}Perl module{% endif %} included as extension to the following
46-
software installations:
47-
<ul>
48-
{% for parent in ext.parents %}
49-
{% set parent_slug = parent | replace(' ', '-') %}
50-
<li><a href="https://eessi.io/docs/available_software/detail/{{ parent_slug }}">{{ parent }}</a></li>
51-
{% endfor %}
52-
</p>
53-
</ul>
54-
</span>
62+
{% endif %}
5563
{% endfor %}
5664

5765
</div>
5866

67+
---
68+
5969
<small><em>Last update: {{ data.timestamp }}</em></small>

docs/available_software/javascripts/software-filter.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
/*
2+
* Javascript for search box in software overview page (see docs/available_software/index.md)
3+
*/
14
document.addEventListener("DOMContentLoaded", () => {
25
const input = document.getElementById("software-search");
36
const cards = document.querySelectorAll(".software-card");

main.py renamed to docs/available_software/macros.py

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,17 @@ def load_json_eessi_software():
2929
data = json.loads(response.read().decode('utf-8'))
3030

3131
data_software = data['software']
32-
names = data['software'].keys()
32+
names = data_software.keys()
33+
34+
ext_parents = {}
3335

3436
res = {
3537
'timestamp': data['timestamp'],
3638
'n_software': len(names),
3739
'software': [],
38-
'extensions': {},
3940
}
40-
for name in sorted(names):
41-
name_data = data['software'][name]
41+
for name in names:
42+
name_data = data_software[name]
4243
versions = name_data['versions']
4344

4445
# use description is last version
@@ -64,29 +65,48 @@ def load_json_eessi_software():
6465
'n_versions': len(versions),
6566
'licenses': licenses,
6667
'cpu_families': ', '.join(x for x in sorted(cpu_families)),
68+
'gpu_families': '',
69+
'is_extension': False,
6770
}
6871

6972
for version in versions:
7073

74+
# determine EESSI version in which this software version is installed
7175
req_mods = version['required_modules']
7276
if req_mods and req_mods[0].get('module_name') == 'EESSI':
7377
eessi_versions.add(req_mods[0]['module_version'])
7478

79+
# pick up on extensions included in this software installation (if any)
7580
for ext in version['extensions']:
7681
ext_key = ext['type'] + ':' + ext['name']
77-
if ext_key in res['extensions']:
78-
res['extensions'][ext_key]['parents'].add(name)
82+
83+
# keep track of "parents" for this extension name (per extension version)
84+
if ext_key in ext_parents:
85+
parents = ext_parents[ext_key]
7986
else:
80-
res['extensions'][ext_key] = {
87+
parents = {}
88+
ext_parents[ext_key] = parents
89+
# new extension, so also add it to list of software
90+
res['software'].append({
91+
'is_extension': True,
8192
'name': ext['name'],
8293
'type': ext['type'],
83-
'parents': set([name]),
84-
}
94+
'parents': parents,
95+
})
96+
parent = {'name': name, 'full_module_name': version['module']['full_module_name']}
97+
parents.setdefault(ext['version'], []).append(parent)
8598

8699
software['eessi_versions'] = ', '.join(sorted(eessi_versions))
87-
88100
res['software'].append(software)
89101

90-
res['n_extensions'] = len(res['extensions'])
102+
res['software'] = sorted(res['software'], key=lambda x: x['name'].lower())
103+
104+
# collect names of all parents per extension
105+
for ext in (x for x in res['software'] if x['is_extension']):
106+
ext['all_parent_names'] = set([y['name'] for x in ext['parents'].values() for y in x])
107+
108+
res['n_extensions'] = len([x for x in res['software'] if x['is_extension']])
109+
110+
print(f"[software overview] {res['n_software']=}, {res['n_extensions']=}")
91111

92112
return res

mkdocs.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,10 @@ plugins:
9797
- git-revision-date-localized
9898
# necessary for search to work
9999
- search
100-
# Enable macros so we can use global variables
101-
- macros
100+
# Enable macros so we can use global variables, and use Jinja2 templates
101+
# see also https://mkdocs-macros-plugin.readthedocs.io/en/latest/macros/
102+
- macros:
103+
module_name: docs/available_software/macros
102104
- redirects:
103105
redirect_maps:
104106
# useful easy-to-remember short URLs, don't remove these!

0 commit comments

Comments
 (0)