Skip to content

feature: KTX property delegation custom labels #1066

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ktx/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ class Cat : ParseObject() {
class Cat : ParseObject() {

var name: String by stringAttribute() // That's it
var legs: Int by intAttribute("cat-legs")

}
```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ import kotlin.reflect.KProperty
/**
* A [Boolean] property delegation for [ParseObject].
*/
class BooleanParseDelegate {
class BooleanParseDelegate(private val name: String?) {

operator fun getValue(parseObject: ParseObject, property: KProperty<*>): Boolean {
return parseObject.getBoolean(property.name)
return parseObject.getBoolean(name ?: property.name)
}

operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: Boolean) {
parseObject.put(property.name, value)
parseObject.put(name ?: property.name, value)
}

}
Expand All @@ -24,4 +24,4 @@ class BooleanParseDelegate {
* Returns a [Boolean] property delegate for [ParseObject]s. This uses [ParseObject.getBoolean]
* and [ParseObject.put].
*/
inline fun booleanAttribute() = BooleanParseDelegate()
inline fun booleanAttribute(name: String? = null) = BooleanParseDelegate(name)
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ import kotlin.reflect.KProperty
/**
* A [ByteArray] property delegation for [ParseObject].
*/
class BytesParseDelegate {
class BytesParseDelegate(private val name: String?) {

operator fun getValue(parseObject: ParseObject, property: KProperty<*>): ByteArray? {
return parseObject.getBytes(property.name)
return parseObject.getBytes(name ?: property.name)
}

operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: ByteArray?) {
parseObject.putOrIgnore(property.name, value)
parseObject.putOrIgnore(name ?:property.name, value)
}

}
Expand All @@ -25,4 +25,4 @@ class BytesParseDelegate {
* Returns a [ByteArray] property delegate for [ParseObject]s. This uses [ParseObject.getBytes]
* and [ParseObject.putOrIgnore].
*/
inline fun bytesAttribute() = BytesParseDelegate()
inline fun bytesAttribute(name: String? = null) = BytesParseDelegate(name)
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ import kotlin.reflect.KProperty
/**
* A [Double] property delegation for [ParseObject].
*/
class DoubleParseDelegate {
class DoubleParseDelegate(private val name: String?) {

operator fun getValue(parseObject: ParseObject, property: KProperty<*>): Double {
return parseObject.getDouble(property.name)
return parseObject.getDouble(name ?: property.name)
}

operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: Double) {
parseObject.put(property.name, value)
parseObject.put(name ?: property.name, value)
}

}
Expand All @@ -24,4 +24,4 @@ class DoubleParseDelegate {
* Returns a [Double] property delegate for [ParseObject]s. This uses [ParseObject.getDouble]
* and [ParseObject.put].
*/
inline fun doubleAttribute() = DoubleParseDelegate()
inline fun doubleAttribute(name: String? = null) = DoubleParseDelegate(name)
18 changes: 14 additions & 4 deletions ktx/src/main/java/com/parse/ktx/delegates/EnumParseDelegate.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,22 @@ import kotlin.reflect.KProperty
* This implementation save enum's name in lower case on parse-server and when try retrieve it
* convert again to upper case to find correspondent local enum.
*/
class EnumParseDelegate<T : Enum<T>>(private val default: T?, private val enumClass: Class<T>) {
class EnumParseDelegate<T : Enum<T>>(
private val name: String?,
private val default: T?,
private val enumClass: Class<T>
) {

operator fun getValue(parseObject: ParseObject, property: KProperty<*>): T {
return try {
java.lang.Enum.valueOf(enumClass, parseObject.getString(property.name)!!.toUpperCase())
java.lang.Enum.valueOf(enumClass, parseObject.getString(name ?: property.name)!!.toUpperCase())
} catch (e: Exception) {
default ?: throw e
}
}

operator fun setValue(parseObject: ParseObject, property: KProperty<*>, t: T) {
parseObject.put(property.name, t.name.toLowerCase())
parseObject.put(name ?: property.name, t.name.toLowerCase())
}

}
Expand All @@ -31,4 +35,10 @@ class EnumParseDelegate<T : Enum<T>>(private val default: T?, private val enumCl
* Returns a [Enum] property delegate for [ParseObject]s. This uses custom implementation for get
* to retrieve a local version of the your enum and [ParseObject.put].
*/
inline fun <reified T : Enum<T>> enumAttribute(default: T? = null) = EnumParseDelegate(default, T::class.java)
inline fun <reified T : Enum<T>> enumAttribute(default: T? = null) = EnumParseDelegate(null, default, T::class.java)

/**
* Returns a [Enum] property delegate for [ParseObject]s. This uses custom implementation for get
* to retrieve a local version of the your enum and [ParseObject.put].
*/
inline fun <reified T : Enum<T>> enumAttribute(name: String? = null, default: T? = null) = EnumParseDelegate(name, default, T::class.java)
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ import kotlin.reflect.KProperty
/**
* A [Float] property delegation for [ParseObject].
*/
class FloatParseDelegate {
class FloatParseDelegate(private val name: String?) {

operator fun getValue(parseObject: ParseObject, property: KProperty<*>): Float {
return parseObject.getDouble(property.name).toFloat()
return parseObject.getDouble(name ?: property.name).toFloat()
}

operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: Float) {
parseObject.put(property.name, value)
parseObject.put(name ?: property.name, value)
}

}
Expand All @@ -24,4 +24,4 @@ class FloatParseDelegate {
* Returns a [Float] property delegate for [ParseObject]s. This uses a custom implementation for get
* and [ParseObject.put].
*/
inline fun floatAttribute() = FloatParseDelegate()
inline fun floatAttribute(name: String? = null) = FloatParseDelegate(name)
8 changes: 4 additions & 4 deletions ktx/src/main/java/com/parse/ktx/delegates/IntParseDelegate.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ import kotlin.reflect.KProperty
/**
* A [Int] property delegation for [ParseObject].
*/
class IntParseDelegate {
class IntParseDelegate(private val name: String?) {

operator fun getValue(parseObject: ParseObject, property: KProperty<*>): Int {
return parseObject.getInt(property.name)
return parseObject.getInt(name ?: property.name)
}

operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: Int) {
parseObject.put(property.name, value)
parseObject.put(name ?:property.name, value)
}

}
Expand All @@ -24,4 +24,4 @@ class IntParseDelegate {
* Returns a [Int] property delegate for [ParseObject]s. This uses [ParseObject.getInt]
* and [ParseObject.put].
*/
inline fun intAttribute() = IntParseDelegate()
inline fun intAttribute(name: String? = null) = IntParseDelegate(name)
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ import kotlin.reflect.KProperty
/**
* A [JSONArray] property delegation for [ParseObject].
*/
class JsonArrayParseDelegate {
class JsonArrayParseDelegate(private val name: String?) {

operator fun getValue(parseObject: ParseObject, property: KProperty<*>): JSONArray? {
return parseObject.getJSONArray(property.name)
return parseObject.getJSONArray(name ?: property.name)
}

operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: JSONArray?) {
parseObject.putOrIgnore(property.name, value)
parseObject.putOrIgnore(name ?: property.name, value)
}

}
Expand All @@ -26,4 +26,4 @@ class JsonArrayParseDelegate {
* Returns a [JSONArray] property delegate for [ParseObject]s. This uses [ParseObject.getDouble]
* and [ParseObject.putOrIgnore].
*/
inline fun jsonArrayAttribute() = JsonArrayParseDelegate()
inline fun jsonArrayAttribute(name: String? = null) = JsonArrayParseDelegate(name)
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ import kotlin.reflect.KProperty
/**
* A [JSONObject] property delegation for [ParseObject].
*/
class JsonObjectParseDelegate {
class JsonObjectParseDelegate(private val name: String?) {

operator fun getValue(parseObject: ParseObject, property: KProperty<*>): JSONObject? {
return parseObject.getJSONObject(property.name)
return parseObject.getJSONObject(name ?: property.name)
}

operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: JSONObject?) {
parseObject.putOrIgnore(property.name, value)
parseObject.putOrIgnore(name ?: property.name, value)
}

}
Expand All @@ -26,4 +26,4 @@ class JsonObjectParseDelegate {
* Returns a [JSONObject] property delegate for [ParseObject]s. This uses [ParseObject.getJSONObject]
* and [ParseObject.putOrIgnore].
*/
fun jsonObjectAttribute() = JsonObjectParseDelegate()
fun jsonObjectAttribute(name: String? = null) = JsonObjectParseDelegate(name)
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ import kotlin.reflect.KProperty
/**
* A [List] property delegation for [ParseObject].
*/
class ListParseDelegate<T> {
class ListParseDelegate<T>(private val name: String?) {

operator fun getValue(parseObject: ParseObject, property: KProperty<*>): MutableList<T>? {
return parseObject.getList<T>(property.name) as? MutableList<T>
return parseObject.getList<T>(name ?: property.name) as? MutableList<T>
}

operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: MutableList<T>?) {
parseObject.putOrIgnore(property.name, value)
parseObject.putOrIgnore(name ?: property.name, value)
}

}
Expand All @@ -25,4 +25,4 @@ class ListParseDelegate<T> {
* Returns a [List] property delegate for [ParseObject]s. This uses [ParseObject.getList]
* and [ParseObject.putOrIgnore].
*/
inline fun <T> listAttribute() = ListParseDelegate<T>()
inline fun <T> listAttribute(name: String? = null) = ListParseDelegate<T>(null)
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ import kotlin.reflect.KProperty
/**
* A [Long] property delegation for [ParseObject].
*/
class LongParseDelegate {
class LongParseDelegate(private val name: String?) {

operator fun getValue(parseObject: ParseObject, property: KProperty<*>): Long {
return parseObject.getLong(property.name)
return parseObject.getLong(name ?: property.name)
}

operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: Long) {
parseObject.put(property.name, value)
parseObject.put(name ?: property.name, value)
}

}
Expand All @@ -24,4 +24,4 @@ class LongParseDelegate {
* Returns a [Long] property delegate for [ParseObject]s. This uses [ParseObject.getLong]
* and [ParseObject.put].
*/
inline fun longAttribute() = LongParseDelegate()
inline fun longAttribute(name: String? = null) = LongParseDelegate(name)
8 changes: 4 additions & 4 deletions ktx/src/main/java/com/parse/ktx/delegates/MapParseDelegate.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ import kotlin.reflect.KProperty
/**
* A [Map] property delegation for [ParseObject].
*/
class MapParseDelegate<V> {
class MapParseDelegate<V>(private val name: String?) {

operator fun getValue(parseObject: ParseObject, property: KProperty<*>): MutableMap<String, V>? {
return parseObject.getMap<V>(property.name) as? MutableMap<String, V>
return parseObject.getMap<V>(name ?: property.name) as? MutableMap<String, V>
}

operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: MutableMap<String, V>?) {
parseObject.putOrIgnore(property.name, value)
parseObject.putOrIgnore(name ?: property.name, value)
}

}
Expand All @@ -25,4 +25,4 @@ class MapParseDelegate<V> {
* Returns a [Map] property delegate for [ParseObject]s. This uses [ParseObject.getMap]
* and [ParseObject.putOrIgnore].
*/
inline fun <V> mapAttribute() = MapParseDelegate<V>()
inline fun <V> mapAttribute(name: String? = null) = MapParseDelegate<V>(name)
8 changes: 4 additions & 4 deletions ktx/src/main/java/com/parse/ktx/delegates/ParseDelegate.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ import kotlin.reflect.KProperty
/**
* A generic property delegation for [ParseObject].
*/
class ParseDelegate<T> {
class ParseDelegate<T>(private val name: String?) {

@Suppress("UNCHECKED_CAST")
operator fun getValue(parseObject: ParseObject, property: KProperty<*>): T {
return parseObject.getAs(property.name)
return parseObject.getAs(name ?: property.name)
}

operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: T) {
parseObject.putOrIgnore(property.name, value)
parseObject.putOrIgnore(name ?: property.name, value)
}

}
Expand All @@ -27,4 +27,4 @@ class ParseDelegate<T> {
* Returns a generic property delegate for [ParseObject]s. This uses [ParseObject.getAs]
* and [ParseObject.putOrIgnore].
*/
inline fun <T> attribute() = ParseDelegate<T>()
inline fun <T> attribute(name: String? = null) = ParseDelegate<T>(name)
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ import kotlin.reflect.KProperty
/**
* A [ParseRelation] property delegation for [ParseObject].
*/
class ParseRelationDelegate<T : ParseObject> {
class ParseRelationDelegate<T : ParseObject>(private val name: String?) {

operator fun getValue(parseObject: ParseObject, property: KProperty<*>): ParseRelation<T> {
return parseObject.getRelation<T>(property.name)
return parseObject.getRelation<T>(name ?: property.name)
}

}
Expand All @@ -21,4 +21,4 @@ class ParseRelationDelegate<T : ParseObject> {
* Returns a [ParseRelation] property delegate for [ParseObject]s.
* This uses [ParseObject.getRelation].
*/
inline fun <T : ParseObject> relationAttribute() = ParseRelationDelegate<T>()
inline fun <T : ParseObject> relationAttribute(name: String? = null) = ParseRelationDelegate<T>(name)
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,13 @@ import kotlin.reflect.KProperty
* A generic property delegation for [ParseObject], and give some checks to avoid throw some
* exceptions.
*/
class SafeParseDelegate<T> {
class SafeParseDelegate<T>(private val name: String?) {

@Suppress("UNCHECKED_CAST")
operator fun getValue(parseObject: ParseObject, property: KProperty<*>): T? {
val value = if (parseObject.has(property.name)) {
parseObject.get(property.name)
val name = name ?: property.name
val value = if (parseObject.has(name)) {
parseObject.get(name)
} else {
null
}
Expand All @@ -37,4 +38,4 @@ class SafeParseDelegate<T> {
* Returns a generic property delegate for [ParseObject]s. This uses a custom get implementation
* and [ParseObject.putOrRemove].
*/
inline fun <T> safeAttribute() = SafeParseDelegate<T>()
inline fun <T> safeAttribute(name: String? = null) = SafeParseDelegate<T>(name)
15 changes: 10 additions & 5 deletions ktx/src/main/java/com/parse/ktx/delegates/StringParseDelegate.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,18 @@ import kotlin.reflect.KProperty
/**
* A [String] property delegation for [ParseObject].
*/
class StringParseDelegate<S : String?>(private val filter: (String) -> String) {
class StringParseDelegate<S : String?>(
private val name: String?,
private val filter: (String) -> String
) {

operator fun getValue(parseObject: ParseObject, property: KProperty<*>): S {
return parseObject.getAs(property.name)
return parseObject.getAs(name ?: property.name)
}

operator fun setValue(parseObject: ParseObject, property: KProperty<*>, value: S) {
if (value != null) {
parseObject.put(property.name, filter.invoke(value))
parseObject.put(name ?: property.name, filter.invoke(value))
}
}

Expand All @@ -28,13 +31,15 @@ class StringParseDelegate<S : String?>(private val filter: (String) -> String) {
* and a custom implementation for set.
*/
inline fun nullableStringAttribute(
name: String? = null,
noinline filter: (String) -> String = { it }
) = StringParseDelegate<String?>(filter)
) = StringParseDelegate<String?>(name, filter)

/**
* Returns a [String] property delegate for [ParseObject]s. This uses [ParseObject.getAs]
* and a custom implementation for set.
*/
inline fun stringAttribute(
name: String? = null,
noinline filter: (String) -> String = { it }
) = StringParseDelegate<String>(filter)
) = StringParseDelegate<String>(name, filter)