Skip to content

fix: Normalize the option to post coverage as PR comment #558

fix: Normalize the option to post coverage as PR comment

fix: Normalize the option to post coverage as PR comment #558

Workflow file for this run

---
name: Grammar 📓
on:
push:
branches:
- main
pull_request:
types:
- opened
- synchronize
- reopened
- ready_for_review
branches:
- main
workflow_dispatch:
workflow_call:
inputs:
passive-voice:
description: Enable checks for passive voice
required: false
default: false
type: boolean
enable-annotations:
description: Enable creation of GitHub annotations
required: false
default: false
type: boolean
concurrency:
group: grammar-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
grammar:
name: Check 📝
runs-on: ubuntu-latest
if: >
!contains(github.event.commits[0].message, '[skip grammar]')
&& github.event.pull_request.draft == false
steps:
- name: Checkout Code 🛎
uses: actions/checkout@v4
- name: Restore npm cache 💰
uses: actions/cache@v4
with:
key: npm-${{ runner.os }}-${{ github.job }}
restore-keys: |
npm-${{ runner.os }}-
path: node_modules
- name: Setup NodeJS ☊
uses: actions/setup-node@v4
id: npm-cache
with:
node-version: 20
- name: Install write-good and deps ⏬
if: steps.npm-cache.outputs.cache-hit != 'true'
run: npm install write-good fs
shell: bash
- name: Get changed files 🗞
id: changed-files
uses: tj-actions/changed-files@v41
with:
separator: ","
files: |
**.R
**.Rmd
**.Rnw
**.Rmarkdown
**.qmd
**.md
- name: Run write-good 🏃‍♀️
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const writeGood = require('write-good');
const path = require('path');
const fs = require('fs');
const changedFiles = "${{ steps.changed-files.outputs.all_changed_files }}";
if (!changedFiles || changedFiles.length === 0) {
process.exit(0);
}
let files = changedFiles.split(",");
let allSuggestions = [];
var inputs = ${{ toJSON(inputs) }};
var passiveVoice = inputs['passive-voice'];
if (typeof passiveVoice === 'undefined') {
passiveVoice = false;
}
files.forEach((file) => {
if (fs.lstatSync(file).isFile() &&
!path.dirname(file).startsWith("node_modules")) {
const contents = fs.readFileSync(file, 'utf8');
const suggestions = writeGood(contents, { passive : passiveVoice });
const annotations = writeGood.annotate(contents, suggestions, true);
if (annotations.length) {
for (var i=0; i < annotations.length; i++) {
let ann = annotations[i];
ann['message'] = ann['reason'];
ann['start_column'] = ann['col'];
ann['end_column'] = ann['col'];
ann['start_line'] = ann['line'];
ann['end_line'] = ann['line'];
ann['annotation_level'] = 'notice';
ann['path'] = file;
delete ann['reason'];
delete ann['col'];
delete ann['line'];
allSuggestions.push(ann);
}
}
}
});
fs.writeFileSync('./annotations.json', JSON.stringify(allSuggestions, null, 2) , 'utf-8');
- name: Check whether annotations exist 💭
id: check-annotations
if: inputs.enable-annotations
uses: andstor/file-existence-action@v3
with:
files: "annotations.json"
- name: Annotate files for grammar suggestions ✍️
if: >
steps.check-annotations.outputs.files_exists == 'true'
&& inputs.enable-annotations
uses: kibalabs/[email protected]
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
json-file-path: ./annotations.json
fail-on-error: false