Skip to content

Commit

Permalink
Merge pull request #65 from open-feature/breaking-changes
Browse files Browse the repository at this point in the history
Collection of small, breaking changes
  • Loading branch information
justinabrahms authored Sep 13, 2022
2 parents 35c9c7e + 60fad05 commit 89ea363
Show file tree
Hide file tree
Showing 15 changed files with 128 additions and 56 deletions.
6 changes: 3 additions & 3 deletions src/main/java/dev/openfeature/javasdk/EvaluationContext.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package dev.openfeature.javasdk;

import java.time.ZonedDateTime;
import java.time.Instant;
import java.util.List;

import lombok.Getter;
Expand Down Expand Up @@ -76,7 +76,7 @@ public EvaluationContext add(String key, Double value) {
return this;
}

public EvaluationContext add(String key, ZonedDateTime value) {
public EvaluationContext add(String key, Instant value) {
this.structure.add(key, value);
return this;
}
Expand Down Expand Up @@ -123,7 +123,7 @@ public Structure add(String ignoredKey, Structure ignoredValue) {
return null;
}

public Structure add(String ignoredKey, ZonedDateTime ignoredValue) {
public Structure add(String ignoredKey, Instant ignoredValue) {
return null;
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/dev/openfeature/javasdk/FeatureProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,5 @@ default List<Hook> getProviderHooks() {

ProviderEvaluation<Double> getDoubleEvaluation(String key, Double defaultValue, EvaluationContext ctx);

ProviderEvaluation<Structure> getObjectEvaluation(String key, Structure defaultValue, EvaluationContext ctx);
ProviderEvaluation<Value> getObjectEvaluation(String key, Value defaultValue, EvaluationContext ctx);
}
12 changes: 6 additions & 6 deletions src/main/java/dev/openfeature/javasdk/Features.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,19 +57,19 @@ FlagEvaluationDetails<Integer> getIntegerDetails(String key, Integer defaultValu
FlagEvaluationDetails<Double> getDoubleDetails(String key, Double defaultValue, EvaluationContext ctx,
FlagEvaluationOptions options);

Structure getObjectValue(String key, Structure defaultValue);
Value getObjectValue(String key, Value defaultValue);

Structure getObjectValue(String key, Structure defaultValue, EvaluationContext ctx);
Value getObjectValue(String key, Value defaultValue, EvaluationContext ctx);

Structure getObjectValue(String key, Structure defaultValue, EvaluationContext ctx,
Value getObjectValue(String key, Value defaultValue, EvaluationContext ctx,
FlagEvaluationOptions options);

FlagEvaluationDetails<Structure> getObjectDetails(String key, Structure defaultValue);
FlagEvaluationDetails<Value> getObjectDetails(String key, Value defaultValue);

FlagEvaluationDetails<Structure> getObjectDetails(String key, Structure defaultValue,
FlagEvaluationDetails<Value> getObjectDetails(String key, Value defaultValue,
EvaluationContext ctx);

FlagEvaluationDetails<Structure> getObjectDetails(String key, Structure defaultValue,
FlagEvaluationDetails<Value> getObjectDetails(String key, Value defaultValue,
EvaluationContext ctx,
FlagEvaluationOptions options);
}
4 changes: 2 additions & 2 deletions src/main/java/dev/openfeature/javasdk/NoOpProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,9 @@ public ProviderEvaluation<Double> getDoubleEvaluation(String key, Double default
}

@Override
public ProviderEvaluation<Structure> getObjectEvaluation(String key, Structure defaultValue,
public ProviderEvaluation<Value> getObjectEvaluation(String key, Value defaultValue,
EvaluationContext invocationContext) {
return ProviderEvaluation.<Structure>builder()
return ProviderEvaluation.<Value>builder()
.value(defaultValue)
.variant(PASSED_IN_DEFAULT)
.reason(Reason.DEFAULT)
Expand Down
14 changes: 7 additions & 7 deletions src/main/java/dev/openfeature/javasdk/OpenFeatureClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ private <T> ProviderEvaluation<?> createProviderEvaluation(
case DOUBLE:
return provider.getDoubleEvaluation(key, (Double) defaultValue, invocationContext);
case OBJECT:
return provider.getObjectEvaluation(key, (Structure) defaultValue, invocationContext);
return provider.getObjectEvaluation(key, (Value) defaultValue, invocationContext);
default:
throw new GeneralError("Unknown flag type");
}
Expand Down Expand Up @@ -257,34 +257,34 @@ public FlagEvaluationDetails<Double> getDoubleDetails(String key, Double default
}

@Override
public Structure getObjectValue(String key, Structure defaultValue) {
public Value getObjectValue(String key, Value defaultValue) {
return getObjectDetails(key, defaultValue).getValue();
}

@Override
public Structure getObjectValue(String key, Structure defaultValue, EvaluationContext ctx) {
public Value getObjectValue(String key, Value defaultValue, EvaluationContext ctx) {
return getObjectDetails(key, defaultValue, ctx).getValue();
}

@Override
public Structure getObjectValue(String key, Structure defaultValue, EvaluationContext ctx,
public Value getObjectValue(String key, Value defaultValue, EvaluationContext ctx,
FlagEvaluationOptions options) {
return getObjectDetails(key, defaultValue, ctx, options).getValue();
}

@Override
public FlagEvaluationDetails<Structure> getObjectDetails(String key, Structure defaultValue) {
public FlagEvaluationDetails<Value> getObjectDetails(String key, Value defaultValue) {
return getObjectDetails(key, defaultValue, null);
}

@Override
public FlagEvaluationDetails<Structure> getObjectDetails(String key, Structure defaultValue,
public FlagEvaluationDetails<Value> getObjectDetails(String key, Value defaultValue,
EvaluationContext ctx) {
return getObjectDetails(key, defaultValue, ctx, FlagEvaluationOptions.builder().build());
}

@Override
public FlagEvaluationDetails<Structure> getObjectDetails(String key, Structure defaultValue, EvaluationContext ctx,
public FlagEvaluationDetails<Value> getObjectDetails(String key, Value defaultValue, EvaluationContext ctx,
FlagEvaluationOptions options) {
return this.evaluateFlag(FlagValueType.OBJECT, key, defaultValue, ctx, options);
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/dev/openfeature/javasdk/Structure.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package dev.openfeature.javasdk;

import java.time.ZonedDateTime;
import java.time.Instant;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -73,7 +73,7 @@ public Structure add(String key, Double value) {
* @param value date-time value
* @return Structure
*/
public Structure add(String key, ZonedDateTime value) {
public Structure add(String key, Instant value) {
attributes.put(key, new Value(value));
return this;
}
Expand Down
53 changes: 41 additions & 12 deletions src/main/java/dev/openfeature/javasdk/Value.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package dev.openfeature.javasdk;

import java.time.ZonedDateTime;
import java.time.Instant;
import java.util.List;

import lombok.EqualsAndHashCode;
import lombok.ToString;

/**
* Values serve as a return type for provider objects.
* Values serve as a generic return type for structure data from providers.
* Providers may deal in JSON, protobuf, XML or some other data-interchange format.
* This intermediate representation provides a good medium of exchange.
*/
Expand All @@ -19,7 +19,27 @@ public class Value {
private final Object innerObject;

public Value() {
this.innerObject = null;
this.innerObject = null;
}

/**
* Construct a new Value with an Object.
* @param value to be wrapped.
* @throws InstantiationException if value is not a valid type
* (boolean, string, int, double, list, structure, instant)
*/
public Value(Object value) throws InstantiationException {
// integer is a special case, convert those.
this.innerObject = value instanceof Integer ? ((Integer)value).doubleValue() : value;
if (!this.isNull()
&& !this.isBoolean()
&& !this.isString()
&& !this.isNumber()
&& !this.isStructure()
&& !this.isList()
&& !this.isInstant()) {
throw new InstantiationException("Invalid value type: " + value.getClass());
}
}

public Value(Value value) {
Expand Down Expand Up @@ -50,7 +70,7 @@ public Value(List<Value> value) {
this.innerObject = value;
}

public Value(ZonedDateTime value) {
public Value(Instant value) {
this.innerObject = value;
}

Expand Down Expand Up @@ -109,12 +129,12 @@ public boolean isList() {
}

/**
* Check if this Value represents a ZonedDateTime.
* Check if this Value represents an Instant.
*
* @return boolean
*/
public boolean isZonedDateTime() {
return this.innerObject instanceof ZonedDateTime;
public boolean isInstant() {
return this.innerObject instanceof Instant;
}

/**
Expand All @@ -131,6 +151,15 @@ public Boolean asBoolean() {
return null;
}

/**
* Retrieve the underlying object.
*
* @return Object
*/
public Object asObject() {
return this.innerObject;
}

/**
* Retrieve the underlying String value, or null.
*
Expand Down Expand Up @@ -194,13 +223,13 @@ public List<Value> asList() {
}

/**
* Retrieve the underlying ZonedDateTime value, or null.
* Retrieve the underlying Instant value, or null.
*
* @return ZonedDateTime
* @return Instant
*/
public ZonedDateTime asZonedDateTime() {
if (this.isZonedDateTime()) {
return (ZonedDateTime)this.innerObject;
public Instant asInstant() {
if (this.isInstant()) {
return (Instant)this.innerObject;
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public ProviderEvaluation<Double> getDoubleEvaluation(String key, Double default
}

@Override
public ProviderEvaluation<Structure> getObjectEvaluation(String key, Structure defaultValue, EvaluationContext invocationContext) {
public ProviderEvaluation<Value> getObjectEvaluation(String key, Value defaultValue, EvaluationContext invocationContext) {
throw new NotImplementedException("BORK");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@ public ProviderEvaluation<Double> getDoubleEvaluation(String key, Double default
}

@Override
public ProviderEvaluation<Structure> getObjectEvaluation(String key, Structure defaultValue, EvaluationContext invocationContext) {
public ProviderEvaluation<Value> getObjectEvaluation(String key, Value defaultValue, EvaluationContext invocationContext) {
savedContext = invocationContext;
return ProviderEvaluation.<Structure>builder()
return ProviderEvaluation.<Value>builder()
.value(null)
.build();
}
Expand Down
12 changes: 6 additions & 6 deletions src/test/java/dev/openfeature/javasdk/EvalContextTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.time.ZonedDateTime;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -34,9 +34,9 @@ public class EvalContextTest {
ec.add("int", 4);
assertEquals(4, ec.getValue("int").asInteger());

ZonedDateTime dt = ZonedDateTime.now();
Instant dt = Instant.now();
ec.add("dt", dt);
assertEquals(dt, ec.getValue("dt").asZonedDateTime());
assertEquals(dt, ec.getValue("dt").asInstant());
}

@Specification(number="3.1.2", text="The evaluation context MUST support the inclusion of " +
Expand Down Expand Up @@ -72,7 +72,7 @@ public class EvalContextTest {
ec.add("int", 4);
ec.add("int2", 2);

ZonedDateTime dt = ZonedDateTime.now();
Instant dt = Instant.now();
ec.add("dt", dt);

ec.add("obj", new Structure().add("val1", 1).add("val2", "2"));
Expand Down Expand Up @@ -121,14 +121,14 @@ public class EvalContextTest {
.add("Double", (Double)null)
.add("Structure", (Structure)null)
.add("List", (List<Value>)null)
.add("ZonedDateTime", (ZonedDateTime)null);
.add("Instant", (Instant)null);
assertEquals(6, ec.asMap().size());
assertEquals(null, ec.getValue("Boolean").asBoolean());
assertEquals(null, ec.getValue("String").asString());
assertEquals(null, ec.getValue("Double").asDouble());
assertEquals(null, ec.getValue("Structure").asStructure());
assertEquals(null, ec.getValue("List").asList());
assertEquals(null, ec.getValue("ZonedDateTime").asString());
assertEquals(null, ec.getValue("Instant").asString());
}

@Test void merge_targeting_key() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,9 @@ private Client _client() {
assertEquals(40.0, c.getDoubleValue(key, .4, new EvaluationContext()));
assertEquals(40.0, c.getDoubleValue(key, .4, new EvaluationContext(), FlagEvaluationOptions.builder().build()));

assertEquals(null, c.getObjectValue(key, new Structure()));
assertEquals(null, c.getObjectValue(key, new Structure(), new EvaluationContext()));
assertEquals(null, c.getObjectValue(key, new Structure(), new EvaluationContext(), FlagEvaluationOptions.builder().build()));
assertEquals(null, c.getObjectValue(key, new Value()));
assertEquals(null, c.getObjectValue(key, new Value(), new EvaluationContext()));
assertEquals(null, c.getObjectValue(key, new Value(), new EvaluationContext(), FlagEvaluationOptions.builder().build()));
}

@Specification(number="1.4.1", text="The client MUST provide methods for detailed flag value evaluation with parameters flag key (string, required), default value (boolean | number | string | structure, required), evaluation context (optional), and evaluation options (optional), which returns an evaluation details structure.")
Expand Down
6 changes: 3 additions & 3 deletions src/test/java/dev/openfeature/javasdk/NoOpProviderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@ public class NoOpProviderTest {
assertEquals(0.4, eval.getValue());
}

@Test void structure() {
@Test void value() {
NoOpProvider p = new NoOpProvider();
Structure s = new Structure();
ProviderEvaluation<Structure> eval = p.getObjectEvaluation("key", s, null);
Value s = new Value();
ProviderEvaluation<Value> eval = p.getObjectEvaluation("key", s, null);
assertEquals(s, eval.getValue());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public class ProviderSpecTest {
ProviderEvaluation<Boolean> boolean_result = p.getBooleanEvaluation("key", false, new EvaluationContext());
assertNotNull(boolean_result.getValue());

ProviderEvaluation<Structure> object_result = p.getObjectEvaluation("key", new Structure(), new EvaluationContext());
ProviderEvaluation<Value> object_result = p.getObjectEvaluation("key", new Value(), new EvaluationContext());
assertNotNull(object_result.getValue());

}
Expand Down
6 changes: 3 additions & 3 deletions src/test/java/dev/openfeature/javasdk/StructureTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.time.ZonedDateTime;
import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
Expand Down Expand Up @@ -44,7 +44,7 @@ public class StructureTest {
String STRING_VAL = "val";
int INT_VAL = 13;
double DOUBLE_VAL = .5;
ZonedDateTime DATE_VAL = ZonedDateTime.now();
Instant DATE_VAL = Instant.now();
Structure STRUCT_VAL = new Structure();
List<Value> LIST_VAL = new ArrayList<Value>();
Value VALUE_VAL = new Value();
Expand All @@ -63,7 +63,7 @@ public class StructureTest {
assertEquals(STRING_VAL, structure.getValue(STRING_KEY).asString());
assertEquals(INT_VAL, structure.getValue(INT_KEY).asInteger());
assertEquals(DOUBLE_VAL, structure.getValue(DOUBLE_KEY).asDouble());
assertEquals(DATE_VAL, structure.getValue(DATE_KEY).asZonedDateTime());
assertEquals(DATE_VAL, structure.getValue(DATE_KEY).asInstant());
assertEquals(STRUCT_VAL, structure.getValue(STRUCT_KEY).asStructure());
assertEquals(LIST_VAL, structure.getValue(LIST_KEY).asList());
assertTrue(structure.getValue(VALUE_KEY).isNull());
Expand Down
Loading

0 comments on commit 89ea363

Please sign in to comment.