From 94d420f98c562b546ba9d39daa3e09ff20c884eb Mon Sep 17 00:00:00 2001 From: Smart Tool Factory Date: Wed, 9 Sep 2020 14:00:12 +0300 Subject: [PATCH] update README.md --- README.md | 24 +++++++++++++++++++----- screenshots/modules.png | Bin 0 -> 21880 bytes 2 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 screenshots/modules.png diff --git a/README.md b/README.md index 7e99c8e..799783d 100755 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ [![ktlint](https://img.shields.io/badge/code%20style-%E2%9D%A4-FF4081.svg)](https://ktlint.github.io/) [![Kotlin Version](https://img.shields.io/badge/kotlin-1.4.0-blue.svg)](https://kotlinlang.org) [![API](https://img.shields.io/badge/API-21%2B-brightgreen.svg?style=flat)](https://android-arsenal.com/api?level=21) +[![codecov](https://codecov.io/gh/andremion/Theatre/graph/badge.svg)](https://codecov.io/gh/andremion/Theatre) + ## About @@ -23,7 +25,8 @@ Unit tests are written with JUnit4, JUnit5, MockK, Truth, MockWebServer. * In core module dagger hilt dependencies and ```@EntryPoint``` is created * Data module uses Retrofit and Room to provide Local and Remote data sources * Repository provides offline and remote fetch function with mapping and local save, delete and fetch functions -* Pagination with database +* Domain module uses useCase classes to implment business logic to fetch and forward data +* ViewModel uses LiveData with data-binding to display LOADING, and ERROR or SUCCESS states. ## Built With 🛠 @@ -54,11 +57,22 @@ Some of the popular libraries and MVVM clean architecture used with offline-firs * Offline first/last with Room an Retrofit * [Dynamic feature modules](https://developer.android.com/studio/projects/dynamic-delivery) * Tests - * [Unit Tests](https://en.wikipedia.org/wiki/Unit_testing) ([JUnit](https://junit.org/junit4/)) - * [Mockk](https://mockk.io/) - * + * [Unit Tests](https://en.wikipedia.org/wiki/Unit_testing) ([JUnit5](https://junit.org/junit5/)) ([JUnit4](https://junit.org/junit4/)) + * [MockWebServer](https://github.com/square/okhttp/tree/master/mockwebserver) Mock server for testing Api requests with OkHttp and Retrofit + * [Mockk](https://mockk.io/) Mockking library for Kotlin + * [Truth](https://truth.dev) Assertion library * Gradle * [Gradle Kotlin DSL](https://docs.gradle.org/current/userguide/kotlin_dsl.html) * Custom tasks - * Plugins ([Ktlint](https://github.com/JLLeitschuh/ktlint-gradle), [Detekt](https://github.com/arturbosch/detekt#with-gradle), [SafeArgs](https://developer.android.com/guide/navigation/navigation-pass-data#Safe-args)) + * Plugins ([Ktlint](https://github.com/JLLeitschuh/ktlint-gradle), [Detekt](https://github.com/arturbosch/detekt#with-gradle), [SafeArgs](https://developer.android.com/guide/navigation/navigation-pass-data#Safe-args)), [Git Hooks](https://githooks.com) + + +### Modularaization, Library and Feature Modules + +Uses both library modules and dynamic feature modules + +## Architecture + +Uses concepts of clean architecture + diff --git a/screenshots/modules.png b/screenshots/modules.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c45954607212bf06b59d304d21e953552bc9a9 GIT binary patch literal 21880 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