diff --git a/README.md b/README.md index 26fb102a..518b2c72 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ To use the plugin you need Gradle version 5 or later, to start add the following ```groovy plugins { - id "co.com.bancolombia.cleanArchitecture" version "1.6.4" + id "co.com.bancolombia.cleanArchitecture" version "1.6.5" } ``` diff --git a/gradle.properties b/gradle.properties index 02ddcfbb..9b256aac 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ package=co.com.bancolombia -systemProp.version=1.6.4 +systemProp.version=1.6.5 diff --git a/src/main/java/co/com/bancolombia/Constants.java b/src/main/java/co/com/bancolombia/Constants.java index 78c10923..19917775 100644 --- a/src/main/java/co/com/bancolombia/Constants.java +++ b/src/main/java/co/com/bancolombia/Constants.java @@ -14,7 +14,7 @@ public class Constants { public static final String SECRETS_VERSION = "2.1.0"; public static final String RCOMMONS_ASYNC_COMMONS_STARTER_VERSION = "0.4.7"; public static final String RCOMMONS_OBJECT_MAPPER_VERSION = "0.1.0"; - public static final String PLUGIN_VERSION = "1.6.4"; + public static final String PLUGIN_VERSION = "1.6.5"; public enum BooleanOption { TRUE, FALSE diff --git a/src/main/java/co/com/bancolombia/task/CleanArchitectureDefaultTask.java b/src/main/java/co/com/bancolombia/task/CleanArchitectureDefaultTask.java new file mode 100644 index 00000000..509f61b5 --- /dev/null +++ b/src/main/java/co/com/bancolombia/task/CleanArchitectureDefaultTask.java @@ -0,0 +1,38 @@ +package co.com.bancolombia.task; + +import co.com.bancolombia.factory.ModuleBuilder; +import org.gradle.api.DefaultTask; +import org.gradle.api.Task; +import org.gradle.api.internal.tasks.options.OptionReader; +import org.gradle.api.logging.Logger; +import org.gradle.configuration.TaskDetailPrinter; +import org.gradle.execution.TaskSelector; +import org.gradle.internal.logging.text.StyledTextOutput; +import org.gradle.internal.logging.text.StyledTextOutputFactory; + +import javax.inject.Inject; + +public class CleanArchitectureDefaultTask extends DefaultTask { + protected final ModuleBuilder builder = new ModuleBuilder(getProject()); + protected final Logger logger = getProject().getLogger(); + + protected void printHelp() { + StyledTextOutput output = this.getTextOutputFactory().create(CleanArchitectureDefaultTask.class); + final Task task = this; + TaskSelector.TaskSelection selection = new TaskSelector.TaskSelection(getPath(), getName(), + collection -> collection.add(task)); + OptionReader optionReader = this.getOptionReader(); + TaskDetailPrinter taskDetailPrinter = new TaskDetailPrinter(getName(), selection, optionReader); + taskDetailPrinter.print(output); + } + + @Inject + protected StyledTextOutputFactory getTextOutputFactory() { + throw new UnsupportedOperationException(); + } + + @Inject + protected OptionReader getOptionReader() { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/co/com/bancolombia/task/DeleteModuleTask.java b/src/main/java/co/com/bancolombia/task/DeleteModuleTask.java index 51e43b84..e1fd5076 100644 --- a/src/main/java/co/com/bancolombia/task/DeleteModuleTask.java +++ b/src/main/java/co/com/bancolombia/task/DeleteModuleTask.java @@ -1,8 +1,6 @@ package co.com.bancolombia.task; -import co.com.bancolombia.factory.ModuleBuilder; import co.com.bancolombia.utils.Utils; -import org.gradle.api.DefaultTask; import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.options.Option; import org.gradle.api.tasks.options.OptionValues; @@ -11,9 +9,7 @@ import java.util.ArrayList; import java.util.List; -public class DeleteModuleTask extends DefaultTask { - private final ModuleBuilder builder = new ModuleBuilder(getProject()); - +public class DeleteModuleTask extends CleanArchitectureDefaultTask { private String module; @Option(option = "module", description = "Set module name to delete") @@ -29,6 +25,7 @@ public List getModules() { @TaskAction public void deleteModule() throws IOException { if (module == null || !getProject().getChildProjects().containsKey(module)) { + printHelp(); throw new IllegalArgumentException("No valid module name is set, usage: gradle deleteModule --module " + Utils.formatTaskOptions(getModules())); } diff --git a/src/main/java/co/com/bancolombia/task/GenerateDrivenAdapterTask.java b/src/main/java/co/com/bancolombia/task/GenerateDrivenAdapterTask.java index 27781842..481ea452 100644 --- a/src/main/java/co/com/bancolombia/task/GenerateDrivenAdapterTask.java +++ b/src/main/java/co/com/bancolombia/task/GenerateDrivenAdapterTask.java @@ -2,13 +2,10 @@ import co.com.bancolombia.Constants.BooleanOption; import co.com.bancolombia.exceptions.CleanException; -import co.com.bancolombia.factory.ModuleBuilder; import co.com.bancolombia.factory.ModuleFactory; import co.com.bancolombia.factory.adapters.ModuleFactoryDrivenAdapter; import co.com.bancolombia.factory.adapters.ModuleFactoryDrivenAdapter.DrivenAdapterType; import co.com.bancolombia.utils.Utils; -import org.gradle.api.DefaultTask; -import org.gradle.api.logging.Logger; import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.options.Option; import org.gradle.api.tasks.options.OptionValues; @@ -18,10 +15,7 @@ import java.util.Arrays; import java.util.List; -public class GenerateDrivenAdapterTask extends DefaultTask { - private final ModuleBuilder builder = new ModuleBuilder(getProject()); - private final Logger logger = getProject().getLogger(); - +public class GenerateDrivenAdapterTask extends CleanArchitectureDefaultTask { private DrivenAdapterType type; private String name; private BooleanOption secret = BooleanOption.FALSE; @@ -54,6 +48,7 @@ public List getSecretOptions() { @TaskAction public void generateDrivenAdapterTask() throws IOException, CleanException { if (type == null) { + printHelp(); throw new IllegalArgumentException("No Driven Adapter type is set, usage: gradle generateDrivenAdapter " + "--type " + Utils.formatTaskOptions(getTypes())); } diff --git a/src/main/java/co/com/bancolombia/task/GenerateEntryPointTask.java b/src/main/java/co/com/bancolombia/task/GenerateEntryPointTask.java index 0f476761..2d739639 100644 --- a/src/main/java/co/com/bancolombia/task/GenerateEntryPointTask.java +++ b/src/main/java/co/com/bancolombia/task/GenerateEntryPointTask.java @@ -1,13 +1,10 @@ package co.com.bancolombia.task; import co.com.bancolombia.exceptions.CleanException; -import co.com.bancolombia.factory.ModuleBuilder; import co.com.bancolombia.factory.ModuleFactory; import co.com.bancolombia.factory.entrypoints.ModuleFactoryEntryPoint; import co.com.bancolombia.factory.entrypoints.ModuleFactoryEntryPoint.EntryPointType; import co.com.bancolombia.utils.Utils; -import org.gradle.api.DefaultTask; -import org.gradle.api.logging.Logger; import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.options.Option; import org.gradle.api.tasks.options.OptionValues; @@ -17,10 +14,7 @@ import java.util.Arrays; import java.util.List; -public class GenerateEntryPointTask extends DefaultTask { - private final ModuleBuilder builder = new ModuleBuilder(getProject()); - private final Logger logger = getProject().getLogger(); - +public class GenerateEntryPointTask extends CleanArchitectureDefaultTask { private EntryPointType type; private String name; @@ -42,6 +36,7 @@ public List getTypes() { @TaskAction public void generateEntryPointTask() throws IOException, CleanException { if (type == null) { + printHelp(); throw new IllegalArgumentException("No Entry Point is set, usage: gradle generateEntryPoint --type " + Utils.formatTaskOptions(getTypes())); } diff --git a/src/main/java/co/com/bancolombia/task/GenerateModelTask.java b/src/main/java/co/com/bancolombia/task/GenerateModelTask.java index 2e38a471..0b91fac6 100644 --- a/src/main/java/co/com/bancolombia/task/GenerateModelTask.java +++ b/src/main/java/co/com/bancolombia/task/GenerateModelTask.java @@ -1,19 +1,13 @@ package co.com.bancolombia.task; import co.com.bancolombia.exceptions.ParamNotFoundException; -import co.com.bancolombia.factory.ModuleBuilder; import co.com.bancolombia.utils.Utils; -import org.gradle.api.DefaultTask; -import org.gradle.api.logging.Logger; import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.options.Option; import java.io.IOException; -public class GenerateModelTask extends DefaultTask { - private final ModuleBuilder builder = new ModuleBuilder(getProject()); - private final Logger logger = getProject().getLogger(); - +public class GenerateModelTask extends CleanArchitectureDefaultTask { private String name = ""; @Option(option = "name", description = "Set the model name") @@ -24,6 +18,7 @@ public void setName(String modelName) { @TaskAction public void generateModelTask() throws IOException, ParamNotFoundException { if (name.isEmpty()) { + printHelp(); throw new IllegalArgumentException("No model name, usage: gradle generateModel --name [name]"); } name = Utils.capitalize(name); diff --git a/src/main/java/co/com/bancolombia/task/GeneratePipelineTask.java b/src/main/java/co/com/bancolombia/task/GeneratePipelineTask.java index 1668c9a2..ff71d0a0 100644 --- a/src/main/java/co/com/bancolombia/task/GeneratePipelineTask.java +++ b/src/main/java/co/com/bancolombia/task/GeneratePipelineTask.java @@ -1,13 +1,10 @@ package co.com.bancolombia.task; import co.com.bancolombia.exceptions.CleanException; -import co.com.bancolombia.factory.ModuleBuilder; import co.com.bancolombia.factory.ModuleFactory; import co.com.bancolombia.factory.pipelines.ModuleFactoryPipeline; import co.com.bancolombia.factory.pipelines.ModuleFactoryPipeline.PipelineType; import co.com.bancolombia.utils.Utils; -import org.gradle.api.DefaultTask; -import org.gradle.api.logging.Logger; import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.options.Option; import org.gradle.api.tasks.options.OptionValues; @@ -17,10 +14,7 @@ import java.util.Arrays; import java.util.List; -public class GeneratePipelineTask extends DefaultTask { - private final ModuleBuilder builder = new ModuleBuilder(getProject()); - private final Logger logger = getProject().getLogger(); - +public class GeneratePipelineTask extends CleanArchitectureDefaultTask { private PipelineType type; @Option(option = "type", description = "Set type of pipeline to be generated") @@ -36,6 +30,7 @@ public List getTypes() { @TaskAction public void generatePipelineTask() throws IOException, CleanException { if (type == null) { + printHelp(); throw new IllegalArgumentException("No Pipeline type was set, usage: gradle generatePipeline --type " + Utils.formatTaskOptions(getTypes())); } diff --git a/src/main/java/co/com/bancolombia/task/GenerateStructureTask.java b/src/main/java/co/com/bancolombia/task/GenerateStructureTask.java index 0a1f54f1..34ca3f92 100644 --- a/src/main/java/co/com/bancolombia/task/GenerateStructureTask.java +++ b/src/main/java/co/com/bancolombia/task/GenerateStructureTask.java @@ -1,10 +1,7 @@ package co.com.bancolombia.task; import co.com.bancolombia.exceptions.CleanException; -import co.com.bancolombia.factory.ModuleBuilder; import co.com.bancolombia.utils.Utils; -import org.gradle.api.DefaultTask; -import org.gradle.api.logging.Logger; import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.options.Option; import org.gradle.api.tasks.options.OptionValues; @@ -14,10 +11,7 @@ import java.util.Arrays; import java.util.List; -public class GenerateStructureTask extends DefaultTask { - private final ModuleBuilder builder = new ModuleBuilder(getProject()); - private final Logger logger = getProject().getLogger(); - +public class GenerateStructureTask extends CleanArchitectureDefaultTask { private String packageName = "co.com.bancolombia"; private ProjectType type = ProjectType.IMPERATIVE; private CoveragePlugin coverage = CoveragePlugin.JACOCO; diff --git a/src/main/java/co/com/bancolombia/task/GenerateUseCaseTask.java b/src/main/java/co/com/bancolombia/task/GenerateUseCaseTask.java index 54d24dc7..41f2ec6d 100644 --- a/src/main/java/co/com/bancolombia/task/GenerateUseCaseTask.java +++ b/src/main/java/co/com/bancolombia/task/GenerateUseCaseTask.java @@ -1,19 +1,14 @@ package co.com.bancolombia.task; import co.com.bancolombia.exceptions.ParamNotFoundException; -import co.com.bancolombia.factory.ModuleBuilder; import co.com.bancolombia.utils.Utils; -import org.gradle.api.DefaultTask; -import org.gradle.api.logging.Logger; import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.options.Option; import java.io.IOException; -public class GenerateUseCaseTask extends DefaultTask { +public class GenerateUseCaseTask extends CleanArchitectureDefaultTask { private static final String USECASE_CLASS_NAME = "UseCase"; - private final ModuleBuilder builder = new ModuleBuilder(getProject()); - private final Logger logger = getProject().getLogger(); private String name = ""; @Option(option = "name", description = "Set UseCase name") @@ -24,6 +19,7 @@ public void setName(String useCaseName) { @TaskAction public void generateUseCaseTask() throws IOException, ParamNotFoundException { if (name.isEmpty()) { + printHelp(); throw new IllegalArgumentException( "No use case name, usage: gradle generateUseCase --name [name]"); } diff --git a/src/test/java/co/com/bancolombia/task/CleanArchitectureDefaultTaskTest.java b/src/test/java/co/com/bancolombia/task/CleanArchitectureDefaultTaskTest.java new file mode 100644 index 00000000..400db23a --- /dev/null +++ b/src/test/java/co/com/bancolombia/task/CleanArchitectureDefaultTaskTest.java @@ -0,0 +1,71 @@ +package co.com.bancolombia.task; + +import org.gradle.api.Project; +import org.gradle.api.internal.tasks.options.OptionDescriptor; +import org.gradle.api.internal.tasks.options.OptionReader; +import org.gradle.internal.logging.text.StyledTextOutputFactory; +import org.gradle.testfixtures.ProjectBuilder; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.util.List; + +import static org.junit.Assert.*; + +public class CleanArchitectureDefaultTaskTest { + private Project project; + + @Before + public void setup() { + project = ProjectBuilder.builder() + .withName("cleanArchitecture") + .withProjectDir(new File("build/unitTest")) + .build(); + + project.getTasks().create("dm", DeleteModuleTask.class); + project.getTasks().create("cadt", CleanArchitectureDefaultTask.class); + } + + @Test + public void shouldGetTaskDescriptor() { + // Arrange + CleanArchitectureDefaultTask task = (CleanArchitectureDefaultTask) project.getTasks().getByName("cadt"); + // Act + OptionReader reader = task.getOptionReader(); + // Assert + assertTrue(reader.getOptions(task).isEmpty()); + } + + @Test + public void shouldGetTaskDescriptorWithOptions() { + // Arrange + CleanArchitectureDefaultTask task = (CleanArchitectureDefaultTask) project.getTasks().getByName("dm"); + // Act + OptionReader reader = task.getOptionReader(); + // Assert + List list = reader.getOptions(task); + assertEquals(1, list.size()); + assertEquals("module", list.get(0).getName()); + } + + @Test + public void shouldGetTextOutputFactory() { + // Arrange + CleanArchitectureDefaultTask task = (CleanArchitectureDefaultTask) project.getTasks().getByName("dm"); + // Act + StyledTextOutputFactory factory = task.getTextOutputFactory(); + // Assert + assertNotNull(factory); + } + + @Test + public void shouldPrintHelp() { + // Arrange + CleanArchitectureDefaultTask task = (CleanArchitectureDefaultTask) project.getTasks().getByName("dm"); + // Act + task.printHelp(); + // Assert + assertNotNull(task.getTextOutputFactory()); + } +}