diff --git a/.github/workflows/test-action.yml b/.github/workflows/test-action.yml new file mode 100644 index 0000000..314d22e --- /dev/null +++ b/.github/workflows/test-action.yml @@ -0,0 +1,39 @@ +name: Test Action + +on: + push: + branches: + - main + pull_request: + +jobs: + test-action: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Run RsMetaCheck Action on self + uses: ./ + with: + # Automatically uses ${{ github.repository }} and checks it + verbose: "false" + env: + # Provide token for SoMEF API rate limits (optional but recommended) + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Verify outputs are generated + run: | + if [ ! -d "somef_outputs" ]; then + echo "somef_outputs directory not found!" + exit 1 + fi + if [ ! -d "pitfalls" ]; then + echo "pitfalls directory not found!" + exit 1 + fi + if [ ! -f "all_pitfalls_results.json" ]; then + echo "all_pitfalls_results.json not found!" + exit 1 + fi + echo "Output files verified successfully." diff --git a/README.md b/README.md index 069d42b..fa08b71 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,39 @@ pip install git+https://github.com/SoftwareUnderstanding/RsMetaCheck.git ## Usage -### Run the Detection Tool +### GitHub Action + +RsMetaCheck can be easily integrated into your CI/CD pipelines as a GitHub Action. + +```yaml +name: RsMetaCheck + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + check-metadata: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Run RsMetaCheck + uses: SoftwareUnderstanding/RsMetaCheck@v0.2.1 # Update to the latest version tag + with: + # Optional: Include passed checks in output (defaults to false) + verbose: "false" + env: + # Optional: Provide token for SoMEF API rate limits + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +``` + +The action will generate `all_pitfalls_results.json`, along with the `pitfalls/` and `somef_outputs/` directories directly in your workflow workspace. + +### Run the Detection Tool locally #### Analyze a Single Repository diff --git a/action.yml b/action.yml new file mode 100644 index 0000000..72c3b78 --- /dev/null +++ b/action.yml @@ -0,0 +1,56 @@ +name: "RsMetaCheck" +description: "Detect metadata pitfalls and warnings in software repositories using SoMEF." +author: "SoftwareUnderstanding" +branding: + icon: "check-circle" + color: "blue" + +inputs: + repository_url: + description: "URL of the repository to analyze. Defaults to the current GitHub workspace repository." + required: false + default: "https://github.com/${{ github.repository }}" + branch: + description: "Specific branch to analyze." + required: false + input_file: + description: "Path to a JSON file containing a list of repositories to analyze." + required: false + verbose: + description: "Whether to include all tests (even passed ones) in the final JSON-LD output." + required: false + default: "false" + +runs: + using: "composite" + steps: + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + cache: "pip" + + - name: Install RsMetaCheck + shell: bash + run: pip install ${{ github.action_path }} + + - name: Run RsMetaCheck + shell: bash + run: | + CMD="rsmetacheck" + + if [ -n "${{ inputs.input_file }}" ]; then + CMD="$CMD --input ${{ inputs.input_file }}" + elif [ -n "${{ inputs.repository_url }}" ]; then + CMD="$CMD --input ${{ inputs.repository_url }}" + if [ -n "${{ inputs.branch }}" ]; then + CMD="$CMD --branch ${{ inputs.branch }}" + fi + fi + + if [ "${{ inputs.verbose }}" == "true" ]; then + CMD="$CMD --verbose" + fi + + echo "Running: $CMD" + eval "$CMD" diff --git a/docs/ground_truth/index.html b/docs/ground_truth/index.html index 38a85db..d6c2829 100644 --- a/docs/ground_truth/index.html +++ b/docs/ground_truth/index.html @@ -18,7 +18,7 @@ margin-bottom: 30px; } .table-container { - max-width: 1200px; + max-width: 95%; margin: 0 auto; overflow-x: auto; box-shadow: 0 4px 6px rgba(0,0,0,0.1); @@ -95,7 +95,7 @@

Ground TruthReport

Pitfall / Warning Code Description Source File - Automated + Commit ID @@ -126,11 +126,11 @@

Ground TruthReport

let isFirstContext = true; for (const [code, info] of pEntries) { - addRow(tbody, url, code, info, 'p', isFirstContext, totalRows); + addRow(tbody, url, code, info, 'p', isFirstContext, totalRows, repoData); isFirstContext = false; } for (const [code, info] of wEntries) { - addRow(tbody, url, code, info, 'w', isFirstContext, totalRows); + addRow(tbody, url, code, info, 'w', isFirstContext, totalRows, repoData); isFirstContext = false; } @@ -144,7 +144,7 @@

Ground TruthReport

}); }); - function addRow(tbody, url, code, info, type, isFirstContext, totalRows) { + function addRow(tbody, url, code, info, type, isFirstContext, totalRows, repoData) { const tr = document.createElement('tr'); if (isFirstContext) { @@ -179,14 +179,30 @@

Ground TruthReport

const tdSource = document.createElement('td'); tdSource.textContent = info.source_file || 'Unknown'; - // Automated Column - const tdAutomated = document.createElement('td'); - tdAutomated.textContent = 'Yes'; - tr.appendChild(tdCode); tr.appendChild(tdDesc); tr.appendChild(tdSource); - tr.appendChild(tdAutomated); + + if (isFirstContext) { + const tdCommit = document.createElement('td'); + tdCommit.style.whiteSpace = 'nowrap'; + const commitId = repoData['commit ID']; + if (commitId) { + const aCommit = document.createElement('a'); + let cleanUrl = url.endsWith('/') ? url.slice(0, -1) : url; + let treePath = cleanUrl.includes('gitlab') ? '/-/tree/' : '/tree/'; + aCommit.href = `${cleanUrl}${treePath}${commitId}`; + aCommit.textContent = commitId.substring(0, 7); + aCommit.className = 'repo-link'; + aCommit.style.wordBreak = 'normal'; + aCommit.target = '_blank'; + tdCommit.appendChild(aCommit); + } else { + tdCommit.textContent = 'Unknown'; + } + tdCommit.rowSpan = totalRows; + tr.appendChild(tdCommit); + } tbody.appendChild(tr); } diff --git a/docs/ground_truth/summary_pitfalls_warnings.json b/docs/ground_truth/summary_pitfalls_warnings.json index c955629..01eaf0e 100644 --- a/docs/ground_truth/summary_pitfalls_warnings.json +++ b/docs/ground_truth/summary_pitfalls_warnings.json @@ -10,9 +10,10 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "245b109d77370eec2eb7c4dce0370638887aa7c6" }, "repo_2": { "url": "https://github.com/damiendevienne/phylter", @@ -21,7 +22,8 @@ "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "4d74241169be3882da9d5f08da47bd40604764eb" }, "repo_3": { "url": "https://github.com/gavinsimpson/data.adapt.multi.test", @@ -32,7 +34,7 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { @@ -44,7 +46,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "Identifier is empty" } - } + }, + "commit ID": "b33e222ddb9e05da62afb0bbfd88bd8a3567ac89" }, "repo_4": { "url": "https://github.com/FairRootGroup/FairMQ", @@ -55,10 +58,11 @@ }, "P006": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "License pointing to a local file instead of stating the name. For example: \u201clicense\u201d: LICENSE.MD" + "description": "License pointing to a local file instead of stating the name. For example: “license”: LICENSE.MD" } }, - "warnings": {} + "warnings": {}, + "commit ID": "fa64faf3f755e9b00e0af738826718bf5117c8ea" }, "repo_5": { "url": "https://github.com/neuronsimulator/nrn", @@ -66,7 +70,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -76,7 +80,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "aba5057b527587f1ca9a43b772edf47346d41e5a" }, "repo_6": { "url": "https://github.com/gabrielblain/CropWaterBalance", @@ -95,7 +100,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "6b6a27d027b3508b62aff062cb8fd66f3942951e" }, "repo_7": { "url": "https://github.com/instatdealii/idealii", @@ -108,7 +114,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -118,7 +124,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "8f6d66b22dfcf276cce0eb275f46fdb2f6c5d59e" }, "repo_8": { "url": "https://github.com/sillyplots/spotifyr", @@ -141,7 +148,8 @@ "source_file": "codemeta.json", "description": "Identifier is a name instead of a valid unique identifier, but an identifier exist (e.g., in a badge)" } - } + }, + "commit ID": "68bc0ae54ee5f727b9ff6b70483f9b4b1fddaf3e" }, "repo_9": { "url": "https://github.com/Materials-Data-Science-and-Informatics/dirschema", @@ -149,13 +157,14 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W009": { "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "297c914fa277e2c720ae08a758707ef8ebe51ef6" }, "repo_10": { "url": "https://github.com/sanorthey/pemmss", @@ -165,7 +174,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "Inconsistent use of licenses in metadata files" } - } + }, + "commit ID": "65883be0f53fdfa3911cc8d3847931d1cc9f4037" }, "repo_11": { "url": "https://github.com/gemini3d/gemini3d", @@ -184,7 +194,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "ee89832c620c05101751759f3fbaf1ba9e7d7b74" }, "repo_12": { "url": "https://github.com/Sprinterzzj/ggstatsplot", @@ -201,7 +212,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W003": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", @@ -219,7 +230,8 @@ "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "150a4bd2bb66bd1bdbe19eadec3bb6a6f00c66b7" }, "repo_13": { "url": "https://github.com/bioconductor-source/treeio", @@ -230,34 +242,36 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W004": { "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "df013a97e144086980317527de6fab39dc54e9fa" }, "repo_14": { "url": "https://github.com/Kaffeegangster/tclf", "pitfalls": { "P006": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "License pointing to a local file instead of stating the name. For example: \u201clicense\u201d: LICENSE.MD" + "description": "License pointing to a local file instead of stating the name. For example: “license”: LICENSE.MD" } }, "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "d44b74f990c3e2d03d9a3ced3a89ffa619b59d63" }, "repo_15": { "url": "https://github.com/BM32ESRF/LaueNN", @@ -265,7 +279,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -275,7 +289,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "9033ffbf5c5257b0e22289bf6fb175dc678e1c84" }, "repo_16": { "url": "https://github.com/Ruitao-Terry/GA-cal", @@ -290,7 +305,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "Inconsistent use of licenses in metadata files" } - } + }, + "commit ID": "62f5b3a8bcd3ae2e3c3e639bd6ad856d2b001d04" }, "repo_17": { "url": "https://github.com/LanguageMachines/ucto", @@ -298,7 +314,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -312,7 +328,8 @@ "source_file": "codemeta.json", "description": "Identifier is a name instead of a valid unique identifier, but an identifier exist (e.g., in a badge)" } - } + }, + "commit ID": "a57692225c4693a4229f7cd74f39465aaa96b4a7" }, "repo_18": { "url": "https://github.com/eebrown/workloopR", @@ -343,7 +360,8 @@ "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "51ca63341023a996fecaa6057109aa8c16029b51" }, "repo_19": { "url": "https://gricad-gitlab.univ-grenoble-alpes.fr/bidegarb/nautil/", @@ -351,13 +369,14 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W004": { "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "5d60f004a965a016cf40cca42cc696e33296969a" }, "repo_20": { "url": "https://github.com/lecfab/rescience-gorder", @@ -365,7 +384,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W004": { "source_file": "codemeta.json", @@ -373,9 +392,10 @@ }, "W005": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "softwareRequirements have more than one req, but it\u2019s written as one string" + "description": "softwareRequirements have more than one req, but it’s written as one string" } - } + }, + "commit ID": "305d28dc1584b152ff981ee81be0de12598b402e" }, "repo_21": { "url": "https://github.com/arthurcuri/flixfinder-tis1", @@ -385,22 +405,24 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "Inconsistent use of licenses in metadata files" } - } + }, + "commit ID": "8771f700fd168e2e6c16a4f85b6631ca6b9c569f" }, "repo_22": { "url": "https://github.com/ComputationalBiomechanicsLab/opensim-creator", "pitfalls": { "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "824222911d158f0ffc6929605f8a925ff08fcf64" }, "repo_23": { "url": "https://github.com/nazar-mykolyshyn/TikTok-Api", @@ -408,9 +430,10 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "3973da62a683b34548d07acb48e334ac5b4cfe6d" }, "repo_24": { "url": "https://github.com/iljah/hdintegrator", @@ -420,7 +443,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "Inconsistent use of licenses in metadata files" } - } + }, + "commit ID": "f2ab7fb246ef88a79789e492d1f40d3a07b602d9" }, "repo_25": { "url": "https://github.com/peterpolidoro/kicad_netlist_reader", @@ -437,7 +461,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -451,7 +475,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "1b2108e0a8da04acdb595c724f3272a73f1ab755" }, "repo_26": { "url": "https://github.com/ropensci/geojson", @@ -466,19 +491,20 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W004": { "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "3881c7df07e924b3afce2270b78e316e5e47e79d" }, "repo_27": { "url": "https://github.com/Neplex/ArchiTXT", @@ -491,7 +517,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W003": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", @@ -509,7 +535,8 @@ "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "e82e532453dff78fe5ea2475774be167521c0fca" }, "repo_28": { "url": "https://github.com/NeuralEnsemble/PyNN", @@ -526,7 +553,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -538,9 +565,10 @@ }, "W005": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "softwareRequirements have more than one req, but it\u2019s written as one string" + "description": "softwareRequirements have more than one req, but it’s written as one string" } - } + }, + "commit ID": "5a53a5144e5c8c739a0ad65435cea23579574a19" }, "repo_29": { "url": "https://github.com/Rbfinch/grepq", @@ -551,7 +579,7 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { @@ -559,7 +587,8 @@ "source_file": "codemeta.json", "description": "dateModified is outdated" } - } + }, + "commit ID": "3251219d23b1242a562a593f4e9f2f98ce797fad" }, "repo_30": { "url": "https://github.com/ms609/TreeSearch", @@ -590,7 +619,8 @@ "source_file": "codemeta.json", "description": "Identifier is a name instead of a valid unique identifier, but an identifier exist (e.g., in a badge)" } - } + }, + "commit ID": "d4af0fba212c8490e2c0250d3872f4b9e0d630c2" }, "repo_31": { "url": "https://github.com/inbo/archivaltag", @@ -613,7 +643,8 @@ "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "ad337685076bb7eae906bee4dae6067812564284" }, "repo_32": { "url": "https://github.com/ms609/Quartet", @@ -632,7 +663,8 @@ "source_file": "codemeta.json", "description": "Identifier is a name instead of a valid unique identifier, but an identifier exist (e.g., in a badge)" } - } + }, + "commit ID": "8b81f549be20f251f71f2be402c5ff6d90dada3f" }, "repo_33": { "url": "https://github.com/tvwenger/bayes_spec", @@ -645,7 +677,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -659,7 +691,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "Identifier is empty" } - } + }, + "commit ID": "2dc53e3fc9302b8a40fcaec6384ee152c700590a" }, "repo_34": { "url": "https://github.com/caseyyoungflesh/MCMCvis", @@ -682,7 +715,8 @@ "source_file": "codemeta.json", "description": "Identifier is a name instead of a valid unique identifier, but an identifier exist (e.g., in a badge)" } - } + }, + "commit ID": "3c7b05282dbe3b509f2a101e0ac5fd397c283cfa" }, "repo_35": { "url": "https://github.com/sep-developers/sep", @@ -703,13 +737,14 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", "description": "dateModified is outdated" } - } + }, + "commit ID": "93b3ac52e0f6cb26449204dc8bc8c3cf65602f0f" }, "repo_36": { "url": "https://github.com/ropensci/tradestatistics", @@ -728,7 +763,7 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { @@ -736,7 +771,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "4c0b85989f0085f4eb4c16eaefab6214b7854b6b" }, "repo_37": { "url": "https://github.com/bioc/BioCor", @@ -755,19 +791,20 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W004": { "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "e26910ce2bb0f6e1b4edcde1b0fa925d78c837a0" }, "repo_38": { "url": "https://github.com/ropensci-archive/tidytags", @@ -786,7 +823,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "65c40bcb0e6721b55be676c42b524e33ea59885e" }, "repo_39": { "url": "https://github.com/giscience-fsu/sperrorest", @@ -809,7 +847,8 @@ "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "b4d2a1426bfcbb2f5630c6182ff946b926f96e4a" }, "repo_40": { "url": "https://github.com/IBM/multi-variate-parallel-transformer", @@ -822,9 +861,10 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "9f5357bb55d53c66e9cfc63ef39fddb05c1c1ad7" }, "repo_41": { "url": "https://github.com/mia-jinns/jinns", @@ -837,7 +877,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -847,7 +887,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "dbd98a4fe05f04b8f96d1bf23ea977a3938c8d66" }, "repo_42": { "url": "https://github.com/PRIDE-Archive/pridepy", @@ -855,9 +896,10 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "b046bd00569ae3930b51581d559cc5c5afde866a" }, "repo_43": { "url": "https://github.com/fair-test/license-already-here", @@ -870,7 +912,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -880,7 +922,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "4ca932834fe48821f39300c8de3bf92a4ffd366b" }, "repo_44": { "url": "https://github.com/SedFoam/sedfoam", @@ -888,7 +931,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -898,7 +941,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "08a5552af912fa8c89a265329484618ae7919be9" }, "repo_45": { "url": "https://github.com/assume-framework/assume", @@ -911,7 +955,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -921,7 +965,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "Inconsistent use of licenses in metadata files" } - } + }, + "commit ID": "aaa904c603ef267aaab6872d67cd87affcb17688" }, "repo_46": { "url": "https://github.com/felixsc1/COSplay", @@ -948,7 +993,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "Identifier is empty" } - } + }, + "commit ID": "9a10c3f55b1f80c916d55acb3110402cdfda6fa5" }, "repo_47": { "url": "https://github.com/megasanjay/testrepository", @@ -971,7 +1017,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "b589e13fb3a725d82d6d0f9a8c68de51b765e546" }, "repo_48": { "url": "https://github.com/GlobalEcologyLab/poems", @@ -994,7 +1041,8 @@ "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "129b021c42b726a9cb3e8b2b0786a1bc9513f4d9" }, "repo_49": { "url": "https://github.com/EDIorg/ecocomDP", @@ -1004,7 +1052,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "531bbefc6a584cfde708c8112ac08b9c63b810bc" }, "repo_50": { "url": "https://github.com/fhdsl/conrad", @@ -1015,7 +1064,7 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { @@ -1023,7 +1072,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "f7bda1bcc042e61b96ff84c860f3bb0ff5d690b1" }, "repo_51": { "url": "https://github.com/MiguelRodo/Slides24STA5069Z", @@ -1034,7 +1084,7 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { @@ -1042,7 +1092,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "44fa1574b3dd34eee6eda27fb8428e44c4a9dd51" }, "repo_52": { "url": "https://github.com/FairRootGroup/DDS", @@ -1052,7 +1103,8 @@ "description": "Version does not correspond to the version used in the latest release" } }, - "warnings": {} + "warnings": {}, + "commit ID": "39e33651d1fe319411d7c50ff44b5ede31d75f9d" }, "repo_53": { "url": "https://github.com/amd/mumps-build", @@ -1071,7 +1123,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "a9af8ebc5a24c075f62464daf03b30ce6ab1945b" }, "repo_54": { "url": "https://github.com/MolSSI/QCEngine", @@ -1086,7 +1139,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "cdda3660afee241968907c3020ee368ef8230b99" }, "repo_55": { "url": "https://github.com/Simple-Robotics/proxsuite", @@ -1094,9 +1148,10 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "00a6eff9dcb21f31b8990d232d46fba5d6b18cbf" }, "repo_56": { "url": "https://github.com/ropensci/occCite", @@ -1107,7 +1162,7 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { @@ -1127,7 +1182,8 @@ "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "b1af9efcf9a6b892591297c08bc2f0e1c00b573a" }, "repo_57": { "url": "https://github.com/sscu-budapest/lead-contamination-hungary", @@ -1135,9 +1191,10 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "17db2298e25bb439873e3746ddab6aad05b9014f" }, "repo_58": { "url": "https://github.com/Mariizero/ECGRat", @@ -1152,7 +1209,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "eaeb1758e791926d267c69807ad5b3dab75c98a9" }, "repo_59": { "url": "https://github.com/khinsen/MMTK", @@ -1165,7 +1223,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -1179,7 +1237,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "84547c238580201fe21bf3f227be7c02a1a2b9bc" }, "repo_60": { "url": "https://github.com/electronicvisions/releases-ebrains", @@ -1192,7 +1251,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -1204,9 +1263,10 @@ }, "W005": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "softwareRequirements have more than one req, but it\u2019s written as one string" + "description": "softwareRequirements have more than one req, but it’s written as one string" } - } + }, + "commit ID": "fcd2149561ab1796fba4d2500facdd3e532a6b86" }, "repo_61": { "url": "https://github.com/LanguageMachines/foliautils", @@ -1219,7 +1279,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W004": { "source_file": "codemeta.json", @@ -1233,7 +1293,8 @@ "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "bdcfd01531c0b147bfc2cb08f9e8e351db6100fb" }, "repo_62": { "url": "https://github.com/yt-project/unyt", @@ -1248,13 +1309,13 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -1264,7 +1325,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "Identifier is empty" } - } + }, + "commit ID": "969fc6a629d332568832b849c6cb058d405ad442" }, "repo_63": { "url": "https://github.com/cristal-smac/ipd", @@ -1272,7 +1334,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -1286,7 +1348,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "40c86c7f7ad51599ed402ab03bbfad398d4cce61" }, "repo_64": { "url": "https://github.com/grycap/im-client", @@ -1303,7 +1366,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W003": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", @@ -1313,7 +1376,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "2e9f20e0a1326a63998b2c181042f5315515b98d" }, "repo_65": { "url": "https://github.com/ashbythorpe/selenider", @@ -1328,7 +1392,7 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { @@ -1336,20 +1400,21 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "0f802fea4d6429786335a9f31ca53b0e941a80de" }, "repo_66": { "url": "https://github.com/HumanBrainProject/kg-core-sdks", "pitfalls": { "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -1359,7 +1424,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "83b3091785a7e007408e463122cd64cd40049bad" }, "repo_67": { "url": "https://github.com/ajpelu/likelihoodTools", @@ -1374,7 +1440,7 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { @@ -1386,7 +1452,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "e0d8fdb5b69d27a641ffc4731e8c2e5b6a21b67c" }, "repo_68": { "url": "https://github.com/KonradHoeffner/rickview", @@ -1401,7 +1468,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "934e834915544005e0a0106d45d222d4e745f129" }, "repo_69": { "url": "https://github.com/dankelley/oce", @@ -1424,7 +1492,7 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { @@ -1440,7 +1508,8 @@ "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "40904f6d5b9b1fd3d2d0631da59759283285a93f" }, "repo_70": { "url": "https://github.com/jonas-ellert/linear-time-runs", @@ -1450,7 +1519,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "065dfae01cccc8fa7fa8b116cfa91f272c0b22ba" }, "repo_71": { "url": "https://github.com/Miagarciaru/atlas-outreach-data-tools-for-lumi36", @@ -1463,7 +1533,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -1473,7 +1543,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "fc28e29316a373b917db9e88c778fb52697476cc" }, "repo_72": { "url": "https://github.com/peterpolidoro/kicad_bom", @@ -1486,7 +1557,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -1496,7 +1567,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "9868eeec378a9a3723c963c66a4a5e77023903aa" }, "repo_73": { "url": "https://github.com/FIPE18-007-VERMEULEN/csdvp-evolutionary-algorithm-optimization", @@ -1513,7 +1585,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -1523,7 +1595,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "19cc44fd5204dcc32fdff9e1a2213e5aa74db5b2" }, "repo_74": { "url": "https://github.com/Nowosad/rcartocolor", @@ -1538,19 +1611,20 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W004": { "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "39298c7dd95fc9d661ec88fd8fe38f1eaefe0322" }, "repo_75": { "url": "https://github.com/DanielSc4/inseq", @@ -1558,9 +1632,10 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "5a217b0410ba73d0e6b2df712d04569497a3be97" }, "repo_76": { "url": "https://github.com/aravind-j/EvaluateCore", @@ -1579,7 +1654,7 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { @@ -1591,7 +1666,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "GivenName in author field, has more than one name" } - } + }, + "commit ID": "83f380c102022ddfd0fb275c821b9f16e2ec4cd4" }, "repo_77": { "url": "https://github.com/matthiasprobst/pivmetalib", @@ -1599,7 +1675,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W003": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", @@ -1609,7 +1685,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "a8d2fafb200cb3663f77c21bf768b94c87a2618c" }, "repo_78": { "url": "https://github.com/craddm/eegUtils", @@ -1624,7 +1701,7 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { @@ -1640,7 +1717,8 @@ "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "2b2dbe123b1fabaac414aa0f62b8259194d40e5f" }, "repo_79": { "url": "https://github.com/arviz-devs/preliz", @@ -1650,7 +1728,8 @@ "description": "Copyright section taken as template without modification" } }, - "warnings": {} + "warnings": {}, + "commit ID": "2fbd0c585d81faadbc5b9818c151323a89d890b4" }, "repo_80": { "url": "https://github.com/JSadowska/testLille", @@ -1673,7 +1752,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "a944981f43c1bd37710b8a41442754bdc95e339b" }, "repo_81": { "url": "https://github.com/riatelab/tanaka", @@ -1688,7 +1768,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "fd2efc3d9b417612c81c318f0223a40f5f4e6518" }, "repo_82": { "url": "https://github.com/underworldcode/underworld2", @@ -1699,7 +1780,7 @@ }, "P006": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "License pointing to a local file instead of stating the name. For example: \u201clicense\u201d: LICENSE.MD" + "description": "License pointing to a local file instead of stating the name. For example: “license”: LICENSE.MD" }, "P013": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", @@ -1713,7 +1794,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -1723,7 +1804,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "Inconsistent use of licenses in metadata files" } - } + }, + "commit ID": "a017a16c73c7c8bbb2869ceb05080c5c5098ac8e" }, "repo_83": { "url": "https://github.com/caltechlibrary/admin-shell-scripts", @@ -1731,7 +1813,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -1741,7 +1823,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "ba5753c86812f4230e2c68dcecaf825c22aeefd4" }, "repo_84": { "url": "https://github.com/jvegreg/ESMValCore", @@ -1758,9 +1841,10 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "03eb1c942bf1dc3be98cb30c3592b42e82a94f16" }, "repo_85": { "url": "https://github.com/sthanhe/ParticleDispersion", @@ -1775,7 +1859,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "Inconsistent use of licenses in metadata files" } - } + }, + "commit ID": "9eafc76b75a52846b9bf78aa8a2fd0c24c5f2b9d" }, "repo_86": { "url": "https://github.com/Neplex/COveR", @@ -1798,7 +1883,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "35423ec7f840c68070b73a9910350c1ac93e4a53" }, "repo_87": { "url": "https://github.com/AI5GW/Goertzel", @@ -1813,7 +1899,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "Inconsistent use of licenses in metadata files" } - } + }, + "commit ID": "2eb355240d0a66147309c783c91877af350414a9" }, "repo_88": { "url": "https://github.com/mdstephenserdc/network_representativeness", @@ -1828,7 +1915,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "Inconsistent use of licenses in metadata files" } - } + }, + "commit ID": "a0f9fc12d1bf44811423b1fc212c0b6d398b677c" }, "repo_89": { "url": "https://github.com/matthiasprobst/h5RDMtoolbox", @@ -1836,13 +1924,14 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W004": { "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "eaf66f66d23fcc6b7b1728f2fe7ac6d65c9d9d85" }, "repo_90": { "url": "https://github.com/m-team-kit/cookiecutter-web", @@ -1861,7 +1950,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "728cf1ae38ce76aaaa31fd52bb46006144a2e5fa" }, "repo_91": { "url": "https://github.com/ParaStation/psmpi", @@ -1872,13 +1962,13 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -1888,7 +1978,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "375f8ee387a70bb5e80b774c0ec8472f2ca7d840" }, "repo_92": { "url": "https://github.com/LanguageMachines/frog", @@ -1901,7 +1992,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -1919,7 +2010,8 @@ "source_file": "codemeta.json", "description": "Identifier is a name instead of a valid unique identifier, but an identifier exist (e.g., in a badge)" } - } + }, + "commit ID": "53da3bfd9958af5e7221348607f6db358edef486" }, "repo_93": { "url": "https://github.com/LDEO-CREW/Pythonic-DISORT", @@ -1927,9 +2019,10 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "eb92fb81d422e76c1501d196bf14db6756430d03" }, "repo_94": { "url": "https://github.com/barbagroup/PetIBM", @@ -1948,7 +2041,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "Identifier is empty" } - } + }, + "commit ID": "be91f218702ada7fe569fe77c258fa748f075713" }, "repo_95": { "url": "https://github.com/DrMattG/SDGsR", @@ -1965,7 +2059,8 @@ "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", "description": "codeRepository does not point to the same repository" } - } + }, + "commit ID": "fa1898e88b9a31a05c2b722f36d6993595536a12" }, "repo_96": { "url": "https://github.com/tesselle/kairos", @@ -1992,7 +2087,8 @@ "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "113e0be3cc9beb2895f0ff5ac95063aad219b536" }, "repo_97": { "url": "https://github.com/SeUniVr/PLC-RE", @@ -2000,9 +2096,10 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "a12a44cbc077dbd4c20b5f4764f9d53da5647b86" }, "repo_98": { "url": "https://github.com/andrew-saydjari/mfouesneau.github.com", @@ -2010,9 +2107,10 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "17fbd909db0122eeca39d0c313b11742e7fd8164" }, "repo_99": { "url": "https://github.com/fran2410/AI-Open-Science", @@ -2025,7 +2123,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -2035,7 +2133,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "592afb0b0f8a64cb57b66ed4f79d2bca9f448fbc" }, "repo_100": { "url": "https://github.com/umr-amap/StormR", @@ -2050,7 +2149,7 @@ }, "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" }, "P018": { "source_file": "codemeta.json", @@ -2060,7 +2159,7 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -2070,7 +2169,8 @@ "source_file": "codemeta.json", "description": "programmingLanguages do not have versions" } - } + }, + "commit ID": "0f179f94caac8ee075473472cb0474f54e745947" }, "repo_101": { "url": "https://github.com/viznuv/transforEmotion", @@ -2079,23 +2179,25 @@ "source_file": "LICENSE", "description": "Copyright section taken as template without modification" } - } + }, + "commit ID": "f40dbf651f4361c2cd2dca4092e6e90b9bf4a073" }, "repo_102": { "url": "https://github.com/rOpenGov/r311", "pitfalls": { "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } - } + }, + "commit ID": "1273245299f477b47754319cf0e22b8cdf4995a8" }, "repo_103": { "url": "https://github.com/R3BRootGroup/sofia", "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" }, "W002": { "source_file": "codemeta.json", @@ -2107,9 +2209,10 @@ }, "W005": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "softwareRequirements have more than one req, but it\u2019s written as one string" + "description": "softwareRequirements have more than one req, but it’s written as one string" } - } + }, + "commit ID": "ce7e8f0296333ca952d5f5554c068cc44a500380" }, "repo_104": { "url": "https://github.com/sorokinvld/LLFn", @@ -2117,9 +2220,10 @@ "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "a8ec8da19a3cc5d8207d362add83181bffa18c4e" }, "repo_105": { "url": "https://github.com/DeepRank/Deeprank-GNN", @@ -2129,7 +2233,8 @@ "description": "Copyright section taken as template without modification" } }, - "warnings": {} + "warnings": {}, + "commit ID": "544ee2b98a1d784047c25f4014f09a1effcdbcec" }, "repo_106": { "url": "https://github.com/r-spatialecology/landscapemetrics", @@ -2152,14 +2257,15 @@ "source_file": "codemeta.json", "description": "Identifier is a name instead of a valid unique identifier, but an identifier exist (e.g., in a badge)" } - } + }, + "commit ID": "9e777a5c5ec568ebca8f5ddec7bed1c2d465a357" }, "repo_107": { "url": "https://github.com/aloftdata/getRad", "pitfalls": { "P017": { "source_file": "codemeta.json", - "description": "version does not match the package\u2019s" + "description": "version does not match the package’s" } }, "warnings": { @@ -2167,7 +2273,8 @@ "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "f4bc21602adecdae6dfd123e8d439933de426f7b" }, "repo_110": { "url": "https://github.com/R-Lum/Luminescence", @@ -2190,15 +2297,17 @@ "source_file": "codemeta.json", "description": "developmentStatus is a URL instead of a string" } - } + }, + "commit ID": "3aca65758cd130df06afb274c6a419033ecdadd0" }, "repo_111": { "url": "https://github.com/naaci/watermarking", "warnings": { "W001": { "source_file": "Metadata files (codemeta.json, setup.py, pom.xml etc...)", - "description": "SoftwareRequirements don\u2019t have versions" + "description": "SoftwareRequirements don’t have versions" } - } + }, + "commit ID": "48211f102defdb16d0cd3cf6fc281518a4a96442" } } diff --git a/src/rsmetacheck/utils/json_ld_utils.py b/src/rsmetacheck/utils/json_ld_utils.py index 45430fc..15c56e9 100644 --- a/src/rsmetacheck/utils/json_ld_utils.py +++ b/src/rsmetacheck/utils/json_ld_utils.py @@ -499,6 +499,13 @@ def get_suggestion_text(pitfall_code: str, pitfall_result: Dict = None, somef_da latest = pitfall_result.get("release_version") if latest: return f"Ensure the version in your metadata matches the latest official release ({latest}). Keeping these synchronized avoids confusion for users and improves reproducibility." + elif pitfall_code == "P003": + author_val = pitfall_result.get("author_value") + if author_val and isinstance(author_val, str) and ("and" in author_val or "," in author_val): + import re + parts = [p.strip() for p in re.split(r'\s+and\s+|,', author_val) if p.strip()] + if len(parts) > 1: + return f'You should separate multiple authors into a structured list. For example: {parts}' elif pitfall_code == "P004": good_readme = None @@ -528,6 +535,11 @@ def get_suggestion_text(pitfall_code: str, pitfall_result: Dict = None, somef_da elif pitfall_code == "P011": issue_url = pitfall_result.get("issue_url") if issue_url: + import re + match = re.search(r'https?://[^\s,]+', issue_url) + if match: + extracted_url = match.group(0) + return f"You need to correct the issue tracker URL. Consider using the extracted link: {extracted_url}" return f"You need to correct the issue tracker URL ({issue_url}) so it follows a valid format, such as https://github.com/user/repo/issues." elif pitfall_code == "P012": @@ -539,7 +551,7 @@ def get_suggestion_text(pitfall_code: str, pitfall_result: Dict = None, somef_da identifier = pitfall_result.get("identifier_value", "") if identifier and isinstance(identifier, str): import re - cleaned_id = re.sub(r'^(doi:|10\.)', '10.', identifier).replace('https://doi.org/', '') + cleaned_id = re.sub(r'^doi:', '', identifier, flags=re.IGNORECASE).replace('https://doi.org/', '') if cleaned_id.startswith('10.'): return f"You should include the full DOI URL form in your metadata (e.g., https://doi.org/{cleaned_id})" @@ -561,6 +573,39 @@ def get_suggestion_text(pitfall_code: str, pitfall_result: Dict = None, somef_da if github_date: return f"The data in the metadata file should be updated to be aligned with the date of the latest release ({github_date})." + elif pitfall_code == "W003": + found_license = None + if "license" in somef_data: + for entry in somef_data["license"]: + src = entry.get("source", "") + if isinstance(src, list): + src = src[0] if src else "" + src_str = str(src).lower() + tech = entry.get("technique", "") + is_file_search = ("license" in src_str or tech == "file_exploration") + if is_file_search: + val = entry.get("result", {}).get("value") + spdx = entry.get("result", {}).get("spdx_id") + name = entry.get("result", {}).get("name") + found_license = spdx or name or (val if val and len(str(val)) < 50 else None) + if found_license: + break + if found_license: + return f"Use the LICENSE that is stated in your repository ({found_license}) instead." + + elif pitfall_code == "W004": + if "programming_languages" in somef_data: + valid_langs = [] + for entry in somef_data["programming_languages"]: + res = entry.get("result", {}) + name = res.get("name") + ver = res.get("version") + if name and ver: + valid_langs.append(f"{name} ({ver})") + if valid_langs: + langs_str = ", ".join(valid_langs) + return f"Specify version numbers for your programming languages like found in other sources: {langs_str}." + elif pitfall_code == "W005": reqs = pitfall_result.get("requirement_string", "") if reqs and isinstance(reqs, str): @@ -589,6 +634,7 @@ def get_suggestion_text(pitfall_code: str, pitfall_result: Dict = None, somef_da return f"You should replace the remote-style syntax with a full web-accessible URL (e.g., {github_api_repo})." suggestions = { + # This works as fallback in case the dynamic suggestions does not find the necessary metadata in SoMEF report # Pitfalls "P001": "Ensure the version in your metadata matches the latest official release. Keeping these synchronized avoids confusion for users and improves reproducibility.", "P002": "Update the copyright section with accurate names, organizations, and the current year. Personalizing this section ensures clarity and legal accuracy.",