Skip to content

Commit

Permalink
OpenAPI tooling updates (github#16320)
Browse files Browse the repository at this point in the history
  • Loading branch information
sarahs authored Nov 24, 2020
1 parent 6223032 commit 8f0093c
Show file tree
Hide file tree
Showing 30 changed files with 2,339,953 additions and 132 deletions.
41 changes: 41 additions & 0 deletions .github/actions-scripts/openapi-schema-branch.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#!/usr/bin/env node

const fs = require('fs')
const path = require('path')
const { execSync } = require('child_process')
const semver = require('semver')

/*
* This script performs two checks to prevent shipping development mode OpenAPI schemas:
* - Ensures the `info.version` property is a semantic version.
* In development mode, the `info.version` property is a string
* containing the `github/github` branch name.
* - Ensures the decorated schema matches the dereferenced schema.
* The workflow that calls this script runs `script/rest/update-files.js`
* with the `--decorate-only` switch then checks to see if files changed.
*
*/

// Check that the `info.version` property is a semantic version
const dereferencedDir = path.join(process.cwd(), 'lib/rest/static/dereferenced')
const schemas = fs.readdirSync(dereferencedDir)
schemas.forEach(filename => {
const schema = require(path.join(dereferencedDir, filename))
if (!semver.valid(schema.info.version)) {
console.log(`🚧⚠️ Your branch contains a development mode OpenAPI schema: ${schema.info.version}. This check is a reminder to not 🚢 OpenAPI files in development mode. 🛑`)
process.exit(1)
}
})

// Check that the decorated schema matches the dereferenced schema
const changedFiles = execSync('git diff --name-only HEAD').toString()

if(changedFiles !== '') {
console.log(`These files were changed:\n${changedFiles}`)
console.log(`🚧⚠️ Your decorated and dereferenced schema files don't match. Ensure you're using decorated and dereferenced schemas from the automatically created pull requests by the 'github-openapi-bot' user. For more information, see 'script/rest/README.md'. 🛑`)
process.exit(1)
}

// All checks pass, ready to ship
console.log('All good 👍')
process.exit(0)
3 changes: 2 additions & 1 deletion .github/allowed-actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,6 @@ module.exports = [
'repo-sync/github-sync@3832fe8e2be32372e1b3970bbae8e7079edeec88',
'repo-sync/pull-request@33777245b1aace1a58c87a29c90321aa7a74bd7d',
'rtCamp/action-slack-notify@e17352feaf9aee300bf0ebc1dfbf467d80438815',
'tjenkinson/gh-action-auto-merge-dependency-updates@cee2ac0'
'tjenkinson/gh-action-auto-merge-dependency-updates@cee2ac0',
'EndBug/add-and-commit@9358097a71ad9fb9e2f9624c6098c89193d83575'
]
32 changes: 32 additions & 0 deletions .github/workflows/openapi-decorate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: OpenAPI generate decorated schema files

on:
workflow_dispatch:
pull_request:
types: [opened]

jobs:
generate-decorated-files:
if: github.event.pull_request.user.login == 'github-openapi-bot'
runs-on: ubuntu-latest
steps:
- name: Checkout repository code
uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f

- name: Install dependencies
run: npm ci

- name: Decorate the dereferenced OpenAPI schemas
run: script/rest/update-files.js --decorate-only

- name: Check in the decorated files
uses: EndBug/add-and-commit@9358097a71ad9fb9e2f9624c6098c89193d83575
with:
# The arguments for the `git add` command
add: 'lib/rest/static/decorated'

# The message for the commit
message: 'Add decorated OpenAPI schema files'

env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Leave this line unchanged
22 changes: 22 additions & 0 deletions .github/workflows/openapi-schema-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: OpenAPI dev mode check

on:
workflow_dispatch:
push:

jobs:
check-schema-versions:
runs-on: ubuntu-latest
steps:
- name: Checkout repository code
uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f

- name: Install dependencies
run: npm ci

# Differences between decorated and dereferenced files indicates a problem
- name: Generate decorated files to check that there are no differences
run: script/rest/update-files.js --decorate-only

- name: Check if deref/decorated schemas are dev mode and that they match
run: .github/actions-scripts/openapi-schema-branch.js
25 changes: 25 additions & 0 deletions lib/rest/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# REST

## About this directory

* `lib/rest/index.js` is human-editable.
* `lib/rest/static/*.json` are generated by [scripts](../../script/rest/README.md).

## Editable files

* `lib/rest/index.js` consumes the static decorated schema files and exports `categories`, `operations`, and `operationsEnabledForGitHubApps` used by the REST middleware contextualizer.

## Static files

Generated by `script/rest/update-files.js`:

* `lib/rest/static/dereferenced` - dereferenced OpenAPI schema file for each version of GitHub
* `lib/rest/static/decorated` - files generated from the dereferenced OpenAPI schema with the Markdown descriptions rendered in HTML

## Rendering docs

When the server starts, `middleware/contextualizers/rest.js` accesses the data exported from the static decorated JSON files, fetches the data for the current version and requested path, and adds it to the `context` object. The added property is:

* `req.context.currentRestOperations` - all operations with a category matching the current path

Markdown files in `content/rest/reference` use Liquid to loop over these context properties. The Liquid calls HTML files in the `includes` directory to do most of the rendering. Writers can add content to the Markdown files alongside the Liquid.
13 changes: 11 additions & 2 deletions lib/rest.js → lib/rest/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
const fs = require('fs')
const path = require('path')
const { chain, get, groupBy } = require('lodash')
const operations = require('@github/rest-api-operations')
const allVersions = require('./all-versions')
const schemasPath = path.join(__dirname, 'static/decorated')
const operations = {}
fs.readdirSync(schemasPath)
.forEach(filename => {
const key = filename.replace('.json', '')
const value = require(path.join(schemasPath, filename))
operations[key] = value
})
const allVersions = require('../all-versions')
const allVersionKeys = Object.keys(allVersions)

let allCategories = []
Expand Down
86,101 changes: 86,101 additions & 0 deletions lib/rest/static/decorated/api.github.com.json

Large diffs are not rendered by default.

Loading

0 comments on commit 8f0093c

Please sign in to comment.