Skip to content

Commit

Permalink
Gradle provider API adjustments
Browse files Browse the repository at this point in the history
  • Loading branch information
jjohannes committed Feb 12, 2024
1 parent a8f312e commit cc3f67a
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,28 @@
import com.tngtech.jgiven.gradle.internal.JGivenHtmlReportImpl;
import com.tngtech.jgiven.impl.Config;
import com.tngtech.jgiven.impl.util.WordUtil;
import org.gradle.api.*;
import org.gradle.api.internal.ConventionMapping;
import org.gradle.api.internal.IConventionAware;
import org.gradle.api.Action;
import org.gradle.api.NonNullApi;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.file.Directory;
import org.gradle.api.model.ObjectFactory;
import org.gradle.api.plugins.ReportingBasePlugin;
import org.gradle.api.provider.Provider;
import org.gradle.api.reporting.Report;
import org.gradle.api.reporting.ReportingExtension;
import org.gradle.api.tasks.testing.Test;

import java.io.File;
import javax.inject.Inject;
import java.util.Objects;
import java.util.concurrent.Callable;

@NonNullApi
public class JGivenPlugin implements Plugin<Project> {
public abstract class JGivenPlugin implements Plugin<Project> {

@Inject
protected abstract ObjectFactory getObjects();

@Override
public void apply(final Project project) {
project.getPluginManager().apply(ReportingBasePlugin.class);
Expand All @@ -32,12 +40,12 @@ private void addTaskExtension(Project project) {

private void applyTo(Test test) {
final String testName = test.getName();
final JGivenTaskExtension extension = test.getExtensions().create("jgiven", JGivenTaskExtension.class);
final JGivenTaskExtension extension = getObjects().newInstance(JGivenTaskExtension.class);
test.getExtensions().add("jgiven", extension);
final Project project = test.getProject();
((IConventionAware) extension).getConventionMapping().map("resultsDir",
(Callable<File>) () -> project.file(project.getBuildDir() + "/jgiven-results/" + testName));
extension.getResultsDir().convention(project.getLayout().getBuildDirectory().dir("jgiven-results/" + testName));

File resultsDir = extension.getResultsDir().get();
Provider<Directory> resultsDir = extension.getResultsDir();
test.getOutputs().dir(resultsDir).withPropertyName("jgiven.resultsDir");

/* Java lambda classes are created at runtime with a non-deterministic classname.
Expand All @@ -46,10 +54,10 @@ private void applyTo(Test test) {
* See: https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:how_does_it_work
*/
//noinspection Convert2Lambda
test.prependParallelSafeAction(new Action<>() {
test.doFirst(new Action<>() {
@Override
public void execute(Task task) {
((Test) task).systemProperty(Config.JGIVEN_REPORT_DIR, extension.getResultsDir().get().getAbsolutePath());
((Test) task).systemProperty(Config.JGIVEN_REPORT_DIR, extension.getResultsDir().get().getAsFile().getAbsolutePath());
}
});
}
Expand All @@ -76,18 +84,15 @@ private void configureDefaultReportTask(final Test test, JGivenReportTask report
final ReportingExtension reportingExtension) {
reportTask.mustRunAfter(test);

ConventionMapping mapping = ((IConventionAware) reportTask).getConventionMapping();
Callable<File> getResultsDirectory = () -> test.getExtensions()
Provider<Directory> getResultsDirectory = test.getExtensions()
.getByType(JGivenTaskExtension.class)
.getResultsDir().get();
mapping.map("results", getResultsDirectory);

Objects.requireNonNull(mapping.getConventionValue(reportTask.getReports(), "reports", false))
.all(report -> {
ConventionMapping reportMapping = ((IConventionAware) report).getConventionMapping();
String relativeFilePath = "jgiven" + "/" + test.getName() + "/" + report.getName();
Callable<File> getDestination = () -> reportingExtension.file(relativeFilePath);
reportMapping.map("destination", getDestination);
});
.getResultsDir();

reportTask.getResults().set(getResultsDirectory);

reportTask.getReports().configureEach(report -> {
String relativeFilePath = "jgiven" + "/" + test.getName() + "/" + report.getName();
report.getOutputLocation().set(reportingExtension.getBaseDirectory().dir(relativeFilePath));
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
import com.tngtech.jgiven.gradle.internal.JGivenReportsContainerImpl;
import com.tngtech.jgiven.report.AbstractReportGenerator;
import groovy.lang.Closure;
import java.io.File;
import javax.inject.Inject;
import org.gradle.api.Action;
import org.gradle.api.DefaultTask;
import org.gradle.api.NonNullApi;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.model.ObjectFactory;
import org.gradle.api.reporting.Reporting;
import org.gradle.api.tasks.CacheableTask;
import org.gradle.api.tasks.InputDirectory;
Expand All @@ -16,33 +16,25 @@
import org.gradle.api.tasks.PathSensitivity;
import org.gradle.api.tasks.SkipWhenEmpty;
import org.gradle.api.tasks.TaskAction;
import org.gradle.internal.reflect.Instantiator;

import javax.inject.Inject;

@CacheableTask
@NonNullApi
public class JGivenReportTask extends DefaultTask implements Reporting<JGivenReportsContainer> {
public abstract class JGivenReportTask extends DefaultTask implements Reporting<JGivenReportsContainer> {
private final JGivenReportsContainer reports;
private File results;

public JGivenReportTask() {
reports = getInstantiator().newInstance(JGivenReportsContainerImpl.class, this);
reports = getObjects().newInstance(JGivenReportsContainerImpl.class, this);
}

@Inject
protected Instantiator getInstantiator() {
throw new UnsupportedOperationException();
}
protected abstract ObjectFactory getObjects();

@InputDirectory
@SkipWhenEmpty
@PathSensitive(PathSensitivity.NONE)
public File getResults() {
return results;
}

public void setResults(File results) {
this.results = results;
}
public abstract DirectoryProperty getResults();

@TaskAction
public void generate() {
Expand All @@ -53,7 +45,7 @@ public void generate() {

private void generateReport(JGivenReport report) {
AbstractReportGenerator generator = report.createGenerator();
generator.config.setSourceDir(getResults());
generator.config.setSourceDir(getResults().get().getAsFile());
generator.loadReportModel();
try {
generator.generate();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package com.tngtech.jgiven.gradle;

import org.gradle.api.provider.Property;

import java.io.File;
import org.gradle.api.file.DirectoryProperty;

public interface JGivenTaskExtension {
Property<File> getResultsDir();

DirectoryProperty getResultsDir();
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@
import org.gradle.api.Task;
import org.gradle.api.reporting.internal.TaskReportContainer;

import javax.inject.Inject;

import static org.gradle.api.internal.CollectionCallbackActionDecorator.NOOP;

public class JGivenReportsContainerImpl extends TaskReportContainer<JGivenReport> implements JGivenReportsContainer {

@Inject
public JGivenReportsContainerImpl( Task task ) {
super( JGivenReport.class, task, NOOP);
add(JGivenHtmlReportImpl.class, task);
Expand Down

0 comments on commit cc3f67a

Please sign in to comment.