From d935036eaaa384db2c4bb755dd1469c1d64097f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20August=C3=BDn?= Date: Tue, 27 Jul 2021 22:16:44 +0200 Subject: [PATCH] chore: classes created via ObjectFactory --- .../dockercompose/ComposeExecutor.groovy | 47 ++++++++++++------- .../dockercompose/ComposeExtension.groovy | 3 ++ .../dockercompose/ComposeSettings.groovy | 8 ++-- .../dockercompose/DockerComposePlugin.groovy | 2 +- .../dockercompose/DockerExecutor.groovy | 20 +++++--- 5 files changed, 51 insertions(+), 29 deletions(-) diff --git a/src/main/groovy/com/avast/gradle/dockercompose/ComposeExecutor.groovy b/src/main/groovy/com/avast/gradle/dockercompose/ComposeExecutor.groovy index 06b5b40..794c7e5 100644 --- a/src/main/groovy/com/avast/gradle/dockercompose/ComposeExecutor.groovy +++ b/src/main/groovy/com/avast/gradle/dockercompose/ComposeExecutor.groovy @@ -1,23 +1,34 @@ package com.avast.gradle.dockercompose -import org.gradle.api.Project +import org.gradle.api.internal.file.FileOperations +import org.gradle.api.invocation.Gradle import org.gradle.api.logging.Logger +import org.gradle.api.logging.Logging import org.gradle.internal.UncheckedException +import org.gradle.process.ExecOperations import org.gradle.process.ExecSpec import org.gradle.util.VersionNumber import org.yaml.snakeyaml.Yaml +import javax.inject.Inject import java.util.concurrent.Executors class ComposeExecutor { private final ComposeSettings settings - private final Project project - private final Logger logger + private final File projectDir + private final ExecOperations exec + private final FileOperations fileOps + private final Gradle gradle - ComposeExecutor(ComposeSettings settings) { + private static final Logger logger = Logging.getLogger(ComposeExecutor.class); + + @Inject + ComposeExecutor(ComposeSettings settings, File projectDir, ExecOperations exec, FileOperations fileOps, Gradle gradle) { this.settings = settings - this.project = settings.project - this.logger = settings.project.logger + this.projectDir = projectDir + this.exec = exec + this.fileOps = fileOps + this.gradle = gradle } void executeWithCustomOutputWithExitValue(OutputStream os, String... args) { @@ -29,14 +40,14 @@ class ComposeExecutor { } void executeWithCustomOutput(OutputStream os, Boolean ignoreExitValue, Boolean noAnsi, Boolean captureStderr, String... args) { - def ex = this.settings - def er = project.exec { ExecSpec e -> + def settings = this.settings + def er = exec.exec { ExecSpec e -> if (settings.dockerComposeWorkingDirectory) { e.setWorkingDir(settings.dockerComposeWorkingDirectory) } - e.environment = ex.environment - def finalArgs = [ex.executable] - finalArgs.addAll(ex.composeAdditionalArgs) + e.environment = settings.environment + def finalArgs = [settings.executable] + finalArgs.addAll(settings.composeAdditionalArgs) if (noAnsi) { if (version >= VersionNumber.parse('1.28.0')) { finalArgs.addAll(['--ansi', 'never']) @@ -44,8 +55,8 @@ class ComposeExecutor { finalArgs.add('--no-ansi') } } - finalArgs.addAll(ex.useComposeFiles.collectMany { ['-f', it].asCollection() }) - String pn = ex.projectName + finalArgs.addAll(settings.useComposeFiles.collectMany { ['-f', it].asCollection() }) + String pn = settings.projectName if (pn) { finalArgs.addAll(['-p', pn]) } @@ -132,7 +143,7 @@ class ComposeExecutor { }) t.daemon = true t.start() - project.gradle.buildFinished { t.interrupt() } + gradle.buildFinished { t.interrupt() } } Iterable getServiceNames() { @@ -151,7 +162,7 @@ class ComposeExecutor { } else { def composeFiles = settings.useComposeFiles.empty ? getStandardComposeFiles() : getCustomComposeFiles() composeFiles.collectMany { composeFile -> - def compose = (Map) (new Yaml().load(project.file(composeFile).text)) + def compose = (Map) (new Yaml().load(fileOps.file(composeFile).text)) // if there is 'version' on top-level then information about services is in 'services' sub-tree compose.containsKey('version') ? ((Map) compose.get('services')).keySet() : compose.keySet() }.unique() @@ -171,16 +182,16 @@ class ComposeExecutor { Iterable getStandardComposeFiles() { def res = [] - def f = findInParentDirectories('docker-compose.yml', project.projectDir) + def f = findInParentDirectories('docker-compose.yml', projectDir) if (f != null) res.add(f) - f = findInParentDirectories('docker-compose.override.yml', project.projectDir) + f = findInParentDirectories('docker-compose.override.yml', projectDir) if (f != null) res.add(f) res } Iterable getCustomComposeFiles() { settings.useComposeFiles.collect { - def f = project.file(it) + def f = fileOps.file(it) if (!f.exists()) { throw new IllegalArgumentException("Custom Docker Compose file not found: $f") } diff --git a/src/main/groovy/com/avast/gradle/dockercompose/ComposeExtension.groovy b/src/main/groovy/com/avast/gradle/dockercompose/ComposeExtension.groovy index ac56e14..485f833 100644 --- a/src/main/groovy/com/avast/gradle/dockercompose/ComposeExtension.groovy +++ b/src/main/groovy/com/avast/gradle/dockercompose/ComposeExtension.groovy @@ -3,7 +3,10 @@ package com.avast.gradle.dockercompose import org.gradle.api.Project import org.gradle.util.ConfigureUtil +import javax.inject.Inject + class ComposeExtension extends ComposeSettings { + @Inject ComposeExtension(Project project) { super(project, '', '') } diff --git a/src/main/groovy/com/avast/gradle/dockercompose/ComposeSettings.groovy b/src/main/groovy/com/avast/gradle/dockercompose/ComposeSettings.groovy index 1efc367..22c29ef 100644 --- a/src/main/groovy/com/avast/gradle/dockercompose/ComposeSettings.groovy +++ b/src/main/groovy/com/avast/gradle/dockercompose/ComposeSettings.groovy @@ -18,6 +18,7 @@ import org.gradle.process.JavaForkOptions import org.gradle.process.ProcessForkOptions import org.gradle.util.VersionNumber +import javax.inject.Inject import java.nio.charset.StandardCharsets import java.security.MessageDigest import java.time.Duration @@ -107,6 +108,7 @@ class ComposeSettings { String dockerComposeWorkingDirectory = null Duration dockerComposeStopTimeout = Duration.ofSeconds(10) + @Inject ComposeSettings(Project project, String name = '', String parentName = '') { this.project = project this.nestedName = parentName + name @@ -119,8 +121,8 @@ class ComposeSettings { logsTask = project.tasks.register(name ? "${name}ComposeLogs".toString() : 'composeLogs', ComposeLogs, { it.settings = this }) pushTask = project.tasks.register(name ? "${name}ComposePush".toString() : 'composePush', ComposePush, { it.settings = this }) - this.dockerExecutor = new DockerExecutor(this) - this.composeExecutor = new ComposeExecutor(this) + this.dockerExecutor = project.objects.newInstance(DockerExecutor, this) + this.composeExecutor = project.objects.newInstance(ComposeExecutor, this, project.projectDir) this.serviceInfoCache = new ServiceInfoCache(this) this.containerLogToDir = project.buildDir.toPath().resolve('containers-logs').toFile() @@ -139,7 +141,7 @@ class ComposeSettings { } protected ComposeSettings cloneAsNested(String name) { - def r = new ComposeSettings(project, name, this.nestedName) + def r = project.objects.newInstance(ComposeSettings, project, name, this.nestedName) r.buildBeforeUp = this.buildBeforeUp r.buildBeforePull = this.buildBeforePull diff --git a/src/main/groovy/com/avast/gradle/dockercompose/DockerComposePlugin.groovy b/src/main/groovy/com/avast/gradle/dockercompose/DockerComposePlugin.groovy index 1b538c6..a16f66d 100644 --- a/src/main/groovy/com/avast/gradle/dockercompose/DockerComposePlugin.groovy +++ b/src/main/groovy/com/avast/gradle/dockercompose/DockerComposePlugin.groovy @@ -6,6 +6,6 @@ import org.gradle.api.Project class DockerComposePlugin implements Plugin { @Override void apply(Project project) { - project.extensions.create('dockerCompose', ComposeExtension, project) + project.extensions.create('dockerCompose', ComposeExtension) } } diff --git a/src/main/groovy/com/avast/gradle/dockercompose/DockerExecutor.groovy b/src/main/groovy/com/avast/gradle/dockercompose/DockerExecutor.groovy index 762977b..202ca6b 100644 --- a/src/main/groovy/com/avast/gradle/dockercompose/DockerExecutor.groovy +++ b/src/main/groovy/com/avast/gradle/dockercompose/DockerExecutor.groovy @@ -1,24 +1,30 @@ package com.avast.gradle.dockercompose -import org.gradle.api.Project import org.gradle.api.logging.Logger +import org.gradle.api.logging.Logging +import org.gradle.process.ExecOperations import org.gradle.process.ExecSpec import org.yaml.snakeyaml.Yaml +import javax.inject.Inject + class DockerExecutor { private final ComposeSettings settings - private final Project project - private final Logger logger + private final ExecOperations exec + + private static final Logger logger = Logging.getLogger(DockerExecutor.class); - DockerExecutor(ComposeSettings settings) { + @Inject + DockerExecutor(ComposeSettings settings, ExecOperations exec) { this.settings = settings - this.project = settings.project - this.logger = settings.project.logger + this.exec = exec } String execute(String... args) { + def exec = this.exec + def settings = this.settings new ByteArrayOutputStream().withStream { os -> - def er = project.exec { ExecSpec e -> + def er = exec.exec { ExecSpec e -> e.environment = settings.environment def finalArgs = [settings.dockerExecutable] finalArgs.addAll(args)