Skip to content

Commit

Permalink
Added option to generate markdown api-reference doc
Browse files Browse the repository at this point in the history
  • Loading branch information
lukas-bednar committed Nov 16, 2017
1 parent 6dc4c0a commit 35eea01
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 30 deletions.
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,6 @@ tags
.Gopkg.*
.GeneratedDockerfile
.gradle
*.adoc
html5
hack/gen-swagger-doc/*.adoc
hack/gen-swagger-doc/*.md
hack/gen-swagger-doc/html5
20 changes: 12 additions & 8 deletions hack/gen-swagger-doc/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,29 @@ buildscript {
}

dependencies {
classpath "io.github.swagger2markup:swagger2markup:1.3.1"
classpath "io.github.swagger2markup:swagger2markup-gradle-plugin:1.3.1"
classpath "org.asciidoctor:asciidoctor-gradle-plugin:1.5.6"
}
}

apply plugin: 'org.asciidoctor.convert'
apply plugin: 'io.github.swagger2markup'

task gendocs << {
io.github.swagger2markup.Swagger2MarkupConverter
.from(java.nio.file.Paths.get("./api/openapi-spec/swagger.json"))
.build()
.toFolder(java.nio.file.Paths.get("./hack/gen-swagger-doc"));
convertSwagger2markup {
swaggerInput "./api/openapi-spec/swagger.json"
outputDir file("./")
config = [
'swagger2markup.markupLanguage': markupLanguage,
'swagger2markup.interDocumentCrossReferencesEnabled': true,
]
}

apply plugin: 'org.asciidoctor.convert'

asciidoctor {
sourceDir = file('./')
sources {
// paths.adoc is being renamed to operations.adoc by gen-swagger-docs.sh.
// Keeping it here in case somebody run: gradle gendocs asciidoctor
// Keeping it here in case somebody run: gradle convertSwagger2markup asciidoctor
include 'definitions.adoc', 'overview.adoc', 'paths.adoc', 'security.adoc', 'operations.adoc'
}
outputDir = file('./')
Expand Down
75 changes: 55 additions & 20 deletions hack/gen-swagger-doc/gen-swagger-docs.sh
Original file line number Diff line number Diff line change
@@ -1,53 +1,88 @@
#!/bin/bash

# gen-swagger-docs.sh $API_VERSION $OUTPUT_FORMAT
# API_VERSION=v1
# OUTPUT_FORMAT=html|markdown

set -o errexit
set -o nounset
set -o pipefail

VERSION="${1:-v1}"
OUTPUT_FORMAT="${2:-html}"
if [ "$OUTPUT_FORMAT" = "html" ] ;
then
SUFFIX="adoc"
HEADER="="
LINK1_TEMPLATE="\* \<\<\${VERSION}.\$m\>\>"
LINK_DEFINITIONS="* link:./definitions.html[Types Definition]"
LINK_OPERATIONS="* link:./operations.html[Operations]"
GRADLE_EXTRA_PARAMS=""
elif [ "$OUTPUT_FORMAT" = "markdown" ] ;
then
SUFFIX="md"
HEADER="#"
LINK1_TEMPLATE="\* [\${VERSION}.\$m]\(definitions.md#\${VERSION}-\${m,,}\)"
LINK_DEFINITIONS="* [Types Definition](definitions.md)"
LINK_OPERATIONS="* [Operations](operations.md)"
GRADLE_EXTRA_PARAMS="-PmarkupLanguage=MARKDOWN"
else
echo "Unknown OUTPUT_FORMAT=${OUTPUT_FORMAT}"
exit 1
fi
WORKDIR="hack/gen-swagger-doc"
GRADLE_BUILD_FILE="$WORKDIR/build.gradle"


# Generate *.adoc files from swagger.json
gradle -b $GRADLE_BUILD_FILE gendocs --info
gradle -b $GRADLE_BUILD_FILE $GRADLE_EXTRA_PARAMS convertSwagger2markup --info

#insert a TOC for top level API objects
buf="== Top Level API Objects\n\n"
buf="${HEADER}${HEADER} Top Level API Objects\n\n"
top_level_models=$(grep '&[A-Za-z]*{},' pkg/api/${VERSION}/types.go | sed 's/.*&//;s/{},//')

# check if the top level models exist in the definitions.adoc. If they exist,
# check if the top level models exist in the definitions.$SUFFIX. If they exist,
# their name will be <version>.<model_name>
for m in $top_level_models
do
if grep -xq "=== ${VERSION}.$m" "$WORKDIR/definitions.adoc"
if grep -xq "${HEADER}${HEADER}${HEADER} ${VERSION}.$m" "$WORKDIR/definitions.${SUFFIX}"
then
buf+="* <<${VERSION}.$m>>\n"
buf+="$(eval echo $LINK1_TEMPLATE)\n"
fi
done
sed -i "1i $buf" "$WORKDIR/definitions.adoc"

# fix the links in .adoc, replace <<x,y>> with link:definitions.html#_x[y], and lowercase the _x part
sed -i -e 's|<<\(.*\),\(.*\)>>|link:#\L\1\E[\2]|g' "$WORKDIR/definitions.adoc"
sed -i -e 's|<<\(.*\),\(.*\)>>|link:./definitions.html#\L\1\E[\2]|g' "$WORKDIR/paths.adoc"
sed -i "1i $buf" "$WORKDIR/definitions.${SUFFIX}"

# change the title of paths.adoc from "paths" to "operations"
sed -i 's|== Paths|== Operations|g' "$WORKDIR/paths.adoc"
mv -f "$WORKDIR/paths.adoc" "$WORKDIR/operations.adoc"
sed -i "s|${HEADER}${HEADER} Paths|${HEADER}${HEADER} Operations|g" "$WORKDIR/paths.${SUFFIX}"
mv -f "$WORKDIR/paths.${SUFFIX}" "$WORKDIR/operations.${SUFFIX}"

# $$ has special meaning in asciidoc, we need to escape it
sed -i 's|\$\$|+++$$+++|g' "$WORKDIR/definitions.adoc"
# TODO !!!
#sed -i 's|\$\$|+++$$+++|g' "$WORKDIR/definitions.adoc"

# Add links to definitons & operations under overview
cat >> "$WORKDIR/overview.adoc" << __END__
== KubeVirt API Reference
[%hardbreaks]
* link:./definitions.html[Types Definition]
* link:./operations.html[Operations]
cat >> "$WORKDIR/overview.${SUFFIX}" << __END__
${HEADER}${HEADER} KubeVirt API Reference
${LINK_DEFINITIONS}
${LINK_OPERATIONS}
__END__


# Generate *.html files from *.adoc
gradle -b $GRADLE_BUILD_FILE asciidoctor --info
if [ "$OUTPUT_FORMAT" = "html" ] ;
then
# Generate *.html files from *.adoc
gradle -b $GRADLE_BUILD_FILE asciidoctor --info
elif [ "$OUTPUT_FORMAT" = "markdown" ] ;
then
# Generate TOC for definitions & operations as README.md
cd "$WORKDIR"
echo "# KubeVirt API Reference" > README.md
curl \
https://raw.githubusercontent.com/ekalinin/github-markdown-toc/master/gh-md-toc | \
bash -s "definitions.md" "operations.md" | \
sed 's/^ //' >> "README.md"
cd -
fi

echo "SUCCESS"
1 change: 1 addition & 0 deletions hack/gen-swagger-doc/gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
markupLanguage=ASCIIDOC

0 comments on commit 35eea01

Please sign in to comment.