From 81e96164b907bd7098cc480558bf9f566fb24fbf Mon Sep 17 00:00:00 2001
From: Maxwell Mapako <wax911@users.noreply.github.com>
Date: Fri, 3 May 2024 11:30:25 +0200
Subject: [PATCH] hotfix(refactor): remove initialization module and update
 workflow (#205)

* chore: remove initializer module
* fix: build directory path resolution when using `layout.buildDirectory`
* feat(platform): update workflows (add workflow for publishing to maven local, aid us in catching publication issues sooner)
---
 .../workflows/android-publish-artifact.yml    | 44 ++++++++++++++++++
 ...android-test.yml => android-unit-test.yml} | 31 +------------
 .idea/gradle.xml                              |  1 -
 .idea/modules.xml                             |  4 --
 app/build.gradle.kts                          |  1 -
 .../wax911/emojifysample/EmojiInitializer.kt  | 24 ++++++++--
 build.gradle.kts                              | 10 +++++
 .../io/wax911/emoji/buildSrc/Libraries.kt     |  1 -
 .../wax911/emoji/buildSrc/module/Modules.kt   |  1 -
 .../plugin/components/AndroidConfiguration.kt |  2 +-
 .../plugin/components/AndroidOptions.kt       |  9 +---
 initializer/.gitignore                        |  1 -
 initializer/build.gradle.kts                  | 15 -------
 initializer/src/main/AndroidManifest.xml      | 15 -------
 .../initializer/AbstractEmojiInitializer.kt   | 45 -------------------
 settings.gradle.kts                           |  1 -
 16 files changed, 80 insertions(+), 125 deletions(-)
 create mode 100644 .github/workflows/android-publish-artifact.yml
 rename .github/workflows/{android-test.yml => android-unit-test.yml} (50%)
 delete mode 100644 initializer/.gitignore
 delete mode 100644 initializer/build.gradle.kts
 delete mode 100644 initializer/src/main/AndroidManifest.xml
 delete mode 100644 initializer/src/main/kotlin/io/wax911/emojify/initializer/AbstractEmojiInitializer.kt

diff --git a/.github/workflows/android-publish-artifact.yml b/.github/workflows/android-publish-artifact.yml
new file mode 100644
index 00000000..527492de
--- /dev/null
+++ b/.github/workflows/android-publish-artifact.yml
@@ -0,0 +1,44 @@
+name: android-publish-artifact
+
+on:
+  push:
+    branches: [ develop ]
+  pull_request:
+    branches:
+      - develop
+    paths-ignore:
+      - "app/src/main/**"
+
+permissions:
+  checks: write
+
+jobs:
+  publish:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - uses: gradle/wrapper-validation-action@v3
+      - name: set up JDK 17
+        uses: actions/setup-java@v4
+        with:
+          java-version: '17'
+          distribution: 'adopt'
+      - name: Wait for tests to succeed
+        uses: lewagon/wait-on-check-action@v1.3.3
+        with:
+          ref: ${{ github.ref }}
+          running-workflow-name: android-publish-artifact
+          check-name: android-unit-test
+          repo-token: ${{ secrets.GITHUB_TOKEN }}
+          wait-interval: 20
+      - uses: gradle/actions/setup-gradle@v3
+      - name: Grant execute permission for gradlew
+        run: chmod +x gradlew
+      - name: Publish to local maven
+        run: |
+          ./gradlew build publishMavenPublicationToMavenLocal
+      - name: Upload artifacts
+        uses: actions/upload-artifact@v3
+        with:
+          name: publications
+          path: ~/.m2/repository/io/wax911/emoji/
diff --git a/.github/workflows/android-test.yml b/.github/workflows/android-unit-test.yml
similarity index 50%
rename from .github/workflows/android-test.yml
rename to .github/workflows/android-unit-test.yml
index 50435998..e4e41aae 100644
--- a/.github/workflows/android-test.yml
+++ b/.github/workflows/android-unit-test.yml
@@ -1,4 +1,4 @@
-name: android-test
+name: android-unit-test
 
 on:
   push:
@@ -17,6 +17,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v4
+      - uses: gradle/actions/setup-gradle@v3
       - uses: gradle/wrapper-validation-action@v3
       - name: set up JDK 17
         uses: actions/setup-java@v4
@@ -35,31 +36,3 @@ jobs:
         if: always() # always run even if the previous step fails
         with:
           report_paths: '**/build/test-results/**/TEST-*.xml'
-
-  instrumented:
-    runs-on: macos-latest
-    strategy:
-      fail-fast: false
-      matrix:
-        api-level:
-          - 23
-    steps:
-      - uses: actions/checkout@v4
-      - uses: gradle/wrapper-validation-action@v3
-      - uses: actions/setup-java@v4
-        with:
-          java-version: '17'
-          distribution: 'adopt'
-      - uses: gradle/gradle-build-action@v3
-      - name: Run Tests
-        uses: reactivecircus/android-emulator-runner@v2
-        with:
-          api-level: ${{ matrix.api-level }}
-          script: ./gradlew connectedCheck
-        env:
-          API_LEVEL: ${{ matrix.api-level }}
-      - name: Publish Integrated Test Report
-        uses: mikepenz/action-junit-report@v4
-        if: always() # always run even if the previous step fails
-        with:
-          report_paths: '**/build/androidTest-results/**/TEST-*.xml'
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 4e086b50..e47aa851 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -24,7 +24,6 @@
             <option value="$PROJECT_DIR$/buildSrc" />
             <option value="$PROJECT_DIR$/contract" />
             <option value="$PROJECT_DIR$/emojify" />
-            <option value="$PROJECT_DIR$/initializer" />
             <option value="$PROJECT_DIR$/serializer" />
             <option value="$PROJECT_DIR$/serializer/gson" />
             <option value="$PROJECT_DIR$/serializer/kotlinx" />
diff --git a/.idea/modules.xml b/.idea/modules.xml
index eedc2212..53fdf999 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -18,10 +18,6 @@
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/emojify/android-emojify.emojify.androidTest.iml" filepath="$PROJECT_DIR$/.idea/modules/emojify/android-emojify.emojify.androidTest.iml" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/emojify/android-emojify.emojify.main.iml" filepath="$PROJECT_DIR$/.idea/modules/emojify/android-emojify.emojify.main.iml" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/emojify/android-emojify.emojify.unitTest.iml" filepath="$PROJECT_DIR$/.idea/modules/emojify/android-emojify.emojify.unitTest.iml" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/initializer/android-emojify.initializer.iml" filepath="$PROJECT_DIR$/.idea/modules/initializer/android-emojify.initializer.iml" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/initializer/android-emojify.initializer.androidTest.iml" filepath="$PROJECT_DIR$/.idea/modules/initializer/android-emojify.initializer.androidTest.iml" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/initializer/android-emojify.initializer.main.iml" filepath="$PROJECT_DIR$/.idea/modules/initializer/android-emojify.initializer.main.iml" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/initializer/android-emojify.initializer.unitTest.iml" filepath="$PROJECT_DIR$/.idea/modules/initializer/android-emojify.initializer.unitTest.iml" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/serializer/android-emojify.serializer.iml" filepath="$PROJECT_DIR$/.idea/modules/serializer/android-emojify.serializer.iml" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/serializer/gson/android-emojify.serializer.gson.iml" filepath="$PROJECT_DIR$/.idea/modules/serializer/gson/android-emojify.serializer.gson.iml" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/serializer/gson/android-emojify.serializer.gson.androidTest.iml" filepath="$PROJECT_DIR$/.idea/modules/serializer/gson/android-emojify.serializer.gson.androidTest.iml" />
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index aab2a756..8040c76d 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -7,7 +7,6 @@ plugins {
 dependencies {
     implementation(project(Libraries.AniTrend.Emojify.emojify))
     implementation(project(Libraries.AniTrend.Emojify.contract))
-    implementation(project(Libraries.AniTrend.Emojify.initializer))
     implementation(project(Libraries.AniTrend.Emojify.serializerKotlinx))
 
     implementation(libs.google.android.material)
diff --git a/app/src/main/java/io/wax911/emojifysample/EmojiInitializer.kt b/app/src/main/java/io/wax911/emojifysample/EmojiInitializer.kt
index c5f55764..80f689fd 100644
--- a/app/src/main/java/io/wax911/emojifysample/EmojiInitializer.kt
+++ b/app/src/main/java/io/wax911/emojifysample/EmojiInitializer.kt
@@ -1,9 +1,27 @@
 package io.wax911.emojifysample
 
+import android.content.Context
+import androidx.startup.Initializer
+import io.wax911.emojify.EmojiManager
 import io.wax911.emojify.contract.serializer.IEmojiDeserializer
-import io.wax911.emojify.initializer.AbstractEmojiInitializer
 import io.wax911.emojify.serializer.kotlinx.KotlinxDeserializer
 
-class EmojiInitializer : AbstractEmojiInitializer() {
-    override val serializer: IEmojiDeserializer = KotlinxDeserializer()
+class EmojiInitializer : Initializer<EmojiManager> {
+    private val serializer: IEmojiDeserializer = KotlinxDeserializer()
+
+    /**
+     * Initializes and a component given the application [Context]
+     *
+     * @param context The application context.
+     */
+    override fun create(context: Context) = EmojiManager.create(context, serializer)
+
+    /**
+     * @return A list of dependencies that this [Initializer] depends on. This is
+     * used to determine initialization order of [Initializer]s.
+     *
+     * For e.g. if a [Initializer] `B` defines another
+     * [Initializer] `A` as its dependency, then `A` gets initialized before `B`.
+     */
+    override fun dependencies() = emptyList<Class<out Initializer<*>>>()
 }
diff --git a/build.gradle.kts b/build.gradle.kts
index 7986ce1a..7e29485a 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,4 +1,9 @@
 // Top-level build file where you can add configuration options common to all sub-projects/modules.
+import org.jetbrains.dokka.gradle.DokkaMultiModuleTask
+
+plugins {
+    id("org.jetbrains.dokka")
+}
 
 buildscript {
     repositories {
@@ -18,3 +23,8 @@ allprojects {
         mavenCentral()
     }
 }
+
+tasks.withType(DokkaMultiModuleTask::class.java) {
+    outputDirectory.set(rootProject.file("dokka-docs"))
+    failOnWarning.set(false)
+}
diff --git a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/Libraries.kt b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/Libraries.kt
index ebb594df..65ffe12a 100644
--- a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/Libraries.kt
+++ b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/Libraries.kt
@@ -8,7 +8,6 @@ object Libraries {
         object Emojify {
             val emojify = Modules.Library.Emojify.path()
             val contract = Modules.Library.Contract.path()
-            val initializer = Modules.Library.Initializer.path()
             val serializerKotlinx = Modules.Library.SerializerKotlinX.path()
             val serializerGson = Modules.Library.SerializerGson.path()
             val serializerMoshi = Modules.Library.SerializerMoshi.path()
diff --git a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/module/Modules.kt b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/module/Modules.kt
index 7c007ad5..a0f0a1b9 100644
--- a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/module/Modules.kt
+++ b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/module/Modules.kt
@@ -18,7 +18,6 @@ internal object Modules {
     enum class Library(override val id: String) : Module {
         Emojify("emojify"),
         Contract("contract"),
-        Initializer("initializer"),
         SerializerKotlinX("serializer:kotlinx"),
         SerializerGson("serializer:gson"),
         SerializerMoshi("serializer:moshi"),
diff --git a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidConfiguration.kt b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidConfiguration.kt
index 02402faa..c8c36377 100644
--- a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidConfiguration.kt
+++ b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidConfiguration.kt
@@ -19,7 +19,7 @@ internal fun Project.configureSpotless() {
         spotlessExtension().run {
             kotlin {
                 target("**/kotlin/**/*.kt")
-                targetExclude("${layout.buildDirectory}/**/*.kt", "**/test/**/*.kt", "bin/**/*.kt")
+                targetExclude("${layout.buildDirectory.get()}/**/*.kt", "**/test/**/*.kt", "bin/**/*.kt")
                 ktlint(libs.versions.ktlint.get())
                 licenseHeaderFile(rootProject.file("spotless/copyright.kt"))
             }
diff --git a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidOptions.kt b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidOptions.kt
index eb114c2a..28a17bc2 100644
--- a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidOptions.kt
+++ b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidOptions.kt
@@ -18,10 +18,6 @@ import java.net.URL
 
 private fun Project.dependenciesOfProject(): List<Modules.Module> {
     return when (project.name) {
-        Modules.Library.Initializer.id -> listOf(
-            Modules.Library.Contract,
-            Modules.Library.Emojify,
-        )
         Modules.Library.Emojify.id -> listOf(
             Modules.Library.Contract,
         )
@@ -46,7 +42,7 @@ private fun Project.createMavenPublicationUsing(sourcesJar: Jar) {
             version = props[PropertyTypes.VERSION]
 
             artifact(sourcesJar)
-            artifact("${project.layout.buildDirectory}/outputs/aar/${project.name}-release.aar")
+            artifact("${project.layout.buildDirectory.get()}/outputs/aar/${project.name}-release.aar")
             from(component)
 
             pom {
@@ -185,7 +181,6 @@ private fun Project.createDokkaTaskProvider() = tasks.named<DokkaTask>("dokkaHtm
     }
 }
 
-
 internal fun Project.configureOptions() {
     if (isLibraryModule()) {
         println("Applying additional tasks options for dokka and javadoc on ${project.path}")
@@ -198,7 +193,7 @@ internal fun Project.configureOptions() {
         }
 
         val classesJar by tasks.register("classesJar", Jar::class.java) {
-            from("${project.layout.buildDirectory}/intermediates/classes/release")
+            from("${project.layout.buildDirectory.get()}/intermediates/classes/release")
         }
 
         artifacts {
diff --git a/initializer/.gitignore b/initializer/.gitignore
deleted file mode 100644
index 42afabfd..00000000
--- a/initializer/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/build
\ No newline at end of file
diff --git a/initializer/build.gradle.kts b/initializer/build.gradle.kts
deleted file mode 100644
index 01d5a59d..00000000
--- a/initializer/build.gradle.kts
+++ /dev/null
@@ -1,15 +0,0 @@
-import io.wax911.emoji.buildSrc.Libraries
-
-plugins {
-    id("io.wax911.emojify")
-}
-
-android {
-    namespace = "io.wax911.emojify.initializer"
-}
-
-dependencies {
-    implementation(project(Libraries.AniTrend.Emojify.contract))
-    implementation(project(Libraries.AniTrend.Emojify.emojify))
-    api(libs.androidx.startup.runtime)
-}
diff --git a/initializer/src/main/AndroidManifest.xml b/initializer/src/main/AndroidManifest.xml
deleted file mode 100644
index 87c00b74..00000000
--- a/initializer/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-
-    <application>
-        <provider
-            android:name="androidx.startup.InitializationProvider"
-            android:authorities="${applicationId}.androidx-startup"
-            android:exported="false"
-            tools:node="merge">
-            <meta-data
-                android:name="io.wax911.emojify.initializer.AbstractEmojiInitializer"
-                android:value="androidx.startup" />
-        </provider>
-    </application>
-</manifest>
diff --git a/initializer/src/main/kotlin/io/wax911/emojify/initializer/AbstractEmojiInitializer.kt b/initializer/src/main/kotlin/io/wax911/emojify/initializer/AbstractEmojiInitializer.kt
deleted file mode 100644
index 0fbe9bd5..00000000
--- a/initializer/src/main/kotlin/io/wax911/emojify/initializer/AbstractEmojiInitializer.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2021 AniTrend
- *
- * 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
- *
- *     https://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.wax911.emojify.initializer
-
-import android.content.Context
-import androidx.startup.Initializer
-import io.wax911.emojify.EmojiManager
-import io.wax911.emojify.contract.serializer.IEmojiDeserializer
-
-/**
- * Abstract the logic of Initializer<EmojiManager> so that
- */
-abstract class AbstractEmojiInitializer : Initializer<EmojiManager> {
-    abstract val serializer: IEmojiDeserializer
-
-    /**
-     * Initializes and a component given the application [Context]
-     *
-     * @param context The application context.
-     */
-    override fun create(context: Context) = EmojiManager.create(context, serializer)
-
-    /**
-     * @return A list of dependencies that this [Initializer] depends on. This is
-     * used to determine initialization order of [Initializer]s.
-     *
-     * For e.g. if a [Initializer] `B` defines another
-     * [Initializer] `A` as its dependency, then `A` gets initialized before `B`.
-     */
-    override fun dependencies() = emptyList<Class<out Initializer<*>>>()
-}
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 65cc4f1c..f97aa859 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -1,7 +1,6 @@
 rootProject.name = "android-emojify"
 include(":emojify")
 include(":contract")
-include(":initializer")
 include(":serializer:kotlinx")
 include(":serializer:gson")
 include(":serializer:moshi")