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+4847837)
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.4)
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: pandas>=2.2.2 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from almanack) (2.3.3)
Requirement already satisfied: pyarrow>=16 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from almanack) (22.0.0)
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.3)
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.6.3)
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: numpy>=1.23.2 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from pandas>=2.2.2->almanack) (2.3.1)
Requirement already satisfied: python-dateutil>=2.8.2 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from pandas>=2.2.2->almanack) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from pandas>=2.2.2->almanack) (2024.1)
Requirement already satisfied: tzdata>=2022.7 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from pandas>=2.2.2->almanack) (2024.1)
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) (2.0.0)
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)
Requirement already satisfied: six>=1.5 in /home/runner/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas>=2.2.2->almanack) (1.16.0)
# 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: 3990, done.
remote: Counting objects: 0% (1/137)
remote: Counting objects: 1% (2/137)
remote: Counting objects: 2% (3/137)
remote: Counting objects: 3% (5/137)
remote: Counting objects: 4% (6/137)
remote: Counting objects: 5% (7/137)
remote: Counting objects: 6% (9/137)
remote: Counting objects: 7% (10/137)
remote: Counting objects: 8% (11/137)
remote: Counting objects: 9% (13/137)
remote: Counting objects: 10% (14/137)
remote: Counting objects: 11% (16/137)
remote: Counting objects: 12% (17/137)
remote: Counting objects: 13% (18/137)
remote: Counting objects: 14% (20/137)
remote: Counting objects: 15% (21/137)
remote: Counting objects: 16% (22/137)
remote: Counting objects: 17% (24/137)
remote: Counting objects: 18% (25/137)
remote: Counting objects: 19% (27/137)
remote: Counting objects: 20% (28/137)
remote: Counting objects: 21% (29/137)
remote: Counting objects: 22% (31/137)
remote: Counting objects: 23% (32/137)
remote: Counting objects: 24% (33/137)
remote: Counting objects: 25% (35/137)
remote: Counting objects: 26% (36/137)
remote: Counting objects: 27% (37/137)
remote: Counting objects: 28% (39/137)
remote: Counting objects: 29% (40/137)
remote: Counting objects: 30% (42/137)
remote: Counting objects: 31% (43/137)
remote: Counting objects: 32% (44/137)
remote: Counting objects: 33% (46/137)
remote: Counting objects: 34% (47/137)
remote: Counting objects: 35% (48/137)
remote: Counting objects: 36% (50/137)
remote: Counting objects: 37% (51/137)
remote: Counting objects: 38% (53/137)
remote: Counting objects: 39% (54/137)
remote: Counting objects: 40% (55/137)
remote: Counting objects: 41% (57/137)
remote: Counting objects: 42% (58/137)
remote: Counting objects: 43% (59/137)
remote: Counting objects: 44% (61/137)
remote: Counting objects: 45% (62/137)
remote: Counting objects: 46% (64/137)
remote: Counting objects: 47% (65/137)
remote: Counting objects: 48% (66/137)
remote: Counting objects: 49% (68/137)
remote: Counting objects: 50% (69/137)
remote: Counting objects: 51% (70/137)
remote: Counting objects: 52% (72/137)
remote: Counting objects: 53% (73/137)
remote: Counting objects: 54% (74/137)
remote: Counting objects: 55% (76/137)
remote: Counting objects: 56% (77/137)
remote: Counting objects: 57% (79/137)
remote: Counting objects: 58% (80/137)
remote: Counting objects: 59% (81/137)
remote: Counting objects: 60% (83/137)
remote: Counting objects: 61% (84/137)
remote: Counting objects: 62% (85/137)
remote: Counting objects: 63% (87/137)
remote: Counting objects: 64% (88/137)
remote: Counting objects: 65% (90/137)
remote: Counting objects: 66% (91/137)
remote: Counting objects: 67% (92/137)
remote: Counting objects: 68% (94/137)
remote: Counting objects: 69% (95/137)
remote: Counting objects: 70% (96/137)
remote: Counting objects: 71% (98/137)
remote: Counting objects: 72% (99/137)
remote: Counting objects: 73% (101/137)
remote: Counting objects: 74% (102/137)
remote: Counting objects: 75% (103/137)
remote: Counting objects: 76% (105/137)
remote: Counting objects: 77% (106/137)
remote: Counting objects: 78% (107/137)
remote: Counting objects: 79% (109/137)
remote: Counting objects: 80% (110/137)
remote: Counting objects: 81% (111/137)
remote: Counting objects: 82% (113/137)
remote: Counting objects: 83% (114/137)
remote: Counting objects: 84% (116/137)
remote: Counting objects: 85% (117/137)
remote: Counting objects: 86% (118/137)
remote: Counting objects: 87% (120/137)
remote: Counting objects: 88% (121/137)
remote: Counting objects: 89% (122/137)
remote: Counting objects: 90% (124/137)
remote: Counting objects: 91% (125/137)
remote: Counting objects: 92% (127/137)
remote: Counting objects: 93% (128/137)
remote: Counting objects: 94% (129/137)
remote: Counting objects: 95% (131/137)
remote: Counting objects: 96% (132/137)
remote: Counting objects: 97% (133/137)
remote: Counting objects: 98% (135/137)
remote: Counting objects: 99% (136/137)
remote: Counting objects: 100% (137/137)
remote: Counting objects: 100% (137/137), done.
remote: Compressing objects: 1% (1/98)
remote: Compressing objects: 2% (2/98)
remote: Compressing objects: 3% (3/98)
remote: Compressing objects: 4% (4/98)
remote: Compressing objects: 5% (5/98)
remote: Compressing objects: 6% (6/98)
remote: Compressing objects: 7% (7/98)
remote: Compressing objects: 8% (8/98)
remote: Compressing objects: 9% (9/98)
remote: Compressing objects: 10% (10/98)
remote: Compressing objects: 11% (11/98)
remote: Compressing objects: 12% (12/98)
remote: Compressing objects: 13% (13/98)
remote: Compressing objects: 14% (14/98)
remote: Compressing objects: 15% (15/98)
remote: Compressing objects: 16% (16/98)
remote: Compressing objects: 17% (17/98)
remote: Compressing objects: 18% (18/98)
remote: Compressing objects: 19% (19/98)
remote: Compressing objects: 20% (20/98)
remote: Compressing objects: 21% (21/98)
remote: Compressing objects: 22% (22/98)
remote: Compressing objects: 23% (23/98)
remote: Compressing objects: 24% (24/98)
remote: Compressing objects: 25% (25/98)
remote: Compressing objects: 26% (26/98)
remote: Compressing objects: 27% (27/98)
remote: Compressing objects: 28% (28/98)
remote: Compressing objects: 29% (29/98)
remote: Compressing objects: 30% (30/98)
remote: Compressing objects: 31% (31/98)
remote: Compressing objects: 32% (32/98)
remote: Compressing objects: 33% (33/98)
remote: Compressing objects: 34% (34/98)
remote: Compressing objects: 35% (35/98)
remote: Compressing objects: 36% (36/98)
remote: Compressing objects: 37% (37/98)
remote: Compressing objects: 38% (38/98)
remote: Compressing objects: 39% (39/98)
remote: Compressing objects: 40% (40/98)
remote: Compressing objects: 41% (41/98)
remote: Compressing objects: 42% (42/98)
remote: Compressing objects: 43% (43/98)
remote: Compressing objects: 44% (44/98)
remote: Compressing objects: 45% (45/98)
remote: Compressing objects: 46% (46/98)
remote: Compressing objects: 47% (47/98)
remote: Compressing objects: 48% (48/98)
remote: Compressing objects: 50% (49/98)
remote: Compressing objects: 51% (50/98)
remote: Compressing objects: 52% (51/98)
remote: Compressing objects: 53% (52/98)
remote: Compressing objects: 54% (53/98)
remote: Compressing objects: 55% (54/98)
remote: Compressing objects: 56% (55/98)
remote: Compressing objects: 57% (56/98)
remote: Compressing objects: 58% (57/98)
remote: Compressing objects: 59% (58/98)
remote: Compressing objects: 60% (59/98)
remote: Compressing objects: 61% (60/98)
remote: Compressing objects: 62% (61/98)
remote: Compressing objects: 63% (62/98)
remote: Compressing objects: 64% (63/98)
remote: Compressing objects: 65% (64/98)
remote: Compressing objects: 66% (65/98)
remote: Compressing objects: 67% (66/98)
remote: Compressing objects: 68% (67/98)
remote: Compressing objects: 69% (68/98)
remote: Compressing objects: 70% (69/98)
remote: Compressing objects: 71% (70/98)
remote: Compressing objects: 72% (71/98)
remote: Compressing objects: 73% (72/98)
remote: Compressing objects: 74% (73/98)
remote: Compressing objects: 75% (74/98)
remote: Compressing objects: 76% (75/98)
remote: Compressing objects: 77% (76/98)
remote: Compressing objects: 78% (77/98)
remote: Compressing objects: 79% (78/98)
remote: Compressing objects: 80% (79/98)
remote: Compressing objects: 81% (80/98)
remote: Compressing objects: 82% (81/98)
remote: Compressing objects: 83% (82/98)
remote: Compressing objects: 84% (83/98)
remote: Compressing objects: 85% (84/98)
remote: Compressing objects: 86% (85/98)
remote: Compressing objects: 87% (86/98)
remote: Compressing objects: 88% (87/98)
remote: Compressing objects: 89% (88/98)
remote: Compressing objects: 90% (89/98)
remote: Compressing objects: 91% (90/98)
remote: Compressing objects: 92% (91/98)
remote: Compressing objects: 93% (92/98)
remote: Compressing objects: 94% (93/98)
remote: Compressing objects: 95% (94/98)
remote: Compressing objects: 96% (95/98)
remote: Compressing objects: 97% (96/98)
remote: Compressing objects: 98% (97/98)
remote: Compressing objects: 100% (98/98)
remote: Compressing objects: 100% (98/98), done.
Receiving objects: 0% (1/3990)
Receiving objects: 1% (40/3990)
Receiving objects: 2% (80/3990)
Receiving objects: 3% (120/3990)
Receiving objects: 4% (160/3990)
Receiving objects: 5% (200/3990)
Receiving objects: 6% (240/3990)
Receiving objects: 7% (280/3990)
Receiving objects: 8% (320/3990)
Receiving objects: 9% (360/3990)
Receiving objects: 10% (399/3990)
Receiving objects: 11% (439/3990)
Receiving objects: 11% (460/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 12% (479/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 13% (519/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 14% (559/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 15% (599/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 16% (639/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 17% (679/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 18% (719/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 19% (759/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 20% (798/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 21% (838/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 22% (878/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 23% (918/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 24% (958/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 25% (998/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 26% (1038/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 27% (1078/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 28% (1118/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 29% (1158/3990), 63.18 MiB | 63.17 MiB/s
Receiving objects: 30% (1197/3990), 84.64 MiB | 56.42 MiB/s
Receiving objects: 31% (1237/3990), 84.64 MiB | 56.42 MiB/s
Receiving objects: 32% (1277/3990), 84.64 MiB | 56.42 MiB/s
Receiving objects: 33% (1317/3990), 84.64 MiB | 56.42 MiB/s
Receiving objects: 34% (1357/3990), 84.64 MiB | 56.42 MiB/s
Receiving objects: 35% (1397/3990), 84.64 MiB | 56.42 MiB/s
Receiving objects: 36% (1437/3990), 84.64 MiB | 56.42 MiB/s
Receiving objects: 37% (1477/3990), 84.64 MiB | 56.42 MiB/s
Receiving objects: 37% (1503/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 38% (1517/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 39% (1557/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 40% (1596/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 41% (1636/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 42% (1676/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 43% (1716/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 44% (1756/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 45% (1796/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 46% (1836/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 47% (1876/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 48% (1916/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 49% (1956/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 50% (1995/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 51% (2035/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 52% (2075/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 53% (2115/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 54% (2155/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 55% (2195/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 56% (2235/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 57% (2275/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 58% (2315/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 59% (2355/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 60% (2394/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 61% (2434/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 62% (2474/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 63% (2514/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 64% (2554/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 65% (2594/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 66% (2634/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 67% (2674/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 68% (2714/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 69% (2754/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 70% (2793/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 71% (2833/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 72% (2873/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 73% (2913/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 74% (2953/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 75% (2993/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 76% (3033/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 77% (3073/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 78% (3113/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 79% (3153/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 80% (3192/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 81% (3232/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 82% (3272/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 83% (3312/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 84% (3352/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 85% (3392/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 86% (3432/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 87% (3472/3990), 106.93 MiB | 53.46 MiB/s
Receiving objects: 88% (3512/3990), 134.13 MiB | 53.67 MiB/s
Receiving objects: 89% (3552/3990), 134.13 MiB | 53.67 MiB/s
Receiving objects: 90% (3591/3990), 134.13 MiB | 53.67 MiB/s
Receiving objects: 91% (3631/3990), 134.13 MiB | 53.67 MiB/s
Receiving objects: 92% (3671/3990), 134.13 MiB | 53.67 MiB/s
Receiving objects: 93% (3711/3990), 134.13 MiB | 53.67 MiB/s
Receiving objects: 94% (3751/3990), 134.13 MiB | 53.67 MiB/s
Receiving objects: 95% (3791/3990), 134.13 MiB | 53.67 MiB/s
Receiving objects: 96% (3831/3990), 134.13 MiB | 53.67 MiB/s
Receiving objects: 97% (3871/3990), 134.13 MiB | 53.67 MiB/s
Receiving objects: 98% (3911/3990), 134.13 MiB | 53.67 MiB/s
Receiving objects: 99% (3951/3990), 134.13 MiB | 53.67 MiB/s
remote: Total 3990 (delta 93), reused 39 (delta 39), pack-reused 3853 (from 3)
Receiving objects: 100% (3990/3990), 134.13 MiB | 53.67 MiB/s
Receiving objects: 100% (3990/3990), 156.38 MiB | 55.64 MiB/s, done.
Resolving deltas: 0% (0/2180)
Resolving deltas: 1% (23/2180)
Resolving deltas: 2% (44/2180)
Resolving deltas: 3% (66/2180)
Resolving deltas: 4% (88/2180)
Resolving deltas: 5% (109/2180)
Resolving deltas: 6% (131/2180)
Resolving deltas: 7% (153/2180)
Resolving deltas: 8% (176/2180)
Resolving deltas: 9% (198/2180)
Resolving deltas: 10% (218/2180)
Resolving deltas: 11% (240/2180)
Resolving deltas: 12% (262/2180)
Resolving deltas: 13% (284/2180)
Resolving deltas: 14% (306/2180)
Resolving deltas: 15% (327/2180)
Resolving deltas: 16% (349/2180)
Resolving deltas: 17% (371/2180)
Resolving deltas: 18% (393/2180)
Resolving deltas: 19% (415/2180)
Resolving deltas: 20% (436/2180)
Resolving deltas: 21% (458/2180)
Resolving deltas: 22% (480/2180)
Resolving deltas: 23% (502/2180)
Resolving deltas: 24% (524/2180)
Resolving deltas: 25% (545/2180)
Resolving deltas: 26% (567/2180)
Resolving deltas: 27% (589/2180)
Resolving deltas: 28% (611/2180)
Resolving deltas: 29% (633/2180)
Resolving deltas: 30% (654/2180)
Resolving deltas: 31% (676/2180)
Resolving deltas: 32% (698/2180)
Resolving deltas: 33% (720/2180)
Resolving deltas: 34% (742/2180)
Resolving deltas: 35% (763/2180)
Resolving deltas: 36% (785/2180)
Resolving deltas: 37% (807/2180)
Resolving deltas: 38% (829/2180)
Resolving deltas: 39% (851/2180)
Resolving deltas: 40% (872/2180)
Resolving deltas: 41% (894/2180)
Resolving deltas: 42% (916/2180)
Resolving deltas: 43% (938/2180)
Resolving deltas: 44% (960/2180)
Resolving deltas: 45% (981/2180)
Resolving deltas: 46% (1003/2180)
Resolving deltas: 47% (1025/2180)
Resolving deltas: 48% (1047/2180)
Resolving deltas: 49% (1069/2180)
Resolving deltas: 50% (1090/2180)
Resolving deltas: 51% (1112/2180)
Resolving deltas: 52% (1134/2180)
Resolving deltas: 53% (1156/2180)
Resolving deltas: 54% (1178/2180)
Resolving deltas: 55% (1199/2180)
Resolving deltas: 56% (1221/2180)
Resolving deltas: 57% (1243/2180)
Resolving deltas: 58% (1265/2180)
Resolving deltas: 58% (1266/2180)
Resolving deltas: 59% (1287/2180)
Resolving deltas: 60% (1308/2180)
Resolving deltas: 61% (1330/2180)
Resolving deltas: 62% (1352/2180)
Resolving deltas: 63% (1374/2180)
Resolving deltas: 64% (1396/2180)
Resolving deltas: 65% (1417/2180)
Resolving deltas: 65% (1435/2180)
Resolving deltas: 66% (1439/2180)
Resolving deltas: 67% (1461/2180)
Resolving deltas: 68% (1483/2180)
Resolving deltas: 69% (1505/2180)
Resolving deltas: 70% (1526/2180)
Resolving deltas: 71% (1548/2180)
Resolving deltas: 72% (1570/2180)
Resolving deltas: 73% (1592/2180)
Resolving deltas: 74% (1615/2180)
Resolving deltas: 75% (1635/2180)
Resolving deltas: 76% (1657/2180)
Resolving deltas: 77% (1679/2180)
Resolving deltas: 78% (1701/2180)
Resolving deltas: 79% (1723/2180)
Resolving deltas: 80% (1744/2180)
Resolving deltas: 81% (1766/2180)
Resolving deltas: 82% (1788/2180)
Resolving deltas: 83% (1810/2180)
Resolving deltas: 84% (1833/2180)
Resolving deltas: 85% (1853/2180)
Resolving deltas: 86% (1875/2180)
Resolving deltas: 87% (1897/2180)
Resolving deltas: 88% (1919/2180)
Resolving deltas: 89% (1941/2180)
Resolving deltas: 90% (1962/2180)
Resolving deltas: 91% (1984/2180)
Resolving deltas: 92% (2006/2180)
Resolving deltas: 93% (2028/2180)
Resolving deltas: 94% (2050/2180)
Resolving deltas: 95% (2071/2180)
Resolving deltas: 96% (2093/2180)
Resolving deltas: 97% (2115/2180)
Resolving deltas: 98% (2137/2180)
Resolving deltas: 99% (2159/2180)
Resolving deltas: 100% (2180/2180)
Resolving deltas: 100% (2180/2180), 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)
Rate limit exceeded (attempt 1/100). Retrying in 0 seconds...
Rate limit exceeded (attempt 2/100). Retrying in 5 seconds...
Rate limit exceeded (attempt 3/100). Retrying in 10 seconds...
Rate limit exceeded (attempt 4/100). Retrying in 15 seconds...
---------------------------------------------------------------------------
HTTPError Traceback (most recent call last)
File ~/work/almanack/almanack/src/almanack/metrics/remote.py:67, in get_api_data(api_endpoint, params)
66 # Raise an exception for HTTP errors
---> 67 response.raise_for_status()
69 # Parse and return the JSON response
File ~/.cache/pypoetry/virtualenvs/almanack-1GdAbBV3-py3.11/lib/python3.11/site-packages/requests/models.py:1026, in Response.raise_for_status(self)
1025 if http_error_msg:
-> 1026 raise HTTPError(http_error_msg, response=self)
HTTPError: 403 Client Error: rate limit exceeded for url: https://api.github.com/repos/software-gardening/almanack/actions/runs?event=push&branch=main&per_page=100
During handling of the above exception, another exception occurred:
KeyboardInterrupt Traceback (most recent call last)
File <timed exec>:2
File ~/work/almanack/almanack/src/almanack/metrics/data.py:98, in get_table(repo_path, ignore)
95 raise ValueError(f"Invalid ignore keys: {invalid_ignore_keys}")
97 # gather data for use in the metrics table
---> 98 metrics_data = compute_repo_data(repo_path=repo_path)
100 if "error" in metrics_data.keys():
101 raise ReferenceError(
102 "Encountered an error with processing the data.", metrics_data
103 )
File ~/work/almanack/almanack/src/almanack/metrics/data.py:256, in compute_repo_data(repo_path)
251 remote_repo_data = get_api_data(
252 params={"url": remote_url} if remote_url is not None else None
253 )
255 # gather data from github repo workflows api
--> 256 gh_workflows_data = get_github_build_metrics(
257 repo_url=remote_url, branch=repo.head.shorthand, max_runs=100
258 )
260 # gather data on code coverage
261 code_coverage = measure_coverage(
262 repo=repo, primary_language=remote_repo_data.get("language", None)
263 )
File ~/work/almanack/almanack/src/almanack/metrics/data.py:714, in get_github_build_metrics(repo_url, branch, max_runs, github_api_endpoint)
711 return {}
713 # Fetch the latest workflow run data using get_api_data
--> 714 github_response = get_api_data(
715 # Construct the API URL for GitHub Actions runs
716 api_endpoint=f"{github_api_endpoint}/{owner}/{repo_name}/actions/runs",
717 params={"event": "push", "branch": branch, "per_page": max_runs},
718 )
720 if github_response.get("workflow_runs"):
721 workflow_runs = github_response["workflow_runs"]
File ~/work/almanack/almanack/src/almanack/metrics/remote.py:86, in get_api_data(api_endpoint, params)
81 backoff = base_backoff * (attempt - 1)
82 LOGGER.warning(
83 f"Rate limit exceeded (attempt {attempt}/{max_retries}). "
84 f"Retrying in {backoff} seconds..."
85 )
---> 86 time.sleep(backoff)
87 else:
88 LOGGER.info("Rate limit exceeded. All retry attempts exhausted.")
KeyboardInterrupt:
# 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,
"result": "/content/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,
"result": 154
},
{
"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,
"result": 117
},
{
"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,
"result": [
"2024-03-05",
"2025-01-12"
]
},
{
"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,
"result": 314
},
{
"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,
"result": 0.49044585987261147
},
{
"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,
"result": "2025-01-13T04:51:44.464534Z"
},
{
"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,
"result": "0.0.5"
},
{
"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,
"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,
"result": "bsd-3-clause"
},
{
"name": "repo-doi",
"id": "SGA-META-0011",
"result-type": "int",
"sustainability_correlation": 0,
"description": "Repository DOI value detected from CITATION.cff file.",
"correction_guidance": null,
"result": null
},
{
"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,
"result": null
},
{
"name": "repo-almanack-score",
"id": "SGA-META-0013",
"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,
"result": {
"almanack-score-numerator": 9,
"almanack-score-denominator": 11,
"almanack-score": 0.8181818181818182
}
},
{
"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.",
"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.",
"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.",
"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.",
"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.).",
"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'.",
"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.",
"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,
"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,
"result": 5
},
{
"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,
"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,
"result": 5
},
{
"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,
"result": 5
},
{
"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,
"result": 4
},
{
"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,
"result": 3
},
{
"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.",
"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,
"result": 44
},
{
"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.",
"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,
"result": 2
},
{
"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,
"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,
"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,
"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,
"result": 6
},
{
"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,
"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,
"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.",
"result": null
},
{
"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.",
"result": null
},
{
"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,
"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,
"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,
"result": 0.83
},
{
"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,
"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,
"result": 83
},
{
"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,
"result": 17
},
{
"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,
"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,
"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,
"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,
"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,
"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,
"result": 0.0032399961236882105
},
{
"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,
"result": {
".alexignore": 8.137557051950418e-05,
".github/ISSUE_TEMPLATE/bug.yml": 0.002303314622555871,
".github/ISSUE_TEMPLATE/config.yml": 8.137557051950418e-05,
".github/ISSUE_TEMPLATE/feature.yml": 0.0020754619576020122,
".github/PULL_REQUEST_TEMPLATE.md": 0.0011757694100385388,
".github/actions/install-node-env/action.yml": 0.00047945189067534965,
".github/actions/install-python-env/action.yml": 0.0009517133576552295,
".github/dependabot.yml": 0.0010083247197419888,
".github/release-drafter.yml": 0.0006909928228313111,
".github/workflows/deploy-book.yml": 0.0012033573999027773,
".github/workflows/draft-release.yml": 0.0007498757030847159,
".github/workflows/entropy-check.yml": 0.0018438756341057083,
".github/workflows/pre-commit-checks.yml": 0.0008946603169759946,
".github/workflows/publish-pypi.yml": 0.0008659584698754822,
".github/workflows/pytest-tests.yml": 0.0011480943013509966,
".gitignore": 0.003866925828781817,
".linkcheckerrc.ini": 0.0003854932634532223,
".pre-commit-config.yaml": 0.0047100726714637865,
".vale.ini": 0.00047945189067534965,
"CITATION.cff": 0.00468763564195914,
"CODE_OF_CONDUCT.md": 0.00011803692532472581,
"CONTRIBUTING.md": 0.00011803692532472581,
"LICENSE": 0.0008946603169759946,
"LICENSE.txt": 0.0008946603169759946,
"README.md": 0.0017918539523558929,
"coverage.xml": 0.021715239301768757,
"docs/readme.md": 0.00011803692532472581,
"media/coverage-badge.svg": 4.2982194701705824e-05,
"pa11y.json": 0.00025578681143135096,
"package-lock.json": 0.028516791316587936,
"package.json": 0.00018827370478629308,
"poetry.lock": 0.06214779427081766,
"pyproject.toml": 0.0047100726714637865,
"src/almanack/__init__.py": 0.0007790979227771374,
"src/almanack/book.py": 0.0018698072351989385,
"src/almanack/cli.py": 0.004620215024571,
"src/almanack/git.py": 0.009041119787303037,
"src/almanack/metrics/data.py": 0.01685943704457394,
"src/almanack/metrics/entropy/calculate_entropy.py": 0.0026758650782534327,
"src/almanack/metrics/entropy/processing_repositories.py": 0.0019730242487215003,
"src/almanack/metrics/garden_lattice/connectedness.py": 0.006686146199632836,
"src/almanack/metrics/garden_lattice/practicality.py": 0.0031127411964607323,
"src/almanack/metrics/garden_lattice/understanding.py": 0.0016608337052025802,
"src/almanack/metrics/metrics.yml": 0.01002750263588727,
"src/almanack/metrics/remote.py": 0.0025030547588967746,
"src/almanack/reporting/report.py": 0.0032561951645520217,
"src/book/_config.yml": 0.0014211715989295478,
"src/book/_static/custom.css": 0.00044839432134928975,
"src/book/_toc.yml": 0.0009232439198919463,
"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-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.004507476067189011,
"src/book/garden-circle/garden-circle.md": 0.00011803692532472581,
"src/book/garden-circle/garden-map.md": 0.0013400650229209604,
"src/book/garden-circle/package-api.md": 0.0013671735796648872,
"src/book/garden-lattice/garden-lattice.md": 0.0012308605052558962,
"src/book/garden-lattice/understanding.md": 0.0031845955072730566,
"src/book/introduction.md": 0.002202478777886068,
"src/book/references.bib": 0.007292900480154505,
"src/book/seed-bank/pubmed-github-repositories/gather-pubmed-repos/generate_data.py": 0.0048666308387477234,
"src/book/seed-bank/pubmed-github-repositories/gather-pubmed-repos/generate_github_enriched_data.py": 0.003866925828781817,
"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.0041434443281982815,
"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.05066124999414861,
"src/book/seed-bank/seed-bank.md": 0.00011803692532472581,
"src/book/software-forest/software-forest.md": 0.0012582808486586293,
"src/book/verdant-sundial/verdant-sundial.md": 0.0012856204491005655,
"styles/config/vocabularies/almanack/accept.txt": 0.0007498757030847159,
"tests/__init__.py": 0.0,
"tests/conftest.py": 0.004507476067189011,
"tests/data/almanack/coverage/python/coverage.json": 4.2982194701705824e-05,
"tests/data/almanack/coverage/python/coverage.lcov": 0.020099797014865625,
"tests/data/almanack/repo_setup/create_repo.py": 0.006601681638426565,
"tests/data/almanack/repo_setup/insert_code.py": 0.0016608337052025802,
"tests/data/jupyter-book/sandbox.md": 0.0005408729109422541,
"tests/metrics/test_calculate_entropy.py": 0.001687151936421729,
"tests/metrics/test_data.py": 0.021929524636905687,
"tests/metrics/test_garden_lattice.py": 0.0022781682551554936,
"tests/test_almanack.py": 0.0010924731761011023,
"tests/test_build.py": 0.0018956871133573793,
"tests/test_cli.py": 0.0024034963477559974,
"tests/test_git.py": 0.009240016120558485,
"tests/utils.py": 0.0010924731761011023
}
}
]
%%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, "result": "/content/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, "result": 156}, {"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, "result": 117}, {"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, "result": ["2024-03-05", "2025-01-13"]}, {"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, "result": 315}, {"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, "result": 0.49523809523809526}, {"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, "result": "2025-01-13T18:35:41.038659Z"}, {"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, "result": "0.0.5"}, {"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, "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, "result": "bsd-3-clause"}, {"name": "repo-doi", "id": "SGA-META-0011", "result-type": "int", "sustainability_correlation": 0, "description": "Repository DOI value detected from CITATION.cff file.", "correction_guidance": null, "result": null}, {"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, "result": null}, {"name": "repo-almanack-score", "id": "SGA-META-0013", "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, "result": {"almanack-score-numerator": 9, "almanack-score-denominator": 11, "almanack-score": 0.8181818181818182}}, {"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.", "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.", "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.", "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.", "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.).", "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'.", "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.", "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, "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, "result": 5}, {"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, "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, "result": 5}, {"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, "result": 5}, {"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, "result": 4}, {"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, "result": 3}, {"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.", "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, "result": 44}, {"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.", "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, "result": 2}, {"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, "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, "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, "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, "result": 6}, {"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, "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, "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.", "result": null}, {"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.", "result": null}, {"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, "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, "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, "result": 0.81}, {"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, "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, "result": 81}, {"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, "result": 19}, {"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, "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, "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, "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, "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, "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, "result": 0.0032399961236882105}, {"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, "result": {".alexignore": 8.137557051950418e-05, ".github/ISSUE_TEMPLATE/bug.yml": 0.002303314622555871, ".github/ISSUE_TEMPLATE/config.yml": 8.137557051950418e-05, ".github/ISSUE_TEMPLATE/feature.yml": 0.0020754619576020122, ".github/PULL_REQUEST_TEMPLATE.md": 0.0011757694100385388, ".github/actions/install-node-env/action.yml": 0.00047945189067534965, ".github/actions/install-python-env/action.yml": 0.0009517133576552295, ".github/dependabot.yml": 0.0010083247197419888, ".github/release-drafter.yml": 0.0006909928228313111, ".github/workflows/deploy-book.yml": 0.0012033573999027773, ".github/workflows/draft-release.yml": 0.0007498757030847159, ".github/workflows/entropy-check.yml": 0.0018438756341057083, ".github/workflows/pre-commit-checks.yml": 0.0008946603169759946, ".github/workflows/publish-pypi.yml": 0.0008659584698754822, ".github/workflows/pytest-tests.yml": 0.0011480943013509966, ".gitignore": 0.003866925828781817, ".linkcheckerrc.ini": 0.0003854932634532223, ".pre-commit-config.yaml": 0.0047100726714637865, ".vale.ini": 0.00047945189067534965, "CITATION.cff": 0.00468763564195914, "CODE_OF_CONDUCT.md": 0.00011803692532472581, "CONTRIBUTING.md": 0.00011803692532472581, "LICENSE": 0.0008946603169759946, "LICENSE.txt": 0.0008946603169759946, "README.md": 0.0017918539523558929, "coverage.xml": 0.021715239301768757, "docs/readme.md": 0.00011803692532472581, "media/coverage-badge.svg": 4.2982194701705824e-05, "pa11y.json": 0.00025578681143135096, "package-lock.json": 0.028516791316587936, "package.json": 0.00018827370478629308, "poetry.lock": 0.06214779427081766, "pyproject.toml": 0.0047100726714637865, "src/almanack/__init__.py": 0.0007790979227771374, "src/almanack/book.py": 0.0018698072351989385, "src/almanack/cli.py": 0.004620215024571, "src/almanack/git.py": 0.009041119787303037, "src/almanack/metrics/data.py": 0.01685943704457394, "src/almanack/metrics/entropy/calculate_entropy.py": 0.0026758650782534327, "src/almanack/metrics/entropy/processing_repositories.py": 0.0019730242487215003, "src/almanack/metrics/garden_lattice/connectedness.py": 0.006686146199632836, "src/almanack/metrics/garden_lattice/practicality.py": 0.0031127411964607323, "src/almanack/metrics/garden_lattice/understanding.py": 0.0016608337052025802, "src/almanack/metrics/metrics.yml": 0.01002750263588727, "src/almanack/metrics/remote.py": 0.0025030547588967746, "src/almanack/reporting/report.py": 0.0032561951645520217, "src/book/_config.yml": 0.0014211715989295478, "src/book/_static/custom.css": 0.00044839432134928975, "src/book/_toc.yml": 0.0009232439198919463, "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-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.004507476067189011, "src/book/garden-circle/garden-circle.md": 0.00011803692532472581, "src/book/garden-circle/garden-map.md": 0.0013400650229209604, "src/book/garden-circle/package-api.md": 0.0013671735796648872, "src/book/garden-lattice/garden-lattice.md": 0.0012308605052558962, "src/book/garden-lattice/understanding.md": 0.0031845955072730566, "src/book/introduction.md": 0.002202478777886068, "src/book/references.bib": 0.007292900480154505, "src/book/seed-bank/pubmed-github-repositories/gather-pubmed-repos/generate_data.py": 0.0048666308387477234, "src/book/seed-bank/pubmed-github-repositories/gather-pubmed-repos/generate_github_enriched_data.py": 0.003866925828781817, "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.0041434443281982815, "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.05066124999414861, "src/book/seed-bank/seed-bank.md": 0.00011803692532472581, "src/book/software-forest/software-forest.md": 0.0012582808486586293, "src/book/verdant-sundial/verdant-sundial.md": 0.0012856204491005655, "styles/config/vocabularies/almanack/accept.txt": 0.0007498757030847159, "tests/__init__.py": 0.0, "tests/conftest.py": 0.004507476067189011, "tests/data/almanack/coverage/python/coverage.json": 4.2982194701705824e-05, "tests/data/almanack/coverage/python/coverage.lcov": 0.020099797014865625, "tests/data/almanack/repo_setup/create_repo.py": 0.006601681638426565, "tests/data/almanack/repo_setup/insert_code.py": 0.0016608337052025802, "tests/data/jupyter-book/sandbox.md": 0.0005408729109422541, "tests/metrics/test_calculate_entropy.py": 0.001687151936421729, "tests/metrics/test_data.py": 0.021929524636905687, "tests/metrics/test_garden_lattice.py": 0.0022781682551554936, "tests/test_almanack.py": 0.0010924731761011023, "tests/test_build.py": 0.0018956871133573793, "tests/test_cli.py": 0.0024034963477559974, "tests/test_git.py": 0.009240016120558485, "tests/utils.py": 0.0010924731761011023}}]
CPU times: user 59.4 ms, sys: 9.72 ms, total: 69.1 ms
Wall time: 6.14 s
%%time
# show the same results from the CLI
!almanack check "./almanack"
Running Software Gardening Almanack checks.
Datetime: 2025-01-13T18:36:09.368206Z
Almanack version: 0.0.5
Target repository path: ./almanack
The following Software Gardening Almanack metrics have failed:
╭─────────────┬───────────────────────────┬────────────────────────────────────────────────────╮
│ ID │ Name │ Guidance │
├─────────────┼───────────────────────────┼────────────────────────────────────────────────────┤
│ SGA-GL-0025 │ repo-doi-valid-format │ DOI within the CITATION.cff file is not of a valid │
│ │ │ format or missing. │
├─────────────┼───────────────────────────┼────────────────────────────────────────────────────┤
│ SGA-GL-0026 │ repo-doi-https-resolvable │ DOI within the CITATION.cff file is not https │
│ │ │ resolvable or missing. │
╰─────────────┴───────────────────────────┴────────────────────────────────────────────────────╯
Software Gardening Almanack score: 81.82% (9/11)
CPU times: user 40.3 ms, sys: 10.7 ms, total: 51 ms
Wall time: 4.83 s