Skip to content

Commit 1f8aac1

Browse files
authored
Merge pull request #57 from Archinamon/bintray
Bintray to rule them all!
2 parents 779e34a + 9aa6ed2 commit 1f8aac1

32 files changed

+185
-31
lines changed

README.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
# GradleAspectJ-Android
22
[![Kotlin](https://img.shields.io/badge/Kotlin-1.1.1-blue.svg)](http://kotlinlang.org) [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-AspectJ%20Gradle-brightgreen.svg?style=flat)](http://android-arsenal.com/details/1/4578) ![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg) [![](https://jitpack.io/v/Archinamon/GradleAspectJ-Android.svg)](https://jitpack.io/#Archinamon/GradleAspectJ-Android) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0)
3+
[ ![Download](https://api.bintray.com/packages/archinamon/maven/android-gradle-aspectj/images/download.svg) ](https://bintray.com/archinamon/maven/android-gradle-aspectj/_latestVersion)
34

45
A Gradle plugin which enables AspectJ for Android builds.
56
Supports writing code with AspectJ-lang in `.aj` files and in java-annotation style.
67
Full support of Android product flavors and build types.
78
Support Kotlin, Groovy, Scala and any other languages that compiles into java bytecode.
89

9-
Actual version: `com.archinamon:android-gradle-aspectj:3.0.2`.
10+
Actual version: `com.archinamon:android-gradle-aspectj:3.0.3`.
1011
<br />
1112
Friendly with <a href="https://zeroturnaround.com/software/jrebel-for-android/" target="_blank">jRebel for Android</a>!
1213

@@ -48,7 +49,7 @@ Don't forget to add `mavenCentral()` due to some dependencies inside AspectJ-gra
4849

4950
Add the plugin to your `buildscript`'s `dependencies` section:
5051
```groovy
51-
classpath 'com.github.Archinamon:GradleAspectJ-Android:3.0.2'
52+
classpath 'com.github.Archinamon:GradleAspectJ-Android:3.0.3'
5253
```
5354

5455
Apply the `aspectj` plugin:
@@ -149,7 +150,13 @@ Currently it has some limitations:
149150

150151
Working tests
151152
-------
152-
Just write a test and run them! If any errors occurrs please write an issue :)
153+
```groovy
154+
apply plugin: 'com.archinamon.aspectj-test'
155+
```
156+
157+
Test scope configuration inherits `aspectj-ext` behavior with strictly excluding compile and transform tasks from non-test build variant.
158+
In other words only instrumentation `androidTest` will work with this sub-plugin.
159+
In case unit tests doesn't really have any specials (excluding source/target code version base) so `aspectj-test` scope won't affect `unitTest` variants.
153160

154161
ProGuard
155162
-------

AspectJ-gradle/build.gradle renamed to android-gradle-aspectj/build.gradle

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ buildscript {
66
mavenCentral()
77
}
88
dependencies {
9+
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
910
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
1011
}
1112
}
1213

1314
apply plugin: 'kotlin'
1415
apply plugin: 'maven'
16+
apply plugin: 'com.jfrog.bintray'
1517

1618
project.ext {
1719
aspectjVersion = '1.8.10'
@@ -22,6 +24,7 @@ dependencies {
2224
jcenter()
2325
mavenCentral()
2426
maven { url 'http://repository.jetbrains.com/utils' }
27+
maven { url "https://dl.bintray.com/archinamon/maven" }
2528
}
2629

2730
compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
@@ -36,13 +39,34 @@ dependencies {
3639
}
3740

3841
group = 'com.archinamon'
39-
version = '3.0.2'
42+
version = '3.0.3'
4043

41-
// local archive :: debug mode
42-
uploadArchives {
43-
repositories {
44-
mavenDeployer {
45-
repository(url: uri('../'))
44+
task sourcesJar(type: Jar, dependsOn: classes) {
45+
classifier = 'sources'
46+
from sourceSets.main.allSource
47+
}
48+
49+
artifacts {
50+
archives sourcesJar
51+
}
52+
53+
if (project.hasProperty('bintray_user') && project.hasProperty('bintray_apiKey')) {
54+
bintray {
55+
user = bintray_user
56+
key = bintray_apiKey
57+
58+
configurations = ['archives']
59+
pkg {
60+
repo = "maven"
61+
name = "android-gradle-aspectj"
62+
// websiteUrl = siteUrl
63+
vcsUrl = "https://github.com/Archinamon/GradleAspectJ-Android"
64+
licenses = ["Apache-2.0"]
65+
publish = true
66+
version {
67+
name = project.version
68+
released = new Date()
69+
}
4670
}
4771
}
4872
}

AspectJ-gradle/src/main/kotlin/com/archinamon/AndroidConfig.kt renamed to android-gradle-aspectj/src/main/kotlin/com/archinamon/AndroidConfig.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.archinamon
22

33
import com.android.build.gradle.*
4+
import com.archinamon.plugin.ConfigScope
45
import org.gradle.api.GradleException
56
import org.gradle.api.Project
67
import java.io.File
@@ -12,9 +13,9 @@ const val MISDEFINITION = "Illegal definition: $ASPECTJ_PLUGIN should be defined
1213
const private val TAG = "AJC:"
1314
const private val PLUGIN_EXCEPTION = "$TAG You must apply the Android plugin or the Android library plugin"
1415

15-
internal class AndroidConfig(val project: Project) {
16+
internal class AndroidConfig(val project: Project, val scope: ConfigScope) {
1617

17-
val extAndroid: TestedExtension
18+
val extAndroid: BaseExtension
1819
val isLibraryPlugin: Boolean
1920
val plugin: BasePlugin
2021

@@ -27,6 +28,10 @@ internal class AndroidConfig(val project: Project) {
2728
extAndroid = project.extensions.getByType(LibraryExtension::class.java)
2829
plugin = project.plugins.getPlugin(LibraryPlugin::class.java)
2930
isLibraryPlugin = true
31+
} else if (project.plugins.hasPlugin(TestPlugin::class.java)) {
32+
extAndroid = project.extensions.getByType(TestExtension::class.java)
33+
plugin = project.plugins.getPlugin(TestPlugin::class.java)
34+
isLibraryPlugin = false
3035
} else {
3136
isLibraryPlugin = false
3237
throw GradleException(PLUGIN_EXCEPTION)

AspectJ-gradle/src/main/kotlin/com/archinamon/api/AspectJCompileTask.kt renamed to android-gradle-aspectj/src/main/kotlin/com/archinamon/api/AspectJCompileTask.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,7 @@ internal open class AspectJCompileTask: AbstractCompile() {
4949
return this
5050
}
5151

52-
fun buildAndAttach() {
53-
val android = AndroidConfig(project)
54-
52+
fun buildAndAttach(android: AndroidConfig) {
5553
val options = mutableMapOf(
5654
Pair("overwrite", true),
5755
Pair("group", "build"),

AspectJ-gradle/src/main/kotlin/com/archinamon/api/AspectJTransform.kt renamed to android-gradle-aspectj/src/main/kotlin/com/archinamon/api/AspectJTransform.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.android.build.gradle.internal.variant.BaseVariantData
88
import com.android.build.gradle.internal.variant.BaseVariantOutputData
99
import com.android.utils.FileUtils
1010
import com.archinamon.AndroidConfig
11+
import com.archinamon.plugin.ConfigScope
1112
import com.archinamon.utils.*
1213
import com.archinamon.utils.DependencyFilter.isIncludeFilterMatched
1314
import com.google.common.collect.Sets
@@ -22,13 +23,15 @@ private const val AJRUNTIME = "aspectjrt"
2223
private const val SLICER_DETECTED_ERROR = "Running with InstantRun slicer when weaver extended not allowed!"
2324

2425
enum class BuildPolicy {
26+
2527
SIMPLE,
2628
COMPLEX,
2729
LIBRARY
2830
}
2931

3032
internal class StdTransformer(project: Project): AspectJTransform(project, BuildPolicy.SIMPLE)
3133
internal class ExtTransformer(project: Project): AspectJTransform(project, BuildPolicy.COMPLEX)
34+
internal class TstTransformer(project: Project): AspectJTransform(project, BuildPolicy.COMPLEX)
3235
internal class LibTransformer(project: Project): AspectJTransform(project, BuildPolicy.LIBRARY) {
3336

3437
override fun getScopes(): MutableSet<QualifiedContent.Scope> {
@@ -119,6 +122,12 @@ internal sealed class AspectJTransform(val project: Project, private val policy:
119122
}
120123

121124
override fun transform(transformInvocation: TransformInvocation) {
125+
// bypassing transformer for non-test variant data in ConfigScope.TEST
126+
if (!verifyBypassInTestScope(transformInvocation.context)) {
127+
logBypassTransformation()
128+
return
129+
}
130+
122131
val outputProvider = transformInvocation.outputProvider
123132
val includeJars = config.aspectj().includeJar
124133
val includeAspects = config.aspectj().includeAspectsFromJar
@@ -198,6 +207,15 @@ internal sealed class AspectJTransform(val project: Project, private val policy:
198207

199208
/* Internal */
200209

210+
private fun verifyBypassInTestScope(ctx: Context): Boolean {
211+
val variant = (ctx as TransformTask).variantName
212+
213+
return when (config.scope) {
214+
ConfigScope.TEST -> variant.contains("androidtest", true)
215+
else -> true
216+
}
217+
}
218+
201219
private fun includeCompiledAspects(transformInvocation: TransformInvocation, outputDir: File) {
202220
val compiledAj = project.file("${project.buildDir}/aspectj/${(transformInvocation.context as TransformTask).variantName}")
203221
if (compiledAj.exists()) {

AspectJ-gradle/src/main/kotlin/com/archinamon/plugin/AspectJWrapper.kt renamed to android-gradle-aspectj/src/main/kotlin/com/archinamon/plugin/AspectJWrapper.kt

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,33 @@ import com.android.build.gradle.LibraryExtension
55
import com.android.build.gradle.TestedExtension
66
import com.archinamon.AndroidConfig
77
import com.archinamon.AspectJExtension
8-
import com.archinamon.api.AspectJTransform
9-
import com.archinamon.api.ExtTransformer
10-
import com.archinamon.api.LibTransformer
11-
import com.archinamon.api.StdTransformer
8+
import com.archinamon.api.*
129
import org.gradle.api.Plugin
1310
import org.gradle.api.Project
1411
import javax.inject.Inject
1512

16-
internal sealed class AspectJWrapper: Plugin<Project> {
13+
internal sealed class AspectJWrapper(private val scope: ConfigScope): Plugin<Project> {
1714

18-
internal class Std @Inject constructor(): AspectJWrapper() {
15+
internal companion object {
16+
const val CONFIG_STD = "std"
17+
const val CONFIG_EXT = "ext"
18+
const val CONFIG_TEST = "tst"
19+
}
20+
21+
internal class Std @Inject constructor(): AspectJWrapper(ConfigScope.STD) {
1922
override fun getTransformer(project: Project): AspectJTransform = StdTransformer(project)
2023
}
2124

22-
internal class Ext @Inject constructor(): AspectJWrapper() {
25+
internal class Ext @Inject constructor(): AspectJWrapper(ConfigScope.EXT) {
2326
override fun getTransformer(project: Project): AspectJTransform = ExtTransformer(project)
2427
}
2528

29+
internal class Test @Inject constructor(): AspectJWrapper(ConfigScope.TEST) {
30+
override fun getTransformer(project: Project): AspectJTransform = TstTransformer(project)
31+
}
32+
2633
override fun apply(project: Project) {
27-
val config = AndroidConfig(project)
34+
val config = AndroidConfig(project, scope)
2835
val settings = project.extensions.create("aspectj", AspectJExtension::class.java)
2936

3037
configProject(project, config, settings)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.archinamon.plugin
2+
3+
/**
4+
* TODO: Add description
5+
*
6+
* @author archinamon on 12/04/17.
7+
*/
8+
9+
internal enum class ConfigScope(internal val _name: String) {
10+
11+
STD(AspectJWrapper.CONFIG_STD),
12+
EXT(AspectJWrapper.CONFIG_EXT),
13+
TEST(AspectJWrapper.CONFIG_TEST);
14+
}

AspectJ-gradle/src/main/kotlin/com/archinamon/plugin/PluginSetup.kt renamed to android-gradle-aspectj/src/main/kotlin/com/archinamon/plugin/PluginSetup.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,21 @@ private fun prepareVariant(config: AndroidConfig) {
4949
}
5050

5151
private fun configureCompiler(project: Project, config: AndroidConfig) {
52-
getVariantDataList(config.plugin).forEach { variant ->
52+
getVariantDataList(config.plugin).forEach variantScanner@ { variant ->
5353
val variantName = variant.name.capitalize()
54-
val taskName = "compile${variantName}AspectJ"
5554

55+
// do not configure compiler task for non-test variants in ConfigScope.TEST
56+
if (config.scope == ConfigScope.TEST && !variantName.contains("androidtest", true))
57+
return@variantScanner
58+
59+
val taskName = "compile${variantName}AspectJ"
5660
AspectJCompileTask.Builder(project)
5761
.plugin(project.plugins.getPlugin(config))
5862
.config(project.extensions.getByType(AspectJExtension::class.java))
5963
.compiler(getJavaTask(variant)!!)
6064
.variant(variant.name)
6165
.name(taskName)
62-
.buildAndAttach()
66+
.buildAndAttach(config)
6367
}
6468
}
6569

AspectJ-gradle/src/main/kotlin/com/archinamon/utils/StatusLogger.kt renamed to android-gradle-aspectj/src/main/kotlin/com/archinamon/utils/StatusLogger.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import com.android.build.api.transform.JarInput
44
import com.archinamon.api.BuildPolicy
55
import java.io.File
66

7+
internal fun logBypassTransformation() {
8+
println("---------- AspectJ tasks bypassed with no outputs ----------")
9+
}
10+
711
internal fun logCompilationStart() {
812
println("---------- Starting AspectJ sources compilation ----------")
913
}

AspectJ-gradle/src/main/kotlin/com/archinamon/utils/VariantUtils.kt renamed to android-gradle-aspectj/src/main/kotlin/com/archinamon/utils/VariantUtils.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ fun findAjSourcesForVariant(project: Project, variantName: String): MutableSet<F
4040
if (project.file("src/main/aspectj").exists()) {
4141
possibleDirs.add(project.file("src/main/aspectj"))
4242
}
43-
val types = variantName.split("(?=\\p{Upper})")
43+
44+
val types = variantName.split("(?=\\p{Upper})".toRegex())
4445
val root = project.file("src").listFiles()
4546

4647
root.forEach { file ->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
implementation-class=com.archinamon.plugin.AspectJWrapper$Test

AspectJ-gradle/src/test/kotlin/com/archinamon/AndroidPluginTest.kt renamed to android-gradle-aspectj/src/test/kotlin/com/archinamon/AndroidPluginTest.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ class AndroidPluginTest {
2525
project.apply(mapOf(Pair("plugin", "com.archinamon.aspectj-ext")))
2626
}
2727

28+
@Test
29+
fun detectTestPlugin() {
30+
val project = ProjectBuilder.builder().build()
31+
project.apply(mapOf(Pair("plugin", "com.android.application")))
32+
project.apply(mapOf(Pair("plugin", "com.archinamon.aspectj-test")))
33+
}
34+
2835
@Test
2936
fun detectLibPlugin() {
3037
val project = ProjectBuilder.builder().build()
@@ -39,6 +46,13 @@ class AndroidPluginTest {
3946
project.apply(mapOf(Pair("plugin", "com.archinamon.aspectj-ext")))
4047
}
4148

49+
@Test
50+
fun detectLibTestPlugin() {
51+
val project = ProjectBuilder.builder().build()
52+
project.apply(mapOf(Pair("plugin", "com.android.library")))
53+
project.apply(mapOf(Pair("plugin", "com.archinamon.aspectj-test")))
54+
}
55+
4256
@Test(expected = GradleException::class)
4357
fun failsWithoutAndroidPlugin() {
4458
val project = ProjectBuilder.builder().build()
@@ -50,4 +64,10 @@ class AndroidPluginTest {
5064
val project = ProjectBuilder.builder().build()
5165
project.apply(mapOf(Pair("plugin", "com.archinamon.aspectj-ext")))
5266
}
67+
68+
@Test(expected = GradleException::class)
69+
fun failsTestWithoutAndroidPlugin() {
70+
val project = ProjectBuilder.builder().build()
71+
project.apply(mapOf(Pair("plugin", "com.archinamon.aspectj-test")))
72+
}
5373
}
Binary file not shown.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
d353182b8aa93c8318f2ae5ed5f86d4b
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
5f7dae87f4714edadb64bc62f3d35efd24d9943d
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4+
<modelVersion>4.0.0</modelVersion>
5+
<groupId>com.archinamon</groupId>
6+
<artifactId>android-gradle-aspectj</artifactId>
7+
<version>3.0.3</version>
8+
<dependencies>
9+
<dependency>
10+
<groupId>org.jetbrains.kotlin</groupId>
11+
<artifactId>kotlin-stdlib-jre8</artifactId>
12+
<version>1.1.1</version>
13+
<scope>compile</scope>
14+
</dependency>
15+
<dependency>
16+
<groupId>org.aspectj</groupId>
17+
<artifactId>aspectjrt</artifactId>
18+
<version>1.8.10</version>
19+
<scope>compile</scope>
20+
</dependency>
21+
<dependency>
22+
<groupId>org.aspectj</groupId>
23+
<artifactId>aspectjtools</artifactId>
24+
<version>1.8.10</version>
25+
<scope>compile</scope>
26+
</dependency>
27+
<dependency>
28+
<groupId>junit</groupId>
29+
<artifactId>junit</artifactId>
30+
<version>4.10</version>
31+
<scope>test</scope>
32+
</dependency>
33+
<dependency>
34+
<groupId>org.jetbrains.kotlin</groupId>
35+
<artifactId>kotlin-stdlib</artifactId>
36+
<version>1.1.1</version>
37+
<scope>test</scope>
38+
</dependency>
39+
<dependency>
40+
<groupId>org.jetbrains.kotlin</groupId>
41+
<artifactId>kotlin-test-junit</artifactId>
42+
<version>1.1.1</version>
43+
<scope>test</scope>
44+
</dependency>
45+
</dependencies>
46+
</project>

0 commit comments

Comments
 (0)