Skip to content

Commit

Permalink
Remove reliance on groovy in realm-transformer (#6025)
Browse files Browse the repository at this point in the history
  • Loading branch information
kageiit authored and cmelchior committed Jun 23, 2018
1 parent 347a374 commit ced57ca
Show file tree
Hide file tree
Showing 11 changed files with 108 additions and 133 deletions.
2 changes: 1 addition & 1 deletion examples/kotlinExample/build.gradle
@@ -1,5 +1,5 @@
buildscript {
ext.kotlin_version = '1.2.10'
ext.kotlin_version = '1.2.40'
repositories {
jcenter()
mavenCentral()
Expand Down
36 changes: 33 additions & 3 deletions gradle-plugin/src/main/groovy/io/realm/gradle/Realm.groovy
Expand Up @@ -41,16 +41,15 @@ class Realm implements Plugin<Project> {
}

def syncEnabledDefault = false
def dependencyConfigurationName = getDependencyConfigurationName(project)
def usesAptPlugin = project.plugins.findPlugin('com.neenbedankt.android-apt') != null
def isKotlinProject = project.plugins.findPlugin('kotlin-android') != null
def useKotlinExtensionsDefault = isKotlinProject
def hasAnnotationProcessorConfiguration = project.getConfigurations().findByName('annotationProcessor') != null
// TODO add a parameter in 'realm' block if this should be specified by users
def preferAptOnKotlinProject = false


project.extensions.create('realm', RealmPluginExtension, project, syncEnabledDefault, useKotlinExtensionsDefault, dependencyConfigurationName)
def extension = project.extensions.create('realm', RealmPluginExtension)
extension.kotlinExtensionsEnabled = useKotlinExtensionsDefault

if (shouldApplyAndroidAptPlugin(usesAptPlugin, isKotlinProject,
hasAnnotationProcessorConfiguration, preferAptOnKotlinProject)) {
Expand All @@ -59,6 +58,7 @@ class Realm implements Plugin<Project> {
}

project.android.registerTransform(new RealmTransformer(project))
def dependencyConfigurationName = getDependencyConfigurationName(project)

project.repositories.add(project.getRepositories().jcenter())
project.dependencies.add(dependencyConfigurationName, "io.realm:realm-annotations:${Version.VERSION}")
Expand All @@ -73,6 +73,10 @@ class Realm implements Plugin<Project> {
project.dependencies.add("annotationProcessor", "io.realm:realm-annotations-processor:${Version.VERSION}")
project.dependencies.add("androidTestAnnotationProcessor", "io.realm:realm-annotations-processor:${Version.VERSION}")
}

project.afterEvaluate {
setDependencies(project, dependencyConfigurationName, extension.syncEnabled, extension.kotlinExtensionsEnabled)
}
}

private static boolean isTransformAvailable() {
Expand Down Expand Up @@ -114,4 +118,30 @@ class Realm implements Plugin<Project> {
// for any Java Projects where user did not apply 'android-apt' plugin manually.
return !hasAnnotationProcessorConfiguration
}

private static void setDependencies(Project project, String dependencyConfigurationName, boolean syncEnabled, boolean kotlinExtensionsEnabled) {
// remove libraries first

def iterator = project.getConfigurations().getByName(dependencyConfigurationName).getDependencies().iterator()
while (iterator.hasNext()) {
def item = iterator.next()
if (item.group == 'io.realm') {
if (item.name.startsWith('realm-android-library')) {
iterator.remove()
}
if (item.name.startsWith('realm-android-kotlin-extensions')) {
iterator.remove()
}
}
}

// then add again
def syncArtifactName = "realm-android-library${syncEnabled ? '-object-server' : ''}"
project.dependencies.add(dependencyConfigurationName, "io.realm:${syncArtifactName}:${Version.VERSION}")

if (kotlinExtensionsEnabled) {
def kotlinExtArtifactName = "realm-android-kotlin-extensions${syncEnabled ? '-object-server' : ''}"
project.dependencies.add(dependencyConfigurationName, "io.realm:${kotlinExtArtifactName}:${Version.VERSION}")
}
}
}

This file was deleted.

19 changes: 16 additions & 3 deletions gradle-plugin/src/test/groovy/io/realm/gradle/PluginTest.groovy
Expand Up @@ -51,21 +51,35 @@ class PluginTest {
project.buildscript {
repositories {
mavenLocal()
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0-alpha03'
classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.0'
classpath "io.realm:realm-gradle-plugin:${currentVersion}"
}
}

def manifest = project.file("src/main/AndroidManifest.xml")
manifest.parentFile.mkdirs()
manifest.text = '<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.realm.test"></manifest>'

project.apply plugin: 'com.android.application'
project.apply plugin: 'realm-android'

project.android {
compileSdkVersion 27

defaultConfig {
minSdkVersion 16
targetSdkVersion 27
}
}

project.evaluate()

assertTrue(containsDependency(project.dependencies, 'io.realm', 'realm-android-library', currentVersion))
assertTrue(containsDependency(project.dependencies, 'io.realm', 'realm-annotations', currentVersion))

assertTrue(containsTransform(project.android.transforms, RealmTransformer.class))
}

Expand All @@ -79,7 +93,6 @@ class PluginTest {
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0-alpha03'
classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.0'
classpath "io.realm:realm-gradle-plugin:${currentVersion}"
}
}

Expand Down
2 changes: 1 addition & 1 deletion realm-transformer/build.gradle
Expand Up @@ -60,13 +60,13 @@ sourceSets {
}

dependencies {
compile localGroovy()
compile gradleApi()
compile "io.realm:realm-annotations:${version}"
compileOnly 'com.android.tools.build:gradle:3.1.1'
compile 'org.javassist:javassist:3.21.0-GA'
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlin_version}"

testCompile localGroovy()
testCompile('org.spockframework:spock-core:1.0-groovy-2.4') {
exclude module: 'groovy-all'
}
Expand Down

This file was deleted.

@@ -0,0 +1,25 @@
/*
* Copyright 2018 Realm Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package io.realm.gradle;

import org.gradle.api.tasks.Input;

public class RealmPluginExtension {

@Input public boolean syncEnabled = false;
@Input public boolean kotlinExtensionsEnabled = false;
}
27 changes: 26 additions & 1 deletion realm-transformer/src/main/java/io/realm/transformer/Utils.java
Expand Up @@ -16,10 +16,15 @@

package io.realm.transformer;

import javax.xml.bind.DatatypeConverter;
import com.android.build.gradle.BaseExtension;
import io.realm.gradle.RealmPluginExtension;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import javax.xml.bind.DatatypeConverter;
import org.gradle.api.Project;

public class Utils {

Expand Down Expand Up @@ -57,4 +62,24 @@ public static String hexStringify(byte[] data) {

return stringBuilder.toString();
}

public static String getTargetSdk(Project project) {
return getAndroidExtension(project).getDefaultConfig().getTargetSdkVersion().getApiString();
}

public static String getMinSdk(Project project) {
return getAndroidExtension(project).getDefaultConfig().getMinSdkVersion().getApiString();
}

public static boolean isSyncEnabled(Project project) {
return ((RealmPluginExtension) project.getExtensions().getByName("realm")).syncEnabled;
}

public static List<File> getBootClasspath(Project project) {
return getAndroidExtension(project).getBootClasspath();
}

private static BaseExtension getAndroidExtension(Project project) {
return (BaseExtension) project.getExtensions().getByName("android");
}
}
Expand Up @@ -151,11 +151,11 @@ class RealmTransformer(val project: Project) : Transform() {
it.packageName
}

val targetSdk: String? = GroovyUtil.getTargetSdk(project)
val minSdk: String? = GroovyUtil.getMinSdk(project)
val targetSdk: String? = Utils.getTargetSdk(project)
val minSdk: String? = Utils.getMinSdk(project)

if (disableAnalytics) {
val sync: Boolean = GroovyUtil.isSyncEnabled(project)
val sync: Boolean = Utils.isSyncEnabled(project)
val analytics = RealmAnalytics(packages as Set, containsKotlin, sync, targetSdk, minSdk)
analytics.execute()
}
Expand Down
Expand Up @@ -22,9 +22,9 @@ import com.android.build.api.transform.TransformInput
import com.android.build.api.transform.TransformOutputProvider
import com.google.common.io.Files
import io.realm.transformer.BytecodeModifier
import io.realm.transformer.GroovyUtil
import io.realm.transformer.ManagedClassPool
import io.realm.transformer.logger
import io.realm.transformer.Utils
import javassist.ClassPool
import javassist.CtClass
import org.gradle.api.Project
Expand Down Expand Up @@ -147,7 +147,7 @@ abstract class BuildTemplate(val project: Project, val outputProvider: Transform
*/
private fun addBootClassesToClassPool(classPool: ClassPool) {
try {
GroovyUtil.getBootClasspath(project).forEach {
Utils.getBootClasspath(project).forEach {
val path: String = it.absolutePath
logger.debug("Add boot class $path to class pool.")
classPool.appendClassPath(path)
Expand Down
2 changes: 1 addition & 1 deletion realm/build.gradle
Expand Up @@ -3,7 +3,7 @@ project.ext.compileSdkVersion = 26
project.ext.buildToolsVersion = '27.0.2'

buildscript {
ext.kotlin_version = '1.2.10'
ext.kotlin_version = '1.2.40'
ext.dokka_version = '0.9.16'
repositories {
mavenLocal()
Expand Down

0 comments on commit ced57ca

Please sign in to comment.