这是indexloc提供的服务,不要输入任何密码
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
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.1"
id "co.com.bancolombia.cleanArchitecture" version "1.6.2"
}
```

Expand Down Expand Up @@ -90,6 +90,12 @@ gradle gpl --type=[pipelineType]
|AZURE |Azure Pipeline|


8 The ```deleteModule | dm``` task will delete a sub project, this task have one required parameter ```module```.
```sh
gradle deleteModule --module=[name]
gradle dm --module=[name]
````

How I can help?
=============
Review the issues, we hear new ideas.
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
package=co.com.bancolombia
systemProp.version=1.6.1
systemProp.version=1.6.2
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
*/
package co.com.bancolombia;

import org.gradle.api.Project;
import org.gradle.testfixtures.ProjectBuilder;
import org.gradle.testkit.runner.BuildResult;
import org.gradle.testkit.runner.GradleRunner;
import org.gradle.testkit.runner.TaskOutcome;
Expand All @@ -17,8 +15,7 @@
import java.io.Writer;
import java.nio.file.Files;

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

/**
* A simple functional test for the 'co.com.bancolombia.greeting' plugin.
Expand Down Expand Up @@ -249,6 +246,19 @@ public void createTasks() {
assertEquals(result.task(":tasks").getOutcome(), TaskOutcome.SUCCESS);
}

@Test
public void canDeleteModule() {
// Arrange
canRunTaskGenerateDrivenAdapterWithParameters();
// Act
runner.withArguments("deleteModule", "--module=jpa-repository");
runner.withProjectDir(projectDir);
BuildResult result = runner.build();
// Assert
assertFalse(new File("build/functionalTest/infrastructure/driven-adapters/jpa-repository").exists());
assertEquals(result.task(":deleteModule").getOutcome(), TaskOutcome.SUCCESS);
}

private void writeString(File file, String string) throws IOException {
try (Writer writer = new FileWriter(file)) {
writer.write(string);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/co/com/bancolombia/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class Constants {
public static final String SPRING_CLOUD_VERSION = "Greenwich.M1";
public static final String SONAR_VERSION = "2.7";
public static final String JACOCO_VERSION = "0.8.5";
public static final String PLUGIN_VERSION = "1.6.1";
public static final String PLUGIN_VERSION = "1.6.2";
public static final String SECRETS_VERSION = "2.1.0";

public enum BooleanOption {
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/co/com/bancolombia/PluginClean.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ private List<TaskModel> initTasks() {
.description("Generate CI pipeline as a code in deployment layer").group(Constants.PLUGIN_TASK_GROUP)
.taskAction(GeneratePipelineTask.class).build());

tasksModels.add(TaskModel.builder().name("deleteModule").shortcut("dm")
.description("Delete gradle module").group(Constants.PLUGIN_TASK_GROUP)
.taskAction(DeleteModuleTask.class).build());

return tasksModels;
}

Expand Down
61 changes: 45 additions & 16 deletions src/main/java/co/com/bancolombia/factory/ModuleBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import co.com.bancolombia.exceptions.ParamNotFoundException;
import co.com.bancolombia.models.FileModel;
import co.com.bancolombia.models.TemplateDefinition;
import co.com.bancolombia.utils.FileAppender;
import co.com.bancolombia.utils.FileUpdater;
import co.com.bancolombia.utils.FileUtils;
import co.com.bancolombia.utils.Utils;
import com.fasterxml.jackson.databind.ObjectMapper;
Expand All @@ -31,6 +31,7 @@ public class ModuleBuilder {
private final MustacheFactory mustacheFactory = new DefaultMustacheFactory();
private final Map<String, FileModel> files = new ConcurrentHashMap<>();
private final List<String> dirs = new ArrayList<>();
private final List<String> dirsToDelete = new ArrayList<>();
private final Map<String, Object> params = new HashMap<>();
private final ObjectMapper mapper = new ObjectMapper();
private final Logger logger;
Expand All @@ -51,19 +52,25 @@ public ModuleBuilder(Project project) {
}

public void persist() throws IOException {
logger.lifecycle("Generating dirs");
dirs.forEach(getProject()::mkdir);
logger.lifecycle("Dirs generated");
logger.lifecycle("Generating files");
logger.lifecycle("Applying changes");
dirs.forEach(dir -> {
getProject().mkdir(dir);
logger.debug("creating dir {}", dir);
});
if (properties != null) {
logger.lifecycle("Updating application properties");
addFile(APPLICATION_PROPERTIES, FileUtils.parseToYaml(properties));
}
for (Map.Entry<String, FileModel> fileEntry : files.entrySet()) {
FileModel file = fileEntry.getValue();
FileUtils.writeString(getProject(), file.getPath(), file.getContent());
logger.debug("file {} written", file.getPath());
}
logger.lifecycle("Files written");
dirsToDelete.forEach(dir -> {
getProject().delete(dir);
logger.debug("deleting dir {}", dir);
});
logger.lifecycle("Changes successfully applied");
}

public void setupFromTemplate(String resourceGroup) throws IOException, ParamNotFoundException {
Expand All @@ -80,19 +87,35 @@ public void setupFromTemplate(String resourceGroup) throws IOException, ParamNot
}

public void appendToSettings(String module, String baseDir) throws IOException {
appendToFile("settings.gradle", settings -> {
String toAppend = "\ninclude ':" + module + "'\nproject(':" + module + "').projectDir = file('./" + baseDir
+ "/" + module + "')";
if (settings.contains(toAppend)) {
return settings;
}
return settings + toAppend;
logger.lifecycle("adding module {} to settings.gradle", module);
updateFile("settings.gradle", settings -> Utils.addModule(settings, module, baseDir));
}

public void removeFromSettings(String module) throws IOException {
logger.lifecycle("removing {} from settings.gradle", module);
updateFile("settings.gradle", settings -> {
String moduleKey = "':" + module + "'";
return Utils.removeLinesIncludes(settings, moduleKey);
});
}

public void appendDependencyToModule(String module, String dependency) throws IOException {
logger.lifecycle("adding dependency {} to module {}", dependency, module);
String buildFilePath = project.getChildProjects().get(module).getBuildFile().getPath();
updateFile(buildFilePath, current -> Utils.addDependency(current, dependency));
}

public void removeDependencyFromModule(String module, String dependency) throws IOException {
logger.lifecycle("removing dependency {} from module {}", dependency, module);
String buildFilePath = project.getChildProjects().get(module).getBuildFile().getPath();
appendToFile(buildFilePath, current -> Utils.addDependency(current, dependency));
updateFile(buildFilePath, current -> Utils.removeLinesIncludes(current, dependency));
}

public void deleteModule(String module) {
String projectDir = project.getChildProjects().get(module).getProjectDir().getPath();
logger.lifecycle("deleting module {} from dir {}", module,
projectDir.replace(project.getProjectDir().getPath(), ""));
removeDir(projectDir);
}

public ObjectNode appendToProperties(String path) throws IOException {
Expand Down Expand Up @@ -129,6 +152,12 @@ public void addDir(String path) {
}
}

public void removeDir(String path) {
if (path != null) {
this.dirsToDelete.add(path);
}
}

public String getStringParam(String key) {
return (String) params.get(key);
}
Expand All @@ -137,7 +166,7 @@ public Boolean getBooleanParam(String key) {
return (Boolean) params.get(key);
}

private void appendToFile(String path, FileAppender appender) throws IOException {
private void updateFile(String path, FileUpdater updater) throws IOException {
FileModel current = files.get(path);
String content;
if (current == null) {
Expand All @@ -146,7 +175,7 @@ private void appendToFile(String path, FileAppender appender) throws IOException
} else {
content = current.getContent();
}
addFile(path, appender.append(content));
addFile(path, updater.update(content));
}

private ObjectNode getNode(ObjectNode node, List<String> attributes) {
Expand Down
40 changes: 40 additions & 0 deletions src/main/java/co/com/bancolombia/task/DeleteModuleTask.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
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;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class DeleteModuleTask extends DefaultTask {
private final ModuleBuilder builder = new ModuleBuilder(getProject());

private String module;

@Option(option = "module", description = "Set module name to delete")
public void setModule(String module) {
this.module = module;
}

@OptionValues("module")
public List<String> getModules() {
return new ArrayList<>(getProject().getChildProjects().keySet());
}

@TaskAction
public void deleteModule() throws IOException {
if (module == null || !getProject().getChildProjects().containsKey(module)) {
throw new IllegalArgumentException("No valid module name is set, usage: gradle deleteModule --module "
+ Utils.formatTaskOptions(getModules()));
}
builder.deleteModule(module);
builder.removeFromSettings(module);
builder.removeDependencyFromModule("app-service", "implementation project(':" + module + "')");
builder.persist();
}
}
5 changes: 0 additions & 5 deletions src/main/java/co/com/bancolombia/utils/FileAppender.java

This file was deleted.

5 changes: 5 additions & 0 deletions src/main/java/co/com/bancolombia/utils/FileUpdater.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package co.com.bancolombia.utils;

public interface FileUpdater {
String update(String content);
}
16 changes: 16 additions & 0 deletions src/main/java/co/com/bancolombia/utils/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Utils {
Expand Down Expand Up @@ -88,4 +90,18 @@ public static String toDashName(String name) {
return res;
}

public static String addModule(String settings, String module, String baseDir) {
String toAppend = "\ninclude ':" + module + "'\nproject(':" + module + "').projectDir = file('./" + baseDir
+ "/" + module + "')";
if (settings.contains(toAppend)) {
return settings;
}
return settings + toAppend;
}

public static String removeLinesIncludes(String content, String key) {
return Arrays.stream(content.split("\\n"))
.filter(line -> !line.contains(key))
.collect(Collectors.joining("\n"));
}
}
6 changes: 3 additions & 3 deletions src/main/resources/structure/root/settings.gradle.mustache
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
rootProject.name = '{{projectName}}'

include ":app-service"
include ":model"
include ":usecase"
include ':app-service'
include ':model'
include ':usecase'
project(':app-service').projectDir = file('./applications/app-service')
project(':model').projectDir = file('./domain/model')
project(':usecase').projectDir = file('./domain/usecase')
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public void shouldAppendProperties() throws IOException {
builder.appendToProperties("spring.datasource").put("url", "mydburl");
builder.appendToProperties("").put("test", "myUnitTes");
builder.appendToProperties("server").put("port", 8000);
builder.removeDir(null);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's required?

builder.persist();
}

Expand Down
79 changes: 79 additions & 0 deletions src/test/java/co/com/bancolombia/task/DeleteModuleTaskTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package co.com.bancolombia.task;

import co.com.bancolombia.exceptions.CleanException;
import co.com.bancolombia.factory.adapters.ModuleFactoryDrivenAdapter;
import org.gradle.api.Project;
import org.gradle.testfixtures.ProjectBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.File;
import java.io.IOException;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class DeleteModuleTaskTest {
private DeleteModuleTask task;

@Before
public void setup() throws IOException, CleanException {
Project project = ProjectBuilder.builder()
.withName("cleanArchitecture")
.withProjectDir(new File("build/unitTest"))
.build();

project.getTasks().create("ca", GenerateStructureTask.class);
GenerateStructureTask generateStructureTask = (GenerateStructureTask) project.getTasks().getByName("ca");
generateStructureTask.generateStructureTask();

ProjectBuilder.builder()
.withName("app-service")
.withProjectDir(new File("build/unitTest/applications/app-service"))
.withParent(project)
.build();

project.getTasks().create("gda", GenerateDrivenAdapterTask.class);
GenerateDrivenAdapterTask generateDriven = (GenerateDrivenAdapterTask) project.getTasks().getByName("gda");
generateDriven.setType(ModuleFactoryDrivenAdapter.DrivenAdapterType.MONGODB);
generateDriven.generateDrivenAdapterTask();

ProjectBuilder.builder()
.withName("mongo-repository")
.withProjectDir(new File("build/unitTest/infrastructure/driven-adapters/mongo-repository"))
.withParent(project)
.build();

assertTrue(new File("build/unitTest/infrastructure/driven-adapters/mongo-repository/build.gradle").exists());

project.getTasks().create("test", DeleteModuleTask.class);
task = (DeleteModuleTask) project.getTasks().getByName("test");
}

// Assert
@Test(expected = IllegalArgumentException.class)
public void deleteNullModule() throws IOException {
// Arrange
// Act
task.deleteModule();
}

// Assert
@Test(expected = IllegalArgumentException.class)
public void deleteNonExistentModule() throws IOException {
// Arrange
task.setModule("non-existent");
// Act
task.deleteModule();
}

@Test
public void generateEntryPoint() throws IOException {
// Arrange
task.setModule("mongo-repository");
// Act
task.deleteModule();
// Assert
assertFalse(new File("build/unitTest/infrastructure/driven-adapters/mongo-repository/build.gradle").exists());
}
}
Loading