Skip to content

Commit

Permalink
Added configuration for excluding validators by name
Browse files Browse the repository at this point in the history
  • Loading branch information
dimitrovvlado committed Nov 10, 2018
1 parent 6ed93ab commit 498ad4d
Show file tree
Hide file tree
Showing 7 changed files with 121 additions and 15 deletions.
10 changes: 6 additions & 4 deletions src/main/java/io/github/dimitrovvlado/proto/lint/LinterMojo.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,13 @@
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static com.google.common.base.Preconditions.checkNotNull;

/**
* Goal which executes the lint.
*/
Expand All @@ -45,6 +41,9 @@ public class LinterMojo extends AbstractMojo {
@Parameter(property = "protoDirectory")
private File protoDirectory;

@Parameter(property = "excludes")
private String[] excludes;

private ValidatorService validator;

public LinterMojo() {
Expand All @@ -56,6 +55,9 @@ public void execute() throws MojoExecutionException {
getLog().info("Skipping linting phase.");
return;
}
if (excludes != null) {
Arrays.stream(excludes).forEach(e -> validator.excludeValidator(e));
}
Collection<File> files = resolveFiles();
int errorCount = 0;
for (File file : files) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,9 @@ private void processType(TypeElement typeElement, List<ValidationResult> result)
}
}
}

@Override
public String getName() {
return "messagesValidator";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,9 @@ public List<ValidationResult> validate(ProtoFileElement protoFile) {
}
return result;
}

@Override
public String getName() {
return "servicesValidator";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,10 @@ public interface Validator {
*/
List<ValidationResult> validate(ProtoFileElement protoFile);

/**
* The name of the validator. Must be unique.
* @return the name of the validator, never null.
*/
String getName();

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,10 @@
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
Expand All @@ -23,21 +22,47 @@ public class ValidatorService {

private Map<String, Validator> validators = new HashMap<>();

private static ValidatorService INSTANCE = new ValidatorService();
/**
* Constructs a {@link ValidatorService} instance with default set of validators
*
* @return a new ValidatorInstance
*/
public static ValidatorService getInstance() {
ValidatorService instance = new ValidatorService();
instance.includeValidator(new MessagesValidator());
instance.includeValidator(new ServicesValidator());
return instance;
}

static {
INSTANCE.addValidator("messages", new MessagesValidator());
INSTANCE.addValidator("services", new ServicesValidator());
/**
* Includes a validator to the {@link ValidatorService}
*
* @param validator the {@link Validator} implementation to include.
*/
public void includeValidator(Validator validator) {
validators.put(validator.getName(), validator);
}

public static ValidatorService getInstance() {
return INSTANCE;
/**
* Exclude a validator from the {@link ValidatorService}. Useful for excluding default validations.
*
* @param name the name of the validator to exclude.
*/
public void excludeValidator(String name) {
validators.remove(name);
}

public void addValidator(String name, Validator validator) {
validators.put(name, validator);
public Map<String, Validator> getValidators() {
return Collections.unmodifiableMap(validators);
}

/**
* Applies all the validation rules on the provided .proto file.
*
* @param file the proto file to validate.
* @return a list of validation errors if any.
* @throws IOException if the provided validation file cannot be open,
*/
public List<ValidationResult> apply(File file) throws IOException {
try (Source source = Okio.source(file)) {
Location location = Location.get(file.getAbsolutePath());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import org.apache.maven.plugin.testing.MojoRule;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mockito;

import java.io.File;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package io.github.dimitrovvlado.proto.lint.validation;

import com.squareup.wire.schema.internal.parser.ProtoFileElement;
import org.junit.Test;

import java.util.List;
import java.util.Map;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

/**
* Tests for {@link ValidatorService} class
*/
public class ValidatorServiceTest {

@Test
public void instantiateAndExclude() {
ValidatorService instance = ValidatorService.getInstance();
assertNotNull(instance);
Map<String, Validator> validators = instance.getValidators();
assertNotNull(validators);
assertEquals(2, validators.size()); //Expected 2 default validators
assertTrue(validators.get("messagesValidator") instanceof MessagesValidator);
assertTrue(validators.get("servicesValidator") instanceof ServicesValidator);

instance.excludeValidator("servicesValidator");
validators = instance.getValidators();
assertNotNull(validators);
assertEquals(1, validators.size());
assertTrue(validators.get("messagesValidator") instanceof MessagesValidator);

instance.excludeValidator("messagesValidator");
validators = instance.getValidators();
assertNotNull(validators);
assertEquals(0, validators.size());
}

@Test
public void instantiateAndInclude() {
ValidatorService instance = ValidatorService.getInstance();
assertNotNull(instance);
Map<String, Validator> validators = instance.getValidators();
assertNotNull(validators);
assertEquals(2, validators.size()); //Expected 2 default validators

instance.includeValidator(new Validator() {
@Override
public List<ValidationResult> validate(ProtoFileElement protoFile) {
return null;
}

@Override
public String getName() {
return "foobar";
}
});

validators = instance.getValidators();
assertNotNull(validators);
assertEquals(3, validators.size());
}
}

0 comments on commit 498ad4d

Please sign in to comment.