Skip to content

Instantly share code, notes, and snippets.

@ambientlight
Last active October 9, 2021 15:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ambientlight/db77ee6f65989f426841d2426220cb18 to your computer and use it in GitHub Desktop.
Save ambientlight/db77ee6f65989f426841d2426220cb18 to your computer and use it in GitHub Desktop.
Autorest codegen for python, typescript, golang, c#, java
#!/bin/bash
if [[ -z $1 ]] ; then
echo "Missing swagger readme search path, usage: ./gen_all.sh SEARCH_PATH"
echo 'Sample: ./gen_all.sh "specification/maps/data-plane/Render/readme.md"'
exit 0
else
SEARCH_PATH=$1
fi
./gen_python.sh $SEARCH_PATH
./gen_go.sh $SEARCH_PATH
./gen_csharp.sh $SEARCH_PATH
./gen_java.sh $SEARCH_PATH
./gen_js.sh $SEARCH_PATH
#!/bin/bash
if [[ -z $1 ]] ; then
echo "Missing swagger readme search path, usage: ./gen_csharp.sh SEARCH_PATH [SDK_PATH]"
echo 'Sample: ./gen_csharp.sh "specification/maps/data-plane/*/readme.md"'
exit 0
else
SEARCH_PATH=$1
fi
if [[ -z $2 ]] ; then
echo "Using ../azure-sdk-for-net for csharp sdk"
SDK_PATH="../azure-sdk-for-net"
else
SDK_PATH=$2
fi
VERSION=1.0.0-beta.1
VERSION_MESSAGE="Initial preview"
find $SEARCH_PATH | while read README_PATH ; do
README_FPATH=$(dirname $README_PATH)
SRCPATH=$(cat $README_FPATH/readme.csharp.md | grep '^\s*output-folder:' | sed "s/output-folder://" | dos2unix | xargs dirname)
SERVICE_NAME=$(dirname $SRCPATH | xargs basename)
TRACK2_COMMAND='npx autorest@3.2.1 --use=@autorest/csharp@v3.0.0-beta.20211007.2 --skip-csproj --skip-upgrade-check '"$README_PATH"' --modeler.debugger --use='"$(realpath ~)"'/.nuget/packages/microsoft.azure.autorest.csharp/3.0.0-beta.20210615.2/buildMultiTargeting/../tools/netcoreapp3.1/any/ --output-folder='"$(realpath $SDK_PATH)"'/sdk/maps/'"$SERVICE_NAME"'/src/Generated --namespace='"$SERVICE_NAME"' --clear-output-folder=true --shared-source-folders="'"$(realpath $SDK_PATH/)"'/eng//../sdk/core/Azure.Core/src/Shared/;'"$(realpath ~)"'/.nuget/packages/microsoft.azure.autorest.csharp/3.0.0-beta.20210615.2/buildMultiTargeting/../content/Generator.Shared/" --public-clients'
echo $TRACK2_COMMAND
eval $TRACK2_COMMAND
cp $SDK_PATH/sdk/template/Azure.Template/src/Azure.Template.csproj $SDK_PATH/sdk/maps/$SERVICE_NAME/src/$SERVICE_NAME.csproj
cp $SDK_PATH/sdk/template/Azure.Template/Directory.Build.props $SDK_PATH/sdk/maps/$SERVICE_NAME/
# update meta
sed -i "s/<Version>.*<\/Version>/<Version>$VERSION<\/Version>/" $SDK_PATH/sdk/maps/$SERVICE_NAME/src/$SERVICE_NAME.csproj
sed -i "s/<AssemblyTitle>.*<\/AssemblyTitle>/<AssemblyTitle>Azure Maps $SERVICE_NAME<\/AssemblyTitle>/" $SDK_PATH/sdk/maps/$SERVICE_NAME/src/$SERVICE_NAME.csproj
sed -i "s/<PackageTags>.*<\/PackageTags>/<PackageTags>Azure;Azure Maps;Maps $SERVICE_NAME<\/PackageTags>/" $SDK_PATH/sdk/maps/$SERVICE_NAME/src/$SERVICE_NAME.csproj
sed -i "s/<Description>.*<\/Description>/<Description>Azure Maps $SERVICE_NAME<\/Description>/" $SDK_PATH/sdk/maps/$SERVICE_NAME/src/$SERVICE_NAME.csproj
sed -i "s/<\/PropertyGroup>/<NoWarn>\$(NoWarn);AZC0001;AZC0012<\/NoWarn><\/PropertyGroup>/" $SDK_PATH/sdk/maps/$SERVICE_NAME/src/$SERVICE_NAME.csproj
# inject additional shared source
sed -z "s/<ItemGroup>\n\s*<Compile/<ItemGroup>\n <Compile Include=\"\$(AzureCoreSharedSources)Argument.cs\" Link=\"Shared\%(RecursiveDir)\%(Filename)%(Extension)\" \/>\n <Compile Include=\"\$(AzureCoreSharedSources)AzureKeyCredentialPolicy.cs\" Link=\"Shared\%(RecursiveDir)\%(Filename)%(Extension)\" \/>\n <Compile/" $SDK_PATH/sdk/maps/$SERVICE_NAME/src/$SERVICE_NAME.csproj > $SDK_PATH/sdk/maps/$SERVICE_NAME/src/$SERVICE_NAME.tmp.csproj
mv $SDK_PATH/sdk/maps/$SERVICE_NAME/src/$SERVICE_NAME.tmp.csproj $SDK_PATH/sdk/maps/$SERVICE_NAME/src/$SERVICE_NAME.csproj
# the build somehow add condiitional dependencies if autorest.md is present, otherwise I cannot explain build failing without empty autorest.md...
touch $SDK_PATH/sdk/maps/$SERVICE_NAME/src/autorest.md
# add changelog and generate Nuget package
echo -e "# Release History\n\n## $VERSION ($(date +%Y-%m-%d))\n- $VERSION_MESSAGE" > $SDK_PATH/sdk/maps/$SERVICE_NAME/CHANGELOG.md
dotnet pack $SDK_PATH/sdk/maps/$SERVICE_NAME/src/$SERVICE_NAME.csproj /p:RunApiCompat=$false
#dotnet build $SDK_PATH/sdk/maps/$SERVICE_NAME/src/$SERVICE_NAME.csproj /t:RunApiCompat /p:TargetFramework=netstandard2.0 /flp:v=m
done
#!/bin/bash
if [[ -z $1 ]] ; then
echo "Missing swagger readme search path, usage: ./gen_go.sh SEARCH_PATH [SDK_PATH]"
echo 'Sample: ./gen_go.sh "specification/maps/data-plane/*/readme.md"'
exit 0
else
SEARCH_PATH=$1
fi
if [[ -z $2 ]] ; then
echo "Using ../azure-sdk-for-go for go sdk"
SDK_PATH="../azure-sdk-for-go"
else
SDK_PATH=$2
fi
VERSION=1.0.0
find $SEARCH_PATH | while read README_PATH ; do
SERVICE_NAME=$(dirname ${README_PATH,,} | xargs basename)
COMMAND="autorest --go --track2 --use=@autorest/go@4.0.0-preview.28 $README_PATH --go-sdk-folder=$SDK_PATH --multiapi --export-clients --module=$SERVICE_NAME --module-version=$VERSION --clear-output-folder=true"
echo $COMMAND
eval $COMMAND
done
#!/bin/bash
if [[ -z $1 ]] ; then
echo "Missing swagger readme search path, usage: ./gen_java.sh SEARCH_PATH [SDK_PATH]"
echo 'Sample: ./gen_java.sh "specification/maps/data-plane/*/readme.md"'
exit 0
else
SEARCH_PATH=$1
fi
if [[ -z $2 ]] ; then
echo "Using ../azure-sdk-for-java for java sdk"
SDK_PATH="../azure-sdk-for-java"
else
SDK_PATH=$2
fi
SPOTBUGS_EXCLUDE='<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<Bug pattern="UPM_UNCALLED_PRIVATE_METHOD"/>
</Match>
<Match>
<Bug pattern="NP_LOAD_OF_KNOWN_NULL_VALUE"/>
</Match>
<Match>
<Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON"/>
</Match>
<Match>
<Bug pattern="NM_CONFUSING"/>
</Match>
</FindBugsFilter>
'
SPOTBUGS_PLUGIN_CONFIG='<plugin><groupId>com\.github\.spotbugs<\/groupId><artifactId>spotbugs-maven-plugin<\/artifactId><version>4\.2\.0<\/version><configuration><excludeFilterFile>.\/spotbugs\/sportbugs-exclude\.xml<\/excludeFilterFile><\/configuration><\/plugin>'
find $SEARCH_PATH -print | while read README_PATH ; do
# WARNING: this doesnot yet generate a base pom.xml file
TRACK2_COMMAND="autorest --java --use:@autorest/java@4.0.38 --sync-methods=all --track2 --version=3.3.2 --generate-sync-async-clients:true --java.azure-libraries-for-java-folder=$SDK_PATH/sdk/maps --pipeline.modelerfour.additional-checks=false --pipeline.modelerfour.lenient-model-deduplication=true --sdk-integration --java.license-header=MICROSOFT_MIT_SMALL $README_PATH"
README_FPATH=$(dirname $README_PATH)
SERVICE_NAME=$(cat $README_FPATH/readme.java.md | grep '^\s*output-folder:' | sed "s/output-folder://" | dos2unix | xargs basename)
TARGET_PATH="$SDK_PATH/sdk/maps/$SERVICE_NAME"
SERVICE_COMPONENENTS=(${SERVICE_NAME//-/ })
echo $TRACK2_COMMAND
eval $TRACK2_COMMAND
mkdir -p $TARGET_PATH/spotbugs
# replace meta
sed -i "s/<groupId>com.azure.resourcemanager<\/groupId>/<groupId>com.azure<\/groupId>/" $TARGET_PATH/pom.xml
sed -i "s/<artifactId>azure-resourcemanager-${SERVICE_COMPONENENTS[2]}-generated<\/artifactId>/<artifactId>${SERVICE_NAME,,}<\/artifactId>/" $TARGET_PATH/pom.xml
sed -i '0,/<name>.*<\/name>/ '"s/<name>.*<\/name>/<name>Microsoft Azure client library for $SERVICE_NAME service<\/name>/" $TARGET_PATH/pom.xml
sed -i '0,/<name>.*<\/name>/ '"s/<description>.*<\/description>/<description>This package contains the Microsoft $SERVICE_NAME SDK\.<\/description>>/" $TARGET_PATH/pom.xml
# add spotbugs exclusions
echo "$SPOTBUGS_EXCLUDE" > $TARGET_PATH/spotbugs/sportbugs-exclude.xml
REPLACE_EXPR="s/<plugins>/<plugins>"$SPOTBUGS_PLUGIN_CONFIG"/"
sed -i $REPLACE_EXPR $TARGET_PATH/pom.xml
mvn clean install -f $TARGET_PATH/pom.xml
done
#!/bin/bash
# npm install -g @microsoft/rush
if [[ -z $1 ]] ; then
echo "Missing swagger readme search path, usage: ./gen_js.sh SEARCH_PATH [SDK_PATH]"
echo 'Sample: ./gen_js.sh "specification/maps/data-plane/*/readme.md"'
exit 0
else
SEARCH_PATH=$1
fi
if [[ -z $2 ]] ; then
echo "Using ../azure-sdk-for-js for js sdk"
SDK_PATH="../azure-sdk-for-js"
else
SDK_PATH=$2
fi
find $SEARCH_PATH -print | while read README_PATH ; do
TRACK2_COMMAND="autorest --typescript --track2 --license-header=MICROSOFT_MIT_NO_VERSION --clear-output-folder=true --typescript-sdks-folder=$SDK_PATH $README_PATH"
README_FPATH=$(dirname $README_PATH)
SRCPATH=$(cat $README_FPATH/readme.typescript.md | grep '^\s*output-folder:' | sed "s/output-folder://" | dos2unix)
SERVICE_NAME=$(basename $SRCPATH | tr -d \")
TARGET_PATH="$SDK_PATH/sdk/maps/$SERVICE_NAME/"
echo $TRACK2_COMMAND
eval $TRACK2_COMMAND
DESCRIPTION="A client library for Azure Maps ${SERVICE_NAME,,}"
cd $TARGET_PATH
jq -s '.[0] + {
name: "@azure/'"${SERVICE_NAME,,}"'",
description: "'"${DESCRIPTION}"'",
version: "'"${VERSION}"'"
} | del(."//metadata")
| del(."//sampleConfiguration")
+ {module: "dist-esm/index.js", types: "types/'"${SERVICE_NAME,,}"'.d.ts"}
| .dependencies += {
"@azure/core-client": "^1.0.0",
"@azure/core-paging": "^1.1.1",
"@azure/core-lro": "^2.2.2",
"@azure/abort-controller": "^1.0.0",
"@azure/core-asynciterator-polyfill": "^1.0.0",
"@azure/core-rest-pipeline": "^1.1.0",
}
| .files = ["dist/", "dist-esm/", "types/'"${SERVICE_NAME,,}"'.d.ts"]
| .scripts."build:types" = "downlevel-dts types types/3.1"
| .typesVersions."<3.6"."*" = ["types/3.1/index.d.ts"]' ../../template/template/package.json > package.json
jq -s '.[0]
| .compilerOptions += { noUnusedLocals: false, noUnusedParameters: false }
| .compilerOptions.paths."@azure/'"${SERVICE_NAME,,}"'" = ["./src/generated/index"]
| del(.compilerOptions.paths."@azure/template")' ../../template/template/tsconfig.json > tsconfig.json
cp ../../template/template/rollup.config.js rollup.config.js
jq -s '.[0]
| .mainEntryPointFilePath = "types/index.d.ts"
| .dtsRollup.publicTrimmedFilePath = "types/'"${SERVICE_NAME,,}"'.d.ts"
' ../../template/template/api-extractor.json api-extractor.json > api-extractor.json
if cat ../../../rush.json | grep -q "" ; then
echo "rush.json already contains @azure/${SERVICE_NAME,,}"
else
echo "adding @azure/${SERVICE_NAME,,} into rush.json"
cat ../../../rush.json | head -n -3 > ../../../rush.temp.json
mv ../../../rush.temp.json ../../../rush.json
RUSH_CONFIG=' },
{
"packageName": "@azure/'"${SERVICE_NAME,,}"'",
"projectFolder": "sdk/maps/'"${SERVICE_NAME,,}"'",
"versionPolicyName": "client"
}
]
}'
echo "$RUSH_CONFIG" >> ../../../rush.json
fi
mkdir -p review
cd -
done
cd $SDK_PATH
rush update
rush build
find sdk/maps/*/* -maxdepth 1 -name "package.json" -print | while read PACKAGEJSON_PATH ; do
TARGET_PATH="$(dirname $PACKAGEJSON_PATH)"
echo $TARGET_PATH
RP=$(pwd)
cd $TARGET_PATH
rushx build
rushx pack
cd $RP
done
#!/bin/bash
if [[ -z $1 ]] ; then
echo "Missing swagger readme search path, usage: ./gen_python.sh SEARCH_PATH [SDK_PATH]"
echo 'Sample: ./gen_python.sh "specification/maps/data-plane/*/readme.md"'
exit 0
else
SEARCH_PATH=$1
fi
if [[ -z $2 ]] ; then
echo "Using ../azure-sdk-for-python for js sdk"
SDK_PATH="../azure-sdk-for-python"
else
SDK_PATH=$2
fi
TARGET_GENINPUT_PATH="genInput.json"
TARGET_GENOUTPUT_PATH="genOutput.json"
TARGET_PACKAGEOUTPUT_PATH="packageOutput.json"
CHANGED=$(find $(dirname $SEARCH_PATH) -print | xargs python -c 'import json, sys; print(json.dumps([v for v in sys.argv[1:]]))')
RELATED=$(find $SEARCH_PATH -print | xargs python -c 'import json, sys; print(json.dumps([v for v in sys.argv[1:]]))')
echo '{"relatedReadmeMdFiles":'"$RELATED"', "changedFiles":'"$CHANGED"', "specFolder":"../azure-rest-api-specs/"}' > "$SDK_PATH/$TARGET_GENINPUT_PATH"
cd $SDK_PATH
ln -s tools/azure-sdk-tools/packaging_tools/ packaging_tools
python -m packaging_tools.auto_codegen $TARGET_GENINPUT_PATH $TARGET_GENOUTPUT_PATH
python -m packaging_tools.auto_package $TARGET_GENOUTPUT_PATH $TARGET_PACKAGEOUTPUT_PATH
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment