From ca8a17fdae48ac53a4f961a4d4fb9285bfa7569c Mon Sep 17 00:00:00 2001 From: Gautam Korlam Date: Thu, 16 Jul 2020 17:05:52 -0700 Subject: [PATCH] Various updates (#879) * Various updates * Remove comments * Fix build * Fix build * Fix dex --- .buckconfig | 3 + .../okbuck/android/lint/AndroidLintCli.java | 2 +- buildSrc/build.gradle | 65 ++++++++++----- .../com/uber/okbuck/OkBuckGradlePlugin.java | 10 +-- .../composer/base/BuckRuleComposer.java | 4 +- .../annotation/AnnotationProcessorCache.java | 2 +- .../core/dependency/DependencyCache.java | 4 +- .../core/dependency/DependencyUtils.java | 16 +--- .../core/dependency/OExternalDependency.java | 4 +- .../core/dependency/OResolvedDependency.java | 2 +- .../dependency/OUnresolvedDependency.java | 3 +- .../dependency/VersionlessDependency.java | 2 +- .../core/manager/DependencyManager.java | 15 ++-- .../okbuck/core/manager/JetifierManager.java | 3 - .../core/manager/ManifestMergerManager.java | 1 - .../core/manager/RobolectricManager.java | 6 +- .../core/model/android/AndroidAppTarget.java | 3 - .../android/AndroidInstrumentationTarget.java | 2 +- .../core/model/android/AndroidTarget.java | 4 +- .../core/model/android/ExoPackageScope.java | 1 + .../uber/okbuck/core/model/base/RuleType.java | 3 +- .../uber/okbuck/core/model/base/Scope.java | 4 +- .../uber/okbuck/core/model/base/Target.java | 2 +- .../uber/okbuck/core/model/jvm/JvmTarget.java | 6 +- .../com/uber/okbuck/core/task/OkBuckTask.java | 8 +- .../com/uber/okbuck/core/util/FileUtil.java | 5 +- .../uber/okbuck/core/util/ProjectCache.java | 4 +- .../com/uber/okbuck/core/util/XmlUtil.java | 6 +- .../okbuck/extension/OkBuckExtension.java | 6 -- .../extension/RuleOverridesExtension.java | 6 +- .../uber/okbuck/extension/ScalaExtension.java | 2 +- .../com/uber/okbuck/template/core/Rule.java | 2 +- .../okbuck/template/core/RuleTemplate.java | 2 +- dependencies.gradle | 75 +++++++++--------- gradle/wrapper/gradle-wrapper.jar | Bin 55616 -> 58910 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 31 ++++---- gradlew.bat | 4 + kotlin-app/build.gradle | 1 + .../uber/okbuck/example/MainActivityTest.kt | 9 ++- libraries/javahadooplibrary/build.gradle | 9 --- .../uber/okbuck/java/example/DummyJava.java | 14 ---- libraries/kotlinandroidlibrary/build.gradle | 1 + .../uber/okbuck/java/KotlinLibActivityTest.kt | 11 ++- libraries/scalalibrary/build.gradle | 2 +- .../okbuck/scala/example/DummyScalaTest.scala | 6 +- .../okbuck/manifmerger/ManifestMergerCli.java | 2 +- settings.gradle | 1 - tooling/buck-defs/cleanup.bzl | 2 + .../uber/okbuck/transform/CliTransform.java | 6 +- .../okbuck/transform/SystemClassLoader.java | 4 +- 51 files changed, 189 insertions(+), 199 deletions(-) delete mode 100644 libraries/javahadooplibrary/build.gradle delete mode 100644 libraries/javahadooplibrary/src/main/java/com/uber/okbuck/java/example/DummyJava.java diff --git a/.buckconfig b/.buckconfig index 2a0346110..a9cc26b8b 100644 --- a/.buckconfig +++ b/.buckconfig @@ -48,4 +48,7 @@ polyglot_parsing_enabled = true default_build_file_syntax = SKYLARK +[scala] + target_level = jvm-1.8 + diff --git a/android-lint-cli/src/main/java/com/uber/okbuck/android/lint/AndroidLintCli.java b/android-lint-cli/src/main/java/com/uber/okbuck/android/lint/AndroidLintCli.java index 24cdc540d..60ff4b690 100644 --- a/android-lint-cli/src/main/java/com/uber/okbuck/android/lint/AndroidLintCli.java +++ b/android-lint-cli/src/main/java/com/uber/okbuck/android/lint/AndroidLintCli.java @@ -25,7 +25,7 @@ private static String getLibraryArguments(String filename) throws IOException { File file = new File(filename); if (!file.isAbsolute()) { - throw new RuntimeException(String.format("%s should be absolute", file)); + throw new IllegalStateException(String.format("%s should be absolute", file)); } String librariesString = read(file.toPath()).trim(); diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 1d0103b6b..03845626a 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -41,6 +41,8 @@ dependencies { annotationProcessor deps.build.nullaway errorprone deps.build.erroproneCompiler + errorproneJavac deps.build.errorproneJavac + compileOnly deps.external.inferAnnotations compileOnly deps.apt.autoValueAnnotations @@ -49,13 +51,15 @@ dependencies { implementation deps.build.androidPlugin implementation deps.build.commonsIo implementation deps.build.commonsLang3 - implementation deps.build.kotlinPlugin - implementation deps.build.kotlinAllOpen - implementation deps.build.rockerRuntime implementation deps.build.jna implementation deps.build.jnaPlatform + implementation deps.build.kotlinAllOpen + implementation deps.build.kotlinPlugin implementation deps.build.mavenArtifact + implementation deps.build.rockerRuntime + implementation deps.external.gson implementation deps.external.guava + implementation deps.lint.lintGradle testImplementation deps.test.junit } @@ -65,29 +69,37 @@ rocker { optimize true extendsClass "com.uber.okbuck.template.core.RuleTemplate" extendsModelClass "com.uber.okbuck.template.core.Rule" + markAsGenerated true } tasks.withType(JavaCompile) { + options.errorprone { + allDisabledChecksAsWarnings = true + disableWarningsInGeneratedCode = true + + option("NullAway:AnnotatedPackages", "com.uber") + option("NullAway:TreatGeneratedAsUnannotated", "true") + + error("NullAway") + + disable("MissingSummary") + disable("BooleanParameter") + disable("FieldCanBeFinal") + disable("RemoveUnusedImports") + disable("AndroidJdkLibsChecker") + disable("Java7ApiChecker") + + warn("ConstantField") + warn("MixedArrayDimensions") + warn("MultipleTopLevelClasses") + warn("MultiVariableDeclaration") + warn("PackageLocation") + warn("ThrowsUncheckedException") + warn("UnnecessaryStaticImport") + warn("WildcardImport") + } options.compilerArgs += [ - "-Werror", - "-XepAllDisabledChecksAsWarnings", - "-XepDisableWarningsInGeneratedCode", - "-Xep:NullAway:ERROR", - "-XepOpt:NullAway:AnnotatedPackages=com.uber", - "-XepOpt:NullAway:TreatGeneratedAsUnannotated=true", - "-Xep:BooleanParameter:OFF", - "-Xep:ReturnMissingNullable:OFF", - "-Xep:ConstructorInvokesOverridable:OFF", - "-Xep:FieldCanBeFinal:OFF", - "-Xep:ConstantField:WARN", - "-Xep:MixedArrayDimensions:WARN", - "-Xep:MultipleTopLevelClasses:WARN", - "-Xep:MultiVariableDeclaration:WARN", - "-Xep:PackageLocation:WARN", - "-Xep:RemoveUnusedImports:OFF", - "-Xep:ThrowsUncheckedException:WARN", - "-Xep:UnnecessaryStaticImport:WARN", - "-Xep:WildcardImport:WARN", + "-Werror" ] } @@ -145,3 +157,12 @@ bintray { } } } + +tasks.withType(com.fizzed.rocker.gradle.RockerTask).each { task -> + task.doLast { + def tree = fileTree(dir: task.outputDir, include: '**/*.java') + tree.each { file -> + file.text = file.text.replace("@com.fizzed.rocker.Generated", '@javax.annotation.Generated("Rocker")') + } + } +} diff --git a/buildSrc/src/main/java/com/uber/okbuck/OkBuckGradlePlugin.java b/buildSrc/src/main/java/com/uber/okbuck/OkBuckGradlePlugin.java index 619f82662..3cdcf9f14 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/OkBuckGradlePlugin.java +++ b/buildSrc/src/main/java/com/uber/okbuck/OkBuckGradlePlugin.java @@ -230,14 +230,6 @@ public void apply(Project rootProject) { wrapper.sourceRoots, wrapper.ignoredDirs); - // Add elements from extraDepCaches to extraDepCachesMap for backwards compatibility - okbuckExt.extraDepCaches.forEach( - depCache -> { - if (!okbuckExt.extraDepCachesMap.containsKey(depCache)) { - okbuckExt.extraDepCachesMap.put(depCache, false); - } - }); - Map extraConfigurations = okbuckExt .extraDepCachesMap @@ -375,7 +367,7 @@ private void writeExportedFileRules(Project rootBuckProject, OkBuckExtension okB .sorted((rule1, rule2) -> rule1.name().compareToIgnoreCase(rule2.name())) .forEach(rule -> rule.render(os)); } catch (IOException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } } diff --git a/buildSrc/src/main/java/com/uber/okbuck/composer/base/BuckRuleComposer.java b/buildSrc/src/main/java/com/uber/okbuck/composer/base/BuckRuleComposer.java index 06a1b90d2..933d264f3 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/composer/base/BuckRuleComposer.java +++ b/buildSrc/src/main/java/com/uber/okbuck/composer/base/BuckRuleComposer.java @@ -11,7 +11,7 @@ public abstract class BuckRuleComposer { - public BuckRuleComposer() {} + protected BuckRuleComposer() {} public static Set external(Set deps) { return deps.stream().map(BuckRuleComposer::external).collect(Collectors.toSet()); @@ -21,7 +21,7 @@ public static String external(OExternalDependency dep) { try { return String.format("//%s:%s", dep.getTargetPath(), dep.getTargetName()); } catch (NullPointerException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/annotation/AnnotationProcessorCache.java b/buildSrc/src/main/java/com/uber/okbuck/core/annotation/AnnotationProcessorCache.java index ce9119dde..be6b4d663 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/annotation/AnnotationProcessorCache.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/annotation/AnnotationProcessorCache.java @@ -90,7 +90,7 @@ public List getAnnotationProcessorScopes(Project project, Configuration c Map, Scope> autoValueScopeMap = getAutoValueDependencyToScopeMap(); if (!autoValueScopeMap.containsKey(autoValueDependencies)) { - throw new RuntimeException( + throw new IllegalStateException( "autoValueConfigurations should be present if adding autoValue dependencies. missing: " + autoValueDependencies); } diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/dependency/DependencyCache.java b/buildSrc/src/main/java/com/uber/okbuck/core/dependency/DependencyCache.java index 2916df38d..eb83a252a 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/dependency/DependencyCache.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/dependency/DependencyCache.java @@ -105,7 +105,7 @@ public Set getAnnotationProcessors(OExternalDependency externalDependenc return ImmutableSet.copyOf(processors.split(",")); } catch (IOException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } @@ -125,7 +125,7 @@ public boolean hasAutoValueExtension(OExternalDependency externalDependency) { "META-INF/services/com.google.auto.value.extension.AutoValueExtension"); return !extensions.isEmpty(); } catch (IOException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/dependency/DependencyUtils.java b/buildSrc/src/main/java/com/uber/okbuck/core/dependency/DependencyUtils.java index 4ac4716c2..b79c10d65 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/dependency/DependencyUtils.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/dependency/DependencyUtils.java @@ -14,7 +14,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; -import java.util.jar.JarFile; import java.util.stream.Collectors; import javax.annotation.Nullable; import org.apache.commons.io.FilenameUtils; @@ -84,7 +83,8 @@ public static String shaSum256(File file) { try { return Files.asByteSource(file).hash(Hashing.sha256()).toString(); } catch (IOException e) { - throw new RuntimeException(String.format("Failed to calculate shaSum256 of %s", file)); + throw new IllegalStateException( + String.format("Failed to calculate shaSum256 of %s", file), e); } } @@ -116,14 +116,6 @@ static String getModuleClassifier(String fileNameString, @Nullable String versio } } - private static long jarComparisonKeyFunction(File file) { - try { - return new JarFile(file).entries().nextElement().getTime(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - public static Set resolveExternal( Project project, Configuration configuration, @@ -206,7 +198,7 @@ public static void enforceChangingDeps(Project project, Configuration configurat if (useVersion != null) { details.useVersion(useVersion); } else { - throw new RuntimeException( + throw new IllegalStateException( "Please do not use changing dependencies. They can cause hard to reproduce builds.\n" + "Found changing dependency " + details.getRequested() @@ -244,7 +236,7 @@ static OExternalDependency lowest(Collection dependencyList .map(OExternalDependency::getVersionless) .collect(Collectors.toSet()); if (versionless.size() != 1) { - throw new RuntimeException( + throw new IllegalStateException( String.format( "Lowest could only be found for the same group:artifactID, found -> %s", dependencyList)); diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/dependency/OExternalDependency.java b/buildSrc/src/main/java/com/uber/okbuck/core/dependency/OExternalDependency.java index 536fab53d..131d73a9a 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/dependency/OExternalDependency.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/dependency/OExternalDependency.java @@ -47,7 +47,7 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (o == null || getClass() != o.getClass()) { + if (!(o instanceof OExternalDependency)) { return false; } OExternalDependency that = (OExternalDependency) o; @@ -207,7 +207,7 @@ String getSourceFileNameFrom(String prebuiltName) { if (ImmutableList.of(JAR, AAR).contains(getPackaging())) { return prebuiltName.replaceFirst("\\.(jar|aar)$", SOURCE_FILE); } - throw new RuntimeException("Couldn't get sources file name for " + prebuiltName); + throw new IllegalStateException("Couldn't get sources file name for " + prebuiltName); } private boolean shouldInclude(OExternalDependency dependency) { diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/dependency/OResolvedDependency.java b/buildSrc/src/main/java/com/uber/okbuck/core/dependency/OResolvedDependency.java index 5b9489873..e34e11d52 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/dependency/OResolvedDependency.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/dependency/OResolvedDependency.java @@ -50,7 +50,7 @@ public abstract static class Builder { } @Override - public String toString() { + public final String toString() { return this.getMavenCoords() + " -> " + realDependencyFile().toString(); } diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/dependency/OUnresolvedDependency.java b/buildSrc/src/main/java/com/uber/okbuck/core/dependency/OUnresolvedDependency.java index d24978502..238ac56de 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/dependency/OUnresolvedDependency.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/dependency/OUnresolvedDependency.java @@ -1,6 +1,7 @@ package com.uber.okbuck.core.dependency; import com.google.auto.value.AutoValue; +import com.google.common.collect.ImmutableSet; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -14,7 +15,7 @@ public abstract class OUnresolvedDependency { public abstract String version(); - public abstract Set excludeRules(); + public abstract ImmutableSet excludeRules(); public static Builder builder() { return new AutoValue_OUnresolvedDependency.Builder(); diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/dependency/VersionlessDependency.java b/buildSrc/src/main/java/com/uber/okbuck/core/dependency/VersionlessDependency.java index e1a20b412..d9684e43c 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/dependency/VersionlessDependency.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/dependency/VersionlessDependency.java @@ -60,7 +60,7 @@ public static VersionlessDependency fromMavenCoords(String s) { .build(); break; default: - throw new RuntimeException("Invalid dependency specified: " + s); + throw new IllegalStateException("Invalid dependency specified: " + s); } return versionless; } diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/manager/DependencyManager.java b/buildSrc/src/main/java/com/uber/okbuck/core/manager/DependencyManager.java index db02bbe16..de56ddc50 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/manager/DependencyManager.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/manager/DependencyManager.java @@ -100,7 +100,7 @@ public void resolveCurrentRawDeps() { Map> rawDepsMap = rawDependencies .stream() - .collect(Collectors.groupingBy(i -> i.getGroup() + ":" + i.getVersion())); + .collect(Collectors.groupingBy(i -> i.getGroup() + "--" + i.getVersion())); List allProjects = new ArrayList<>(project.getAllprojects()); int numberOfChunks = allProjects.size(); @@ -235,7 +235,7 @@ private void validateDependencies( Collectors.mapping(OExternalDependency::getVersion, Collectors.toSet()))); if (extraDependencies.size() > 0) { - throw new RuntimeException( + throw new IllegalStateException( "Multiple versions found for external dependencies: \n" + mapJoiner.join(extraDependencies)); } @@ -255,7 +255,7 @@ private void validateDependencies( Collectors.mapping(OExternalDependency::getVersion, Collectors.toSet()))); if (singleDependencies.size() > 0) { - throw new RuntimeException( + throw new IllegalStateException( "Single version found for external dependencies, please remove them from external dependency extension: \n" + mapJoiner.join(singleDependencies)); } @@ -368,7 +368,7 @@ private static Set childDependencies( } private static void dependencyException(ResolvedDependency dependency) { - throw new RuntimeException( + throw new IllegalStateException( "Couldn't find " + dependency + " child of parents -> " @@ -384,7 +384,7 @@ private void processDependencies( try { FileUtils.deleteDirectory(cacheDir); } catch (IOException e) { - throw new RuntimeException("Could not delete dependency directory: " + cacheDir); + throw new IllegalStateException("Could not delete dependency directory: " + cacheDir, e); } } @@ -457,7 +457,8 @@ private boolean isPrebuiltDependency(OExternalDependency dependency) { private static void createSymlinks(Path path, Collection dependencies) { if (!path.toFile().exists() && !path.toFile().mkdirs()) { - throw new RuntimeException(String.format("Couldn't create %s when creating symlinks", path)); + throw new IllegalStateException( + String.format("Couldn't create %s when creating symlinks", path)); } SetMultimap nameToDependencyMap = @@ -510,7 +511,7 @@ private static void persistSha256Cache(Project rootProject, HashMap MANIFEST_MERGER_EXCLUDES = ImmutableSet.of("META-INF/.*\\\\.SF", "META-INF/.*\\\\.DSA", "META-INF/.*\\\\.RSA"); private static final String MANIFEST_MERGER_CLI_CLASS = diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/manager/RobolectricManager.java b/buildSrc/src/main/java/com/uber/okbuck/core/manager/RobolectricManager.java index 87d6bfa8b..5eb216a7b 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/manager/RobolectricManager.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/manager/RobolectricManager.java @@ -7,6 +7,7 @@ import com.uber.okbuck.core.dependency.DependencyCache; import com.uber.okbuck.core.dependency.OExternalDependency; import com.uber.okbuck.core.util.FileUtil; +import com.uber.okbuck.core.util.MoreCollectors; import com.uber.okbuck.core.util.ProjectUtil; import com.uber.okbuck.template.config.SymlinkBuckFile; import com.uber.okbuck.template.core.Rule; @@ -65,7 +66,7 @@ public void download() { .stream() .map(dependencyCache::build) .flatMap(Set::stream) - .collect(com.uber.okbuck.core.util.MoreCollectors.toImmutableSet()); + .collect(MoreCollectors.toImmutableSet()); } public void finalizeDependencies() { @@ -106,7 +107,8 @@ enum API { API_26("8.0.0_r4", "r1"), API_27("8.1.0", "4611349"), API_P("P", "4651975"), - API_28("9", "4913185-2"); + API_28("9", "4913185-2"), + API_29("10", "5803371"); private final String androidVersion; private final String frameworkSdkBuildVersion; diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/model/android/AndroidAppTarget.java b/buildSrc/src/main/java/com/uber/okbuck/core/model/android/AndroidAppTarget.java index 786569678..62e93687c 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/model/android/AndroidAppTarget.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/model/android/AndroidAppTarget.java @@ -21,13 +21,10 @@ import java.util.Set; import javax.annotation.Nullable; import org.gradle.api.Project; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** An Android app target */ public class AndroidAppTarget extends AndroidLibTarget { - private static final Logger LOG = LoggerFactory.getLogger(AndroidAppTarget.class); private static final int DEFAULT_LINEARALLOC_LIMIT = 16777216; private final boolean multidexEnabled; @Nullable private final Keystore keystore; diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/model/android/AndroidInstrumentationTarget.java b/buildSrc/src/main/java/com/uber/okbuck/core/model/android/AndroidInstrumentationTarget.java index 9eb697587..25521ce8f 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/model/android/AndroidInstrumentationTarget.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/model/android/AndroidInstrumentationTarget.java @@ -11,7 +11,7 @@ public abstract class AndroidInstrumentationTarget extends AndroidAppTarget { private static final String KAPT_ANDROID_TEST = "kaptAndroidTest"; - public AndroidInstrumentationTarget(Project project, String name) { + protected AndroidInstrumentationTarget(Project project, String name) { super(project, name, true); } diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/model/android/AndroidTarget.java b/buildSrc/src/main/java/com/uber/okbuck/core/model/android/AndroidTarget.java index d2548928f..57756ca09 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/model/android/AndroidTarget.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/model/android/AndroidTarget.java @@ -74,7 +74,7 @@ public abstract class AndroidTarget extends JvmTarget { @Nullable private String originalPackageName; @Nullable private String resourceUnionPackageName; - public AndroidTarget(Project project, String name, boolean isTest) { + protected AndroidTarget(Project project, String name, boolean isTest) { super(project, name); this.isTest = isTest; @@ -133,7 +133,7 @@ public AndroidTarget(Project project, String name, boolean isTest) { } } - public AndroidTarget(Project project, String name) { + protected AndroidTarget(Project project, String name) { this(project, name, false); } diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/model/android/ExoPackageScope.java b/buildSrc/src/main/java/com/uber/okbuck/core/model/android/ExoPackageScope.java index 28b3d6fc2..e1ae871b8 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/model/android/ExoPackageScope.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/model/android/ExoPackageScope.java @@ -36,6 +36,7 @@ public class ExoPackageScope extends Scope { } @Nullable + @SuppressWarnings("EmptyCatch") public String getAppClass() { if (manifest == null) { return null; diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/model/base/RuleType.java b/buildSrc/src/main/java/com/uber/okbuck/core/model/base/RuleType.java index 976e3fabe..1dd2eb8db 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/model/base/RuleType.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/model/base/RuleType.java @@ -2,7 +2,6 @@ import com.google.common.collect.ImmutableList; import com.google.errorprone.annotations.Var; -import java.util.List; public enum RuleType { AIDL, @@ -48,7 +47,7 @@ public enum RuleType { this.properties = ImmutableList.copyOf(properties); } - public List getProperties() { + public ImmutableList getProperties() { return properties; } diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/model/base/Scope.java b/buildSrc/src/main/java/com/uber/okbuck/core/model/base/Scope.java index a189c642e..7a2ec1c59 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/model/base/Scope.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/model/base/Scope.java @@ -520,7 +520,7 @@ private void extractConfigurationImpl( firstLevelExternal.put( localExternalDependency.getVersionless(), localExternalDependency); } catch (IOException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } }); @@ -531,7 +531,7 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (o == null || getClass() != o.getClass()) { + if (!(o instanceof Scope)) { return false; } Scope scope = (Scope) o; diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/model/base/Target.java b/buildSrc/src/main/java/com/uber/okbuck/core/model/base/Target.java index 15daa7705..915b7c021 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/model/base/Target.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/model/base/Target.java @@ -30,7 +30,7 @@ public abstract class Target { private final String identifier; private final String path; - public Target(Project project, String name) { + protected Target(Project project, String name) { this.project = project; this.name = name; identifier = project.getPath().replaceFirst(":", ""); diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/model/jvm/JvmTarget.java b/buildSrc/src/main/java/com/uber/okbuck/core/model/jvm/JvmTarget.java index 31a4d8b87..b3a98776d 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/model/jvm/JvmTarget.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/model/jvm/JvmTarget.java @@ -64,6 +64,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin; import org.jetbrains.kotlin.gradle.plugin.SubpluginOption; import org.jetbrains.kotlin.gradle.tasks.KotlinCompile; +import org.gradle.api.artifacts.ExternalDependency; public class JvmTarget extends Target { @@ -216,7 +217,7 @@ public Set getApiExternalDeps() { Set versionlessApiDependencies = apiConfiguration .getAllDependencies() - .withType(org.gradle.api.artifacts.ExternalDependency.class) + .withType(ExternalDependency.class) .stream() .map(factory::fromDependency) .flatMap(Collection::stream) @@ -460,7 +461,7 @@ public static String javaVersion(JavaVersion version) { * For Kotlin tests, a special extra friend-paths argument needs to be passed to read internal * elements. See https://github.com/uber/okbuck/issues/709 * - * @param isTest + * @param isTest is test target * @return the list with all friend paths */ public Map> getKotlinFriendPaths(boolean isTest) { @@ -586,6 +587,7 @@ private AllOpenKotlinGradleSubplugin getAllOpenKotlinGradleSubplugin() { return null; } + @SuppressWarnings("NoFunctionalReturnType") private static Predicate distinctByKey(Function keyExtractor) { Set seen = ConcurrentHashMap.newKeySet(); return t -> seen.add(keyExtractor.apply(t)); diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/task/OkBuckTask.java b/buildSrc/src/main/java/com/uber/okbuck/core/task/OkBuckTask.java index 4d9aacf76..4a4d51818 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/task/OkBuckTask.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/task/OkBuckTask.java @@ -165,7 +165,7 @@ private void generate( try { dotBuckConfig().createNewFile(); } catch (IOException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } Map overrides = @@ -252,7 +252,11 @@ private void generate( scalaCompiler, scalaLibrary, ProguardUtil.getProguardJarPath(getProject()), - repositoryMap(okbuckExt.getExternalDependenciesExtension().shouldDownloadInBuck() && okBuckExtension.getExternalDependenciesExtension().getGenerateMavenRepositories())) + repositoryMap( + okbuckExt.getExternalDependenciesExtension().shouldDownloadInBuck() + && okBuckExtension + .getExternalDependenciesExtension() + .getGenerateMavenRepositories())) .render(okbuckBuckConfig()); } diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/util/FileUtil.java b/buildSrc/src/main/java/com/uber/okbuck/core/util/FileUtil.java index 3cf2d1d0d..d4fe1263e 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/util/FileUtil.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/util/FileUtil.java @@ -49,7 +49,7 @@ public static void copyResourceToProject(String resource, File destination) { try { FileUtils.copyURLToFile(FileUtil.class.getResource(resource), destination); } catch (IOException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } @@ -71,7 +71,7 @@ public static ImmutableSet available(Project project, Collection f .iterator() .hasNext(); } catch (IOException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } return rootFile.exists(); @@ -80,6 +80,7 @@ public static ImmutableSet available(Project project, Collection f .collect(MoreCollectors.toImmutableSet()); } + @SuppressWarnings("EmptyCatch") public static void deleteQuietly(Path p) { try { Files.walkFileTree( diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/util/ProjectCache.java b/buildSrc/src/main/java/com/uber/okbuck/core/util/ProjectCache.java index b1d03e45b..74c59c124 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/util/ProjectCache.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/util/ProjectCache.java @@ -18,7 +18,7 @@ public static Map getScopeCache(Project project) { Map scopeCache = (Map) project.property(scopeCacheKey); if (scopeCache == null) { - throw new RuntimeException( + throw new IllegalStateException( "Scope cache external property '" + scopeCacheKey + "' is not set."); } return scopeCache; @@ -29,7 +29,7 @@ public static TargetCache getTargetCache(Project project) { TargetCache targetCache = (TargetCache) project.property(targetCacheKey); if (targetCache == null) { - throw new RuntimeException( + throw new IllegalStateException( "Target cache external property '" + targetCacheKey + "' is not set."); } return targetCache; diff --git a/buildSrc/src/main/java/com/uber/okbuck/core/util/XmlUtil.java b/buildSrc/src/main/java/com/uber/okbuck/core/util/XmlUtil.java index b1bf122bc..425a99df6 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/core/util/XmlUtil.java +++ b/buildSrc/src/main/java/com/uber/okbuck/core/util/XmlUtil.java @@ -35,7 +35,7 @@ public static Document loadXml(String xmlString) { doc.getDocumentElement().normalize(); return doc; } catch (ParserConfigurationException | IOException | SAXException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } @@ -46,7 +46,7 @@ public static Document loadXml(File xmlFile) { doc.getDocumentElement().normalize(); return doc; } catch (ParserConfigurationException | IOException | SAXException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } @@ -83,7 +83,7 @@ public static void writeToXml(Document document, File xmlFile) { writeText(xmlString, xmlFile); } catch (IOException | TransformerException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } diff --git a/buildSrc/src/main/java/com/uber/okbuck/extension/OkBuckExtension.java b/buildSrc/src/main/java/com/uber/okbuck/extension/OkBuckExtension.java index c50c680b3..99b1b77a8 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/extension/OkBuckExtension.java +++ b/buildSrc/src/main/java/com/uber/okbuck/extension/OkBuckExtension.java @@ -66,12 +66,6 @@ public class OkBuckExtension { /** List of exclude patterns for resources to be processed by aapt */ @Input public Set excludeResources = new HashSet<>(); - /** - * Additional dependency caches. Every value "entry" will create a new configuration - * "entryExtraDepCache" that can be used to fetch and cache dependencies. - */ - @Deprecated @Input public Set extraDepCaches = new HashSet<>(); - /** * Additional dependency caches. Every value "entry" will create a new configuration * "entryExtraDepCache" that can be used to fetch and cache dependencies. the boolean defines diff --git a/buildSrc/src/main/java/com/uber/okbuck/extension/RuleOverridesExtension.java b/buildSrc/src/main/java/com/uber/okbuck/extension/RuleOverridesExtension.java index b3b9cf67a..28c963acb 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/extension/RuleOverridesExtension.java +++ b/buildSrc/src/main/java/com/uber/okbuck/extension/RuleOverridesExtension.java @@ -1,8 +1,8 @@ package com.uber.okbuck.extension; +import static com.uber.okbuck.OkBuckGradlePlugin.OKBUCK_ANDROID_MODULES_TARGET; import static com.uber.okbuck.OkBuckGradlePlugin.OKBUCK_PREBUILT_TARGET; import static com.uber.okbuck.OkBuckGradlePlugin.OKBUCK_TARGETS_TARGET; -import static com.uber.okbuck.OkBuckGradlePlugin.OKBUCK_ANDROID_MODULES_TARGET; import com.google.common.base.Preconditions; import com.google.common.base.Strings; @@ -115,12 +115,12 @@ private void preProcessExtension() { // Add OkBuck defaults for rules not re-defined by user. OKBUCK_DEFINED_RULES.forEach( - ((ruleType, target) -> { + (ruleType, target) -> { String buckName = ruleType.getBuckName(); configuredOverrides.computeIfAbsent( buckName, nativeRuleName -> new OverrideSetting(target, OKBUCK_PREFIX + nativeRuleName)); - })); + }); overridesMap = ImmutableMap.copyOf(configuredOverrides); } diff --git a/buildSrc/src/main/java/com/uber/okbuck/extension/ScalaExtension.java b/buildSrc/src/main/java/com/uber/okbuck/extension/ScalaExtension.java index 7d157937e..587827426 100644 --- a/buildSrc/src/main/java/com/uber/okbuck/extension/ScalaExtension.java +++ b/buildSrc/src/main/java/com/uber/okbuck/extension/ScalaExtension.java @@ -3,5 +3,5 @@ public class ScalaExtension { /** Version of the scala compiler to use. */ - public String version = "2.12.4"; + public String version = "2.13.3"; } diff --git a/buildSrc/src/main/rocker/com/uber/okbuck/template/core/Rule.java b/buildSrc/src/main/rocker/com/uber/okbuck/template/core/Rule.java index e07fc4b67..0ac02c300 100644 --- a/buildSrc/src/main/rocker/com/uber/okbuck/template/core/Rule.java +++ b/buildSrc/src/main/rocker/com/uber/okbuck/template/core/Rule.java @@ -107,7 +107,7 @@ public void render(File file) { file.getParentFile().mkdirs(); render(new FileOutputStream(file)); } catch (FileNotFoundException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } diff --git a/buildSrc/src/main/rocker/com/uber/okbuck/template/core/RuleTemplate.java b/buildSrc/src/main/rocker/com/uber/okbuck/template/core/RuleTemplate.java index 01e114406..d6f27c398 100644 --- a/buildSrc/src/main/rocker/com/uber/okbuck/template/core/RuleTemplate.java +++ b/buildSrc/src/main/rocker/com/uber/okbuck/template/core/RuleTemplate.java @@ -15,7 +15,7 @@ public abstract class RuleTemplate extends DefaultRockerTemplate { protected Collection labels; protected Collection extraBuckOpts; - public RuleTemplate(RockerModel model) { + protected RuleTemplate(RockerModel model) { super(model); if (model instanceof Rule) { Rule rule = (Rule) model; diff --git a/dependencies.gradle b/dependencies.gradle index 019057e61..b77dfc642 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -19,17 +19,18 @@ def exclude = { dep, String... excludes -> def versions = [ androidPlugin : "3.6.1", androidTools : "26.6.1", + autovalue : "1.7.4", + avro : "1.10.0", butterKnife : "10.2.1", - dagger : "2.28.1", + dagger : "2.28.2", + jna : "5.6.0", kotlin : "1.3.72", leakCanary : "1.5.4", - rocker : "0.23.0", + rocker : "1.3.0", support : "28.0.0", androidx : "1.1.0", androidxMultidex : "2.0.0", constraintLayout : "1.1.0", - scalaMajor : "2.11", - spark : "2.1.0", sqldelight : "1.4.0", ] @@ -37,22 +38,23 @@ def versions = [ def build = [ androidPlugin : "com.android.tools.build:gradle:${versions.androidPlugin}", androidPluginApi : "com.android.tools.build:gradle-api:${versions.androidPlugin}", - bintrayPlugin : "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.2", + bintrayPlugin : "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.5", butterKnifePlugin: "com.jakewharton:butterknife-gradle-plugin:${versions.butterKnife}", - commonsIo : "commons-io:commons-io:2.5", - commonsLang3 : "org.apache.commons:commons-lang3:3.7", - erroproneCompiler: "com.google.errorprone:error_prone_core:2.3.1", - errorpronePlugin : "net.ltgt.gradle:gradle-errorprone-plugin:0.0.16", + commonsIo : "commons-io:commons-io:2.6", + commonsLang3 : "org.apache.commons:commons-lang3:3.9", + erroproneCompiler: "com.google.errorprone:error_prone_core:2.4.0", + errorproneJavac : "com.google.errorprone:javac:9+181-r4173-1", + errorpronePlugin : "net.ltgt.gradle:gradle-errorprone-plugin:1.2.1", kotlinPlugin : "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}", kotlinAllOpen : "org.jetbrains.kotlin:kotlin-allopen:${versions.kotlin}", manifestMerger : "com.android.tools.build:manifest-merger:${versions.androidTools}", - nullaway : "com.uber.nullaway:nullaway:0.5.3", - rockerPlugin : "gradle.plugin.com.fizzed:rocker-gradle-plugin:${versions.rocker}", + nullaway : "com.uber.nullaway:nullaway:0.7.10", + rockerPlugin : "com.fizzed:rocker-gradle-plugin:${versions.rocker}", rockerRuntime : "com.fizzed:rocker-runtime:${versions.rocker}", - shadowJar : "com.github.jengelman.gradle.plugins:shadow:2.0.1", + shadowJar : "com.github.jengelman.gradle.plugins:shadow:6.0.0", sqlDelightPlugin : "com.squareup.sqldelight:gradle-plugin:${versions.sqldelight}", - jna : "net.java.dev.jna:jna:5.2.0", - jnaPlatform : "net.java.dev.jna:jna-platform:5.2.0", + jna : "net.java.dev.jna:jna:${versions.jna}", + jnaPlatform : "net.java.dev.jna:jna-platform:${versions.jna}", mavenArtifact : "org.apache.maven:maven-artifact:3.6.2", proguard : "net.sf.proguard:proguard-base:6.2.2", ] @@ -65,10 +67,10 @@ def buildConfig = [ ] def apt = [ - autoValue : "com.google.auto.value:auto-value:1.6", - autoValueAnnotations : "com.google.auto.value:auto-value-annotations:1.6", - autoValueGson : "com.ryanharter.auto.value:auto-value-gson:0.7.0", - autoValueParcel : "com.ryanharter.auto.value:auto-value-parcel:0.2.6", + autoValue : "com.google.auto.value:auto-value:${versions.autovalue}", + autoValueAnnotations : "com.google.auto.value:auto-value-annotations:${versions.autovalue}", + autoValueGson : "com.ryanharter.auto.value:auto-value-gson:1.3.0", + autoValueParcel : "com.ryanharter.auto.value:auto-value-parcel:0.2.8", butterKnifeCompiler : "com.jakewharton:butterknife-compiler:${versions.butterKnife}", daggerCompiler : "com.google.dagger:dagger-compiler:${versions.dagger}", daggerAndroidProcessor: "com.google.dagger:dagger-android-processor:${versions.dagger}", @@ -79,23 +81,21 @@ def external = [ butterKnife : "com.jakewharton:butterknife:${versions.butterKnife}", dagger : "com.google.dagger:dagger:${versions.dagger}", daggerAndroid : "com.google.dagger:dagger-android-support:${versions.dagger}", - inferAnnotations: "com.facebook.infer.annotation:infer-annotation:0.11.0", - gson : "com.google.code.gson:gson:2.8.2", + inferAnnotations: "com.facebook.infer.annotation:infer-annotation:0.18.0", + gson : "com.google.code.gson:gson:2.8.6", kotlinExtension : "org.jetbrains.kotlin:kotlin-android-extensions:${versions.kotlin}", kotlinStdlib : "org.jetbrains.kotlin:kotlin-stdlib:${versions.kotlin}", leakCanary : "com.squareup.leakcanary:leakcanary-android:${versions.leakCanary}", sqldelight : "com.squareup.sqldelight:android-driver:${versions.sqldelight}", - rxandroid : "io.reactivex.rxjava2:rxandroid:2.0.2", - rxjava : "io.reactivex.rxjava2:rxjava:2.1.12", - rxPermissions : "com.tbruyelle.rxpermissions2:rxpermissions:0.9.4", + rxandroid : "io.reactivex.rxjava2:rxandroid:2.1.1", + rxjava : "io.reactivex.rxjava2:rxjava:2.2.19", + rxPermissions : "com.tbruyelle.rxpermissions2:rxpermissions:0.9.5", sqlite : "com.pushtorefresh.storio3:sqlite:3.0.0", xlogAndroidIdle : "com.github.promeg:xlog-android-idle:2.1.1", - avroIpc : "org.apache.avro:avro-ipc:1.7.7", - avroIpcTests : "org.apache.avro:avro-ipc:1.7.7:tests", - saxon : "net.sf.saxon:Saxon-HE:9.7.0-15", - scalaLibrary : "org.scala-lang:scala-library:2.12.4", - sparkCore : exclude("org.apache.spark:spark-core_${versions.scalaMajor}:${versions.spark}", "commons-beanutils-core", "commons-collections", "hadoop-yarn-common", "pmml-evaluator", "pmml-model", "pmml-schema", "org.scalatest"), - sparkSql : exclude("org.apache.spark:spark-sql_${versions.scalaMajor}:${versions.spark}", "org.scalatest"), + avroIpc : "org.apache.avro:avro-ipc:${versions.avro}", + avroIpcTests : "org.apache.avro:avro-ipc:${versions.avro}:tests", + saxon : "net.sf.saxon:Saxon-HE:10.1", + scalaLibrary : "org.scala-lang:scala-library:2.13.3", log4j : exclude("log4j:log4j:1.2.15", "jline", "jms", "jmxtools", "jmxri"), guava : "com.google.guava:guava:26.0-jre", ] @@ -104,6 +104,7 @@ def lint = [ lint : "com.android.tools.lint:lint:${versions.androidTools}", lintApi : "com.android.tools.lint:lint-api:${versions.androidTools}", lintChecks: "com.android.tools.lint:lint-checks:${versions.androidTools}", + lintGradle: "com.android.tools.lint:lint-gradle:${versions.androidTools}", lintTests : "com.android.tools.lint:lint-tests:${versions.androidTools}", ] @@ -119,15 +120,17 @@ def androidx = [ ] def test = [ - assertj : "org.assertj:assertj-core:3.9.1", - espressoCore : "androidx.test.espresso:espresso-core:3.1.0", - espressoRules : "androidx.test:rules:1.1.0", - espressoRunner: "androidx.test:runner:1.1.0-alpha3", - junit : "junit:junit:4.12", + assertj : "org.assertj:assertj-core:3.16.1", + espressoCore : "androidx.test.espresso:espresso-core:3.3.0-rc01", + espressoRules : "androidx.test:rules:1.3.0-rc01", + espressoRunner: "androidx.test:runner:1.3.0-rc01", + junit : "junit:junit:4.13", kotlinTest : "org.jetbrains.kotlin:kotlin-test-junit:${versions.kotlin}", - mockito : "org.mockito:mockito-core:2.15.0", + mockito : "org.mockito:mockito-core:3.4.0", robolectric : "org.robolectric:robolectric:4.3.1", - scalaTest : "org.scalatest:scalatest_2.12:3.0.5" + scalaTest : "org.scalatest:scalatest_sjs1_2.13:3.2.0", + scalaTestJunit: "org.scalatestplus:junit-4-12_2.13:3.2.0.0", + testExt : "androidx.test.ext:junit:1.1.2-rc01", ] ext.config = [ diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 5c2d1cf016b3885f6930543d57b744ea8c220a1a..62d4c053550b91381bbd28b1afc82d634bf73a8a 100644 GIT binary patch delta 23020 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 delta 19839 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 + assert(activity.analytics is TestAnalyticsImpl) + } } } diff --git a/libraries/javahadooplibrary/build.gradle b/libraries/javahadooplibrary/build.gradle deleted file mode 100644 index 2fe0b8a40..000000000 --- a/libraries/javahadooplibrary/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -apply plugin: "java-library" - -dependencies { - // spark is provided by spark-submit - compileOnly deps.external.sparkCore - compileOnly deps.external.sparkSql - - implementation deps.external.log4j -} diff --git a/libraries/javahadooplibrary/src/main/java/com/uber/okbuck/java/example/DummyJava.java b/libraries/javahadooplibrary/src/main/java/com/uber/okbuck/java/example/DummyJava.java deleted file mode 100644 index 841d01a9b..000000000 --- a/libraries/javahadooplibrary/src/main/java/com/uber/okbuck/java/example/DummyJava.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.uber.okbuck.java.example; - -import org.apache.log4j.Level; -import org.apache.log4j.Logger; - -public class DummyJava { - - private static final Logger logger = Logger.getLogger(DummyJava.class.getName()); - - static int add(int a, int b) { - logger.setLevel(Level.WARN); - return a + b; - } -} diff --git a/libraries/kotlinandroidlibrary/build.gradle b/libraries/kotlinandroidlibrary/build.gradle index 019cc8ab8..4e8e7f13f 100755 --- a/libraries/kotlinandroidlibrary/build.gradle +++ b/libraries/kotlinandroidlibrary/build.gradle @@ -18,6 +18,7 @@ dependencies { testImplementation deps.test.junit testImplementation deps.test.kotlinTest + androidTestImplementation deps.test.testExt androidTestImplementation deps.test.junit androidTestImplementation deps.test.espressoCore androidTestImplementation deps.test.espressoRules diff --git a/libraries/kotlinandroidlibrary/src/androidTest/java/com/uber/okbuck/java/KotlinLibActivityTest.kt b/libraries/kotlinandroidlibrary/src/androidTest/java/com/uber/okbuck/java/KotlinLibActivityTest.kt index 2ccd7f80a..e212f1c2a 100644 --- a/libraries/kotlinandroidlibrary/src/androidTest/java/com/uber/okbuck/java/KotlinLibActivityTest.kt +++ b/libraries/kotlinandroidlibrary/src/androidTest/java/com/uber/okbuck/java/KotlinLibActivityTest.kt @@ -4,7 +4,7 @@ import android.content.Intent import org.junit.Rule import org.junit.Test import org.hamcrest.CoreMatchers.allOf -import androidx.test.rule.ActivityTestRule +import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.espresso.Espresso.onView import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.isDisplayed @@ -15,14 +15,13 @@ import com.uber.okbuck.kotlin.android.R class KotlinLibActivityTest { @get:Rule - val activityRule = ActivityTestRule(KotlinLibActivity::class.java, true, false) - + val activityRule = ActivityScenarioRule(KotlinLibActivity::class.java) @Test fun testTextView() { - activityRule.launchActivity(Intent()) - - onView(allOf(withId(R.id.titleTV), withText("I'm in an android library test!"))).check(matches(isDisplayed())) + activityRule.getScenario().onActivity { _ -> + onView(allOf(withId(R.id.titleTV), withText("I'm in an android library test!"))).check(matches(isDisplayed())) + } } } diff --git a/libraries/scalalibrary/build.gradle b/libraries/scalalibrary/build.gradle index 2ee74d5ce..71c026495 100644 --- a/libraries/scalalibrary/build.gradle +++ b/libraries/scalalibrary/build.gradle @@ -7,7 +7,7 @@ dependencies { compile deps.external.scalaLibrary testCompile deps.test.scalaTest - testCompile deps.test.junit + testCompile deps.test.scalaTestJunit } mainClassName = "com.uber.okbuck.scala.example.Hello" diff --git a/libraries/scalalibrary/src/test/scala/com/uber/okbuck/scala/example/DummyScalaTest.scala b/libraries/scalalibrary/src/test/scala/com/uber/okbuck/scala/example/DummyScalaTest.scala index 78713a633..228af12f1 100644 --- a/libraries/scalalibrary/src/test/scala/com/uber/okbuck/scala/example/DummyScalaTest.scala +++ b/libraries/scalalibrary/src/test/scala/com/uber/okbuck/scala/example/DummyScalaTest.scala @@ -2,11 +2,11 @@ package com.uber.okbuck.scala.example import org.junit.runner.RunWith -import org.scalatest.FlatSpec -import org.scalatest.junit.JUnitRunner +import org.scalatest.flatspec.AnyFlatSpec +import org.scalatestplus.junit.JUnitRunner @RunWith(classOf[JUnitRunner]) -class DummyScalaTest extends FlatSpec { +class DummyScalaTest extends AnyFlatSpec { "Hello" should "say hello" in { assert(DummyScala.hello == "hello") } diff --git a/manifest-merger-cli/src/main/java/com/uber/okbuck/manifmerger/ManifestMergerCli.java b/manifest-merger-cli/src/main/java/com/uber/okbuck/manifmerger/ManifestMergerCli.java index 234e57aad..2db25060e 100644 --- a/manifest-merger-cli/src/main/java/com/uber/okbuck/manifmerger/ManifestMergerCli.java +++ b/manifest-merger-cli/src/main/java/com/uber/okbuck/manifmerger/ManifestMergerCli.java @@ -151,7 +151,7 @@ private static int process(String[] args) throws FileNotFoundException { try { Files.write(mergedDocument, outFile, Charsets.UTF_8); } catch (IOException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } else { System.out.println(mergedDocument); diff --git a/settings.gradle b/settings.gradle index 33bf3239d..556a9ffb7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -15,7 +15,6 @@ include "libraries:kotlinlibrary" include "libraries:lintErrorLibrary" include "libraries:parcelable" include "libraries:scalalibrary" -include "libraries:javahadooplibrary" include "manifest-merger-cli" include "plugin" include "transform-cli" diff --git a/tooling/buck-defs/cleanup.bzl b/tooling/buck-defs/cleanup.bzl index 770f386e6..39390eb2d 100644 --- a/tooling/buck-defs/cleanup.bzl +++ b/tooling/buck-defs/cleanup.bzl @@ -1,6 +1,7 @@ JARS_TO_CLEANUP = [ '.okbuck/ext/org/hamcrest:hamcrest-core.jar', '.okbuck/ext/org/hamcrest:hamcrest-integration.jar', + '.okbuck/ext/com/google/code/gson:gson.jar' ] @@ -9,6 +10,7 @@ ENTRIES_TO_DELETE = " ".join([ 'LICENSE', 'NOTICE', 'asm-license.txt', + 'module-info.class', ]) diff --git a/transform-cli/src/main/java/com/uber/okbuck/transform/CliTransform.java b/transform-cli/src/main/java/com/uber/okbuck/transform/CliTransform.java index 8c4af09f9..493c889fd 100644 --- a/transform-cli/src/main/java/com/uber/okbuck/transform/CliTransform.java +++ b/transform-cli/src/main/java/com/uber/okbuck/transform/CliTransform.java @@ -84,7 +84,7 @@ public TransformRunner provide() { return runner; } catch (Exception e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } }); @@ -99,7 +99,7 @@ static void main(TransformRunnerProvider provider) { try { provider.provide().runTransform(); } catch (Exception e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } @@ -121,7 +121,7 @@ static String[] readDependenciesFileFromSystemPropertyVar(String property) { String[] dependencies = line.split(DEPENDENCIES_SEPARATOR); return dependencies; } catch (IOException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } else { return new String[0]; diff --git a/transform-cli/src/main/java/com/uber/okbuck/transform/SystemClassLoader.java b/transform-cli/src/main/java/com/uber/okbuck/transform/SystemClassLoader.java index 0ee0ad910..57794af00 100644 --- a/transform-cli/src/main/java/com/uber/okbuck/transform/SystemClassLoader.java +++ b/transform-cli/src/main/java/com/uber/okbuck/transform/SystemClassLoader.java @@ -23,7 +23,7 @@ class SystemClassLoader { this.addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); this.addUrlMethod.setAccessible(true); } catch (NoSuchMethodException e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } } @@ -42,7 +42,7 @@ private void loadJarFile(String jarFilePath) { this.addUrlMethod.invoke(systemClassLoader, jarFileUrl); System.out.println("Added dependency: " + jarFileUrl.toString()); } catch (Exception e) { - throw new RuntimeException(e); + throw new IllegalStateException(e); } }