Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "metacheck"
version = "0.2.0"
version = "0.2.1"
description = "Detect metadata pitfalls in software repositories"
authors = ["Anas El Hounsri"]
readme = "README.md"
Expand Down
104 changes: 104 additions & 0 deletions results/pitfalls/output_1_pitfalls.jsonld
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
{
"@context": "[IN PROCESS]",
"@type": "SoftwareQualityAssessment",
"name": "Quality Assessment for tidyverse/tidyverse",
"description": "Easily install and load packages from the tidyverse",
"creator": {
"@type": "schema:Person",
"name": "Anonymous",
"email": "example@email.com"
},
"dateCreated": "2026-03-09T11:04:30Z",
"license": {
"@id": "https://opensource.org/license/mit"
},
"assessedSoftware": {
"@type": "schema:SoftwareApplication",
"name": "tidyverse/tidyverse",
"softwareVersion": "v2.0.0",
"url": "https://github.com/tidyverse/tidyverse",
"commit_id": "0231aafbc56914ee5371dd6c7b60677f168d7154"
},
"checks": [
{
"@type": "CheckResult",
"assessesIndicator": {
"@id": "https://w3id.org/rsmetacheck/catalog/#P001"
},
"checkingSoftware": {
"@type": "schema:SoftwareApplication",
"name": "RSMetacheck",
"@id": "https://w3id.org/rsmetacheck",
"softwareVersion": "0.2.0"
},
"process": "Compares the version found in the metadata file with the latest repository release tag.",
"status": {
"@id": "schema:CompletedActionStatus"
},
"output": "true",
"evidence": "P001 detected: codemeta.json version '1.2.1.9000' does not match release version '2.0.0'",
"suggestion": "Ensure the version in your metadata matches the latest official release. Keeping these synchronized avoids confusion for users and improves reproducibility.",
"checkId": "d5abee7e3b49470e8d53a72ecd7200b8197fe4acef28544cdfbe737ef2497a9d"
},
{
"@type": "CheckResult",
"assessesIndicator": {
"@id": "https://w3id.org/rsmetacheck/catalog/#P003"
},
"checkingSoftware": {
"@type": "schema:SoftwareApplication",
"name": "RSMetacheck",
"@id": "https://w3id.org/rsmetacheck",
"softwareVersion": "0.2.0"
},
"process": "Analyzes author fields in metadata to see if multiple distinct authors are merged into a single string.",
"status": {
"@id": "schema:CompletedActionStatus"
},
"output": "true",
"evidence": "P003 detected: DESCRIPTION Multiple authors found in single field: 'Posit Software, PBC'",
"suggestion": "You should separate multiple authors into a structured list. This allows tools and citation systems to correctly identify and credit each contributor.",
"checkId": "bd27c80fcfeaba3cff17a63eeac949f20e150ef91b00566589ce3c9f51053639"
},
{
"@type": "CheckResult",
"assessesIndicator": {
"@id": "https://w3id.org/rsmetacheck/catalog/#P010"
},
"checkingSoftware": {
"@type": "schema:SoftwareApplication",
"name": "RSMetacheck",
"@id": "https://w3id.org/rsmetacheck",
"softwareVersion": "0.2.0"
},
"process": "Analyzes the LICENSE file to determine if it only contains a copyright notice without any actual usage terms.",
"status": {
"@id": "schema:CompletedActionStatus"
},
"output": "true",
"evidence": "P010 detected: LICENSE file only contains copyright information without actual license terms",
"suggestion": "You need to include the complete text of a recognized license such as MIT, Apache 2.0, or GPL. A full license clarifies rights and usage conditions for others",
"checkId": "e5a81eaf374af4d2e5a2e68f8de68dde7f3fa4bb0a5d288c10dbd62b73dff6c9"
},
{
"@type": "CheckResult",
"assessesIndicator": {
"@id": "https://w3id.org/rsmetacheck/catalog/#P017"
},
"checkingSoftware": {
"@type": "schema:SoftwareApplication",
"name": "RSMetacheck",
"@id": "https://w3id.org/rsmetacheck",
"softwareVersion": "0.2.0"
},
"process": "Compares the version field in codemeta.json against the package manager version.",
"status": {
"@id": "schema:CompletedActionStatus"
},
"output": "true",
"evidence": "P017 detected: codemeta.json version '1.2.1.9000' does not match package version",
"suggestion": "You need to synchronize all version references across metadata and build configuration files.",
"checkId": "6b8e9e41e7fa2d9cb7101212ce191a8ef2acfcd6afba175005cef78173dc945a"
}
]
}
1 change: 1 addition & 0 deletions results/somef/output_1.json

Large diffs are not rendered by default.

265 changes: 265 additions & 0 deletions results/summary.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,265 @@
{
"summary": {
"total_repositories_analyzed": 1,
"repositories_with_target_languages": 1,
"individual_jsonld_files_created": 1,
"total_pitfalls_detected": 4,
"total_warnings_detected": 0,
"target_languages": [
"Python",
"Java",
"C++",
"C",
"R",
"Rust"
],
"evaluated_repositories": {
"tidyverse/tidyverse": {
"url": "https://github.com/tidyverse/tidyverse",
"commit_id": "0231aafbc56914ee5371dd6c7b60677f168d7154"
}
}
},
"pitfalls & warnings": [
{
"pitfall_code": "P001",
"pitfall_desc": "The metadata file (codemeta or other) has a version which does not correspond to the version used in the latest release",
"count": 1,
"percentage": 100.0,
"languages": {
"R": 1
},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P001"
},
{
"pitfall_code": "P002",
"pitfall_desc": "LICENSE file contains template placeholders like <program>, <year>, <name of author> that were not replaced",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P002"
},
{
"pitfall_code": "P003",
"pitfall_desc": "Metadata files have multiple authors in single field instead of a list",
"count": 1,
"percentage": 100.0,
"languages": {
"R": 1
},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P003"
},
{
"pitfall_code": "P004",
"pitfall_desc": "In codemeta.json README property pointing to their homepage/wiki instead of README file",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P004"
},
{
"pitfall_code": "P005",
"pitfall_desc": "codemeta.json referencePublication refers to software archive instead of paper",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P005"
},
{
"pitfall_code": "P006",
"pitfall_desc": "The metadata file has License pointing to a local file instead of stating the name",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P006"
},
{
"pitfall_code": "P007",
"pitfall_desc": "CITATION.cff does not have referencePublication even though it's referenced in codemeta.json",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P007"
},
{
"pitfall_code": "P008",
"pitfall_desc": "The metadata file softwareRequirement points to an invalid page",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P008"
},
{
"pitfall_code": "P009",
"pitfall_desc": "The metadata file coderepository points to their homepage",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P009"
},
{
"pitfall_code": "P010",
"pitfall_desc": "LICENSE file only contains copyright information without actual license terms",
"count": 1,
"percentage": 100.0,
"languages": {
"R": 1
},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P010"
},
{
"pitfall_code": "P011",
"pitfall_desc": "codemeta.json IssueTracker violates the expected URL format",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P011"
},
{
"pitfall_code": "P012",
"pitfall_desc": "codemeta.json downloadURL is outdated",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P012"
},
{
"pitfall_code": "P013",
"pitfall_desc": "The metadata file License does not have the specific version",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P013"
},
{
"pitfall_code": "P014",
"pitfall_desc": "codemeta.json uses bare DOIs in the identifier field instead of full https://doi.org/ URL",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P014"
},
{
"pitfall_code": "P015",
"pitfall_desc": "In codemeta.json contIntegration link returns 404",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P015"
},
{
"pitfall_code": "P016",
"pitfall_desc": "The metadata file codeRepository does not point to the same repository",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P016"
},
{
"pitfall_code": "P017",
"pitfall_desc": "codemeta.json version does not match the package's",
"count": 1,
"percentage": 100.0,
"languages": {
"R": 1
},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P017"
},
{
"pitfall_code": "P018",
"pitfall_desc": "codemeta.json Identifier uses raw SWHIDs without their resolvable URL",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P018"
},
{
"pitfall_code": "P019",
"pitfall_desc": "Inconsistent author counts found across metadata files",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#P019"
},
{
"warning_code": "W001",
"warning_desc": "Software requirements in metadata files don't have version specifications",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#W001"
},
{
"warning_code": "W002",
"warning_desc": "The dateModified in codemeta.json is outdated compared to the actual repository last update date",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#W002"
},
{
"warning_code": "W003",
"warning_desc": "Codemeta.json repository has multiple licenses but only one is listed",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#W003"
},
{
"warning_code": "W004",
"warning_desc": "Programming languages in codemeta.json do not have versions",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#W004"
},
{
"warning_code": "W005",
"warning_desc": "The metadata file softwareRequirements have more than one req, but it's written as one string",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#W005"
},
{
"warning_code": "W006",
"warning_desc": "codemeta.json Identifier is a name instead of a valid unique identifier, but an identifier exist",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#W006"
},
{
"warning_code": "W007",
"warning_desc": "codemeta.json Identifier is empty",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#W007"
},
{
"warning_code": "W008",
"warning_desc": "The metadata file GivenName is a list instead of a string",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#W008"
},
{
"pitfall_code": "W009",
"pitfall_desc": "codemeta.json developmentStatus is a URL instead of a string",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#W009"
},
{
"pitfall_code": "W010",
"pitfall_desc": "The metadata file codeRepository uses Git remote-style shorthand instead of full URL",
"count": 0,
"percentage": 0.0,
"languages": {},
"pitfall": "https://w3id.org/rsmetacheck/catalog/#W010"
}
]
}
5 changes: 2 additions & 3 deletions src/metacheck/cli.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import argparse
import os
from pathlib import Path
from metacheck.run_somef import run_somef_batch, run_somef_single, configure_somef
from metacheck.run_somef import run_somef_batch, run_somef_single, ensure_somef_configured
from metacheck.run_analyzer import run_analysis


Expand Down Expand Up @@ -66,8 +66,7 @@ def cli():
run_analysis(somef_json_paths, args.pitfalls_output, args.analysis_output, verbose=args.verbose)

else:
# Before taking any SoMEF actions, configure it
configure_somef()
ensure_somef_configured()

threshold = args.threshold
somef_output_dir = args.somef_output
Expand Down
Loading