Skip to content
This repository has been archived by the owner on Sep 13, 2023. It is now read-only.

Commit

Permalink
Transfer codebase
Browse files Browse the repository at this point in the history
  • Loading branch information
fabriziodemaria committed Apr 14, 2023
1 parent 4699276 commit 4a4137b
Show file tree
Hide file tree
Showing 45 changed files with 2,042 additions and 1 deletion.
46 changes: 46 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*


# Gradle files
.gradle/
build/
gradlew
gradlew.bat

# Local configuration file (sdk path, etc)
local.properties

# IntelliJ
*.iml
.idea/
misc.xml
deploymentTargetDropDown.xml
render.experimental.xml

# Android Profiling
*.hprof

# Other
*.DS_Store
1 change: 1 addition & 0 deletions OpenFeature/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
53 changes: 53 additions & 0 deletions OpenFeature/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
plugins {
id("com.android.library")
id("org.jetbrains.kotlin.android")
id("maven-publish")
kotlin("plugin.serialization") version "1.8.10"
}

android {
namespace = "dev.openfeature.sdk"
compileSdk = 33

defaultConfig {
minSdk = 26
version = "0.0.1"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
getByName("release") {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_11.toString()
}
}

dependencies {
implementation("com.google.android.material:material:1.8.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1")
testImplementation("junit:junit:4.13.2")
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4")
}

publishing {
publications {
register<MavenPublication>("release") {
groupId = "dev.openfeature"
artifactId = "kotlin-sdk"
version = "0.0.1-SNAPSHOT"

afterEvaluate {
from(components["release"])
}
}
}
}
21 changes: 21 additions & 0 deletions OpenFeature/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.kts.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
3 changes: 3 additions & 0 deletions OpenFeature/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest>
</manifest>
11 changes: 11 additions & 0 deletions OpenFeature/src/main/java/dev/openfeature/sdk/BaseEvaluation.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package dev.openfeature.sdk

import dev.openfeature.sdk.exceptions.ErrorCode

interface BaseEvaluation<T> {
val value: T
val variant: String?
val reason: String?
val errorCode: ErrorCode?
val errorMessage: String?
}
8 changes: 8 additions & 0 deletions OpenFeature/src/main/java/dev/openfeature/sdk/Client.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package dev.openfeature.sdk

interface Client: Features {
val metadata: Metadata
val hooks: List<Hook<*>>

fun addHooks(hooks: List<Hook<*>>)
}
10 changes: 10 additions & 0 deletions OpenFeature/src/main/java/dev/openfeature/sdk/EvaluationContext.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package dev.openfeature.sdk

interface EvaluationContext: Structure {
fun getTargetingKey(): String
fun setTargetingKey(targetingKey: String)

// Make sure these are implemented for correct object comparisons
override fun hashCode(): Int
override fun equals(other: Any?): Boolean
}
16 changes: 16 additions & 0 deletions OpenFeature/src/main/java/dev/openfeature/sdk/FeatureProvider.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package dev.openfeature.sdk

interface FeatureProvider {
val hooks: List<Hook<*>>
val metadata: Metadata

// Called by OpenFeatureAPI whenever the new Provider is registered
suspend fun initialize(initialContext: EvaluationContext?)
// Called by OpenFeatureAPI whenever a new EvaluationContext is set by the application
suspend fun onContextSet(oldContext: EvaluationContext?, newContext: EvaluationContext)
fun getBooleanEvaluation(key: String, defaultValue: Boolean): ProviderEvaluation<Boolean>
fun getStringEvaluation(key: String, defaultValue: String): ProviderEvaluation<String>
fun getIntegerEvaluation(key: String, defaultValue: Int): ProviderEvaluation<Int>
fun getDoubleEvaluation(key: String, defaultValue: Double): ProviderEvaluation<Double>
fun getObjectEvaluation(key: String, defaultValue: Value): ProviderEvaluation<Value>
}
24 changes: 24 additions & 0 deletions OpenFeature/src/main/java/dev/openfeature/sdk/Features.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package dev.openfeature.sdk

interface Features {
fun getBooleanValue(key: String, defaultValue: Boolean): Boolean
fun getBooleanValue(key: String, defaultValue: Boolean, options: FlagEvaluationOptions): Boolean
fun getBooleanDetails(key: String, defaultValue: Boolean): FlagEvaluationDetails<Boolean>
fun getBooleanDetails(key: String, defaultValue: Boolean, options: FlagEvaluationOptions): FlagEvaluationDetails<Boolean>
fun getStringValue(key: String, defaultValue: String): String
fun getStringValue(key: String, defaultValue: String, options: FlagEvaluationOptions): String
fun getStringDetails(key: String, defaultValue: String): FlagEvaluationDetails<String>
fun getStringDetails(key: String, defaultValue: String, options: FlagEvaluationOptions): FlagEvaluationDetails<String>
fun getIntegerValue(key: String, defaultValue: Int): Int
fun getIntegerValue(key: String, defaultValue: Int, options: FlagEvaluationOptions): Int
fun getIntegerDetails(key: String, defaultValue: Int): FlagEvaluationDetails<Int>
fun getIntegerDetails(key: String, defaultValue: Int, options: FlagEvaluationOptions): FlagEvaluationDetails<Int>
fun getDoubleValue(key: String, defaultValue: Double): Double
fun getDoubleValue(key: String, defaultValue: Double, options: FlagEvaluationOptions): Double
fun getDoubleDetails(key: String, defaultValue: Double): FlagEvaluationDetails<Double>
fun getDoubleDetails(key: String, defaultValue: Double, options: FlagEvaluationOptions): FlagEvaluationDetails<Double>
fun getObjectValue(key: String, defaultValue: Value): Value
fun getObjectValue(key: String, defaultValue: Value, options: FlagEvaluationOptions): Value
fun getObjectDetails(key: String, defaultValue: Value): FlagEvaluationDetails<Value>
fun getObjectDetails(key: String, defaultValue: Value, options: FlagEvaluationOptions): FlagEvaluationDetails<Value>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package dev.openfeature.sdk

import dev.openfeature.sdk.exceptions.ErrorCode

data class FlagEvaluationDetails<T>(
val flagKey: String,
override var value: T,
override var variant: String? = null,
override var reason: String? = null,
override var errorCode: ErrorCode? = null,
override var errorMessage: String? = null
) : BaseEvaluation<T> {
companion object
}

fun <T> FlagEvaluationDetails.Companion.from(providerEval: ProviderEvaluation<T>, flagKey: String): FlagEvaluationDetails<T> {
return FlagEvaluationDetails(
flagKey,
providerEval.value,
providerEval.variant,
providerEval.reason,
providerEval.errorCode,
providerEval.errorMessage
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package dev.openfeature.sdk

data class FlagEvaluationOptions(
var hooks: List<Hook<*>> = listOf(),
var hookHints: Map<String, Any> = mapOf()
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dev.openfeature.sdk
enum class FlagValueType {
BOOLEAN,
STRING,
INTEGER,
DOUBLE,
OBJECT;
}

9 changes: 9 additions & 0 deletions OpenFeature/src/main/java/dev/openfeature/sdk/Hook.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dev.openfeature.sdk

interface Hook<T> {
fun before(ctx: HookContext<T>, hints: Map<String, Any>) = Unit
fun after(ctx: HookContext<T>, details: FlagEvaluationDetails<T>, hints: Map<String, Any>) = Unit
fun error(ctx: HookContext<T>, error: Exception, hints: Map<String, Any>) = Unit
fun finallyAfter(ctx: HookContext<T>, hints: Map<String, Any>) = Unit
fun supportsFlagValueType(flagValueType: FlagValueType): Boolean = true
}
10 changes: 10 additions & 0 deletions OpenFeature/src/main/java/dev/openfeature/sdk/HookContext.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package dev.openfeature.sdk

data class HookContext<T>(
var flagKey: String,
val type: FlagValueType,
var defaultValue: T,
var ctx: EvaluationContext,
var clientMetadata: Metadata?,
var providerMetadata: Metadata
)
Loading

0 comments on commit 4a4137b

Please sign in to comment.