Skip to content

Commit a1f9eb5

Browse files
authored
[Filtering] Add support for filtering classes like Maven plugin (#54)
This adds package filters similar to how the Maven plugin filters in its `<classes>` block. This supports ant-like patterns similar to how patterns filter. Follows #53 which added similar support for `packages` filtering Closes #16.
1 parent b8acd28 commit a1f9eb5

File tree

6 files changed

+537
-2
lines changed

6 files changed

+537
-2
lines changed

README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,30 @@ sourceSets {
224224
See [`PackageFilter` tests](src/test/groovy/org/assertj/generator/gradle/parameter/PackageFilter.groovy) for more
225225
examples.
226226

227+
#### classes - `JavaClassPatternFilterable`
228+
229+
Default: All classes
230+
231+
Class filters can be used to include, or exclude individual patterns of fully-qualified class names to be generated.
232+
These filters use a
233+
similar pattern to `include`/`exclude` with `SourceSet`.
234+
235+
```groovy
236+
sourceSets {
237+
main {
238+
assertJ {
239+
classes {
240+
include "org.example.**" // include *all* classes under `org.example` including sub-packages
241+
exclude "org.example.Foo" // exclude class `org.example.Foo` specifically
242+
}
243+
}
244+
}
245+
}
246+
```
247+
248+
See [`ClassesFilter` tests](src/test/groovy/org/assertj/generator/gradle/parameter/ClassesFilter.groovy) for more
249+
examples.
250+
227251
#### entryPoints - `EntryPointsGeneratorOptions`
228252

229253
Default: Only generate "standard" assertion entrypoint

src/main/kotlin/org/assertj/generator/gradle/tasks/AssertJGenerationTask.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import org.assertj.assertions.generator.description.converter.ClassToClassDescri
2020
import org.assertj.assertions.generator.util.ClassUtil
2121
import org.assertj.generator.gradle.tasks.config.AssertJGeneratorExtension
2222
import org.assertj.generator.gradle.tasks.config.SerializedTemplate
23+
import org.assertj.generator.gradle.tasks.config.patterns.JavaClassPatternFilterable
2324
import org.assertj.generator.gradle.tasks.config.patterns.JavaPackageNamePatternFilterable
2425
import org.gradle.api.DefaultTask
2526
import org.gradle.api.file.ConfigurableFileCollection
@@ -83,6 +84,9 @@ open class AssertJGenerationTask @Inject internal constructor(
8384
@get:Input
8485
internal val hierarchical: Property<Boolean> = objects.property()
8586

87+
@get:Input
88+
internal val classesFilterable: Property<JavaClassPatternFilterable> = objects.property()
89+
8690
@get:Input
8791
internal val packagesFilterable: Property<JavaPackageNamePatternFilterable> = objects.property()
8892

@@ -114,6 +118,7 @@ open class AssertJGenerationTask @Inject internal constructor(
114118

115119
skip.set(project.provider { assertJOptions.skip })
116120
hierarchical.set(project.provider { assertJOptions.hierarchical })
121+
classesFilterable.set(project.provider { assertJOptions.classes })
117122
packagesFilterable.set(project.provider { assertJOptions.packages })
118123
entryPoints.set(project.provider { assertJOptions.entryPoints.entryPoints })
119124
entryPointsClassPackage.set(project.provider { assertJOptions.entryPoints.classPackage })
@@ -130,6 +135,7 @@ open class AssertJGenerationTask @Inject internal constructor(
130135

131136
val classLoader = URLClassLoader((generationClasspath + classDirectories).map { it.toURI().toURL() }.toTypedArray())
132137

138+
val classesPredicate = classesFilterable.get().asPredicate()
133139
val packagesPredicate = packagesFilterable.get().asPredicate()
134140
val allClassNames = getClassNames(classDirectories)
135141
.filter { packagesPredicate.test(it.substringBeforeLast('.')) }
@@ -138,7 +144,9 @@ open class AssertJGenerationTask @Inject internal constructor(
138144
val allClasses = ClassUtil.collectClasses(
139145
classLoader,
140146
*allClassNames.toTypedArray(),
141-
)
147+
).asSequence()
148+
.filter { classesPredicate.test(it) }
149+
.toSet()
142150

143151
val changedFiles = if (inputs.isIncremental) {
144152
inputs.getFileChanges(classDirectories).asSequence().map { it.file }.filter { it.isFile }.toSet()

src/main/kotlin/org/assertj/generator/gradle/tasks/config/AssertJGeneratorExtension.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
package org.assertj.generator.gradle.tasks.config
1414

1515
import org.assertj.assertions.generator.AssertionsEntryPointType
16+
import org.assertj.generator.gradle.tasks.config.patterns.JavaClassPatternFilterable
1617
import org.assertj.generator.gradle.tasks.config.patterns.JavaPackageNamePatternFilterable
1718
import org.gradle.api.Action
1819
import org.gradle.api.Project
@@ -35,6 +36,12 @@ open class AssertJGeneratorExtension @Inject internal constructor(
3536
val classDirectories: SourceDirectorySet =
3637
objects.sourceDirectorySet("assertJClasses", "Classes to generate AssertJ assertions from")
3738

39+
val classes: JavaClassPatternFilterable = objects.newInstance()
40+
41+
fun classes(action: Action<in JavaClassPatternFilterable>): AssertJGeneratorExtension = apply {
42+
action.execute(classes)
43+
}
44+
3845
val packages: JavaPackageNamePatternFilterable = objects.newInstance()
3946

4047
fun packages(action: Action<in JavaPackageNamePatternFilterable>): AssertJGeneratorExtension = apply {
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
* Copyright 2023. assertj-generator-gradle-plugin contributors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
5+
* the License. You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
10+
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
11+
* specific language governing permissions and limitations under the License.
12+
*/
13+
package org.assertj.generator.gradle.tasks.config.patterns
14+
15+
import com.google.common.reflect.TypeToken
16+
import org.assertj.generator.gradle.tasks.config.patterns.JavaNamePatternCompiler.compilePattern
17+
import java.io.IOException
18+
import java.io.ObjectInputStream
19+
import java.io.ObjectOutputStream
20+
import java.io.Serializable
21+
22+
/**
23+
* Implements a similar construction to [org.gradle.api.tasks.util.PatternFilterable] that will match
24+
* [TypeToken] instances.
25+
*/
26+
open class JavaClassPatternFilterable internal constructor() :
27+
JavaIdentifierNamePatternFilterableBase<TypeToken<*>, JavaClassPatternFilterable>(), Serializable {
28+
29+
override fun compilePatterns(patterns: Iterable<String>): Sequence<PatternPredicate<TypeToken<*>>> {
30+
return patterns.asSequence().map { TypeNamePredicate.compile(it) }
31+
}
32+
33+
@Throws(IOException::class)
34+
protected fun writeObject(o: ObjectOutputStream) {
35+
super.writeObjectImpl(o)
36+
}
37+
38+
@Throws(IOException::class, ClassNotFoundException::class)
39+
protected fun readObject(i: ObjectInputStream) {
40+
super.readObjectImpl(i)
41+
}
42+
43+
internal data class TypeNamePredicate(
44+
override val pattern: String,
45+
private val namePattern: Regex,
46+
) : PatternPredicate<TypeToken<*>> {
47+
override fun test(t: TypeToken<*>): Boolean {
48+
return namePattern.matches(t.type.typeName)
49+
}
50+
51+
companion object {
52+
fun compile(pattern: String): TypeNamePredicate = TypeNamePredicate(pattern, compilePattern(pattern))
53+
}
54+
}
55+
56+
companion object {
57+
private const val serialVersionUID = 9418631994L
58+
}
59+
}

0 commit comments

Comments
 (0)