A command line tool to check a bunch of indicators related to research software quality.
Preferably inside a Python virtual environment:
pip install .
$ resqui -h
Usage:
resqui [options]
resqui indicators
Options:
-u <repository_url> URL of the repository to be analyzed.
-c <config_file> Path to the configuration file.
-o <output_file> Path to the output file [default: resqui_summary.json].
-t <github_token> GitHub API token.
-b <branch> The Git branch to be checked.
-v Verbose output.
--version Show the version of the script.
--help Show this help message.
The preliminary configuration file format is JSON and consists a list
of indicators and the plugins to be used. The name field matches the
actual method of the class named plugin. If no configuration file is
provided, a default set of indicators will be used.
{
"indicators": [
{ "name": "has_license", "plugin": "HowFairIs", "@id": "https://w3id.org/everse/i/indicators/license" },
{ "name": "has_citation", "plugin": "CFFConvert", "@id": "https://w3id.org/everse/i/indicators/citation" }
]
}resqui offers a GitHub action which can be installed by creating a dedicated
configuration file in the .github/workflows folder, named e.g. resqui.yml
with the content below. It also needs a new environment called resqui in
your GitHub repository settings under
https://github.com/USER_OR_GROUP/PROJECT/settings/environments with a secret
environment variable named DASHVERSE_TOKEN which is needed for publishing the
pipeline results to the DashVerse instance.
Note: the CI action will be triggered on each "push". Make sure to Allow all
actions and reusable workflows in the repository settings under
https://github.com/USER_OR_GROUP/PROJECT/settings/actions.
name: Run Resqui CI
on:
push:
jobs:
run-resqui:
runs-on: ubuntu-latest
# make sure to match the environment's name
environment: resqui
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Run resqui action
uses: EVERSE-ResearchSoftware/QualityPipelines@main
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
dashverse_token: ${{ secrets.DASHVERSE_TOKEN }}
# a configuartion file is optional and can be placed at the root of the repository
# config: .resqui.jsonThe resqui command line tool can be used to generate and publish a report.
Some indicator plugins require a GitHub API access token, which can be passed via -t.
A personal access token is can be generated on the GitHub
website: https://github.com/settings/personal-access-tokens
Be aware that some GitHub organisations might disallow tokens with no expiration date.
When running resqui as a GitHub action, the automatically generated token from the CI
job will be used.
$ resqui -c example.json -t $RESQUI_GITHUB_TOKEN
GitHub API token ✔
Repository URL: https://github.com/EVERSE-ResearchSoftware/QualityPipelines.git
Project name: QualityPipelines
Author: Tamas Gal
Email: [email protected]
Version: v0.1.0-95-gc1dacb1
Branch, tag or commit hash: c1dacb1197005e9bce20063b2215bdfd7f9939d9
Checking indicators ...
has_license/HowFairIs (1.2s): ✖
has_citation/CFFConvert (1.0s): ✖
Summary has been written to resqui_summary.json
Publishing summary ✔
The current output format is a JSON, based on the Schema presented here: https://github.com/EVERSE-ResearchSoftware/schemas/blob/main/assessment/dev/example.json
{
"@context": "https://w3id.org/everse/rsqa/0.0.1/",
"@type": "SoftwareQualityAssessment",
"dateCreated": "2025-07-16 09:17:34.280112",
"license": {
"@id": "https://creativecommons.org/publicdomain/zero/1.0/"
},
"checks": [
{
"@type": "CheckResult",
"assessesIndicator": {
"@id": "https://w3id.org/everse/i/indicators/license"
},
"checkingSoftware": {
"@type": "schema:SoftwareApplication",
"name": "HowFairIs",
"@id": "https://w3id.org/everse/tools/howfairis",
"softwareVersion": "0.14.2"
},
"process": "Searches for a file named 'LICENSE' or 'LICENSE.md' in the repository root.",
"status": {
"@id": "schema:CompletedActionStatus"
},
"output": "valid",
"evidence": "Found license file: 'LICENSE'."
},
{
"@type": "CheckResult",
"assessesIndicator": {
"@id": "https://w3id.org/everse/i/indicators/citation"
},
"checkingSoftware": {
"@type": "schema:SoftwareApplication",
"name": "CFFConvert",
"@id": "https://w3id.org/everse/tools/cffconvert",
"softwareVersion": "2.0.0"
},
"process": "Searches for a 'CITATION.cff' file in the repository root and validates its syntax.",
"status": {
"@id": "schema:CompletedActionStatus"
},
"output": "invalid",
"evidence": "No valid CITATION.cff file found in repository root."
}
]
}An indicator plugin is represented by a subclass of
resqui.plugins.IndicatorPlugin and uses either a
resqui.plugins.PythonExecutor or a resqui.plugins.DockerExecutor to run the
software to determine the indicator values.
The subclassing is mainly used to identify plugins during runtime,
there is no other inheritence magic behind that.
Each indicator plugin should define a set of class attributes:
name: currently matches the class nameversion: dot-separated numbersid: URL of the tool description on w3id.orgindicators: a list of indicators, matching the actual method names
The Python executor manages a virtual environment and installs the required
packages via pip. A script can be passed to .execute() which returns the
result as an instance of subprocess.CompletedProcess that is executed inside
the virtual environment.
The Docker executor pulls the required image and allows to run scripts inside a
container spawned from that very image. The command is passed to .run() with
optional argments that are passed to the docker run command. The result is
returned similar to the PythonExecutor as an instance of
subprocess.CompletedProcess.