EpiVerse
  • Repositories
  • Contributors
  • Community Health
    • Feedback
    • Source Code
    • github.com/reconhub
    • github.com/epiverse-trace
    • github.com/reconverse

On this page

  • Aggregate Community Health
  • Individual models of community health
  • Community health for individual repositories

Community Health

The Organizational Maintenance and Repository Maintenance pages provide various insights into maintenance deficits and needs across the whole organization and within individual repositories. This page provides more detail on the various CHAOSS (Community Health Analytics in Open Source Software) models used to generate values shown on those two pages. Each of these conceptual models aggregates various individual metrics, and aims to synthesise prominent aspects of community health. This page provides insights into a range of those models, assessed for each repository in the epiverse-trace and reconhub GitHub organizations. Details of individual metrics can be seen on the Repository Maintenance page.

Aggregate Community Health

This page shows aggregate community health scores for all repositories within the reconhub and epiverse-trace organizations. Higher values describe repositories with greater community health scores. Values for individual models are standardised across all repositories to have mean values of zero and standard deviations of one. These results are aggregated across thirteen distinct models, leading to maximal aggregated values slightly exceeding that value.

Plot = import("https://esm.sh/@observablehq/plot")
models_all = {
    return transpose(models_in).map(row => ({
        ...row,
    }));
}
models_final = models_all.filter(function(mod) {
    return mod.name === "final"
})
models_len = models_final.length
Plot.plot({
    height: 20 * models_len,
    marginLeft: 60,
    marginRight: 160,
    marginTop: 50,
    marginBottom: 50,
    axis: null,
    x: {
        axis: "top",
        grid: true,
        label: "Community Health"
    },
    y: { grid: true },
    marks: [
        Plot.barX(models_final, {
            y: "package",
            x: "value",
            sort: {y: "-x" },
            fill: "value",
        }),
        Plot.barX(models_final,
            Plot.pointer(
            {
                y: "package",
                x: "value",
                sort: {y: "-x" },
                stroke: "gray",
                fill: "value",
                strokeWidth: 2,
            })
        ),
        Plot.text(models_final, {
            x: (d) => d.value < 0 ? 0 : d.value,
            y: "package",
            text: "package",
            textAnchor: "start",
            fontSize: 16,
            dx: 5
        })
    ],
    color: {
        scheme: "Cool",
        type: "ordinal"
    }
})

Individual models of community health

The following section shows values for each individual model of community health for all repositories.

json_data = FileAttachment("results-json-data.json").json();
rm_metrics_models = json_data['rm_metrics_models'];
rm_models = rm_metrics_models['models'];
rm_model_text = rm_metrics_models['model_names'];
modelsTextMap = rm_model_text.reduce((map, item) => {
    return map.set(String(item.name), item.airtable_name);
}, new Map());
modelsUrlMap = rm_model_text.reduce((map, item) => {
    return map.set(String(item.name), item.url);
}, new Map());
commHealthVars = Array.from(modelsTextMap.keys());
commHealthText = commHealthVars.map(item => {
    return modelsTextMap.has(item) ? modelsTextMap.get(item) : "";
})
viewof commHealthVar = Inputs.select(
    rm_model_text,
    {
        multiple: "false",
        label: "Community Health Variable",
        format: x => x.airtable_name,
    }
);

htl.html`<div>
Click this link for description of the <a href="${commHealthVar.url}" target="_blank">
<i>${commHealthVar.airtable_name}</i></a> CHAOSS model.
</div>`
models_filtered = models_all.filter(function(mod) {
    return mod.name === commHealthVar.name
})
Plot.plot({
    height: 20 * models_len,
    marginLeft: 60,
    marginRight: 160,
    marginTop: 50,
    marginBottom: 50,
    axis: null,
    x: {
        axis: "top",
        grid: true,
        label: "Community Health"
    },
    y: { grid: true },
    marks: [
        Plot.barX(models_filtered, {
            y: "package",
            x: "value",
            sort: {y: "-x" },
            fill: "value",
        }),
        Plot.barX(models_filtered,
            Plot.pointer(
            {
                y: "package",
                x: "value",
                sort: {y: "-x" },
                stroke: "gray",
                fill: "value",
                strokeWidth: 2,
            })
        ),
        Plot.text(models_filtered, {
            x: (d) => d.value < 0 ? 0 : d.value,
            y: "package",
            text: "package",
            textAnchor: "start",
            fontSize: 16,
            dx: 5
        })
    ],
    color: {
        scheme: "Cool",
        type: "ordinal"
    }
})

Community health for individual repositories

The following section shows all models of community health for a selected repository. The names of the models are hyperlinked to the definitions within the specific pages of the CHAOSS models.

reposAll = models_all.map(function(item) {
    return item.package;
});
repos = Array.from(new Set(reposAll));
repoSet = localStorage.getItem("orgmetricsRepo") || repos [0]
viewof repo = Inputs.select(
    repos,
    {
        multiple: false,
        value: repoSet,
        label: htl.html`<b>Repository:</b>`
    }
)
tmpval = localStorage.setItem("orgmetricsRepo", repo.toString());
models_with_url = models_all.map(item => {
    const key = item.name;
    const url = modelsUrlMap.has(key) ? modelsUrlMap.get(key) :
        "https://chaoss.community/kbtopic/all-metrics-models/";
    const fullname = modelsTextMap.has(key) ? modelsTextMap.get(key) : item.name
    return {
        ...item,
        fullname: fullname,
        url: url
    }
})
model_repo = models_with_url.filter(function(mod) {
    return mod.package === repo && mod.name !== "final"
})
model_repo_len = model_repo.length
bar_ht_mult = model_repo_len > 20 ? 20 : 40;
Plot.plot({
    height: bar_ht_mult * model_repo_len,
    marginLeft: 60,
    marginRight: 160,
    marginTop: 50,
    marginBottom: 50,
    axis: null,
    x: {
        axis: "top",
        grid: true,
        label: "Community Health"
    },
    y: { grid: true },
    marks: [
        Plot.barX(model_repo, {
            y: d => d.fullname,
            x: d => d.value,
            sort: {y: "-x" },
            fill: d => d.value,
        }),
        Plot.barX(model_repo,
            Plot.pointer(
            {
                y: d => d.fullname,
                x: d => d.value,
                sort: {y: "-x" },
                stroke: "gray",
                fill: d => d.value,
                strokeWidth: 2,
            })
        ),
        Plot.text(model_repo, {
            x: d => d.value,
            y: d => d.fullname,
            text: d => d.fullname,
            href: d => d.url,
            textAnchor: "start",
            fontSize: 16,
            dx: 5
        })
    ],
    color: {
        scheme: "Cool",
        type: "ordinal"
    }
})
 
Cookie Preferences