Skip to content

Commit a595c5c

Browse files
committed
Merge pull request #24 from vanniktech/master_0.3.0
Implement features for version 0.3.0
2 parents 808b1ad + 28ef2b0 commit a595c5c

File tree

6 files changed

+337
-63
lines changed

6 files changed

+337
-63
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ gradle-app.setting
1010
local.properties
1111

1212
.idea/
13-
*.iml
13+
*.iml
14+
15+
*.DS_Store

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
GROUP=com.vanniktech
2-
VERSION_NAME=0.2.1-SNAPSHOT
2+
VERSION_NAME=0.3.0-SNAPSHOT
33

44
POM_ARTIFACT_ID=gradle-android-junit-jacoco-plugin
55
POM_NAME=Gradle Android JaCoCo Plugin

src/main/groovy/com/vanniktech/android/junit/jacoco/Generation.groovy

Lines changed: 110 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -6,89 +6,140 @@ import org.gradle.testing.jacoco.tasks.JacocoReport
66

77
class Generation implements Plugin<Project> {
88
@Override
9-
void apply(final Project project) {
10-
project.extensions.create('junitJacoco', JunitJacocoExtension)
9+
void apply(final Project rootProject) {
10+
rootProject.extensions.create('junitJacoco', JunitJacocoExtension)
1111

12-
project.subprojects { subProject ->
13-
subProject.plugins.apply('jacoco')
12+
rootProject.subprojects { subProject ->
13+
afterEvaluate {
14+
final def extension = rootProject.junitJacoco
1415

15-
subProject.jacoco {
16-
toolVersion project.junitJacoco.jacocoVersion
16+
addJacoco(subProject, extension)
1717
}
18+
}
19+
}
20+
21+
protected static boolean addJacoco(final Project subProject, final JunitJacocoExtension extension) {
22+
if (!shouldIgnore(subProject, extension)) {
23+
if (isAndroidProject(subProject)) {
24+
addJacocoAndroid(subProject, extension)
25+
return true
26+
} else if (isJavaProject(subProject)) {
27+
addJacocoJava(subProject, extension)
28+
return true
29+
}
30+
}
31+
32+
return false
33+
}
34+
35+
private static void addJacocoJava(final Project subProject, final extension) {
36+
subProject.plugins.apply('jacoco')
37+
38+
subProject.jacoco {
39+
toolVersion extension.jacocoVersion
40+
}
41+
42+
subProject.jacocoTestReport {
43+
dependsOn 'test'
44+
45+
group = 'Reporting'
46+
description = 'Generate Jacoco coverage reports.'
47+
48+
reports {
49+
xml.enabled = true
50+
html.enabled = true
51+
}
52+
53+
classDirectories = subProject.fileTree(
54+
dir: 'build/classes/main/',
55+
excludes: getExcludes()
56+
)
57+
58+
final def coverageSourceDirs = [
59+
'src/main/java',
60+
]
61+
62+
additionalSourceDirs = subProject.files(coverageSourceDirs)
63+
sourceDirectories = subProject.files(coverageSourceDirs)
64+
executionData = subProject.files("${subProject.buildDir}/jacoco/test.exec")
65+
}
66+
67+
subProject.check.dependsOn 'jacocoTestReport'
68+
}
69+
70+
private static void addJacocoAndroid(final Project subProject, final extension) {
71+
subProject.plugins.apply('jacoco')
72+
73+
subProject.jacoco {
74+
toolVersion extension.jacocoVersion
75+
}
76+
77+
final def buildTypes = subProject.android.buildTypes.collect { type -> type.name }
78+
79+
buildTypes.each { buildTypeName ->
80+
final def taskName = "jacocoTestReport${buildTypeName.capitalize()}"
81+
final def testTaskName = "test${buildTypeName.capitalize()}UnitTest"
1882

19-
subProject.task('jacocoReport', type: JacocoReport, dependsOn: 'testDebugUnitTest') {
83+
subProject.task(taskName, type: JacocoReport, dependsOn: testTaskName) {
2084
group = 'Reporting'
21-
description = 'Generate Jacoco coverage reports after running tests.'
85+
description = "Generate Jacoco coverage reports after running ${buildTypeName} tests."
2286

2387
reports {
2488
xml {
2589
enabled = true
26-
destination "${subProject.buildDir}/reports/jacoco/jacoco.xml"
90+
destination "${subProject.buildDir}/reports/jacoco/${buildTypeName}/jacoco.xml"
2791
}
2892
html {
2993
enabled = true
30-
destination "${subProject.buildDir}/reports/jacoco"
94+
destination "${subProject.buildDir}/reports/jacoco/${buildTypeName}"
3195
}
3296
}
3397

34-
classDirectories = fileTree(
35-
dir: 'build/intermediates/classes/debug',
36-
excludes: ['**/R.class',
37-
'**/R$*.class',
38-
'**/*$$*',
39-
'**/*$ViewInjector*.*',
40-
'**/*$ViewBinder*.*',
41-
'**/BuildConfig.*',
42-
'**/Manifest*.*',
43-
'**/*$Lambda$*.*', // Jacoco can not handle several "$" in class name.
44-
'**/*Dagger*.*', // Dagger auto-generated code.
45-
'**/*MembersInjector*.*', // Dagger auto-generated code.
46-
'**/*_Provide*Factory*.*' // Dagger auto-generated code.
47-
]
98+
classDirectories = subProject.fileTree(
99+
dir: "build/intermediates/classes/${buildTypeName}",
100+
excludes: getExcludes()
48101
)
49102

50-
sourceDirectories = files('src/main/java')
51-
executionData = files('build/jacoco/testDebugUnitTest.exec')
103+
final def coverageSourceDirs = [
104+
'src/main/java',
105+
"src/$buildTypeName/java"
106+
]
52107

53-
doFirst {
54-
files('build/intermediates/classes/debug').getFiles().each { file ->
55-
if (file.name.contains('$$')) {
56-
file.renameTo(file.path.replace('$$', '$'))
57-
}
58-
}
59-
}
108+
additionalSourceDirs = subProject.files(coverageSourceDirs)
109+
sourceDirectories = subProject.files(coverageSourceDirs)
110+
executionData = subProject.files("${subProject.buildDir}/jacoco/${testTaskName}.exec")
60111
}
61-
}
62112

63-
project.plugins.apply('jacoco')
64-
65-
project.jacoco {
66-
toolVersion project.junitJacoco.jacocoVersion
113+
subProject.check.dependsOn "${taskName}"
67114
}
115+
}
68116

69-
project.task('jacocoFullReport', type: JacocoReport, group: 'Coverage reports') {
70-
group = 'Reporting'
71-
description = 'Generate Jacoco coverage reports aggregated from all subprojects.'
72-
dependsOn(project.subprojects.jacocoReport)
117+
private static ArrayList<String> getExcludes() {
118+
['**/R.class',
119+
'**/R$*.class',
120+
'**/*$$*',
121+
'**/*$ViewInjector*.*',
122+
'**/*$ViewBinder*.*',
123+
'**/BuildConfig.*',
124+
'**/Manifest*.*',
125+
'**/*$Lambda$*.*', // Jacoco can not handle several "$" in class name.
126+
'**/*Dagger*.*', // Dagger auto-generated code.
127+
'**/*MembersInjector*.*', // Dagger auto-generated code.
128+
'**/*_Provide*Factory*.*' // Dagger auto-generated code.
129+
]
130+
}
73131

74-
executionData = project.files(project.subprojects.jacocoReport.executionData)
75-
classDirectories = project.files(project.subprojects.jacocoReport.classDirectories)
76-
sourceDirectories = project.files(project.subprojects.jacocoReport.sourceDirectories)
132+
protected static boolean isAndroidProject(final Project project) {
133+
final boolean isAndroidLibrary = project.plugins.hasPlugin('com.android.library')
134+
final boolean isAndroidApp = project.plugins.hasPlugin('com.android.application')
135+
return isAndroidLibrary || isAndroidApp
136+
}
77137

78-
reports {
79-
xml {
80-
enabled = true
81-
destination "${project.buildDir}/reports/jacoco/full/jacoco.xml"
82-
}
83-
html {
84-
enabled = true
85-
destination "${project.buildDir}/reports/jacoco/full"
86-
}
87-
}
138+
protected static boolean isJavaProject(final Project project) {
139+
return project.plugins.hasPlugin('org.gradle.java')
140+
}
88141

89-
doFirst {
90-
executionData = project.files(executionData.findAll { it.exists() })
91-
}
92-
}
142+
private static boolean shouldIgnore(final Project project, final JunitJacocoExtension extension) {
143+
return extension.ignoreProjects?.contains(project.name)
93144
}
94145
}

src/main/groovy/com/vanniktech/android/junit/jacoco/JunitJacocoExtension.groovy

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,10 @@ class JunitJacocoExtension {
1010
* @since 0.3.0
1111
*/
1212
String jacocoVersion = '0.7.2.201409121644'
13+
14+
/**
15+
* subprojects that should be ignored
16+
* @since 0.3.0
17+
*/
18+
String[] ignoreProjects = []
1319
}

0 commit comments

Comments
 (0)