Skip to content

Commit

Permalink
Merge pull request #129 from ShikaSD/extract-binder
Browse files Browse the repository at this point in the history
Extract binder from mvicore module
  • Loading branch information
Andrei Shikov committed Jul 31, 2020
2 parents 773386a + 05a7012 commit 1663cb5
Show file tree
Hide file tree
Showing 46 changed files with 148 additions and 92 deletions.
5 changes: 5 additions & 0 deletions README.md
Expand Up @@ -40,6 +40,11 @@ Add the dependencies:
implementation 'com.github.badoo.mvicore:mvicore:{latest-version}'
```

- Binder (for versions higher than 1.2.4)
```groovy
implementation 'com.github.badoo.mvicore:binder:{latest-version}'
```

- Helper classes for Android:
```groovy
implementation 'com.github.badoo.mvicore:mvicore-android:{latest-version}'
Expand Down
1 change: 1 addition & 0 deletions binder/.gitignore
@@ -0,0 +1 @@
/build
49 changes: 49 additions & 0 deletions binder/build.gradle
@@ -0,0 +1,49 @@
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'kotlin'
apply plugin: 'org.jetbrains.dokka'

group = 'com.github.badoo.mvicore'

buildscript {
repositories {
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$rootProject.ext.kotlinVersion"
}
}

repositories {
jcenter()
}

dependencies {
def deps = rootProject.ext.deps

implementation deps('io.reactivex.rxjava2:rxjava')
implementation deps('io.reactivex.rxjava2:rxkotlin')
implementation deps("org.jetbrains.kotlin:kotlin-stdlib-jdk7")

testImplementation deps('junit:junit')
testImplementation deps('org.jetbrains.kotlin:kotlin-test-junit')
testImplementation deps('com.nhaarman:mockito-kotlin')
}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"

task packageSources(type: Jar, dependsOn: 'classes') {
classifier = 'sources'
from sourceSets.main.allSource
}

task packageJavadoc(type: Jar, dependsOn: javadoc) {
from javadoc.outputDirectory
classifier = 'javadoc'
}

artifacts {
archives packageSources
archives packageJavadoc
}
@@ -1,10 +1,10 @@
package com.badoo.mvicore.binder
package com.badoo.binder

import com.badoo.mvicore.binder.lifecycle.Lifecycle
import com.badoo.mvicore.binder.lifecycle.Lifecycle.Event.BEGIN
import com.badoo.mvicore.binder.lifecycle.Lifecycle.Event.END
import com.badoo.mvicore.consumer.middleware.base.Middleware
import com.badoo.mvicore.consumer.wrapWithMiddleware
import com.badoo.binder.lifecycle.Lifecycle
import com.badoo.binder.lifecycle.Lifecycle.Event.BEGIN
import com.badoo.binder.lifecycle.Lifecycle.Event.END
import com.badoo.binder.middleware.base.Middleware
import com.badoo.binder.middleware.wrapWithMiddleware
import io.reactivex.Observable
import io.reactivex.Observable.wrap
import io.reactivex.ObservableSource
Expand Down
@@ -1,7 +1,7 @@
package com.badoo.mvicore.binder
package com.badoo.binder

import com.badoo.mvicore.connector.Connector
import com.badoo.mvicore.connector.NotNullConnector
import com.badoo.binder.connector.Connector
import com.badoo.binder.connector.NotNullConnector
import io.reactivex.ObservableSource
import io.reactivex.functions.Consumer

Expand Down
@@ -1,4 +1,4 @@
package com.badoo.mvicore.connector
package com.badoo.binder.connector

import io.reactivex.ObservableSource

Expand Down
@@ -1,4 +1,4 @@
package com.badoo.mvicore.connector
package com.badoo.binder.connector

import io.reactivex.Observable
import io.reactivex.Observable.wrap
Expand Down
@@ -1,6 +1,6 @@
package com.badoo.mvicore.binder.lifecycle
package com.badoo.binder.lifecycle

import com.badoo.mvicore.binder.lifecycle.internal.FromObservableSource
import com.badoo.binder.lifecycle.internal.FromObservableSource
import io.reactivex.ObservableSource

interface Lifecycle : ObservableSource<Lifecycle.Event> {
Expand Down
@@ -1,8 +1,8 @@
package com.badoo.mvicore.binder.lifecycle
package com.badoo.binder.lifecycle

import com.badoo.mvicore.binder.lifecycle.Lifecycle.Event
import com.badoo.mvicore.binder.lifecycle.Lifecycle.Event.BEGIN
import com.badoo.mvicore.binder.lifecycle.Lifecycle.Event.END
import com.badoo.binder.lifecycle.Lifecycle.Event
import com.badoo.binder.lifecycle.Lifecycle.Event.BEGIN
import com.badoo.binder.lifecycle.Lifecycle.Event.END
import io.reactivex.subjects.BehaviorSubject

class ManualLifecycle(private val subject : BehaviorSubject<Event> = BehaviorSubject.create()) : Lifecycle by Lifecycle.wrap(subject) {
Expand Down
@@ -1,6 +1,6 @@
package com.badoo.mvicore.binder.lifecycle.internal
package com.badoo.binder.lifecycle.internal

import com.badoo.mvicore.binder.lifecycle.Lifecycle
import com.badoo.binder.lifecycle.Lifecycle
import io.reactivex.ObservableSource

internal class FromObservableSource(
Expand Down
@@ -1,17 +1,17 @@
package com.badoo.mvicore.consumer
package com.badoo.binder.middleware

import com.badoo.mvicore.consumer.middleware.base.Middleware
import com.badoo.mvicore.consumer.middleware.base.StandaloneMiddleware
import com.badoo.mvicore.consumer.middlewareconfig.Middlewares
import com.badoo.mvicore.consumer.middlewareconfig.NonWrappable
import com.badoo.binder.middleware.base.Middleware
import com.badoo.binder.middleware.base.StandaloneMiddleware
import com.badoo.binder.middleware.config.Middlewares
import com.badoo.binder.middleware.config.NonWrappable
import io.reactivex.functions.Consumer

/**
* Wraps a Consumer<T> with Middlewares. The list of Middlewares that will be applied is resolved
* by calling on all available [com.badoo.mvicore.consumer.middlewareconfig.MiddlewareConfiguration]
*
* @param standalone Whether the Consumer<T> is used as a standalone target (true), or as
* part of a [com.badoo.mvicore.binder.Connection] used by [com.badoo.mvicore.binder.Binder].
* part of a [Connection] used by [Binder].
* Defaults to true. In most cases you should not need to override the default value.
* @param name The name for the wrapping. Useful to add MiddlewareConfiguration
* that only applies to named wrappings, or to make them human-readable
Expand Down Expand Up @@ -49,7 +49,7 @@ fun <In> Consumer<In>.wrapWithMiddleware(
"Use wrapWithMiddleware directly",
ReplaceWith(
"wrapWithMiddleware(standalone, name, postfix, wrapperOf)",
"com.badoo.mvicore.consumer.wrapWithMiddleware"
"com.badoo.binder.middleware.wrapWithMiddleware"
)
)
fun <In: Any> Consumer<In>.wrap(
Expand Down
@@ -1,6 +1,6 @@
package com.badoo.mvicore.consumer.middleware.base
package com.badoo.binder.middleware.base

import com.badoo.mvicore.binder.Connection
import com.badoo.binder.Connection
import io.reactivex.functions.Consumer

abstract class Middleware<Out, In>(
Expand Down
@@ -1,6 +1,6 @@
package com.badoo.mvicore.consumer.middleware.base
package com.badoo.binder.middleware.base

import com.badoo.mvicore.binder.Connection
import com.badoo.binder.Connection
import io.reactivex.disposables.Disposable

internal class StandaloneMiddleware<In>(
Expand Down
@@ -1,6 +1,6 @@
package com.badoo.mvicore.consumer.middlewareconfig
package com.badoo.binder.middleware.config

import com.badoo.mvicore.consumer.middleware.base.Middleware
import com.badoo.binder.middleware.base.Middleware
import io.reactivex.functions.Consumer

typealias ConsumerMiddlewareFactory<T> = (Consumer<T>) -> Middleware<Any, T>
@@ -1,6 +1,6 @@
package com.badoo.mvicore.consumer.middlewareconfig
package com.badoo.binder.middleware.config

import com.badoo.mvicore.consumer.middleware.base.Middleware
import com.badoo.binder.middleware.base.Middleware
import io.reactivex.functions.Consumer

data class MiddlewareConfiguration(
Expand Down
@@ -1,4 +1,4 @@
package com.badoo.mvicore.consumer.middlewareconfig
package com.badoo.binder.middleware.config

object Middlewares {
val configurations: MutableList<MiddlewareConfiguration> = mutableListOf()
Expand Down
@@ -0,0 +1,3 @@
package com.badoo.binder.middleware.config

interface NonWrappable
@@ -1,4 +1,4 @@
package com.badoo.mvicore.consumer.middlewareconfig
package com.badoo.binder.middleware.config

interface WrappingCondition {

Expand Down
@@ -1,10 +1,7 @@
package com.badoo.mvicore.binder
package com.badoo.binder

import com.badoo.mvicore.TestConsumer
import com.badoo.mvicore.assertValues
import com.badoo.mvicore.connector.Connector
import io.reactivex.Observable.just
import io.reactivex.Observable.wrap
import com.badoo.binder.connector.Connector
import io.reactivex.Observable
import io.reactivex.ObservableSource
import io.reactivex.subjects.PublishSubject
import org.junit.Test
Expand Down Expand Up @@ -49,8 +46,8 @@ class BinderTest {

object TestConnector: Connector<Int, String> {
override fun invoke(it: ObservableSource<out Int>): ObservableSource<String> =
wrap(it).flatMap {
just(it.toString(), (it + 1).toString())
Observable.wrap(it).flatMap {
Observable.just(it.toString(), (it + 1).toString())
}
}
}
@@ -1,10 +1,7 @@
package com.badoo.mvicore.lifecycle
package com.badoo.binder

import com.badoo.mvicore.TestConsumer
import com.badoo.mvicore.assertValues
import com.badoo.mvicore.binder.Binder
import com.badoo.mvicore.binder.lifecycle.Lifecycle
import com.badoo.mvicore.binder.lifecycle.ManualLifecycle
import com.badoo.binder.lifecycle.Lifecycle
import com.badoo.binder.lifecycle.ManualLifecycle
import com.nhaarman.mockito_kotlin.any
import com.nhaarman.mockito_kotlin.mock
import com.nhaarman.mockito_kotlin.times
Expand Down
@@ -1,4 +1,4 @@
package com.badoo.mvicore
package com.badoo.binder

import io.reactivex.functions.Consumer
import kotlin.test.assertEquals
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
@@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
ext.kotlinVersion = '1.3.40'
ext.kotlinVersion = '1.3.72'

repositories {
google()
Expand Down
4 changes: 3 additions & 1 deletion documentation/binder/binder.md
@@ -1,5 +1,8 @@
# Binder usage and lifecycle

!!! warning ""
After 1.2.4, `Binder` is located in a separate module. You may need to add dependency on `com.github.badoo.mvicore:binder` to have it available.

## What is the Binder and why is it good for me?

If you wrote your first `Feature`, now you may wonder how to start using it.
Expand All @@ -17,7 +20,6 @@ The `Binder` is a tool that can:
- dispose of this subscription when its lifecycle expires
- automatically add `Middlewares` around all inputs (logging and time travel debugging, or your custom one)


## Binder creation

Creating an instance is as simple as:
Expand Down
@@ -1,9 +1,7 @@
package com.badoo.mvicore.android

import android.arch.lifecycle.LifecycleOwner
import com.badoo.mvicore.binder.Binder
import android.arch.lifecycle.Lifecycle as AndroidLifecycle
import com.badoo.mvicore.binder.lifecycle.Lifecycle as BinderLifecycle
import com.badoo.binder.Binder

abstract class AndroidBindings<T : Any>(
lifecycleOwner: LifecycleOwner
Expand Down
Expand Up @@ -5,7 +5,7 @@ import android.arch.lifecycle.LifecycleObserver
import io.reactivex.ObservableSource
import io.reactivex.subjects.BehaviorSubject
import android.arch.lifecycle.Lifecycle as AndroidLifecycle
import com.badoo.mvicore.binder.lifecycle.Lifecycle as BinderLifecycle
import com.badoo.binder.lifecycle.Lifecycle as BinderLifecycle

abstract class BaseAndroidBinderLifecycle private constructor(
androidLifecycle: AndroidLifecycle,
Expand Down
Expand Up @@ -3,7 +3,7 @@ package com.badoo.mvicore.android.lifecycle
import android.arch.lifecycle.DefaultLifecycleObserver
import android.arch.lifecycle.LifecycleOwner
import android.arch.lifecycle.Lifecycle as AndroidLifecycle
import com.badoo.mvicore.binder.lifecycle.Lifecycle as BinderLifecycle
import com.badoo.binder.lifecycle.Lifecycle as BinderLifecycle


class CreateDestroyBinderLifecycle(
Expand Down
@@ -1,7 +1,7 @@
package com.badoo.mvicore.android.lifecycle

import android.arch.lifecycle.Lifecycle
import com.badoo.mvicore.binder.Binder
import com.badoo.binder.Binder

fun Lifecycle.createDestroy(f: Binder.() -> Unit) {
Binder(CreateDestroyBinderLifecycle(this)).apply(f)
Expand Down
Expand Up @@ -3,7 +3,7 @@ package com.badoo.mvicore.android.lifecycle
import android.arch.lifecycle.DefaultLifecycleObserver
import android.arch.lifecycle.LifecycleOwner
import android.arch.lifecycle.Lifecycle as AndroidLifecycle
import com.badoo.mvicore.binder.lifecycle.Lifecycle as BinderLifecycle
import com.badoo.binder.lifecycle.Lifecycle as BinderLifecycle


class ResumePauseBinderLifecycle(
Expand Down
Expand Up @@ -3,7 +3,7 @@ package com.badoo.mvicore.android.lifecycle
import android.arch.lifecycle.DefaultLifecycleObserver
import android.arch.lifecycle.LifecycleOwner
import android.arch.lifecycle.Lifecycle as AndroidLifecycle
import com.badoo.mvicore.binder.lifecycle.Lifecycle as BinderLifecycle
import com.badoo.binder.lifecycle.Lifecycle as BinderLifecycle


class StartStopBinderLifecycle(
Expand Down
Expand Up @@ -2,12 +2,12 @@ package com.badoo.mvicoredemo

import android.annotation.SuppressLint
import android.app.Application
import com.badoo.binder.middleware.config.MiddlewareConfiguration
import com.badoo.binder.middleware.config.Middlewares
import com.badoo.binder.middleware.config.WrappingCondition
import com.badoo.mvicore.consumer.middleware.LoggingMiddleware
import com.badoo.mvicore.consumer.middleware.PlaybackMiddleware
import com.badoo.mvicore.consumer.middleware.PlaybackMiddleware.RecordStore
import com.badoo.mvicore.consumer.middlewareconfig.MiddlewareConfiguration
import com.badoo.mvicore.consumer.middlewareconfig.Middlewares
import com.badoo.mvicore.consumer.middlewareconfig.WrappingCondition
import com.badoo.mvicore.middleware.DefaultPluginStore
import com.badoo.mvicore.middleware.IdeaPluginMiddleware
import com.badoo.mvicoredemo.di.appscope.component.AppScopedComponent
Expand Down
Expand Up @@ -5,11 +5,11 @@ import android.support.v4.view.GravityCompat
import android.support.v7.app.AppCompatActivity
import android.util.Log
import android.view.MenuItem
import com.badoo.binder.Binder
import com.badoo.binder.named
import com.badoo.mvicore.android.lifecycle.CreateDestroyBinderLifecycle
import com.badoo.mvicore.android.lifecycle.ResumePauseBinderLifecycle
import com.badoo.mvicore.android.lifecycle.StartStopBinderLifecycle
import com.badoo.mvicore.binder.Binder
import com.badoo.mvicore.binder.named
import com.badoo.mvicoredemo.R
import init
import io.reactivex.functions.Consumer
Expand Down
@@ -1,10 +1,10 @@
package com.badoo.mvicoredemo.ui.main

import com.badoo.binder.named
import com.badoo.binder.using
import com.badoo.feature1.Feature1
import com.badoo.feature2.Feature2
import com.badoo.mvicore.android.AndroidBindings
import com.badoo.mvicore.binder.named
import com.badoo.mvicore.binder.using
import com.badoo.mvicoredemo.ui.main.analytics.FakeAnalyticsTracker
import com.badoo.mvicoredemo.ui.main.event.UiEventTransformer1
import com.badoo.mvicoredemo.ui.main.event.UiEventTransformer2
Expand Down
@@ -1,6 +1,6 @@
package com.badoo.mvicore.middleware

import com.badoo.mvicore.binder.Connection
import com.badoo.binder.Connection
import com.badoo.mvicore.middleware.data.parse
import com.badoo.mvicore.middleware.gc.QueueWatcher
import com.badoo.mvicore.middleware.gson.MviPluginTypeAdapterFactory
Expand Down

0 comments on commit 1663cb5

Please sign in to comment.