utils/generate-docs-examples/generate-docs-examples.js (76 lines of code) (raw):

/* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch B.V. licenses this file to you under * the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ const { join } = require('path') const { writeFile } = require('fs/promises') const fetch = require('node-fetch') const rimraf = require('rimraf') const ora = require('ora') const { convertRequests } = require('@elastic/request-converter') const minimist = require('minimist') const docsExamplesDir = join(__dirname, '../../docs', 'examples') const log = ora('Generating example snippets') const failures = {} async function getAlternativesReport (version = 'master') { const reportUrl = `https://raw.githubusercontent.com/elastic/built-docs/master/raw/en/elasticsearch/reference/${version}/alternatives_report.json` const response = await fetch(reportUrl) if (!response.ok) { log.fail(`unexpected response ${response.statusText}`) process.exit(1) } return await response.json() } async function makeSnippet (example) { const { source, digest } = example const fileName = `${digest}.asciidoc` const filePath = join(docsExamplesDir, fileName) try { const code = await convertRequests(source, 'python', { complete: false, printResponse: true }) await writeFile(filePath, asciidocWrapper(code, example), 'utf8') } catch (err) { failures[digest] = err.message } } async function generate (version) { log.start() rimraf.sync(join(docsExamplesDir, '*')) log.text = `Downloading alternatives report for version ${version}` const examples = await getAlternativesReport(version) let counter = 1 for (const example of examples) { log.text = `${counter++}/${examples.length}: ${example.digest}` // skip over bad request definitions if (example.source.startsWith('{') || example.source.endsWith('...')) { failures[example.digest] = 'Incomplete request syntax' continue } await makeSnippet(example) } } function asciidocWrapper (source, example) { return `// This file is autogenerated, DO NOT EDIT // ${example.source_location.file}:${example.source_location.line} [source, python] ---- ${source.trim()} ---- ` } const options = minimist(process.argv.slice(2), { string: ['version'], default: { version: 'master' } }) generate(options.version) .then(() => log.succeed('done!')) .catch(err => log.fail(err.message)) .finally(() => { const keys = Object.keys(failures) if (keys.length > 0) { let message = 'Some examples failed to generate:\n\n' for (const key of keys) { message += `${key}: ${failures[key]}\n` } console.error(message) } })