Test branch #846
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
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: Get branch names 🌿 | |
id: branch-name | |
uses: tj-actions/branch-names@v7 | |
- name: Checkout repo (PR) 🛎 | |
uses: actions/[email protected] | |
if: github.event_name == 'pull_request' | |
with: | |
ref: ${{ steps.branch-name.outputs.head_ref_branch }} | |
repository: ${{ github.event.pull_request.head.repo.full_name }} | |
- name: Checkout repo 🛎 | |
uses: actions/[email protected] | |
if: github.event_name != 'pull_request' | |
with: | |
ref: ${{ steps.branch-name.outputs.head_ref_branch }} | |
- name: Check commit message 💬 | |
run: | | |
git config --global --add safe.directory $(pwd) | |
export head_commit_message="$(git show -s --format=%B | tr '\r\n' ' ' | tr '\n' ' ')" | |
echo "head_commit_message = $head_commit_message" | |
if [[ $head_commit_message == *"$SKIP_INSTRUCTION"* ]]; then | |
echo "Skip instruction detected - cancelling the workflow." | |
exit 1 | |
fi | |
shell: bash | |
env: | |
SKIP_INSTRUCTION: "[skip grammar]" | |
- 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 |