Software Gardening Almanack Example#
This notebook demonstrates installing and using the Software Gardening Almanack Python package. The Almanack is an open-source handbook of applied guidance and tools for sustainable software development and maintenance.
# install the almanack from pypi
import json
import pandas as pd
import almanack
!pip install almanack
Requirement already satisfied: almanack in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (0.0.0.post1.dev0+d4fcd79)
Requirement already satisfied: charset-normalizer<4.0.0,>=3.4.0 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from almanack) (3.4.3)
Requirement already satisfied: defusedxml<0.8.0,>=0.7.1 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from almanack) (0.7.1)
Requirement already satisfied: fire<0.8,>=0.6 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from almanack) (0.7.1)
Requirement already satisfied: pygit2>=1.15.1 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from almanack) (1.18.2)
Requirement already satisfied: pyyaml<7.0.0,>=6.0.1 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from almanack) (6.0.2)
Requirement already satisfied: requests<3.0.0,>=2.32.3 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from almanack) (2.32.5)
Requirement already satisfied: tabulate<0.10.0,>=0.9.0 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from almanack) (0.9.0)
Requirement already satisfied: termcolor in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from fire<0.8,>=0.6->almanack) (2.4.0)
Requirement already satisfied: idna<4,>=2.5 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from requests<3.0.0,>=2.32.3->almanack) (3.7)
Requirement already satisfied: urllib3<3,>=1.21.1 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from requests<3.0.0,>=2.32.3->almanack) (2.5.0)
Requirement already satisfied: certifi>=2017.4.17 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from requests<3.0.0,>=2.32.3->almanack) (2024.7.4)
Requirement already satisfied: cffi>=1.17.0 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from pygit2>=1.15.1->almanack) (1.17.1)
Requirement already satisfied: pycparser in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from cffi>=1.17.0->pygit2>=1.15.1->almanack) (2.21)
[notice] A new release of pip is available: 25.1.1 -> 25.2
[notice] To update, run: pip install --upgrade pip
# clone the almanack repo for example usage below
# we will apply the almanack tool to the almanack repo
!git clone https://github.com/software-gardening/almanack
Cloning into 'almanack'...
remote: Enumerating objects: 3427, done.
remote: Counting objects: 1% (1/79)
remote: Counting objects: 2% (2/79)
remote: Counting objects: 3% (3/79)
remote: Counting objects: 5% (4/79)
remote: Counting objects: 6% (5/79)
remote: Counting objects: 7% (6/79)
remote: Counting objects: 8% (7/79)
remote: Counting objects: 10% (8/79)
remote: Counting objects: 11% (9/79)
remote: Counting objects: 12% (10/79)
remote: Counting objects: 13% (11/79)
remote: Counting objects: 15% (12/79)
remote: Counting objects: 16% (13/79)
remote: Counting objects: 17% (14/79)
remote: Counting objects: 18% (15/79)
remote: Counting objects: 20% (16/79)
remote: Counting objects: 21% (17/79)
remote: Counting objects: 22% (18/79)
remote: Counting objects: 24% (19/79)
remote: Counting objects: 25% (20/79)
remote: Counting objects: 26% (21/79)
remote: Counting objects: 27% (22/79)
remote: Counting objects: 29% (23/79)
remote: Counting objects: 30% (24/79)
remote: Counting objects: 31% (25/79)
remote: Counting objects: 32% (26/79)
remote: Counting objects: 34% (27/79)
remote: Counting objects: 35% (28/79)
remote: Counting objects: 36% (29/79)
remote: Counting objects: 37% (30/79)
remote: Counting objects: 39% (31/79)
remote: Counting objects: 40% (32/79)
remote: Counting objects: 41% (33/79)
remote: Counting objects: 43% (34/79)
remote: Counting objects: 44% (35/79)
remote: Counting objects: 45% (36/79)
remote: Counting objects: 46% (37/79)
remote: Counting objects: 48% (38/79)
remote: Counting objects: 49% (39/79)
remote: Counting objects: 50% (40/79)
remote: Counting objects: 51% (41/79)
remote: Counting objects: 53% (42/79)
remote: Counting objects: 54% (43/79)
remote: Counting objects: 55% (44/79)
remote: Counting objects: 56% (45/79)
remote: Counting objects: 58% (46/79)
remote: Counting objects: 59% (47/79)
remote: Counting objects: 60% (48/79)
remote: Counting objects: 62% (49/79)
remote: Counting objects: 63% (50/79)
remote: Counting objects: 64% (51/79)
remote: Counting objects: 65% (52/79)
remote: Counting objects: 67% (53/79)
remote: Counting objects: 68% (54/79)
remote: Counting objects: 69% (55/79)
remote: Counting objects: 70% (56/79)
remote: Counting objects: 72% (57/79)
remote: Counting objects: 73% (58/79)
remote: Counting objects: 74% (59/79)
remote: Counting objects: 75% (60/79)
remote: Counting objects: 77% (61/79)
remote: Counting objects: 78% (62/79)
remote: Counting objects: 79% (63/79)
remote: Counting objects: 81% (64/79)
remote: Counting objects: 82% (65/79)
remote: Counting objects: 83% (66/79)
remote: Counting objects: 84% (67/79)
remote: Counting objects: 86% (68/79)
remote: Counting objects: 87% (69/79)
remote: Counting objects: 88% (70/79)
remote: Counting objects: 89% (71/79)
remote: Counting objects: 91% (72/79)
remote: Counting objects: 92% (73/79)
remote: Counting objects: 93% (74/79)
remote: Counting objects: 94% (75/79)
remote: Counting objects: 96% (76/79)
remote: Counting objects: 97% (77/79)
remote: Counting objects: 98% (78/79)
remote: Counting objects: 100% (79/79)
remote: Counting objects: 100% (79/79), done.
remote: Compressing objects: 1% (1/52)
remote: Compressing objects: 3% (2/52)
remote: Compressing objects: 5% (3/52)
remote: Compressing objects: 7% (4/52)
remote: Compressing objects: 9% (5/52)
remote: Compressing objects: 11% (6/52)
remote: Compressing objects: 13% (7/52)
remote: Compressing objects: 15% (8/52)
remote: Compressing objects: 17% (9/52)
remote: Compressing objects: 19% (10/52)
remote: Compressing objects: 21% (11/52)
remote: Compressing objects: 23% (12/52)
remote: Compressing objects: 25% (13/52)
remote: Compressing objects: 26% (14/52)
remote: Compressing objects: 28% (15/52)
remote: Compressing objects: 30% (16/52)
remote: Compressing objects: 32% (17/52)
remote: Compressing objects: 34% (18/52)
remote: Compressing objects: 36% (19/52)
remote: Compressing objects: 38% (20/52)
remote: Compressing objects: 40% (21/52)
remote: Compressing objects: 42% (22/52)
remote: Compressing objects: 44% (23/52)
remote: Compressing objects: 46% (24/52)
remote: Compressing objects: 48% (25/52)
remote: Compressing objects: 50% (26/52)
remote: Compressing objects: 51% (27/52)
remote: Compressing objects: 53% (28/52)
remote: Compressing objects: 55% (29/52)
remote: Compressing objects: 57% (30/52)
remote: Compressing objects: 59% (31/52)
remote: Compressing objects: 61% (32/52)
remote: Compressing objects: 63% (33/52)
remote: Compressing objects: 65% (34/52)
remote: Compressing objects: 67% (35/52)
remote: Compressing objects: 69% (36/52)
remote: Compressing objects: 71% (37/52)
remote: Compressing objects: 73% (38/52)
remote: Compressing objects: 75% (39/52)
remote: Compressing objects: 76% (40/52)
remote: Compressing objects: 78% (41/52)
remote: Compressing objects: 80% (42/52)
remote: Compressing objects: 82% (43/52)
remote: Compressing objects: 84% (44/52)
remote: Compressing objects: 86% (45/52)
remote: Compressing objects: 88% (46/52)
remote: Compressing objects: 90% (47/52)
remote: Compressing objects: 92% (48/52)
remote: Compressing objects: 94% (49/52)
remote: Compressing objects: 96% (50/52)
remote: Compressing objects: 98% (51/52)
remote: Compressing objects: 100% (52/52)
remote: Compressing objects: 100% (52/52), done.
Receiving objects: 0% (1/3427)
Receiving objects: 1% (35/3427)
Receiving objects: 2% (69/3427)
Receiving objects: 3% (103/3427)
Receiving objects: 4% (138/3427)
Receiving objects: 5% (172/3427)
Receiving objects: 6% (206/3427)
Receiving objects: 7% (240/3427)
Receiving objects: 8% (275/3427)
Receiving objects: 9% (309/3427)
Receiving objects: 10% (343/3427)
Receiving objects: 11% (377/3427)
Receiving objects: 12% (412/3427)
Receiving objects: 13% (446/3427)
Receiving objects: 13% (459/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 14% (480/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 15% (515/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 16% (549/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 17% (583/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 18% (617/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 19% (652/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 20% (686/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 21% (720/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 22% (754/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 23% (789/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 24% (823/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 25% (857/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 26% (892/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 27% (926/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 28% (960/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 29% (994/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 30% (1029/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 31% (1063/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 32% (1097/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 33% (1131/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 34% (1166/3427), 55.41 MiB | 55.40 MiB/s
Receiving objects: 35% (1200/3427), 79.86 MiB | 53.23 MiB/s
Receiving objects: 36% (1234/3427), 79.86 MiB | 53.23 MiB/s
Receiving objects: 37% (1268/3427), 79.86 MiB | 53.23 MiB/s
Receiving objects: 38% (1303/3427), 79.86 MiB | 53.23 MiB/s
Receiving objects: 39% (1337/3427), 79.86 MiB | 53.23 MiB/s
Receiving objects: 39% (1354/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 40% (1371/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 41% (1406/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 42% (1440/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 43% (1474/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 44% (1508/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 45% (1543/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 46% (1577/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 47% (1611/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 48% (1645/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 49% (1680/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 50% (1714/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 51% (1748/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 52% (1783/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 53% (1817/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 54% (1851/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 55% (1885/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 56% (1920/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 57% (1954/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 58% (1988/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 59% (2022/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 60% (2057/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 61% (2091/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 62% (2125/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 63% (2160/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 64% (2194/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 65% (2228/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 66% (2262/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 67% (2297/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 68% (2331/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 69% (2365/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 70% (2399/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 71% (2434/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 72% (2468/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 73% (2502/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 74% (2536/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 75% (2571/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 76% (2605/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 77% (2639/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 78% (2674/3427), 101.25 MiB | 50.62 MiB/s
Receiving objects: 79% (2708/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 80% (2742/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 81% (2776/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 82% (2811/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 83% (2845/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 84% (2879/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 85% (2913/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 86% (2948/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 87% (2982/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 88% (3016/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 89% (3051/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 90% (3085/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 91% (3119/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 92% (3153/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 93% (3188/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 94% (3222/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 95% (3256/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 96% (3290/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 97% (3325/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 98% (3359/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 99% (3393/3427), 127.75 MiB | 51.10 MiB/s
remote: Total 3427 (delta 21), reused 42 (delta 13), pack-reused 3348 (from 2)
Receiving objects: 100% (3427/3427), 127.75 MiB | 51.10 MiB/s
Receiving objects: 100% (3427/3427), 147.10 MiB | 53.10 MiB/s, done.
Resolving deltas: 0% (0/1862)
Resolving deltas: 1% (19/1862)
Resolving deltas: 2% (38/1862)
Resolving deltas: 3% (57/1862)
Resolving deltas: 4% (75/1862)
Resolving deltas: 5% (94/1862)
Resolving deltas: 6% (112/1862)
Resolving deltas: 7% (132/1862)
Resolving deltas: 8% (150/1862)
Resolving deltas: 9% (168/1862)
Resolving deltas: 10% (187/1862)
Resolving deltas: 11% (205/1862)
Resolving deltas: 12% (224/1862)
Resolving deltas: 13% (243/1862)
Resolving deltas: 14% (261/1862)
Resolving deltas: 15% (280/1862)
Resolving deltas: 16% (298/1862)
Resolving deltas: 17% (317/1862)
Resolving deltas: 18% (336/1862)
Resolving deltas: 19% (354/1862)
Resolving deltas: 20% (373/1862)
Resolving deltas: 21% (392/1862)
Resolving deltas: 22% (410/1862)
Resolving deltas: 23% (429/1862)
Resolving deltas: 24% (447/1862)
Resolving deltas: 25% (466/1862)
Resolving deltas: 26% (485/1862)
Resolving deltas: 27% (504/1862)
Resolving deltas: 28% (522/1862)
Resolving deltas: 29% (540/1862)
Resolving deltas: 30% (559/1862)
Resolving deltas: 31% (578/1862)
Resolving deltas: 32% (596/1862)
Resolving deltas: 33% (615/1862)
Resolving deltas: 34% (634/1862)
Resolving deltas: 35% (652/1862)
Resolving deltas: 36% (671/1862)
Resolving deltas: 37% (689/1862)
Resolving deltas: 38% (708/1862)
Resolving deltas: 39% (727/1862)
Resolving deltas: 40% (745/1862)
Resolving deltas: 41% (764/1862)
Resolving deltas: 42% (783/1862)
Resolving deltas: 43% (801/1862)
Resolving deltas: 44% (820/1862)
Resolving deltas: 45% (838/1862)
Resolving deltas: 46% (857/1862)
Resolving deltas: 47% (876/1862)
Resolving deltas: 48% (894/1862)
Resolving deltas: 49% (913/1862)
Resolving deltas: 50% (931/1862)
Resolving deltas: 51% (950/1862)
Resolving deltas: 52% (969/1862)
Resolving deltas: 53% (987/1862)
Resolving deltas: 54% (1006/1862)
Resolving deltas: 55% (1025/1862)
Resolving deltas: 56% (1043/1862)
Resolving deltas: 57% (1062/1862)
Resolving deltas: 58% (1080/1862)
Resolving deltas: 59% (1099/1862)
Resolving deltas: 60% (1118/1862)
Resolving deltas: 61% (1136/1862)
Resolving deltas: 62% (1155/1862)
Resolving deltas: 63% (1174/1862)
Resolving deltas: 64% (1192/1862)
Resolving deltas: 65% (1211/1862)
Resolving deltas: 66% (1229/1862)
Resolving deltas: 67% (1248/1862)
Resolving deltas: 68% (1267/1862)
Resolving deltas: 69% (1285/1862)
Resolving deltas: 70% (1304/1862)
Resolving deltas: 71% (1323/1862)
Resolving deltas: 72% (1341/1862)
Resolving deltas: 73% (1360/1862)
Resolving deltas: 73% (1367/1862)
Resolving deltas: 74% (1378/1862)
Resolving deltas: 75% (1397/1862)
Resolving deltas: 76% (1416/1862)
Resolving deltas: 76% (1427/1862)
Resolving deltas: 77% (1434/1862)
Resolving deltas: 78% (1453/1862)
Resolving deltas: 79% (1471/1862)
Resolving deltas: 80% (1490/1862)
Resolving deltas: 81% (1509/1862)
Resolving deltas: 82% (1527/1862)
Resolving deltas: 83% (1546/1862)
Resolving deltas: 84% (1565/1862)
Resolving deltas: 85% (1583/1862)
Resolving deltas: 86% (1602/1862)
Resolving deltas: 87% (1620/1862)
Resolving deltas: 88% (1639/1862)
Resolving deltas: 89% (1658/1862)
Resolving deltas: 90% (1676/1862)
Resolving deltas: 91% (1695/1862)
Resolving deltas: 92% (1714/1862)
Resolving deltas: 93% (1732/1862)
Resolving deltas: 94% (1751/1862)
Resolving deltas: 95% (1769/1862)
Resolving deltas: 96% (1788/1862)
Resolving deltas: 97% (1807/1862)
Resolving deltas: 98% (1825/1862)
Resolving deltas: 99% (1844/1862)
Resolving deltas: 100% (1862/1862)
Resolving deltas: 100% (1862/1862), done.
%%time
# gather the almanack table using the almanack repo as a reference
almanack_table = almanack.metrics.data.get_table("almanack")
# show the almanack table as a Pandas DataFrame
pd.DataFrame(almanack_table)
CPU times: user 3.03 s, sys: 108 ms, total: 3.14 s
Wall time: 5.65 s
name | id | result-type | sustainability_correlation | description | correction_guidance | fix_why | fix_how | result | |
---|---|---|---|---|---|---|---|---|---|
0 | repo-path | SGA-META-0001 | str | 0 | Repository path (local directory). | None | None | None | /home/runner/work/almanack/almanack/src/book/s... |
1 | repo-commits | SGA-META-0002 | int | 0 | Total number of commits for the repository. | None | None | None | 227 |
2 | repo-file-count | SGA-META-0003 | int | 0 | Total number of files tracked within the repos... | None | None | None | 151 |
3 | repo-commit-time-range | SGA-META-0004 | tuple | 0 | Starting commit and most recent commit for the... | None | None | None | (2024-03-05, 2025-09-03) |
4 | repo-days-of-development | SGA-META-0005 | int | 0 | Integer representing the number of days of dev... | None | None | None | 548 |
5 | repo-commits-per-day | SGA-META-0006 | float | 0 | Floating point number which represents the num... | None | None | None | 0.414234 |
6 | almanack-table-datetime | SGA-META-0007 | str | 0 | String representing the date when this table w... | None | None | None | 2025-09-03T23:52:09.537263Z |
7 | almanack-version | SGA-META-0008 | str | 0 | String representing the version of the almanac... | None | None | None | 0.0.0.post1.dev0+d4fcd79 |
8 | repo-primary-language | SGA-META-0009 | str | 0 | Detected primary programming language of the r... | None | None | None | Jupyter Notebook |
9 | repo-primary-license | SGA-META-0010 | str | 0 | Detected primary license of the repository. | None | None | None | bsd-3-clause |
10 | repo-doi | SGA-META-0011 | str | 0 | Repository DOI value detected from CITATION.cf... | None | None | None | 10.5281/zenodo.14765834 |
11 | repo-doi-publication-date | SGA-META-0012 | str | 0 | Repository DOI publication date detected from ... | None | None | None | None |
12 | repo-doi-fwci | SGA-META-0013 | float | 0 | Field-Weighted Citation Impact (FWCI) from Ope... | None | None | None | None |
13 | repo-doi-is-not-retracted | SGA-META-0014 | bool | 0 | If the work referenced by the repository DOI h... | None | None | None | None |
14 | repo-doi-grants-count | SGA-META-0015 | int | 0 | Count of grant records attached to the DOI's w... | None | None | None | 0 |
15 | repo-doi-grants | SGA-META-0016 | list | 0 | List of grant records for the DOI's work (from... | None | None | None | None |
16 | repo-almanack-score | SGA-META-0017 | dict | 0 | Dictionary of length three, including the foll... | None | None | None | {'almanack-score-numerator': 11, 'almanack-sco... |
17 | repo-includes-readme | SGA-GL-0001 | bool | 1 | Boolean value indicating the presence of a REA... | Consider adding a README file to the repository. | A README file is essential for providing an ov... | Create a README file in the root directory of ... | True |
18 | repo-includes-contributing | SGA-GL-0002 | bool | 1 | Boolean value indicating the presence of a CON... | Consider adding a CONTRIBUTING file to the rep... | A CONTRIBUTING file is important for guiding p... | Create a CONTRIBUTING file in the root directo... | True |
19 | repo-includes-code-of-conduct | SGA-GL-0003 | bool | 1 | Boolean value indicating the presence of a COD... | Consider adding a CODE_OF_CONDUCT file to the ... | A CODE_OF_CONDUCT file is essential for establ... | Create a CODE_OF_CONDUCT file in the root dire... | True |
20 | repo-includes-license | SGA-GL-0004 | bool | 1 | Boolean value indicating the presence of a LIC... | Consider adding a LICENSE file to the repository. | A LICENSE file is crucial for defining the ter... | Create a LICENSE file in the root directory of... | True |
21 | repo-is-citable | SGA-GL-0005 | bool | 1 | Boolean value indicating the presence of a CIT... | Consider adding a CITATION file to the reposit... | A CITATION file is important for providing a s... | Create a CITATION file in the root directory o... | True |
22 | repo-default-branch-not-master | SGA-GL-0006 | bool | 1 | Boolean value indicating that the repo uses a ... | Consider using a default source control branch... | Using a default branch name other than 'master... | Change the default branch name in your source ... | True |
23 | repo-includes-common-docs | SGA-GL-0007 | bool | 1 | Boolean value indicating whether the repo incl... | Consider including project documentation throu... | Including a 'docs/' directory with common docu... | Create a 'docs/' directory in the root of your... | True |
24 | repo-unique-contributors | SGA-GL-0008 | int | 0 | Count of unique contributors since the beginni... | None | None | None | 5 |
25 | repo-unique-contributors-past-year | SGA-GL-0009 | int | 0 | Count of unique contributors within the last y... | None | None | None | 3 |
26 | repo-unique-contributors-past-182-days | SGA-GL-0010 | int | 0 | Count of unique contributors within the last 1... | None | None | None | 3 |
27 | repo-tags-count | SGA-GL-0011 | int | 0 | Count of the number of tags within the reposit... | None | None | None | 14 |
28 | repo-tags-count-past-year | SGA-GL-0012 | int | 0 | Count of the number of tags within the reposit... | None | None | None | 12 |
29 | repo-tags-count-past-182-days | SGA-GL-0013 | int | 0 | Count of the number of tags within the reposit... | None | None | None | 7 |
30 | repo-stargazers-count | SGA-GL-0014 | int | 0 | Count of the number of stargazers on repositor... | None | None | None | 12 |
31 | repo-uses-issues | SGA-GL-0015 | bool | 1 | Whether the repository uses issues (for exampl... | Consider leveraging issues for tracking bugs a... | Using issues for tracking bugs and features he... | Enable issues on your repository hosting platf... | True |
32 | repo-issues-open-count | SGA-GL-0016 | int | 0 | Count of open issues for repository. | None | None | None | 73 |
33 | repo-pull-requests-enabled | SGA-GL-0017 | bool | 1 | Whether the repository enables pull requests. | Consider enabling pull requests for the reposi... | None | None | True |
34 | repo-forks-count | SGA-GL-0018 | int | 0 | Count of forks of the repository. | None | None | None | 3 |
35 | repo-subscribers-count | SGA-GL-0019 | int | 0 | Count of subscribers (or watchers) of the repo... | None | None | None | 1 |
36 | repo-packages-ecosystems | SGA-GL-0020 | list | 0 | List of package platforms or services where th... | None | None | None | [pypi] |
37 | repo-packages-ecosystems-count | SGA-GL-0021 | int | 0 | Count of package platforms or services where t... | None | None | None | 1 |
38 | repo-packages-versions-count | SGA-GL-0022 | int | 0 | Count of package versions on package hosts or ... | None | None | None | 15 |
39 | repo-social-media-platforms | SGA-GL-0023 | list | 0 | Social media platforms detected within the rea... | None | None | None | [] |
40 | repo-social-media-platforms-count | SGA-GL-0024 | int | 0 | Count of social media platforms detected withi... | None | None | None | 0 |
41 | repo-doi-valid-format | SGA-GL-0025 | bool | 1 | Whether the DOI found in the CITATION.cff file... | DOI within the CITATION.cff file is not of a v... | A valid DOI format is essential for ensuring t... | Ensure that the DOI in the CITATION.cff file f... | True |
42 | repo-doi-https-resolvable | SGA-GL-0026 | bool | 1 | Whether the DOI found in the CITATION.cff file... | DOI within the CITATION.cff file is not HTTPS ... | An HTTPS resolvable DOI is crucial for ensurin... | Verify that the DOI in the CITATION.cff file c... | True |
43 | repo-doi-cited-by-count | SGA-GL-0027 | int | 0 | How many other works cite the DOI for the repo... | None | None | None | None |
44 | repo-days-between-doi-publication-date-and-lat... | SGA-GL-0028 | int | 0 | The number of days between the most recent com... | None | None | None | None |
45 | repo-gh-workflow-success-ratio | SGA-SF-0001 | float | 0 | Ratio of succeeding workflow runs out of queri... | None | None | None | 0.75 |
46 | repo-gh-workflow-succeeding-runs | SGA-SF-0002 | int | 0 | Number of succeeding workflow runs out of quer... | None | None | None | 100 |
47 | repo-gh-workflow-failing-runs | SGA-SF-0003 | int | 0 | Number of failing workflow runs out of queried... | None | None | None | 75 |
48 | repo-gh-workflow-queried-total | SGA-SF-0004 | int | 0 | Total number of workflow runs from GitHub (onl... | None | None | None | 25 |
49 | repo-code-coverage-percent | SGA-SF-0005 | float | 0 | Percentage of code coverage for repository giv... | None | None | None | None |
50 | repo-date-of-last-coverage-run | SGA-SF-0006 | str | 0 | Date of code coverage run for repository given... | None | None | None | None |
51 | repo-days-between-last-coverage-run-latest-commit | SGA-SF-0007 | int | 0 | Days between last coverage run date and latest... | None | None | None | None |
52 | repo-code-coverage-total-lines | SGA-SF-0008 | int | 0 | Total lines of code used for code coverage wit... | None | None | None | None |
53 | repo-code-coverage-executed-lines | SGA-SF-0009 | int | 0 | Total lines covered code within repository giv... | None | None | None | None |
54 | repo-agg-info-entropy | SGA-VS-0001 | float | 0 | Aggregated information entropy for all files w... | None | None | None | 0.00306 |
55 | repo-file-info-entropy | SGA-VS-0002 | dict | 0 | File-level information entropy for all files w... | None | None | None | {'.alexignore': 8.07420058602789e-05, '.github... |
# print the json with indentation
print(json.dumps(almanack_table, indent=4))
[
{
"name": "repo-path",
"id": "SGA-META-0001",
"result-type": "str",
"sustainability_correlation": 0,
"description": "Repository path (local directory).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": "/home/runner/work/almanack/almanack/src/book/seed-bank/almanack-example/almanack"
},
{
"name": "repo-commits",
"id": "SGA-META-0002",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Total number of commits for the repository.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 227
},
{
"name": "repo-file-count",
"id": "SGA-META-0003",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Total number of files tracked within the repository.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 151
},
{
"name": "repo-commit-time-range",
"id": "SGA-META-0004",
"result-type": "tuple",
"sustainability_correlation": 0,
"description": "Starting commit and most recent commit for the repository.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": [
"2024-03-05",
"2025-09-03"
]
},
{
"name": "repo-days-of-development",
"id": "SGA-META-0005",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Integer representing the number of days of development between most recent commit and first commit.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 548
},
{
"name": "repo-commits-per-day",
"id": "SGA-META-0006",
"result-type": "float",
"sustainability_correlation": 0,
"description": "Floating point number which represents the number of commits per day (using days of development).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 0.4142335766423358
},
{
"name": "almanack-table-datetime",
"id": "SGA-META-0007",
"result-type": "str",
"sustainability_correlation": 0,
"description": "String representing the date when this table was generated in the format of '%Y-%m-%dT%H:%M:%S.%fZ', for example: 2024-11-22T18:20:30.123456Z .",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": "2025-09-03T23:52:09.537263Z"
},
{
"name": "almanack-version",
"id": "SGA-META-0008",
"result-type": "str",
"sustainability_correlation": 0,
"description": "String representing the version of the almanack which was used to generate this table.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": "0.0.0.post1.dev0+d4fcd79"
},
{
"name": "repo-primary-language",
"id": "SGA-META-0009",
"result-type": "str",
"sustainability_correlation": 0,
"description": "Detected primary programming language of the repository.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": "Jupyter Notebook"
},
{
"name": "repo-primary-license",
"id": "SGA-META-0010",
"result-type": "str",
"sustainability_correlation": 0,
"description": "Detected primary license of the repository.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": "bsd-3-clause"
},
{
"name": "repo-doi",
"id": "SGA-META-0011",
"result-type": "str",
"sustainability_correlation": 0,
"description": "Repository DOI value detected from CITATION.cff file.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": "10.5281/zenodo.14765834"
},
{
"name": "repo-doi-publication-date",
"id": "SGA-META-0012",
"result-type": "str",
"sustainability_correlation": 0,
"description": "Repository DOI publication date detected from CITATION.cff file and OpenAlex.org.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": null
},
{
"name": "repo-doi-fwci",
"id": "SGA-META-0013",
"result-type": "float",
"sustainability_correlation": 0,
"description": "Field-Weighted Citation Impact (FWCI) from OpenAlex for the work referenced by the repository DOI.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": null
},
{
"name": "repo-doi-is-not-retracted",
"id": "SGA-META-0014",
"result-type": "bool",
"sustainability_correlation": 0,
"description": "If the work referenced by the repository DOI has been retracted as reported by OpenAlex.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": null
},
{
"name": "repo-doi-grants-count",
"id": "SGA-META-0015",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Count of grant records attached to the DOI's work (from OpenAlex via Crossref).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 0
},
{
"name": "repo-doi-grants",
"id": "SGA-META-0016",
"result-type": "list",
"sustainability_correlation": 0,
"description": "List of grant records for the DOI's work (from OpenAlex via Crossref).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": null
},
{
"name": "repo-almanack-score",
"id": "SGA-META-0017",
"result-type": "dict",
"sustainability_correlation": 0,
"description": "Dictionary of length three, including the following: 1) number of Almanack boolean metrics that passed (numerator), 2) number of total Almanack boolean metrics considered (denominator), and 3) a score that represents how likely the repository will be maintained over time based (numerator / denominator).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": {
"almanack-score-numerator": 11,
"almanack-score-denominator": 11,
"almanack-score": 1.0
}
},
{
"name": "repo-includes-readme",
"id": "SGA-GL-0001",
"result-type": "bool",
"sustainability_correlation": 1,
"description": "Boolean value indicating the presence of a README file in the repository.",
"correction_guidance": "Consider adding a README file to the repository.",
"fix_why": "A README file is essential for providing an overview of the project, its purpose, and how to use it. Many platforms like GitHub, GitLab, and Bitbucket use the README file to display project information prominently.",
"fix_how": "Create a README file in the root directory of your repository. Include sections such as project description, installation instructions, usage examples, and contribution guidelines. You can use Markdown to format the README for better readability. For example, you can start with a text editor or use an online Markdown editor to create your README file. Save it as `README.md` in the root of your repository. If you're using GitHub, you can also use their web interface to create and edit the README file directly.",
"result": true
},
{
"name": "repo-includes-contributing",
"id": "SGA-GL-0002",
"result-type": "bool",
"sustainability_correlation": 1,
"description": "Boolean value indicating the presence of a CONTRIBUTING file in the repository.",
"correction_guidance": "Consider adding a CONTRIBUTING file to the repository.",
"fix_why": "A CONTRIBUTING file is important for guiding potential contributors on how to contribute to the project, including coding standards, pull request guidelines, and other relevant information. It helps maintain a consistent contribution process and encourages community involvement.",
"fix_how": "Create a CONTRIBUTING file in the root directory of your repository. Include guidelines for contributing, such as coding standards, pull request instructions, and any other relevant information. You can use Markdown to format the CONTRIBUTING file for better readability. For example, you can start with a text editor or use an online Markdown editor to create your CONTRIBUTING file. Save it as `CONTRIBUTING.md` in the root of your repository. If you're using GitHub, you can also use their web interface to create and edit the CONTRIBUTING file directly.",
"result": true
},
{
"name": "repo-includes-code-of-conduct",
"id": "SGA-GL-0003",
"result-type": "bool",
"sustainability_correlation": 1,
"description": "Boolean value indicating the presence of a CODE_OF_CONDUCT file in the repository.",
"correction_guidance": "Consider adding a CODE_OF_CONDUCT file to the repository.",
"fix_why": "A CODE_OF_CONDUCT file is essential for establishing a respectful and inclusive community within the project. It sets expectations for behavior, helps prevent harassment, and provides a framework for resolving conflicts.",
"fix_how": "Create a CODE_OF_CONDUCT file in the root directory of your repository. Include guidelines for acceptable behavior, reporting procedures, and any other relevant information. You can use Markdown to format the CODE_OF_CONDUCT file for better readability. For example, you can start with a text editor or use an online Markdown editor to create your CODE_OF_CONDUCT file. Save it as `CODE_OF_CONDUCT.md` in the root of your repository. If you're using GitHub, you can also use their web interface to create and edit the CODE_OF_CONDUCT file directly.",
"result": true
},
{
"name": "repo-includes-license",
"id": "SGA-GL-0004",
"result-type": "bool",
"sustainability_correlation": 1,
"description": "Boolean value indicating the presence of a LICENSE file in the repository.",
"correction_guidance": "Consider adding a LICENSE file to the repository.",
"fix_why": "A LICENSE file is crucial for defining the terms under which the code can be used, modified, and distributed. It helps protect both the authors and users of the code by clarifying legal rights and responsibilities.",
"fix_how": "Create a LICENSE file in the root directory of your repository. Include the text of the license you wish to apply to your code. You can choose from existing open-source licenses, such as MIT, Apache 2.0, or GPL, depending on your project's needs. For example, you can start with a text editor or use an online license generator to create your LICENSE file. Save it as `LICENSE` or `LICENSE.txt` in the root of your repository. If you're using GitHub, you can also use their web interface to create and edit the LICENSE file directly.",
"result": true
},
{
"name": "repo-is-citable",
"id": "SGA-GL-0005",
"result-type": "bool",
"sustainability_correlation": 1,
"description": "Boolean value indicating the presence of a CITATION file or some other means of indicating how to cite the work.",
"correction_guidance": "Consider adding a CITATION file to the repository (e.g. citation.cff, etc.).",
"fix_why": "A CITATION file is important for providing a standardized way to cite the work, making it easier for others to reference and acknowledge the project in their own work. It helps promote the visibility and impact of the project within the academic and research communities.",
"fix_how": "Create a CITATION file in the root directory of your repository. Include information on how to cite the work, such as the authors, title, publication date, and any relevant identifiers (e.g., DOI). You can use the Citation File Format (CFF) standard to structure the CITATION file for better compatibility with citation tools. For example, you can start with a text editor or use an online CFF editor to create your CITATION file. Save it as `CITATION.cff` in the root of your repository. If you're using GitHub, you can also use their web interface to create and edit the CITATION file directly.",
"result": true
},
{
"name": "repo-default-branch-not-master",
"id": "SGA-GL-0006",
"result-type": "bool",
"sustainability_correlation": 1,
"description": "Boolean value indicating that the repo uses a default branch name besides 'master'.",
"correction_guidance": "Consider using a default source control branch name other than 'master'.",
"fix_why": "Using a default branch name other than 'master' is more collaborative and avoids possible negative historical connotations associated with the term.",
"fix_how": "Change the default branch name in your source control platform (e.g., GitHub, GitLab, Bitbucket) to a more inclusive term like 'main', 'develop', or any other preferred name. This can usually be done through the repository settings or by renaming the branch locally and pushing the changes to the remote repository.",
"result": true
},
{
"name": "repo-includes-common-docs",
"id": "SGA-GL-0007",
"result-type": "bool",
"sustainability_correlation": 1,
"description": "Boolean value indicating whether the repo includes common documentation directory and files associated with building docsites.",
"correction_guidance": "Consider including project documentation through the 'docs/' directory.",
"fix_why": "Including a 'docs/' directory with common documentation files helps in maintaining a clear structure for project documentation, making it easier for contributors and users to find relevant information. It also promotes better collaboration and understanding of the project.",
"fix_how": "Create a 'docs/' directory in the root of your repository. Inside this directory, include common documentation files such as 'index.md', 'CONTRIBUTING.md', 'CODE_OF_CONDUCT.md', and any other relevant documentation files that provide information about the project, its usage, and contribution guidelines. You can use Markdown to format these files for better readability. If you're using GitHub, you can also use their web interface to create and edit these files directly within the 'docs/' directory.",
"result": true
},
{
"name": "repo-unique-contributors",
"id": "SGA-GL-0008",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Count of unique contributors since the beginning of the repository.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 5
},
{
"name": "repo-unique-contributors-past-year",
"id": "SGA-GL-0009",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Count of unique contributors within the last year from now (where now is a reference to table value of almanack-table-datetime).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 3
},
{
"name": "repo-unique-contributors-past-182-days",
"id": "SGA-GL-0010",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Count of unique contributors within the last 182 days from now (where now is a reference to table value of almanack-table-datetime).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 3
},
{
"name": "repo-tags-count",
"id": "SGA-GL-0011",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Count of the number of tags within the repository.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 14
},
{
"name": "repo-tags-count-past-year",
"id": "SGA-GL-0012",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Count of the number of tags within the repository within the last year from now (where now is a reference to table value of almanack-table-datetime).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 12
},
{
"name": "repo-tags-count-past-182-days",
"id": "SGA-GL-0013",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Count of the number of tags within the repository within the last 182 days from now (where now is a reference to table value of almanack-table-datetime).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 7
},
{
"name": "repo-stargazers-count",
"id": "SGA-GL-0014",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Count of the number of stargazers on repository remote hosting platform.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 12
},
{
"name": "repo-uses-issues",
"id": "SGA-GL-0015",
"result-type": "bool",
"sustainability_correlation": 1,
"description": "Whether the repository uses issues (for example, as a bug and/or feature tracking tool.",
"correction_guidance": "Consider leveraging issues for tracking bugs and/or features within your repository hosting platform.",
"fix_why": "Using issues for tracking bugs and features helps in maintaining a clear record of project development, facilitates collaboration, and allows for better prioritization of tasks.",
"fix_how": "Enable issues on your repository hosting platform (e.g., GitHub, GitLab, Bitbucket) if not already enabled. This can usually be done through the repository settings or by creating an issue template. Encourage contributors to use issues for reporting bugs, suggesting features, and discussing project-related topics.",
"result": true
},
{
"name": "repo-issues-open-count",
"id": "SGA-GL-0016",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Count of open issues for repository.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 73
},
{
"name": "repo-pull-requests-enabled",
"id": "SGA-GL-0017",
"result-type": "bool",
"sustainability_correlation": 1,
"description": "Whether the repository enables pull requests.",
"correction_guidance": "Consider enabling pull requests for the repository through your repository hosting platform.",
"fix_why": null,
"fix_how": null,
"result": true
},
{
"name": "repo-forks-count",
"id": "SGA-GL-0018",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Count of forks of the repository.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 3
},
{
"name": "repo-subscribers-count",
"id": "SGA-GL-0019",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Count of subscribers (or watchers) of the repository.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 1
},
{
"name": "repo-packages-ecosystems",
"id": "SGA-GL-0020",
"result-type": "list",
"sustainability_correlation": 0,
"description": "List of package platforms or services where the repository was detected (leveraging the ecosyste.ms packages API).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": [
"pypi"
]
},
{
"name": "repo-packages-ecosystems-count",
"id": "SGA-GL-0021",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Count of package platforms or services where the repository was detected (leveraging the ecosyste.ms packages API).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 1
},
{
"name": "repo-packages-versions-count",
"id": "SGA-GL-0022",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Count of package versions on package hosts or services where the repository was detected (leveraging the ecosyste.ms packages API).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 15
},
{
"name": "repo-social-media-platforms",
"id": "SGA-GL-0023",
"result-type": "list",
"sustainability_correlation": 0,
"description": "Social media platforms detected within the readme.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": []
},
{
"name": "repo-social-media-platforms-count",
"id": "SGA-GL-0024",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Count of social media platforms detected within the readme.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 0
},
{
"name": "repo-doi-valid-format",
"id": "SGA-GL-0025",
"result-type": "bool",
"sustainability_correlation": 1,
"description": "Whether the DOI found in the CITATION.cff file is of a valid format.",
"correction_guidance": "DOI within the CITATION.cff file is not of a valid format or missing.",
"fix_why": "A valid DOI format is essential for ensuring that the DOI can be resolved and used to reference the work correctly.",
"fix_how": "Ensure that the DOI in the CITATION.cff file follows the standard DOI format, which typically includes a prefix (e.g., 10.1234) and a suffix (e.g., 56789/abcde). The DOI should be in the format: `10.<prefix>/<suffix>`. If the DOI is missing or incorrectly formatted, update it to match the correct structure.",
"result": true
},
{
"name": "repo-doi-https-resolvable",
"id": "SGA-GL-0026",
"result-type": "bool",
"sustainability_correlation": 1,
"description": "Whether the DOI found in the CITATION.cff file is HTTPS resolvable.",
"correction_guidance": "DOI within the CITATION.cff file is not HTTPS resolvable or missing.",
"fix_why": "An HTTPS resolvable DOI is crucial for ensuring that the DOI can be accessed securely and reliably, allowing users to retrieve the work associated with the DOI.",
"fix_how": "Verify that the DOI in the CITATION.cff file can be resolved using an HTTPS URL. The DOI should be formatted as: `https://doi.org/10.<prefix>/<suffix>`. If the DOI is not resolvable or does not use HTTPS, update it to ensure it points to a valid and secure URL.",
"result": true
},
{
"name": "repo-doi-cited-by-count",
"id": "SGA-GL-0027",
"result-type": "int",
"sustainability_correlation": 0,
"description": "How many other works cite the DOI for the repository found within the CITATION.cff as discovered by the OpenAlex.org API.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": null
},
{
"name": "repo-days-between-doi-publication-date-and-latest-commit",
"id": "SGA-GL-0028",
"result-type": "int",
"sustainability_correlation": 0,
"description": "The number of days between the most recent commit and DOI for the repository's publication date as discovered by the OpenAlex.org API.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": null
},
{
"name": "repo-gh-workflow-success-ratio",
"id": "SGA-SF-0001",
"result-type": "float",
"sustainability_correlation": 0,
"description": "Ratio of succeeding workflow runs out of queried workflow runs from GitHub (only applies to GitHub hosted repositories which use workflows).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 0.75
},
{
"name": "repo-gh-workflow-succeeding-runs",
"id": "SGA-SF-0002",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Number of succeeding workflow runs out of queried workflow runs from GitHub (only applies to GitHub hosted repositories which use workflows).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 100
},
{
"name": "repo-gh-workflow-failing-runs",
"id": "SGA-SF-0003",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Number of failing workflow runs out of queried workflow runs from GitHub (only applies to GitHub hosted repositories which use workflows).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 75
},
{
"name": "repo-gh-workflow-queried-total",
"id": "SGA-SF-0004",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Total number of workflow runs from GitHub (only applies to GitHub hosted repositories which use workflows).",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 25
},
{
"name": "repo-code-coverage-percent",
"id": "SGA-SF-0005",
"result-type": "float",
"sustainability_correlation": 0,
"description": "Percentage of code coverage for repository given detected code coverage data.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": null
},
{
"name": "repo-date-of-last-coverage-run",
"id": "SGA-SF-0006",
"result-type": "str",
"sustainability_correlation": 0,
"description": "Date of code coverage run for repository given detected code coverage data.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": null
},
{
"name": "repo-days-between-last-coverage-run-latest-commit",
"id": "SGA-SF-0007",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Days between last coverage run date and latest commit date.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": null
},
{
"name": "repo-code-coverage-total-lines",
"id": "SGA-SF-0008",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Total lines of code used for code coverage within repository given detected code coverage data.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": null
},
{
"name": "repo-code-coverage-executed-lines",
"id": "SGA-SF-0009",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Total lines covered code within repository given detected code coverage data.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": null
},
{
"name": "repo-agg-info-entropy",
"id": "SGA-VS-0001",
"result-type": "float",
"sustainability_correlation": 0,
"description": "Aggregated information entropy for all files within a repository given a range between two commits (by default, the first and latest commits). Represents value from 0 to 1 where 0 equals no information entropy and 1 represents maximum information entropy.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": 0.0030602673416902076
},
{
"name": "repo-file-info-entropy",
"id": "SGA-VS-0002",
"result-type": "dict",
"sustainability_correlation": 0,
"description": "File-level information entropy for all files within a repository given a range between two commits (by default, the first and latest commits). Shows all files and their corresponding information entropy measurements relative to the other files found within the range of commits.",
"correction_guidance": null,
"fix_why": null,
"fix_how": null,
"result": {
".alexignore": 8.07420058602789e-05,
".github/ISSUE_TEMPLATE/bug.yml": 0.0022860628255131406,
".github/ISSUE_TEMPLATE/config.yml": 8.07420058602789e-05,
".github/ISSUE_TEMPLATE/feature.yml": 0.0020598892080447764,
".github/PULL_REQUEST_TEMPLATE.md": 0.0011668694232510053,
".github/actions/install-node-env/action.yml": 0.000475780917830426,
".github/actions/install-python-env/action.yml": 0.0009444881777740652,
".github/dependabot.yml": 0.001111843568000494,
".github/release-drafter.yml": 0.0006857251467934946,
".github/workflows/deploy-book.yml": 0.0012759015022791992,
".github/workflows/draft-release.yml": 0.0007441650202983199,
".github/workflows/entropy-check.yml": 0.0018300135635623657,
".github/workflows/pre-commit-checks.yml": 0.001111843568000494,
".github/workflows/publish-pypi.yml": 0.0008593760319026213,
".github/workflows/pytest-tests.yml": 0.0013568474881922171,
".github/workflows/test-links.yml": 0.0006857251467934946,
".gitignore": 0.003861238234043436,
".linkcheckerrc.ini": 0.0005669009349143671,
".pre-commit-config.yaml": 0.0048749573271535005,
".pre-commit-hooks.yaml": 0.00041388345158456806,
".vale.ini": 0.000475780917830426,
"CITATION.cff": 0.00494120573985889,
"CODE_OF_CONDUCT.md": 0.0001171206902258263,
"CONTRIBUTING.md": 0.0001171206902258263,
"LICENSE": 0.0008878626414556587,
"LICENSE.txt": 0.0008878626414556587,
"README.md": 0.0026802421499498305,
"coverage.xml": 0.023154236188316423,
"docs/readme.md": 0.0001171206902258263,
"media/coverage-badge.svg": 4.2645974151753495e-05,
"pa11y.json": 0.00025381525746651134,
"package-lock.json": 0.026682330661217064,
"package.json": 0.00018681827278613808,
"poetry.lock": 0.06625317341062548,
"pyproject.toml": 0.005270220396545561,
"src/almanack/__init__.py": 0.0007731675938503989,
"src/almanack/book.py": 0.0019582076535179585,
"src/almanack/cli.py": 0.006279386033661657,
"src/almanack/git.py": 0.009093980233265218,
"src/almanack/metrics/data.py": 0.01748303678241423,
"src/almanack/metrics/entropy/calculate_entropy.py": 0.002946110343741851,
"src/almanack/metrics/entropy/processing_repositories.py": 0.0019582076535179585,
"src/almanack/metrics/garden_lattice/connectedness.py": 0.0070121928193081825,
"src/almanack/metrics/garden_lattice/practicality.py": 0.003089553445034517,
"src/almanack/metrics/garden_lattice/understanding.py": 0.0016483268945009307,
"src/almanack/metrics/metrics.yml": 0.014783453607424946,
"src/almanack/metrics/remote.py": 0.0024843341592140243,
"src/almanack/reporting/report.py": 0.0032319596179088894,
"src/book/_config.yml": 0.0015168098568427203,
"src/book/_ext/__init__.py": 0.0,
"src/book/_ext/gen_check_pages.py": 0.002753139251947365,
"src/book/_posters/2025/_extensions/quarto-ext/poster/_extension.yml": 0.0003508868333561357,
"src/book/_posters/2025/_extensions/quarto-ext/poster/typst-show.typ": 0.002110453836781493,
"src/book/_posters/2025/_extensions/quarto-ext/poster/typst-template.typ": 0.004474147589660086,
"src/book/_posters/2025/almanack-2025-poster.pdf": 0.0,
"src/book/_posters/2025/images/almanack-handbook.png": 0.0,
"src/book/_posters/2025/images/almanack-notebook.png": 0.0,
"src/book/_posters/2025/images/almanack-package-and-handbook.png": 0.0,
"src/book/_posters/2025/images/almanack-package.png": 0.0,
"src/book/_posters/2025/images/bssw-logo-w-background.png": 0.0,
"src/book/_posters/2025/images/cu-anschutz-short.png": 0.0,
"src/book/_posters/2025/images/dbmi.png": 0.0,
"src/book/_posters/2025/images/entropy-for-repos.png": 0.0,
"src/book/_posters/2025/images/forest_modified.png": 0.0,
"src/book/_posters/2025/images/header-combined-images.png": 0.0,
"src/book/_posters/2025/images/roadmap.png": 0.0,
"src/book/_posters/2025/images/seed-bank-entropy-pubmed.png": 0.0,
"src/book/_posters/2025/images/sga-qr-text.png": 0.0,
"src/book/_posters/2025/images/sga-qr.png": 0.0,
"src/book/_posters/2025/images/software-lifecycle.png": 0.0,
"src/book/_posters/2025/images/spacer.png": 0.0,
"src/book/_posters/2025/images/sustainable-horizons-institute-logo.png": 0.0,
"src/book/_posters/2025/images/title-text.png": 0.0,
"src/book/_posters/2025/poster.qmd": 0.0033498769210219825,
"src/book/_posters/2025/readme.md": 0.0017005156863224226,
"src/book/_static/OSSci Monthly Call Jan 2025 - Software_Gardening_Almanack.odp": 0.0,
"src/book/_static/OSSci Monthly Call Jan 2025 - Software_Gardening_Almanack.pdf": 0.0,
"src/book/_static/custom.css": 0.0005968712659892998,
"src/book/_templates/check_template.md.j2": 0.0003508868333561357,
"src/book/_toc.yml": 0.0011668694232510053,
"src/book/assets/640px-Forgard2-003.gif": 0.0,
"src/book/assets/640px-Rundes_Fenster_mit_Gitter.jpeg": 0.0,
"src/book/assets/Sundial_2916_HDR.jpeg": 0.0,
"src/book/assets/almanack-influencing-software.png": 0.0,
"src/book/assets/garden-lattice-understanding-transfer.png": 0.0,
"src/book/assets/software-gardening-almanack-logo.png": 0.0,
"src/book/assets/software-gardening-logo.png": 0.0,
"src/book/assets/software-lifecycle.png": 0.0,
"src/book/assets/xkcd_dependency.png": 0.0,
"src/book/favicon.png": 0.0,
"src/book/garden-circle/contributing.md": 0.004697536048055605,
"src/book/garden-circle/garden-circle.md": 0.00018681827278613808,
"src/book/garden-circle/garden-map.md": 0.0013299406706512894,
"src/book/garden-circle/package-api.md": 0.003017964968282334,
"src/book/garden-circle/pavilion.md": 0.0010841951015241509,
"src/book/garden-lattice/garden-lattice.md": 0.0012759015022791992,
"src/book/garden-lattice/understanding.md": 0.0031608827795269285,
"src/book/introduction.md": 0.003930092949691444,
"src/book/references.bib": 0.007239576141072257,
"src/book/seed-bank/almanack-example/almanack-example.ipynb": 0.03352450497065555,
"src/book/seed-bank/pubmed-github-repositories/gather-pubmed-repos/generate_data.py": 0.004830706393295111,
"src/book/seed-bank/pubmed-github-repositories/gather-pubmed-repos/generate_github_enriched_data.py": 0.003838242208009742,
"src/book/seed-bank/pubmed-github-repositories/gather-pubmed-repos/pubmed_github_links.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/gather-pubmed-repos/pubmed_github_links_with_github_data.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/gather-software-information-entropy.ipynb": 0.004112753136226156,
"src/book/seed-bank/pubmed-github-repositories/images/pubmed-lines-of-code-and-time.png": 0.0,
"src/book/seed-bank/pubmed-github-repositories/images/pubmed-stars-and-forks.png": 0.0,
"src/book/seed-bank/pubmed-github-repositories/images/pubmed-stars-and-open-issues.png": 0.0,
"src/book/seed-bank/pubmed-github-repositories/images/software-information-entropy-forks.png": 0.0,
"src/book/seed-bank/pubmed-github-repositories/images/software-information-entropy-gh-stars.png": 0.0,
"src/book/seed-bank/pubmed-github-repositories/images/software-information-entropy-open-issues.png": 0.0,
"src/book/seed-bank/pubmed-github-repositories/images/software-information-entropy-top-5-langs.png": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_1.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_10.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_11.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_12.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_13.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_14.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_15.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_16.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_17.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_18.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_19.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_2.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_20.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_3.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_4.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_5.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_6.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_7.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_8.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_9.parquet": 0.0,
"src/book/seed-bank/pubmed-github-repositories/visualize-pubmed-repo-sofware-entropy.ipynb": 0.06196737298882196,
"src/book/seed-bank/seed-bank.md": 0.00018681827278613808,
"src/book/software-forest/software-forest.md": 0.0013029592537397475,
"src/book/verdant-sundial/verdant-sundial.md": 0.0013299406706512894,
"styles/config/vocabularies/almanack/accept.txt": 0.0010006757773978643,
"tests/__init__.py": 0.0,
"tests/conftest.py": 0.004271487512359321,
"tests/data/almanack/coverage/python/coverage.json": 4.2645974151753495e-05,
"tests/data/almanack/coverage/python/coverage.lcov": 0.019957408049737838,
"tests/data/almanack/repo_setup/create_repo.py": 0.006553291798668434,
"tests/data/almanack/repo_setup/insert_code.py": 0.0016483268945009307,
"tests/data/jupyter-book/sandbox.md": 0.000536737428244757,
"tests/metrics/test_calculate_entropy.py": 0.0016744500821492593,
"tests/metrics/test_data.py": 0.02255626236671783,
"tests/metrics/test_garden_lattice.py": 0.0022611015736617142,
"tests/test_almanack.py": 0.0010841951015241509,
"tests/test_build.py": 0.0019582076535179585,
"tests/test_cli.py": 0.004316659316036976,
"tests/test_git.py": 0.009545858772784693,
"tests/utils.py": 0.0010841951015241509
}
}
]
%%time
# show the same results from the CLI
!almanack table "./almanack"
[{"name": "repo-path", "id": "SGA-META-0001", "result-type": "str", "sustainability_correlation": 0, "description": "Repository path (local directory).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": "/home/runner/work/almanack/almanack/src/book/seed-bank/almanack-example/almanack"}, {"name": "repo-commits", "id": "SGA-META-0002", "result-type": "int", "sustainability_correlation": 0, "description": "Total number of commits for the repository.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 227}, {"name": "repo-file-count", "id": "SGA-META-0003", "result-type": "int", "sustainability_correlation": 0, "description": "Total number of files tracked within the repository.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 151}, {"name": "repo-commit-time-range", "id": "SGA-META-0004", "result-type": "tuple", "sustainability_correlation": 0, "description": "Starting commit and most recent commit for the repository.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": ["2024-03-05", "2025-09-03"]}, {"name": "repo-days-of-development", "id": "SGA-META-0005", "result-type": "int", "sustainability_correlation": 0, "description": "Integer representing the number of days of development between most recent commit and first commit.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 548}, {"name": "repo-commits-per-day", "id": "SGA-META-0006", "result-type": "float", "sustainability_correlation": 0, "description": "Floating point number which represents the number of commits per day (using days of development).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 0.4142335766423358}, {"name": "almanack-table-datetime", "id": "SGA-META-0007", "result-type": "str", "sustainability_correlation": 0, "description": "String representing the date when this table was generated in the format of '%Y-%m-%dT%H:%M:%S.%fZ', for example: 2024-11-22T18:20:30.123456Z .", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": "2025-09-03T23:52:22.921557Z"}, {"name": "almanack-version", "id": "SGA-META-0008", "result-type": "str", "sustainability_correlation": 0, "description": "String representing the version of the almanack which was used to generate this table.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": "0.0.0.post1.dev0+d4fcd79"}, {"name": "repo-primary-language", "id": "SGA-META-0009", "result-type": "str", "sustainability_correlation": 0, "description": "Detected primary programming language of the repository.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": "Jupyter Notebook"}, {"name": "repo-primary-license", "id": "SGA-META-0010", "result-type": "str", "sustainability_correlation": 0, "description": "Detected primary license of the repository.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": "bsd-3-clause"}, {"name": "repo-doi", "id": "SGA-META-0011", "result-type": "str", "sustainability_correlation": 0, "description": "Repository DOI value detected from CITATION.cff file.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": "10.5281/zenodo.14765834"}, {"name": "repo-doi-publication-date", "id": "SGA-META-0012", "result-type": "str", "sustainability_correlation": 0, "description": "Repository DOI publication date detected from CITATION.cff file and OpenAlex.org.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": null}, {"name": "repo-doi-fwci", "id": "SGA-META-0013", "result-type": "float", "sustainability_correlation": 0, "description": "Field-Weighted Citation Impact (FWCI) from OpenAlex for the work referenced by the repository DOI.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": null}, {"name": "repo-doi-is-not-retracted", "id": "SGA-META-0014", "result-type": "bool", "sustainability_correlation": 0, "description": "If the work referenced by the repository DOI has been retracted as reported by OpenAlex.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": null}, {"name": "repo-doi-grants-count", "id": "SGA-META-0015", "result-type": "int", "sustainability_correlation": 0, "description": "Count of grant records attached to the DOI's work (from OpenAlex via Crossref).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 0}, {"name": "repo-doi-grants", "id": "SGA-META-0016", "result-type": "list", "sustainability_correlation": 0, "description": "List of grant records for the DOI's work (from OpenAlex via Crossref).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": null}, {"name": "repo-almanack-score", "id": "SGA-META-0017", "result-type": "dict", "sustainability_correlation": 0, "description": "Dictionary of length three, including the following: 1) number of Almanack boolean metrics that passed (numerator), 2) number of total Almanack boolean metrics considered (denominator), and 3) a score that represents how likely the repository will be maintained over time based (numerator / denominator).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": {"almanack-score-numerator": 11, "almanack-score-denominator": 11, "almanack-score": 1.0}}, {"name": "repo-includes-readme", "id": "SGA-GL-0001", "result-type": "bool", "sustainability_correlation": 1, "description": "Boolean value indicating the presence of a README file in the repository.", "correction_guidance": "Consider adding a README file to the repository.", "fix_why": "A README file is essential for providing an overview of the project, its purpose, and how to use it. Many platforms like GitHub, GitLab, and Bitbucket use the README file to display project information prominently.", "fix_how": "Create a README file in the root directory of your repository. Include sections such as project description, installation instructions, usage examples, and contribution guidelines. You can use Markdown to format the README for better readability. For example, you can start with a text editor or use an online Markdown editor to create your README file. Save it as `README.md` in the root of your repository. If you're using GitHub, you can also use their web interface to create and edit the README file directly.", "result": true}, {"name": "repo-includes-contributing", "id": "SGA-GL-0002", "result-type": "bool", "sustainability_correlation": 1, "description": "Boolean value indicating the presence of a CONTRIBUTING file in the repository.", "correction_guidance": "Consider adding a CONTRIBUTING file to the repository.", "fix_why": "A CONTRIBUTING file is important for guiding potential contributors on how to contribute to the project, including coding standards, pull request guidelines, and other relevant information. It helps maintain a consistent contribution process and encourages community involvement.", "fix_how": "Create a CONTRIBUTING file in the root directory of your repository. Include guidelines for contributing, such as coding standards, pull request instructions, and any other relevant information. You can use Markdown to format the CONTRIBUTING file for better readability. For example, you can start with a text editor or use an online Markdown editor to create your CONTRIBUTING file. Save it as `CONTRIBUTING.md` in the root of your repository. If you're using GitHub, you can also use their web interface to create and edit the CONTRIBUTING file directly.", "result": true}, {"name": "repo-includes-code-of-conduct", "id": "SGA-GL-0003", "result-type": "bool", "sustainability_correlation": 1, "description": "Boolean value indicating the presence of a CODE_OF_CONDUCT file in the repository.", "correction_guidance": "Consider adding a CODE_OF_CONDUCT file to the repository.", "fix_why": "A CODE_OF_CONDUCT file is essential for establishing a respectful and inclusive community within the project. It sets expectations for behavior, helps prevent harassment, and provides a framework for resolving conflicts.", "fix_how": "Create a CODE_OF_CONDUCT file in the root directory of your repository. Include guidelines for acceptable behavior, reporting procedures, and any other relevant information. You can use Markdown to format the CODE_OF_CONDUCT file for better readability. For example, you can start with a text editor or use an online Markdown editor to create your CODE_OF_CONDUCT file. Save it as `CODE_OF_CONDUCT.md` in the root of your repository. If you're using GitHub, you can also use their web interface to create and edit the CODE_OF_CONDUCT file directly.", "result": true}, {"name": "repo-includes-license", "id": "SGA-GL-0004", "result-type": "bool", "sustainability_correlation": 1, "description": "Boolean value indicating the presence of a LICENSE file in the repository.", "correction_guidance": "Consider adding a LICENSE file to the repository.", "fix_why": "A LICENSE file is crucial for defining the terms under which the code can be used, modified, and distributed. It helps protect both the authors and users of the code by clarifying legal rights and responsibilities.", "fix_how": "Create a LICENSE file in the root directory of your repository. Include the text of the license you wish to apply to your code. You can choose from existing open-source licenses, such as MIT, Apache 2.0, or GPL, depending on your project's needs. For example, you can start with a text editor or use an online license generator to create your LICENSE file. Save it as `LICENSE` or `LICENSE.txt` in the root of your repository. If you're using GitHub, you can also use their web interface to create and edit the LICENSE file directly.", "result": true}, {"name": "repo-is-citable", "id": "SGA-GL-0005", "result-type": "bool", "sustainability_correlation": 1, "description": "Boolean value indicating the presence of a CITATION file or some other means of indicating how to cite the work.", "correction_guidance": "Consider adding a CITATION file to the repository (e.g. citation.cff, etc.).", "fix_why": "A CITATION file is important for providing a standardized way to cite the work, making it easier for others to reference and acknowledge the project in their own work. It helps promote the visibility and impact of the project within the academic and research communities.", "fix_how": "Create a CITATION file in the root directory of your repository. Include information on how to cite the work, such as the authors, title, publication date, and any relevant identifiers (e.g., DOI). You can use the Citation File Format (CFF) standard to structure the CITATION file for better compatibility with citation tools. For example, you can start with a text editor or use an online CFF editor to create your CITATION file. Save it as `CITATION.cff` in the root of your repository. If you're using GitHub, you can also use their web interface to create and edit the CITATION file directly.", "result": true}, {"name": "repo-default-branch-not-master", "id": "SGA-GL-0006", "result-type": "bool", "sustainability_correlation": 1, "description": "Boolean value indicating that the repo uses a default branch name besides 'master'.", "correction_guidance": "Consider using a default source control branch name other than 'master'.", "fix_why": "Using a default branch name other than 'master' is more collaborative and avoids possible negative historical connotations associated with the term.", "fix_how": "Change the default branch name in your source control platform (e.g., GitHub, GitLab, Bitbucket) to a more inclusive term like 'main', 'develop', or any other preferred name. This can usually be done through the repository settings or by renaming the branch locally and pushing the changes to the remote repository.", "result": true}, {"name": "repo-includes-common-docs", "id": "SGA-GL-0007", "result-type": "bool", "sustainability_correlation": 1, "description": "Boolean value indicating whether the repo includes common documentation directory and files associated with building docsites.", "correction_guidance": "Consider including project documentation through the 'docs/' directory.", "fix_why": "Including a 'docs/' directory with common documentation files helps in maintaining a clear structure for project documentation, making it easier for contributors and users to find relevant information. It also promotes better collaboration and understanding of the project.", "fix_how": "Create a 'docs/' directory in the root of your repository. Inside this directory, include common documentation files such as 'index.md', 'CONTRIBUTING.md', 'CODE_OF_CONDUCT.md', and any other relevant documentation files that provide information about the project, its usage, and contribution guidelines. You can use Markdown to format these files for better readability. If you're using GitHub, you can also use their web interface to create and edit these files directly within the 'docs/' directory.", "result": true}, {"name": "repo-unique-contributors", "id": "SGA-GL-0008", "result-type": "int", "sustainability_correlation": 0, "description": "Count of unique contributors since the beginning of the repository.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 5}, {"name": "repo-unique-contributors-past-year", "id": "SGA-GL-0009", "result-type": "int", "sustainability_correlation": 0, "description": "Count of unique contributors within the last year from now (where now is a reference to table value of almanack-table-datetime).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 3}, {"name": "repo-unique-contributors-past-182-days", "id": "SGA-GL-0010", "result-type": "int", "sustainability_correlation": 0, "description": "Count of unique contributors within the last 182 days from now (where now is a reference to table value of almanack-table-datetime).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 3}, {"name": "repo-tags-count", "id": "SGA-GL-0011", "result-type": "int", "sustainability_correlation": 0, "description": "Count of the number of tags within the repository.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 14}, {"name": "repo-tags-count-past-year", "id": "SGA-GL-0012", "result-type": "int", "sustainability_correlation": 0, "description": "Count of the number of tags within the repository within the last year from now (where now is a reference to table value of almanack-table-datetime).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 12}, {"name": "repo-tags-count-past-182-days", "id": "SGA-GL-0013", "result-type": "int", "sustainability_correlation": 0, "description": "Count of the number of tags within the repository within the last 182 days from now (where now is a reference to table value of almanack-table-datetime).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 7}, {"name": "repo-stargazers-count", "id": "SGA-GL-0014", "result-type": "int", "sustainability_correlation": 0, "description": "Count of the number of stargazers on repository remote hosting platform.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 12}, {"name": "repo-uses-issues", "id": "SGA-GL-0015", "result-type": "bool", "sustainability_correlation": 1, "description": "Whether the repository uses issues (for example, as a bug and/or feature tracking tool.", "correction_guidance": "Consider leveraging issues for tracking bugs and/or features within your repository hosting platform.", "fix_why": "Using issues for tracking bugs and features helps in maintaining a clear record of project development, facilitates collaboration, and allows for better prioritization of tasks.", "fix_how": "Enable issues on your repository hosting platform (e.g., GitHub, GitLab, Bitbucket) if not already enabled. This can usually be done through the repository settings or by creating an issue template. Encourage contributors to use issues for reporting bugs, suggesting features, and discussing project-related topics.", "result": true}, {"name": "repo-issues-open-count", "id": "SGA-GL-0016", "result-type": "int", "sustainability_correlation": 0, "description": "Count of open issues for repository.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 73}, {"name": "repo-pull-requests-enabled", "id": "SGA-GL-0017", "result-type": "bool", "sustainability_correlation": 1, "description": "Whether the repository enables pull requests.", "correction_guidance": "Consider enabling pull requests for the repository through your repository hosting platform.", "fix_why": null, "fix_how": null, "result": true}, {"name": "repo-forks-count", "id": "SGA-GL-0018", "result-type": "int", "sustainability_correlation": 0, "description": "Count of forks of the repository.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 3}, {"name": "repo-subscribers-count", "id": "SGA-GL-0019", "result-type": "int", "sustainability_correlation": 0, "description": "Count of subscribers (or watchers) of the repository.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 1}, {"name": "repo-packages-ecosystems", "id": "SGA-GL-0020", "result-type": "list", "sustainability_correlation": 0, "description": "List of package platforms or services where the repository was detected (leveraging the ecosyste.ms packages API).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": ["pypi"]}, {"name": "repo-packages-ecosystems-count", "id": "SGA-GL-0021", "result-type": "int", "sustainability_correlation": 0, "description": "Count of package platforms or services where the repository was detected (leveraging the ecosyste.ms packages API).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 1}, {"name": "repo-packages-versions-count", "id": "SGA-GL-0022", "result-type": "int", "sustainability_correlation": 0, "description": "Count of package versions on package hosts or services where the repository was detected (leveraging the ecosyste.ms packages API).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 15}, {"name": "repo-social-media-platforms", "id": "SGA-GL-0023", "result-type": "list", "sustainability_correlation": 0, "description": "Social media platforms detected within the readme.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": []}, {"name": "repo-social-media-platforms-count", "id": "SGA-GL-0024", "result-type": "int", "sustainability_correlation": 0, "description": "Count of social media platforms detected within the readme.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 0}, {"name": "repo-doi-valid-format", "id": "SGA-GL-0025", "result-type": "bool", "sustainability_correlation": 1, "description": "Whether the DOI found in the CITATION.cff file is of a valid format.", "correction_guidance": "DOI within the CITATION.cff file is not of a valid format or missing.", "fix_why": "A valid DOI format is essential for ensuring that the DOI can be resolved and used to reference the work correctly.", "fix_how": "Ensure that the DOI in the CITATION.cff file follows the standard DOI format, which typically includes a prefix (e.g., 10.1234) and a suffix (e.g., 56789/abcde). The DOI should be in the format: `10.<prefix>/<suffix>`. If the DOI is missing or incorrectly formatted, update it to match the correct structure.", "result": true}, {"name": "repo-doi-https-resolvable", "id": "SGA-GL-0026", "result-type": "bool", "sustainability_correlation": 1, "description": "Whether the DOI found in the CITATION.cff file is HTTPS resolvable.", "correction_guidance": "DOI within the CITATION.cff file is not HTTPS resolvable or missing.", "fix_why": "An HTTPS resolvable DOI is crucial for ensuring that the DOI can be accessed securely and reliably, allowing users to retrieve the work associated with the DOI.", "fix_how": "Verify that the DOI in the CITATION.cff file can be resolved using an HTTPS URL. The DOI should be formatted as: `https://doi.org/10.<prefix>/<suffix>`. If the DOI is not resolvable or does not use HTTPS, update it to ensure it points to a valid and secure URL.", "result": true}, {"name": "repo-doi-cited-by-count", "id": "SGA-GL-0027", "result-type": "int", "sustainability_correlation": 0, "description": "How many other works cite the DOI for the repository found within the CITATION.cff as discovered by the OpenAlex.org API.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": null}, {"name": "repo-days-between-doi-publication-date-and-latest-commit", "id": "SGA-GL-0028", "result-type": "int", "sustainability_correlation": 0, "description": "The number of days between the most recent commit and DOI for the repository's publication date as discovered by the OpenAlex.org API.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": null}, {"name": "repo-gh-workflow-success-ratio", "id": "SGA-SF-0001", "result-type": "float", "sustainability_correlation": 0, "description": "Ratio of succeeding workflow runs out of queried workflow runs from GitHub (only applies to GitHub hosted repositories which use workflows).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 0.75}, {"name": "repo-gh-workflow-succeeding-runs", "id": "SGA-SF-0002", "result-type": "int", "sustainability_correlation": 0, "description": "Number of succeeding workflow runs out of queried workflow runs from GitHub (only applies to GitHub hosted repositories which use workflows).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 100}, {"name": "repo-gh-workflow-failing-runs", "id": "SGA-SF-0003", "result-type": "int", "sustainability_correlation": 0, "description": "Number of failing workflow runs out of queried workflow runs from GitHub (only applies to GitHub hosted repositories which use workflows).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 75}, {"name": "repo-gh-workflow-queried-total", "id": "SGA-SF-0004", "result-type": "int", "sustainability_correlation": 0, "description": "Total number of workflow runs from GitHub (only applies to GitHub hosted repositories which use workflows).", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 25}, {"name": "repo-code-coverage-percent", "id": "SGA-SF-0005", "result-type": "float", "sustainability_correlation": 0, "description": "Percentage of code coverage for repository given detected code coverage data.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": null}, {"name": "repo-date-of-last-coverage-run", "id": "SGA-SF-0006", "result-type": "str", "sustainability_correlation": 0, "description": "Date of code coverage run for repository given detected code coverage data.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": null}, {"name": "repo-days-between-last-coverage-run-latest-commit", "id": "SGA-SF-0007", "result-type": "int", "sustainability_correlation": 0, "description": "Days between last coverage run date and latest commit date.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": null}, {"name": "repo-code-coverage-total-lines", "id": "SGA-SF-0008", "result-type": "int", "sustainability_correlation": 0, "description": "Total lines of code used for code coverage within repository given detected code coverage data.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": null}, {"name": "repo-code-coverage-executed-lines", "id": "SGA-SF-0009", "result-type": "int", "sustainability_correlation": 0, "description": "Total lines covered code within repository given detected code coverage data.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": null}, {"name": "repo-agg-info-entropy", "id": "SGA-VS-0001", "result-type": "float", "sustainability_correlation": 0, "description": "Aggregated information entropy for all files within a repository given a range between two commits (by default, the first and latest commits). Represents value from 0 to 1 where 0 equals no information entropy and 1 represents maximum information entropy.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": 0.0030602673416902076}, {"name": "repo-file-info-entropy", "id": "SGA-VS-0002", "result-type": "dict", "sustainability_correlation": 0, "description": "File-level information entropy for all files within a repository given a range between two commits (by default, the first and latest commits). Shows all files and their corresponding information entropy measurements relative to the other files found within the range of commits.", "correction_guidance": null, "fix_why": null, "fix_how": null, "result": {".alexignore": 8.07420058602789e-05, ".github/ISSUE_TEMPLATE/bug.yml": 0.0022860628255131406, ".github/ISSUE_TEMPLATE/config.yml": 8.07420058602789e-05, ".github/ISSUE_TEMPLATE/feature.yml": 0.0020598892080447764, ".github/PULL_REQUEST_TEMPLATE.md": 0.0011668694232510053, ".github/actions/install-node-env/action.yml": 0.000475780917830426, ".github/actions/install-python-env/action.yml": 0.0009444881777740652, ".github/dependabot.yml": 0.001111843568000494, ".github/release-drafter.yml": 0.0006857251467934946, ".github/workflows/deploy-book.yml": 0.0012759015022791992, ".github/workflows/draft-release.yml": 0.0007441650202983199, ".github/workflows/entropy-check.yml": 0.0018300135635623657, ".github/workflows/pre-commit-checks.yml": 0.001111843568000494, ".github/workflows/publish-pypi.yml": 0.0008593760319026213, ".github/workflows/pytest-tests.yml": 0.0013568474881922171, ".github/workflows/test-links.yml": 0.0006857251467934946, ".gitignore": 0.003861238234043436, ".linkcheckerrc.ini": 0.0005669009349143671, ".pre-commit-config.yaml": 0.0048749573271535005, ".pre-commit-hooks.yaml": 0.00041388345158456806, ".vale.ini": 0.000475780917830426, "CITATION.cff": 0.00494120573985889, "CODE_OF_CONDUCT.md": 0.0001171206902258263, "CONTRIBUTING.md": 0.0001171206902258263, "LICENSE": 0.0008878626414556587, "LICENSE.txt": 0.0008878626414556587, "README.md": 0.0026802421499498305, "coverage.xml": 0.023154236188316423, "docs/readme.md": 0.0001171206902258263, "media/coverage-badge.svg": 4.2645974151753495e-05, "pa11y.json": 0.00025381525746651134, "package-lock.json": 0.026682330661217064, "package.json": 0.00018681827278613808, "poetry.lock": 0.06625317341062548, "pyproject.toml": 0.005270220396545561, "src/almanack/__init__.py": 0.0007731675938503989, "src/almanack/book.py": 0.0019582076535179585, "src/almanack/cli.py": 0.006279386033661657, "src/almanack/git.py": 0.009093980233265218, "src/almanack/metrics/data.py": 0.01748303678241423, "src/almanack/metrics/entropy/calculate_entropy.py": 0.002946110343741851, "src/almanack/metrics/entropy/processing_repositories.py": 0.0019582076535179585, "src/almanack/metrics/garden_lattice/connectedness.py": 0.0070121928193081825, "src/almanack/metrics/garden_lattice/practicality.py": 0.003089553445034517, "src/almanack/metrics/garden_lattice/understanding.py": 0.0016483268945009307, "src/almanack/metrics/metrics.yml": 0.014783453607424946, "src/almanack/metrics/remote.py": 0.0024843341592140243, "src/almanack/reporting/report.py": 0.0032319596179088894, "src/book/_config.yml": 0.0015168098568427203, "src/book/_ext/__init__.py": 0.0, "src/book/_ext/gen_check_pages.py": 0.002753139251947365, "src/book/_posters/2025/_extensions/quarto-ext/poster/_extension.yml": 0.0003508868333561357, "src/book/_posters/2025/_extensions/quarto-ext/poster/typst-show.typ": 0.002110453836781493, "src/book/_posters/2025/_extensions/quarto-ext/poster/typst-template.typ": 0.004474147589660086, "src/book/_posters/2025/almanack-2025-poster.pdf": 0.0, "src/book/_posters/2025/images/almanack-handbook.png": 0.0, "src/book/_posters/2025/images/almanack-notebook.png": 0.0, "src/book/_posters/2025/images/almanack-package-and-handbook.png": 0.0, "src/book/_posters/2025/images/almanack-package.png": 0.0, "src/book/_posters/2025/images/bssw-logo-w-background.png": 0.0, "src/book/_posters/2025/images/cu-anschutz-short.png": 0.0, "src/book/_posters/2025/images/dbmi.png": 0.0, "src/book/_posters/2025/images/entropy-for-repos.png": 0.0, "src/book/_posters/2025/images/forest_modified.png": 0.0, "src/book/_posters/2025/images/header-combined-images.png": 0.0, "src/book/_posters/2025/images/roadmap.png": 0.0, "src/book/_posters/2025/images/seed-bank-entropy-pubmed.png": 0.0, "src/book/_posters/2025/images/sga-qr-text.png": 0.0, "src/book/_posters/2025/images/sga-qr.png": 0.0, "src/book/_posters/2025/images/software-lifecycle.png": 0.0, "src/book/_posters/2025/images/spacer.png": 0.0, "src/book/_posters/2025/images/sustainable-horizons-institute-logo.png": 0.0, "src/book/_posters/2025/images/title-text.png": 0.0, "src/book/_posters/2025/poster.qmd": 0.0033498769210219825, "src/book/_posters/2025/readme.md": 0.0017005156863224226, "src/book/_static/OSSci Monthly Call Jan 2025 - Software_Gardening_Almanack.odp": 0.0, "src/book/_static/OSSci Monthly Call Jan 2025 - Software_Gardening_Almanack.pdf": 0.0, "src/book/_static/custom.css": 0.0005968712659892998, "src/book/_templates/check_template.md.j2": 0.0003508868333561357, "src/book/_toc.yml": 0.0011668694232510053, "src/book/assets/640px-Forgard2-003.gif": 0.0, "src/book/assets/640px-Rundes_Fenster_mit_Gitter.jpeg": 0.0, "src/book/assets/Sundial_2916_HDR.jpeg": 0.0, "src/book/assets/almanack-influencing-software.png": 0.0, "src/book/assets/garden-lattice-understanding-transfer.png": 0.0, "src/book/assets/software-gardening-almanack-logo.png": 0.0, "src/book/assets/software-gardening-logo.png": 0.0, "src/book/assets/software-lifecycle.png": 0.0, "src/book/assets/xkcd_dependency.png": 0.0, "src/book/favicon.png": 0.0, "src/book/garden-circle/contributing.md": 0.004697536048055605, "src/book/garden-circle/garden-circle.md": 0.00018681827278613808, "src/book/garden-circle/garden-map.md": 0.0013299406706512894, "src/book/garden-circle/package-api.md": 0.003017964968282334, "src/book/garden-circle/pavilion.md": 0.0010841951015241509, "src/book/garden-lattice/garden-lattice.md": 0.0012759015022791992, "src/book/garden-lattice/understanding.md": 0.0031608827795269285, "src/book/introduction.md": 0.003930092949691444, "src/book/references.bib": 0.007239576141072257, "src/book/seed-bank/almanack-example/almanack-example.ipynb": 0.03352450497065555, "src/book/seed-bank/pubmed-github-repositories/gather-pubmed-repos/generate_data.py": 0.004830706393295111, "src/book/seed-bank/pubmed-github-repositories/gather-pubmed-repos/generate_github_enriched_data.py": 0.003838242208009742, "src/book/seed-bank/pubmed-github-repositories/gather-pubmed-repos/pubmed_github_links.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/gather-pubmed-repos/pubmed_github_links_with_github_data.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/gather-software-information-entropy.ipynb": 0.004112753136226156, "src/book/seed-bank/pubmed-github-repositories/images/pubmed-lines-of-code-and-time.png": 0.0, "src/book/seed-bank/pubmed-github-repositories/images/pubmed-stars-and-forks.png": 0.0, "src/book/seed-bank/pubmed-github-repositories/images/pubmed-stars-and-open-issues.png": 0.0, "src/book/seed-bank/pubmed-github-repositories/images/software-information-entropy-forks.png": 0.0, "src/book/seed-bank/pubmed-github-repositories/images/software-information-entropy-gh-stars.png": 0.0, "src/book/seed-bank/pubmed-github-repositories/images/software-information-entropy-open-issues.png": 0.0, "src/book/seed-bank/pubmed-github-repositories/images/software-information-entropy-top-5-langs.png": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_1.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_10.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_11.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_12.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_13.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_14.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_15.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_16.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_17.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_18.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_19.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_2.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_20.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_3.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_4.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_5.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_6.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_7.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_8.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/repository_analysis_results/repository_analysis_results_batch_9.parquet": 0.0, "src/book/seed-bank/pubmed-github-repositories/visualize-pubmed-repo-sofware-entropy.ipynb": 0.06196737298882196, "src/book/seed-bank/seed-bank.md": 0.00018681827278613808, "src/book/software-forest/software-forest.md": 0.0013029592537397475, "src/book/verdant-sundial/verdant-sundial.md": 0.0013299406706512894, "styles/config/vocabularies/almanack/accept.txt": 0.0010006757773978643, "tests/__init__.py": 0.0, "tests/conftest.py": 0.004271487512359321, "tests/data/almanack/coverage/python/coverage.json": 4.2645974151753495e-05, "tests/data/almanack/coverage/python/coverage.lcov": 0.019957408049737838, "tests/data/almanack/repo_setup/create_repo.py": 0.006553291798668434, "tests/data/almanack/repo_setup/insert_code.py": 0.0016483268945009307, "tests/data/jupyter-book/sandbox.md": 0.000536737428244757, "tests/metrics/test_calculate_entropy.py": 0.0016744500821492593, "tests/metrics/test_data.py": 0.02255626236671783, "tests/metrics/test_garden_lattice.py": 0.0022611015736617142, "tests/test_almanack.py": 0.0010841951015241509, "tests/test_build.py": 0.0019582076535179585, "tests/test_cli.py": 0.004316659316036976, "tests/test_git.py": 0.009545858772784693, "tests/utils.py": 0.0010841951015241509}}]
CPU times: user 69.1 ms, sys: 16.2 ms, total: 85.3 ms
Wall time: 5.2 s
%%time
# show the same results from the CLI
!almanack check "./almanack"
Running Software Gardening Almanack checks.
Datetime: 2025-09-03T23:52:28.162186Z
Almanack version: 0.0.0.post1.dev0+d4fcd79
Target repository path: ./almanack
Software Gardening Almanack summary: 100.00% (11/11)
CPU times: user 66.8 ms, sys: 17.4 ms, total: 84.2 ms
Wall time: 5.34 s