Added tests, not failing if parent file doesn't exist

This commit is contained in:
Marcin Grzejszczak
2019-09-09 11:30:17 +02:00
parent f9aad5f2f5
commit 1d35ef3be7
6 changed files with 247 additions and 36 deletions

View File

@@ -52,6 +52,11 @@
<artifactId>groovy-json</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>

View File

@@ -16,43 +16,48 @@ class Main {
@CompileStatic
static void main(String... args) {
String outputFile = args[0]
String inclusionPattern = args.length > 0 ? args[1] : ".*"
new Main().generate(outputFile, inclusionPattern)
}
void generate(String outputFile, String inclusionPattern) {
println "Parsing all configuration metadata"
Resource[] resources = new PathMatchingResourcePatternResolver()
.getResources("classpath*:/META-INF/spring-configuration-metadata.json")
println "Found [${resources.length}] configuration metadata jsons"
TreeSet names = new TreeSet()
def descriptions = [:]
int count = 0
int matchingPropertyCount = 0
int propertyCount = 0
Pattern pattern = Pattern.compile(inclusionPattern)
resources.each { Resource resource ->
if (resource.url.toString().contains("cloud")) {
count++
def slurper = new JsonSlurper()
slurper.parseText(resource.inputStream.text).properties.each { val ->
propertyCount++
if (!pattern.matcher(val.name).matches()) {
return
}
matchingPropertyCount++
names.add val.name
descriptions[val.name] = new ConfigValue(val.name, val.description, val.defaultValue)
}
}
}
println "Found [${count}] Cloud projects configuration metadata jsons. [${matchingPropertyCount}/${propertyCount}] were matching the pattern [${inclusionPattern}]"
println "Successfully built the description table"
if (names.empty) {
println("Will not update the table, since no configuration properties were found!")
String inclusionPattern = args.length > 1 ? args[1] : ".*"
File parent = new File(outputFile).parentFile
if (!parent.exists()) {
println "No parent directory [${parent.toString()}] found. Won't generate the configuration properties file"
return
}
new File(outputFile).text = """\
new Generator().generate(outputFile, inclusionPattern)
}
static class Generator {
void generate(String outputFile, String inclusionPattern) {
println "Parsing all configuration metadata"
Resource[] resources = getResources()
println "Found [${resources.length}] configuration metadata jsons"
TreeSet names = new TreeSet()
def descriptions = [:]
int count = 0
int matchingPropertyCount = 0
int propertyCount = 0
Pattern pattern = Pattern.compile(inclusionPattern)
resources.each { Resource resource ->
if (resourceNameContainsPattern(resource)) {
count++
def slurper = new JsonSlurper()
slurper.parseText(resource.inputStream.text).properties.each { val ->
propertyCount++
if (!pattern.matcher(val.name).matches()) {
return
}
matchingPropertyCount++
names.add val.name
descriptions[val.name] = new ConfigValue(val.name, val.description, val.defaultValue)
}
}
}
println "Found [${count}] Cloud projects configuration metadata jsons. [${matchingPropertyCount}/${propertyCount}] were matching the pattern [${inclusionPattern}]"
println "Successfully built the description table"
if (names.empty) {
println("Will not update the table, since no configuration properties were found!")
return
}
new File(outputFile).text = """\
|===
|Name | Default | Description
@@ -60,9 +65,27 @@ ${names.collect { it -> return descriptions[it] }.join("\n")}
|===
"""
println "Successfully stored the output file"
println "Successfully stored the output file"
}
protected boolean resourceNameContainsPattern(Resource resource) {
try {
return resource.getURL().toString().contains("cloud")
}
catch (Exception e) {
println("Exception [${e}] for resource [${resource}] occurred while trying to retrieve its URL")
return false
}
}
protected Resource[] getResources() {
return new PathMatchingResourcePatternResolver()
.getResources("classpath*:/META-INF/spring-configuration-metadata.json")
}
}
@CompileStatic
static class ConfigValue {
String name

View File

@@ -0,0 +1,116 @@
/*
* Copyright 2013-2019 the original author or authors.
*
* Licensed 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
*
* https://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.
*/
package org.springframework.cloud.internal;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
import org.junit.jupiter.api.Test;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import static org.assertj.core.api.BDDAssertions.then;
class GeneratorTests {
URL root = GeneratorTests.class.getResource(".");
@Test
void should_not_create_a_file_when_no_properties_were_found()
throws URISyntaxException {
Main.Generator generator = new Main.Generator() {
@Override
protected Resource[] getResources() {
return new Resource[0];
}
};
File file = new File(root.toURI().toString(), "output.adoc");
String inclusionPattern = ".*";
generator.generate(file.getAbsolutePath(), inclusionPattern);
then(file).doesNotExist();
}
@Test
void should_create_a_file_when_cloud_file_was_found() {
Main.Generator generator = new Main.Generator() {
@Override
protected Resource[] getResources() {
return new Resource[] { resource("/not-matching-name.json"),
resource("/with-cloud-in-name.json") };
}
@Override
protected boolean resourceNameContainsPattern(Resource resource) {
try {
return resource.getURI().toString().contains("with-cloud");
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
}
};
File file = new File(root.getFile().toString(), "output.adoc");
String inclusionPattern = ".*";
generator.generate(file.getAbsolutePath(), inclusionPattern);
then(file).exists();
then(asString(file)).contains("spring.first-property")
.contains("unmatched.second-property")
.doesNotContain("example1.first-property");
}
@Test
void should_create_a_file_when_spring_property_was_found() {
Main.Generator generator = new Main.Generator() {
@Override
protected Resource[] getResources() {
return new Resource[] { resource("/not-matching-name.json"),
resource("/with-cloud-in-name.json") };
}
};
File file = new File(root.getFile().toString(), "output.adoc");
String inclusionPattern = "spring.*";
generator.generate(file.getAbsolutePath(), inclusionPattern);
then(file).exists();
then(asString(file)).contains("spring.first-property")
.doesNotContain("example1.first-property")
.doesNotContain("unmatched.second-property");
}
static String asString(File file) {
try {
return new String(Files.readAllBytes(file.toPath()));
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
}
static Resource resource(String path) {
return new FileSystemResource(GeneratorTests.class.getResource(path).getFile());
}
}

View File

@@ -0,0 +1,35 @@
/*
* Copyright 2013-2019 the original author or authors.
*
* Licensed 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
*
* https://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.
*/
package org.springframework.cloud.internal;
import java.io.File;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.BDDAssertions.then;
class MainTests {
@Test
void should_do_nothing_when_parent_dir_is_not_found() {
File nonExistantFile = new File("/this/file/does/not/exist");
Main.main(nonExistantFile.getAbsolutePath());
then(nonExistantFile).doesNotExist();
}
}

View File

@@ -0,0 +1,16 @@
{
"properties": [
{
"defaultValue": "false",
"name": "example1.first-property",
"description": "First Description",
"type": "java.lang.Boolean"
},
{
"defaultValue": "true",
"name": "example2.second-property",
"description": "Second Description",
"type": "java.lang.Boolean"
}
]
}

View File

@@ -0,0 +1,16 @@
{
"properties": [
{
"defaultValue": "false",
"name": "spring.first-property",
"description": "First Description",
"type": "java.lang.Boolean"
},
{
"defaultValue": "true",
"name": "unmatched.second-property",
"description": "Second Description",
"type": "java.lang.Boolean"
}
]
}