posener / goreadme

Generate readme file from Go doc. Now available as a Github action!
MIT License
213 stars 31 forks source link
actions code-generation code-quality doc docs github github-actions github-app go godoc golang markdown readme

goreadme

Build Status codecov GoDoc

Package goreadme generates readme markdown file from go doc.

The package can be used as a command line tool and as Github action, described below:

Github Action

Github actions can be configured to update the README file automatically every time it is needed. Below there is an example that on every time a new change is pushed to the main branch, the action is trigerred, generates a new README file, and if there is a change - commits and pushes it to the main branch. In pull requests that affect the README content, if the GITHUB_TOKEN is given, the action will post a comment on the pull request with changes that will be made to the README file.

To use this with Github actions, add the following content to .github/workflows/goreadme.yml. See ./action.yml for all available input options.

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
permissions:
  # Goreadme needs permissions to update pull requests comments and change contents.
  pull-requests: write
  contents: write
jobs:
    goreadme:
        runs-on: ubuntu-latest
        steps:
        - name: Check out repository
          uses: actions/checkout@v2
        - name: Update readme according to Go doc
          uses: posener/goreadme@v1
          with:
            badge-travisci: 'true'
            badge-codecov: 'true'
            badge-godoc: 'true'
            badge-goreadme: 'true'
            # Optional: Token allows goreadme to comment the PR with diff preview.
            GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'

Use as a command line tool

$ GO111MODULE=on go get github.com/posener/goreadme/cmd/goreadme
$ goreadme -h

Pre-Commit hook

goreadme can also be used as a pre-commit hook, acting before each commit is made.

  1. Install pre-commit from https://pre-commit.com/#install
  2. Create a .pre-commit-config.yaml file at the root of your repository with the following content:
repos:
  - repo: [https://github.com/posener/goreadme](https://github.com/posener/goreadme)
    rev: v1.4.2 # Use the latest ref
    hooks:
      - id: goreadme
        entry: env README_FILE=README.md goreadme
        args: ['-badge-goreadme=true', '-badge-godoc=true']
  1. Change README_FILE to your file name and add any flags you need in args.
  2. Auto-update the config to the latest repos' versions by executing pre-commit autoupdate
  3. Install with pre-commit install
  4. Now you're all set! Try a commit, see the README being updated (if relevant), and continue your commit.

Why Should You Use It

Both Go doc and readme files are important. Go doc to be used by your user's library, and README file to welcome users to use your library. They share common content, which is usually duplicated from the doc to the readme or vice versa once the library is ready. The problem is that keeping documentation updated is important, and hard enough - keeping both updated is twice as hard.

Go Doc Instructions

The formatting of the README.md is done by the go doc parser. This makes the result README.md a bit more limited. Currently, goreadme supports the formatting as explained in godoc page, or here. Meaning:

func main() {
  ...
}

Additionally, the syntax was extended to include some more markdown features while keeping the Go doc readable:

-removed line starts with '-'
 remained line starts with ' '
+added line starts with '+'

title of image

Testing

The goreadme tests the test cases in the ./testdata directory. It generates readme files for all the packages in that directory and asserts that the result readme matches the existing one. When modifying goreadme behavior, there is no need to manually change these readme files. It is possible to run WRITE_READMES=1 go test ./... which regenerates them and check the changes match the expected (optionally using git diff).

Sub Packages


Readme created from Go doc with goreadme