Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

@Mojo(name = "doc", threadSafe = true)
@Slf4j
public class GenerateDocMojo extends GenerateMojo {
public class GenerateDocMojo extends GenerateFromDirectoryDocMojo {

@Override
public void execute() throws MojoExecutionException {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.backbase.oss.boat;

import lombok.extern.slf4j.Slf4j;
import org.apache.maven.plugin.MojoExecutionException;

import java.io.File;

/**
* Allows generate::Doc to accept inputSpec as a directory
* Output docs will be placed in separate folders for each spec
*/
@Slf4j
public class GenerateFromDirectoryDocMojo extends GenerateMojo {

@Override
public void execute() throws MojoExecutionException {

File inputSpecFile = new File(inputSpec);

if (inputSpecFile.isDirectory()){
log.info("inputSpec is being read as a directory");

File[] inputSpecs;
File outPutDirectory = output;

inputSpecs = inputSpecFile.listFiles(pathname -> pathname.getName().endsWith(".yaml"));

if (inputSpecs == null || inputSpecs.length == 0) {
throw new MojoExecutionException("No OpenAPI specs found in: " + inputSpec);
}

for(File f : inputSpecs){
inputSpec = f.getPath();
output = new File(outPutDirectory.getPath(),f.getName().substring(0,f.getName().lastIndexOf(".")).concat("-docs"));

if(!output.exists()){
output.mkdir();
}

log.info(" Generating docs for spec {} in directory", f.getName());
super.execute();
}

}else {

log.info("inputSpec being read as a single file");
super.execute();

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,36 @@ void testBoatDocs() throws MojoExecutionException {
assertThat(output.list()).containsExactlyInAnyOrder("index.html", ".openapi-generator-ignore", ".openapi-generator");
}

@Test
void testBoatDocsWithDirectory() throws MojoExecutionException {

String spec = System.getProperty("spec", getClass().getResource("/boat-doc-oas-examples").getFile());

log.info("Generating docs for: {}", spec);

GenerateDocMojo mojo = new GenerateDocMojo();
File input = new File(spec);
File output = new File("target/boat-docs-directory");
if (!output.exists()) {
output.mkdirs();
}

DefaultBuildContext defaultBuildContext = new DefaultBuildContext();
defaultBuildContext.enableLogging(new ConsoleLogger());

mojo.getLog();
mojo.buildContext = defaultBuildContext;
mojo.project = new MavenProject();
mojo.inputSpec = input.getAbsolutePath();
mojo.output = output;
mojo.skip = false;
mojo.skipIfSpecIsUnchanged = false;
mojo.bundleSpecs = true;
mojo.dereferenceComponents = true;
mojo.execute();
assertThat(output.list()).containsExactlyInAnyOrder("link-docs", "petstore-docs", "petstore-new-non-breaking-docs", "upto-docs");
}

@Test
void testBundledBoatDocs() throws MojoExecutionException, MojoFailureException {

Expand Down Expand Up @@ -270,80 +300,5 @@ void testWebClient() throws MojoExecutionException {

}

@Test
void testJavaClient() throws MojoExecutionException, MavenInvocationException {
GenerateMojo mojo = new GenerateMojo();

String spec = System.getProperty("spec", getClass().getResource("/oas-examples/petstore.yaml").getFile());

File input = new File(spec);
File output = new File("target/javaclient");
if (output.exists()) {
output.delete();
}
output.mkdirs();

DefaultBuildContext defaultBuildContext = new DefaultBuildContext();
defaultBuildContext.enableLogging(new ConsoleLogger());
mojo.generatorName = "java";
mojo.library = "native";
mojo.buildContext = defaultBuildContext;
mojo.project = new MavenProject();
mojo.inputSpec = input.getAbsolutePath();
mojo.output = output;
mojo.skip = false;
mojo.skipIfSpecIsUnchanged = false;
mojo.skipOverwrite = false;
mojo.generateAliasAsModel = false;
mojo.execute();

InvocationRequest invocationRequest = new DefaultInvocationRequest();
invocationRequest.setPomFile(new File(output, "pom.xml"));
invocationRequest.setGoals(Arrays.asList("compile"));
invocationRequest.setBatchMode(true);

Invoker invoker = new DefaultInvoker();
InvocationResult invocationResult = invoker.execute(invocationRequest);
assertNull(invocationResult.getExecutionException());

}

@Test
void testReactiveJavaClient() throws MojoExecutionException, MavenInvocationException {
GenerateMojo mojo = new GenerateMojo();

String spec = System.getProperty("spec", getClass().getResource("/oas-examples/petstore.yaml").getFile());

File input = new File(spec);
File output = new File("target/webclient");
if (output.exists()) {
output.delete();
}
output.mkdirs();

DefaultBuildContext defaultBuildContext = new DefaultBuildContext();
defaultBuildContext.enableLogging(new ConsoleLogger());
mojo.generatorName = "java";
mojo.library = "webclient";
mojo.buildContext = defaultBuildContext;
mojo.project = new MavenProject();
mojo.inputSpec = input.getAbsolutePath();
mojo.output = output;
mojo.skip = false;
mojo.skipIfSpecIsUnchanged = false;
mojo.skipOverwrite = false;
mojo.generateAliasAsModel = false;
mojo.execute();

InvocationRequest invocationRequest = new DefaultInvocationRequest();
invocationRequest.setPomFile(new File(output, "pom.xml"));
invocationRequest.setGoals(Arrays.asList("compile"));
invocationRequest.setBatchMode(true);

Invoker invoker = new DefaultInvoker();
InvocationResult invocationResult = invoker.execute(invocationRequest);
assertNull(invocationResult.getExecutionException());

}

}
203 changes: 203 additions & 0 deletions boat-maven-plugin/src/test/resources/boat-doc-oas-examples/link.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
openapi: "3.0.0"
info:
title: Link Example
version: 1.0.0
paths:
/2.0/users/{username}:
get:
operationId: getUserByName
parameters:
- name: username
in: path
required: true
schema:
type: string
responses:
'200':
description: The User
content:
application/json:
schema:
$ref: '#/components/schemas/user'
links:
userRepositories:
$ref: '#/components/links/UserRepositories'
/2.0/repositories/{username}:
get:
operationId: getRepositoriesByOwner
parameters:
- name: username
in: path
required: true
schema:
type: string
responses:
'200':
description: repositories owned by the supplied user
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/repository'
links:
userRepository:
$ref: '#/components/links/UserRepository'
/2.0/repositories/{username}/{slug}:
get:
operationId: getRepository
parameters:
- name: username
in: path
required: true
schema:
type: string
- name: slug
in: path
required: true
schema:
type: string
responses:
'200':
description: The repository
content:
application/json:
schema:
$ref: '#/components/schemas/repository'
links:
repositoryPullRequests:
$ref: '#/components/links/RepositoryPullRequests'
/2.0/repositories/{username}/{slug}/pullrequests:
get:
operationId: getPullRequestsByRepository
parameters:
- name: username
in: path
required: true
schema:
type: string
- name: slug
in: path
required: true
schema:
type: string
- name: state
in: query
schema:
type: string
enum:
- open
- merged
- declined
responses:
'200':
description: an array of pull request objects
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/pullrequest'
/2.0/repositories/{username}/{slug}/pullrequests/{pid}:
get:
operationId: getPullRequestsById
parameters:
- name: username
in: path
required: true
schema:
type: string
- name: slug
in: path
required: true
schema:
type: string
- name: pid
in: path
required: true
schema:
type: string
responses:
'200':
description: a pull request object
content:
application/json:
schema:
$ref: '#/components/schemas/pullrequest'
links:
pullRequestMerge:
$ref: '#/components/links/PullRequestMerge'
/2.0/repositories/{username}/{slug}/pullrequests/{pid}/merge:
post:
operationId: mergePullRequest
parameters:
- name: username
in: path
required: true
schema:
type: string
- name: slug
in: path
required: true
schema:
type: string
- name: pid
in: path
required: true
schema:
type: string
responses:
'204':
description: the PR was successfully merged
components:
links:
UserRepositories:
# returns array of '#/components/schemas/repository'
operationId: getRepositoriesByOwner
parameters:
username: $response.body#/username
UserRepository:
# returns '#/components/schemas/repository'
operationId: getRepository
parameters:
username: $response.body#/owner/username
slug: $response.body#/slug
RepositoryPullRequests:
# returns '#/components/schemas/pullrequest'
operationId: getPullRequestsByRepository
parameters:
username: $response.body#/owner/username
slug: $response.body#/slug
PullRequestMerge:
# executes /2.0/repositories/{username}/{slug}/pullrequests/{pid}/merge
operationId: mergePullRequest
parameters:
username: $response.body#/author/username
slug: $response.body#/repository/slug
pid: $response.body#/id
schemas:
user:
type: object
properties:
username:
type: string
uuid:
type: string
repository:
type: object
properties:
slug:
type: string
owner:
$ref: '#/components/schemas/user'
pullrequest:
type: object
properties:
id:
type: integer
title:
type: string
repository:
$ref: '#/components/schemas/repository'
author:
$ref: '#/components/schemas/user'
Loading