diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 00000000..a547a5bd
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,27 @@
+---
+
+version: 2
+
+registries:
+ maven-artifactory:
+ type: maven-repository
+ url: https://artifactory.rtr.cloud/artifactory/maven-releases/
+ username: ${{ secrets.ARTIFACTORY_DEPLOY_USER }}
+ password: ${{ secrets.ARTIFACTORY_DEPLOY_PASSWORD }}
+
+updates:
+ - package-ecosystem: "maven"
+ registries:
+ - maven-artifactory
+ target-branch: "master"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 30
+
+ - package-ecosystem: "github-actions"
+ target-branch: "master"
+ directory: ".github/workflows"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
diff --git a/.github/workflows/pr-validation.yml b/.github/workflows/pr-validation.yml
index 13ab98ec..fb4a678d 100644
--- a/.github/workflows/pr-validation.yml
+++ b/.github/workflows/pr-validation.yml
@@ -15,7 +15,7 @@ jobs:
steps:
- name: Check out repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: YAML linting
uses: karancode/yamllint-github-action@v2.1.1
@@ -51,5 +51,13 @@ jobs:
}
]
+ - name: Resolve dependencies
+ run: mvn -B dependency:go-offline
+
+ # can't add -o here; go-offline and resolve-plugins don't download plugin dependencies, lol
- name: Build, test, and install
run: mvn -B install
+
+ # dependency:analyze-only is run as part of the previous step, but this sometimes catches more
+ - name: Run dependency and bug analysis
+ run: mvn -o -B dependency:analyze
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 1a55e1d0..9eedc7eb 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -28,13 +28,18 @@ jobs:
- name: Check out repo
uses: actions/checkout@v4
- - name: Install Java and Maven
+ - name: Set up JDK 8
uses: actions/setup-java@v3
with:
java-version: 8
distribution: temurin
check-latest: false
+ - name: Set up Maven
+ uses: stCarolas/setup-maven@v4.5
+ with:
+ maven-version: 3.9.4
+
- name: Configure git
run: |
git config --global user.email "infrastructure+deploy@renttherunway.com"
diff --git a/alchemy-api/pom.xml b/alchemy-api/pom.xml
index f58ba7a9..55424db6 100644
--- a/alchemy-api/pom.xml
+++ b/alchemy-api/pom.xml
@@ -1,27 +1,69 @@
+ 4.0.0
+
alchemy-parent
io.rtr.alchemy
- 2.0.10-SNAPSHOT
+ 2.1.0-SNAPSHOT
+
Alchemy API Library
Representations for Alchemy Service
- 4.0.0
alchemy-api
+
+
+
+
+ io.rtr.alchemy
+ alchemy-dependencies
+ ${project.version}
+ pom
+ import
+
+
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+
+
+ javax.validation
+ validation-api
+
+
+ joda-time
+ joda-time
+
+
+ com.google.guava
+ guava
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ test
+
io.dropwizard
dropwizard-jackson
+ test
- io.dropwizard
- dropwizard-validation
+ junit
+ junit
+ test
- com.fasterxml.jackson.datatype
- jackson-datatype-guava
+ nl.jqno.equalsverifier
+ equalsverifier
+ test
\ No newline at end of file
diff --git a/alchemy-api/src/test/java/io/rtr/alchemy/dto/models/ExperimentDtoTest.java b/alchemy-api/src/test/java/io/rtr/alchemy/dto/models/ExperimentDtoTest.java
index 3c7792e2..b8203832 100644
--- a/alchemy-api/src/test/java/io/rtr/alchemy/dto/models/ExperimentDtoTest.java
+++ b/alchemy-api/src/test/java/io/rtr/alchemy/dto/models/ExperimentDtoTest.java
@@ -7,6 +7,9 @@
public class ExperimentDtoTest {
@Test
public void testEqualsHashCode() {
- EqualsVerifier.forClass(ExperimentDto.class).suppress(Warning.STRICT_INHERITANCE).verify();
+ EqualsVerifier.forClass(ExperimentDto.class)
+ .suppress(Warning.STRICT_INHERITANCE)
+ .withOnlyTheseFields("name")
+ .verify();
}
}
diff --git a/alchemy-api/src/test/java/io/rtr/alchemy/dto/models/TreatmentDtoTest.java b/alchemy-api/src/test/java/io/rtr/alchemy/dto/models/TreatmentDtoTest.java
index b3407bc6..99fda3b4 100644
--- a/alchemy-api/src/test/java/io/rtr/alchemy/dto/models/TreatmentDtoTest.java
+++ b/alchemy-api/src/test/java/io/rtr/alchemy/dto/models/TreatmentDtoTest.java
@@ -7,6 +7,9 @@
public class TreatmentDtoTest {
@Test
public void testEqualsHashCode() {
- EqualsVerifier.forClass(TreatmentDto.class).suppress(Warning.STRICT_INHERITANCE).verify();
+ EqualsVerifier.forClass(TreatmentDto.class)
+ .suppress(Warning.STRICT_INHERITANCE)
+ .withIgnoredFields("description")
+ .verify();
}
}
diff --git a/alchemy-bom/pom.xml b/alchemy-bom/pom.xml
new file mode 100644
index 00000000..8b65f658
--- /dev/null
+++ b/alchemy-bom/pom.xml
@@ -0,0 +1,66 @@
+
+
+ 4.0.0
+
+
+ alchemy-parent
+ io.rtr.alchemy
+ 2.1.0-SNAPSHOT
+
+
+ alchemy-bom
+ pom
+ Alchemy BOM
+ Bill of Materials for Alchemy Libraries
+
+
+
+
+
+ io.rtr.alchemy
+ alchemy-api
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-client
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-core
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-db-memory
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-db-mongo
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-dependencies
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-mapping
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-service
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-testing
+ ${project.version}
+
+
+
+
\ No newline at end of file
diff --git a/alchemy-client/pom.xml b/alchemy-client/pom.xml
index 3d10f6c7..4bdb48f5 100644
--- a/alchemy-client/pom.xml
+++ b/alchemy-client/pom.xml
@@ -1,79 +1,150 @@
+ 4.0.0
+
alchemy-parent
io.rtr.alchemy
- 2.0.10-SNAPSHOT
+ 2.1.0-SNAPSHOT
+
Alchemy Service REST Client
Client for Alchemy Service
- 4.0.0
-
alchemy-client
+
+
+
+
+ io.rtr.alchemy
+ alchemy-dependencies
+ ${project.version}
+ pom
+ import
+
+
+
+
+ io.rtr.alchemy
+ alchemy-api
+ ${project.version}
+
+
+
+
+ io.rtr.alchemy
+ alchemy-core
+ ${project.version}
+ test
+
+
+ io.rtr.alchemy
+ alchemy-db-memory
+ ${project.version}
+ test
+
+
+ io.rtr.alchemy
+ alchemy-mapping
+ ${project.version}
+ test
+
+
+ io.rtr.alchemy
+ alchemy-service
+ ${project.version}
+ test
+
+
+
+
+
io.rtr.alchemy
alchemy-api
- ${project.version}
+
+
- io.dropwizard
- dropwizard-client
+ com.fasterxml.jackson.core
+ jackson-annotations
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
com.fasterxml.jackson.module
jackson-module-jsonSchema
+
+ com.google.code.findbugs
+ jsr305
+
+
+ com.google.guava
+ guava
+
+
+ io.dropwizard
+ dropwizard-client
+
+
+ io.dropwizard
+ dropwizard-core
+
+
+ io.dropwizard
+ dropwizard-jackson
+
+
+ io.dropwizard.metrics
+ metrics-core
+
+
+ javax.validation
+ validation-api
+
+
+ javax.ws.rs
+ javax.ws.rs-api
+
+
+ org.glassfish.hk2
+ hk2-utils
+
+
+
io.dropwizard
dropwizard-testing
- ${dropwizard.version}
+ test
+
+
+ io.rtr.alchemy
+ alchemy-core
+ test
+
+
+ io.rtr.alchemy
+ alchemy-db-memory
+ test
+
+
+ io.rtr.alchemy
+ alchemy-mapping
test
io.rtr.alchemy
alchemy-service
- ${project.version}
+ test
+
+
+ junit
+ junit
test
-
-
-
-
- org.apache.maven.plugins
- maven-shade-plugin
- ${maven-shade-plugin.version}
-
- false
-
-
- *:*
-
- META-INF/*.SF
- META-INF/*.DSA
- META-INF/*.RSA
-
-
-
-
-
-
- client-jar
- package
-
- shade
-
-
- target/alchemy-client.jar
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/alchemy-client/src/main/java/io/rtr/alchemy/client/AlchemyClient.java b/alchemy-client/src/main/java/io/rtr/alchemy/client/AlchemyClient.java
index 7ed0cba6..a11d6d6e 100644
--- a/alchemy-client/src/main/java/io/rtr/alchemy/client/AlchemyClient.java
+++ b/alchemy-client/src/main/java/io/rtr/alchemy/client/AlchemyClient.java
@@ -8,6 +8,10 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Maps;
+
+import io.dropwizard.client.JerseyClientBuilder;
+import io.dropwizard.jackson.Jackson;
+import io.dropwizard.setup.Environment;
import io.rtr.alchemy.client.builder.CreateExperimentRequestBuilder;
import io.rtr.alchemy.client.builder.GetExperimentsRequestBuilder;
import io.rtr.alchemy.client.builder.UpdateAllocationsRequestBuilder;
@@ -20,11 +24,16 @@
import io.rtr.alchemy.dto.models.TreatmentOverrideDto;
import io.rtr.alchemy.dto.requests.GetExperimentsRequest;
import io.rtr.alchemy.dto.requests.TreatmentOverrideRequest;
-import io.dropwizard.client.JerseyClientBuilder;
-import io.dropwizard.jackson.Jackson;
-import io.dropwizard.setup.Environment;
+
import org.glassfish.hk2.utilities.reflection.ParameterizedTypeImpl;
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
import javax.annotation.Nullable;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.Entity;
@@ -32,12 +41,6 @@
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;
-import java.net.URI;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
/** A Dropwizard client for talking to an instance Alchemy service */
public class AlchemyClient {
diff --git a/alchemy-client/src/test/java/io/rtr/alchemy/client/mappers/UserMapper.java b/alchemy-client/src/test/java/io/rtr/alchemy/client/mappers/UserMapper.java
index 0c292a8d..04c4c4cf 100644
--- a/alchemy-client/src/test/java/io/rtr/alchemy/client/mappers/UserMapper.java
+++ b/alchemy-client/src/test/java/io/rtr/alchemy/client/mappers/UserMapper.java
@@ -4,6 +4,8 @@
import io.rtr.alchemy.client.identities.User;
import io.rtr.alchemy.mapping.Mapper;
+// referenced in test-server.yaml
+@SuppressWarnings("unused")
public class UserMapper implements Mapper {
@Override
public UserDto toDto(User source) {
diff --git a/alchemy-core/pom.xml b/alchemy-core/pom.xml
index c845fad6..7174fd69 100644
--- a/alchemy-core/pom.xml
+++ b/alchemy-core/pom.xml
@@ -1,12 +1,14 @@
+ 4.0.0
+
alchemy-parent
io.rtr.alchemy
- 2.0.10-SNAPSHOT
+ 2.1.0-SNAPSHOT
+
Alchemy Core Library
- 4.0.0
alchemy-core
@@ -14,7 +16,26 @@
4.5
+
+
+
+
+ io.rtr.alchemy
+ alchemy-dependencies
+ ${project.version}
+ pom
+ import
+
+
+ org.antlr
+ antlr4-runtime
+ ${antlr.version}
+
+
+
+
+
joda-time
joda-time
@@ -23,18 +44,6 @@
com.google.guava
guava
-
- com.google.inject
- guice
-
-
- com.fasterxml.jackson.core
- jackson-core
-
-
- com.fasterxml.jackson.core
- jackson-annotations
-
org.apache.commons
commons-math3
@@ -46,12 +55,27 @@
org.antlr
antlr4-runtime
- ${antlr.version}
javax.validation
validation-api
- 1.1.0.Final
+
+
+
+
+ junit
+ junit
+ test
+
+
+ nl.jqno.equalsverifier
+ equalsverifier
+ test
+
+
+ org.mockito
+ mockito-core
+ test
diff --git a/alchemy-core/src/main/java/io/rtr/alchemy/db/Filter.java b/alchemy-core/src/main/java/io/rtr/alchemy/db/Filter.java
index 7bc6283d..9cc87473 100644
--- a/alchemy-core/src/main/java/io/rtr/alchemy/db/Filter.java
+++ b/alchemy-core/src/main/java/io/rtr/alchemy/db/Filter.java
@@ -71,7 +71,7 @@ public Ordering getOrdering() {
@Override
public int hashCode() {
- return Objects.hashCode(filter, offset, limit);
+ return Objects.hashCode(filter, offset, limit, ordering);
}
@Override
@@ -84,7 +84,8 @@ public boolean equals(Object obj) {
return Objects.equal(filter, other.filter)
&& Objects.equal(offset, other.offset)
- && Objects.equal(limit, other.limit);
+ && Objects.equal(limit, other.limit)
+ && Objects.equal(ordering, other.ordering);
}
@Override
@@ -93,6 +94,7 @@ public String toString() {
.add("filter", filter)
.add("offset", offset)
.add("limit", limit)
+ .add("ordering", ordering)
.toString();
}
}
diff --git a/alchemy-core/src/main/java/io/rtr/alchemy/models/TreatmentOverride.java b/alchemy-core/src/main/java/io/rtr/alchemy/models/TreatmentOverride.java
index 7048d1f5..9dfe2742 100644
--- a/alchemy-core/src/main/java/io/rtr/alchemy/models/TreatmentOverride.java
+++ b/alchemy-core/src/main/java/io/rtr/alchemy/models/TreatmentOverride.java
@@ -30,7 +30,7 @@ public Treatment getTreatment() {
@Override
public int hashCode() {
- return Objects.hashCode(name, treatment);
+ return Objects.hashCode(name, filter, treatment);
}
@Override
@@ -41,7 +41,9 @@ public boolean equals(Object obj) {
final TreatmentOverride other = (TreatmentOverride) obj;
- return Objects.equal(name, other.name) && Objects.equal(treatment, other.treatment);
+ return Objects.equal(name, other.name)
+ && Objects.equal(filter, other.filter)
+ && Objects.equal(treatment, other.treatment);
}
@Override
diff --git a/alchemy-core/src/test/java/io/rtr/alchemy/models/ExperimentTest.java b/alchemy-core/src/test/java/io/rtr/alchemy/models/ExperimentTest.java
index e97b8839..c5a07c75 100644
--- a/alchemy-core/src/test/java/io/rtr/alchemy/models/ExperimentTest.java
+++ b/alchemy-core/src/test/java/io/rtr/alchemy/models/ExperimentTest.java
@@ -44,6 +44,7 @@ Experiments.class, mock(Experiments.class), mock(Experiments.class))
mock(FilterExpression.class),
mock(FilterExpression.class))
.suppress(Warning.STRICT_INHERITANCE)
+ .withOnlyTheseFields("name")
.verify();
}
diff --git a/alchemy-core/src/test/java/io/rtr/alchemy/models/TreatmentOverrideTest.java b/alchemy-core/src/test/java/io/rtr/alchemy/models/TreatmentOverrideTest.java
index d20877a3..4c79028c 100644
--- a/alchemy-core/src/test/java/io/rtr/alchemy/models/TreatmentOverrideTest.java
+++ b/alchemy-core/src/test/java/io/rtr/alchemy/models/TreatmentOverrideTest.java
@@ -17,8 +17,8 @@ public void testEqualsHashCode() {
.suppress(Warning.STRICT_INHERITANCE)
.withPrefabValues(
FilterExpression.class,
- mock(FilterExpression.class),
- mock(FilterExpression.class))
+ FilterExpression.alwaysTrue(),
+ FilterExpression.of("false"))
.verify();
}
diff --git a/alchemy-core/src/test/java/io/rtr/alchemy/models/TreatmentTest.java b/alchemy-core/src/test/java/io/rtr/alchemy/models/TreatmentTest.java
index 246c5b89..cf5c5d90 100644
--- a/alchemy-core/src/test/java/io/rtr/alchemy/models/TreatmentTest.java
+++ b/alchemy-core/src/test/java/io/rtr/alchemy/models/TreatmentTest.java
@@ -10,7 +10,10 @@
public class TreatmentTest {
@Test
public void testEqualsHashCode() {
- EqualsVerifier.forClass(Treatment.class).suppress(Warning.STRICT_INHERITANCE).verify();
+ EqualsVerifier.forClass(Treatment.class)
+ .suppress(Warning.STRICT_INHERITANCE)
+ .withIgnoredFields("description")
+ .verify();
}
@Test
diff --git a/alchemy-db-memory/pom.xml b/alchemy-db-memory/pom.xml
index c1f4aa44..d7b84876 100644
--- a/alchemy-db-memory/pom.xml
+++ b/alchemy-db-memory/pom.xml
@@ -1,31 +1,76 @@
+ 4.0.0
+
alchemy-parent
io.rtr.alchemy
- 2.0.10-SNAPSHOT
+ 2.1.0-SNAPSHOT
- 4.0.0
+
Alchemy Database Support using Memory
A sample implementation of experiments store and cache
alchemy-db-memory
+
+
+
+
+ io.rtr.alchemy
+ alchemy-dependencies
+ ${project.version}
+ pom
+ import
+
+
+
+
+ io.rtr.alchemy
+ alchemy-core
+ ${project.version}
+
+
+
+
+ io.rtr.alchemy
+ alchemy-testing
+ ${project.version}
+ test
+
+
+
+
+
io.rtr.alchemy
alchemy-core
- ${project.version}
+
+
+
+ com.google.code.findbugs
+ jsr305
+
+
+ com.google.guava
+ guava
+
+
+ joda-time
+ joda-time
+
+
+
io.rtr.alchemy
alchemy-testing
- ${project.version}
test
- com.google.code.findbugs
- jsr305
+ junit
+ junit
+ test
-
\ No newline at end of file
diff --git a/alchemy-db-mongo/pom.xml b/alchemy-db-mongo/pom.xml
index b3c8e87d..e8571c96 100644
--- a/alchemy-db-mongo/pom.xml
+++ b/alchemy-db-mongo/pom.xml
@@ -1,39 +1,92 @@
+ 4.0.0
+
alchemy-parent
io.rtr.alchemy
- 2.0.10-SNAPSHOT
+ 2.1.0-SNAPSHOT
- 4.0.0
+
Alchemy Database Support for Mongo
alchemy-db-mongo
+
+
+
+
+ io.rtr.alchemy
+ alchemy-dependencies
+ ${project.version}
+ pom
+ import
+
+
+
+
+ io.rtr.alchemy
+ alchemy-core
+ ${project.version}
+
+
+
+
+ io.rtr.alchemy
+ alchemy-testing
+ ${project.version}
+ test
+
+
+
+
+
io.rtr.alchemy
alchemy-core
- ${project.version}
+
+
+
+
+ com.google.code.findbugs
+ jsr305
- io.rtr.alchemy
- alchemy-testing
- ${project.version}
- test
+ com.google.guava
+ guava
+
+
+ joda-time
+ joda-time
org.mongodb.morphia
morphia
- 1.3.2
- com.google.code.findbugs
- jsr305
+ org.mongodb
+ mongo-java-driver
org.slf4j
slf4j-api
-
+
+
+ io.rtr.alchemy
+ alchemy-testing
+ test
+
+
+ junit
+ junit
+ test
+
+
+ org.mockito
+ mockito-core
+ test
+
+
\ No newline at end of file
diff --git a/alchemy-db-mongo/src/test/java/io/rtr/alchemy/db/mongo/MongoStoreProviderTest.java b/alchemy-db-mongo/src/test/java/io/rtr/alchemy/db/mongo/MongoStoreProviderTest.java
index d815ad45..6333af3e 100644
--- a/alchemy-db-mongo/src/test/java/io/rtr/alchemy/db/mongo/MongoStoreProviderTest.java
+++ b/alchemy-db-mongo/src/test/java/io/rtr/alchemy/db/mongo/MongoStoreProviderTest.java
@@ -13,7 +13,7 @@ public class MongoStoreProviderTest extends ExperimentsStoreProviderTest {
private static final String DATABASE_NAME = "test_experiments";
@Override
- protected ExperimentsStoreProvider createProvider() throws Exception {
+ protected ExperimentsStoreProvider createProvider() {
return MongoStoreProvider.newBuilder().setDatabase(DATABASE_NAME).build();
}
diff --git a/alchemy-dependencies/pom.xml b/alchemy-dependencies/pom.xml
new file mode 100644
index 00000000..0433a38d
--- /dev/null
+++ b/alchemy-dependencies/pom.xml
@@ -0,0 +1,246 @@
+
+
+ 4.0.0
+
+
+ alchemy-parent
+ io.rtr.alchemy
+ 2.1.0-SNAPSHOT
+
+
+ alchemy-dependencies
+ pom
+ Alchemy Dependencies BOM
+ Bill of Materials for all third-party dependencies of the Alchemy project
+
+
+
+
+ 3.3.0
+
+
+
+ 3.29.2-GA
+
+ 9.4.52.v20230823
+
+
+
+ 5.4.3.Final
+
+ 1.1.0.Final
+
+ 2.0.1
+
+ 3.0.2
+
+
+
+ 4.5.13
+
+ 3.6
+
+ 3.8.1
+
+ 1.3.29
+
+ 32.1.2-jre
+
+ 2.9.10
+
+ 2.25.1
+
+ 2.12.5
+
+ 5.1.0
+
+ 2.5.0
+
+ 1.3.2
+
+ 3.4.0
+
+ 1.7.36
+
+
+
+ 3.3
+
+
+
+ 3.15.2
+
+ 1.3
+
+ 4.13.1
+
+ 2.24.5
+
+
+
+
+
+
+ com.fasterxml.jackson
+ jackson-bom
+ ${jackson.version}
+ pom
+ import
+
+
+ com.google.guava
+ guava-bom
+ ${guava.version}
+ pom
+ import
+
+
+ org.eclipse.jetty
+ jetty-bom
+ ${jetty.version}
+ pom
+ import
+
+
+ org.glassfish.hk2
+ hk2-bom
+ ${hk2.version}
+ pom
+ import
+
+
+ org.glassfish.jersey
+ jersey-bom
+ ${jersey.version}
+ pom
+ import
+
+
+
+
+ cglib
+ cglib-nodep
+ ${cglib.version}
+
+
+ org.javassist
+ javassist
+ ${javassist.version}
+
+
+ org.objenesis
+ objenesis
+ ${objenesis.version}
+
+
+
+
+ com.google.code.findbugs
+ jsr305
+ ${jsr305.version}
+
+
+ javax.validation
+ validation-api
+ ${javax.validation.version}
+
+
+ javax.ws.rs
+ javax.ws.rs-api
+ ${javax.ws.rs.version}
+
+
+ org.hibernate
+ hibernate-validator
+ ${hibernate-validator.version}
+
+
+
+
+ org.mongodb.morphia
+ morphia
+ ${morphia.version}
+
+
+ org.mongodb
+ mongo-java-driver
+ ${mongodb-driver.version}
+
+
+
+
+ com.google.inject
+ guice
+ ${guice.version}
+
+
+ org.apache.httpcomponents
+ httpclient
+ ${apache-httpclient.version}
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j.version}
+
+
+
+
+ joda-time
+ joda-time
+ ${joda-time.version}
+
+
+ ma.glasnost.orika
+ orika-core
+ ${orika.version}
+
+
+ org.apache.commons
+ commons-math3
+ ${apache-math3.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${apache-lang.version}
+
+
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+ nl.jqno.equalsverifier
+ equalsverifier
+ ${equalsverifier.version}
+ test
+
+
+ org.hamcrest
+ hamcrest-core
+ ${hamcrest.version}
+ test
+
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
+
+
+
+
+ io.dropwizard
+ dropwizard-bom
+ ${dropwizard.version}
+ pom
+ import
+
+
+
+
\ No newline at end of file
diff --git a/alchemy-example/pom.xml b/alchemy-example/pom.xml
index 2fa2b0df..dbba7df1 100644
--- a/alchemy-example/pom.xml
+++ b/alchemy-example/pom.xml
@@ -1,45 +1,144 @@
+ 4.0.0
alchemy-parent
io.rtr.alchemy
- 2.0.10-SNAPSHOT
+ 2.1.0-SNAPSHOT
- 4.0.0
+
Alchemy Example Program
alchemy-example
+
+
+
+
+ io.rtr.alchemy
+ alchemy-dependencies
+ ${project.version}
+ pom
+ import
+
+
+
+
+ io.rtr.alchemy
+ alchemy-api
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-client
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-core
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-db-memory
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-db-mongo
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-mapping
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-service
+ ${project.version}
+
+
+
+
+
io.rtr.alchemy
- alchemy-core
- ${project.version}
+ alchemy-api
io.rtr.alchemy
alchemy-client
- ${project.version}
io.rtr.alchemy
- alchemy-api
- ${project.version}
+ alchemy-core
io.rtr.alchemy
- alchemy-service
- ${project.version}
+ alchemy-db-memory
io.rtr.alchemy
- alchemy-db-memory
- ${project.version}
+ alchemy-db-mongo
io.rtr.alchemy
- alchemy-testing
- ${project.version}
- test
+ alchemy-mapping
+
+
+ io.rtr.alchemy
+ alchemy-service
+
+
+
+
+ ch.qos.logback
+ logback-classic
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+ com.google.guava
+ guava
+
+
+ io.dropwizard
+ dropwizard-configuration
+
+
+ io.dropwizard
+ dropwizard-jackson
+
+
+ io.dropwizard
+ dropwizard-validation
+
+
+ javax.validation
+ validation-api
+
+
+ javax.ws.rs
+ javax.ws.rs-api
+
+
+ joda-time
+ joda-time
+
+
+ org.mongodb
+ mongo-java-driver
+
+
+ org.slf4j
+ slf4j-api
@@ -47,71 +146,24 @@
org.apache.maven.plugins
- maven-shade-plugin
- ${maven-shade-plugin.version}
+ maven-dependency-plugin
+ ${maven-dependency-plugin.version}
- false
-
-
- *:*
-
- META-INF/*.SF
- META-INF/*.DSA
- META-INF/*.RSA
-
-
-
+
+
+ ch.qos.logback:logback-classic
+ com.fasterxml.jackson.core:jackson-databind
+ com.google.guava:guava
+ io.dropwizard:dropwizard-configuration
+ joda-time:joda-time
+ org.slf4j:slf4j-api
+
+ com.fasterxml.jackson.core:jackson-annotations
+ io.dropwizard:dropwizard-validation
+ javax.validation:validation-api
+ javax.ws.rs:javax.ws.rs-api
+
-
-
- service-jar
- package
-
- shade
-
-
- target/ServiceExample.jar
-
-
-
- io.rtr.alchemy.example.ServiceExample
-
-
-
-
-
- client-jar
- package
-
- shade
-
-
- target/ClientExample.jar
-
-
-
- io.rtr.alchemy.example.ClientExample
-
-
-
-
-
- library-jar
- package
-
- shade
-
-
- target/LibraryExample.jar
-
-
-
- io.rtr.alchemy.example.LibraryExample
-
-
-
-
-
diff --git a/alchemy-example/src/main/java/io/rtr/alchemy/example/config/PeriodicStaleCheckingCacheStrategy.java b/alchemy-example/src/main/java/io/rtr/alchemy/example/config/PeriodicStaleCheckingCacheStrategy.java
index 54a284a9..2a019bf9 100644
--- a/alchemy-example/src/main/java/io/rtr/alchemy/example/config/PeriodicStaleCheckingCacheStrategy.java
+++ b/alchemy-example/src/main/java/io/rtr/alchemy/example/config/PeriodicStaleCheckingCacheStrategy.java
@@ -1,9 +1,11 @@
package io.rtr.alchemy.example.config;
import com.fasterxml.jackson.annotation.JsonProperty;
+
import io.rtr.alchemy.caching.CacheStrategy;
import io.rtr.alchemy.service.config.CacheStrategyConfiguration;
-import io.dropwizard.util.Duration;
+
+import org.joda.time.Duration;
import javax.validation.constraints.NotNull;
@@ -16,7 +18,6 @@ public Duration getDuration() {
@Override
public CacheStrategy createStrategy() {
- return new io.rtr.alchemy.caching.PeriodicStaleCheckingCacheStrategy(
- org.joda.time.Duration.millis(duration.toMilliseconds()));
+ return new io.rtr.alchemy.caching.PeriodicStaleCheckingCacheStrategy(duration);
}
}
diff --git a/alchemy-example/src/main/java/io/rtr/alchemy/example/mappers/UserMapper.java b/alchemy-example/src/main/java/io/rtr/alchemy/example/mappers/UserMapper.java
index 6f5eb70b..2125f901 100644
--- a/alchemy-example/src/main/java/io/rtr/alchemy/example/mappers/UserMapper.java
+++ b/alchemy-example/src/main/java/io/rtr/alchemy/example/mappers/UserMapper.java
@@ -5,6 +5,7 @@
import io.rtr.alchemy.mapping.Mapper;
/** Maps to and from UserDto to User */
+@SuppressWarnings("unused")
public class UserMapper implements Mapper {
@Override
public User fromDto(UserDto source) {
diff --git a/alchemy-mapping/pom.xml b/alchemy-mapping/pom.xml
index 4737bbf1..3b5f1277 100644
--- a/alchemy-mapping/pom.xml
+++ b/alchemy-mapping/pom.xml
@@ -1,21 +1,42 @@
+ 4.0.0
+
alchemy-parent
io.rtr.alchemy
- 2.0.10-SNAPSHOT
+ 2.1.0-SNAPSHOT
+
Alchemy Mapper Library
Library for implementing mapping of DTO to BO to DB
- 4.0.0
-
alchemy-mapping
+
+
+
+
+ io.rtr.alchemy
+ alchemy-dependencies
+ ${project.version}
+ pom
+ import
+
+
+
+
+
com.google.guava
guava
-
+
+
+ junit
+ junit
+ test
+
+
\ No newline at end of file
diff --git a/alchemy-service/pom.xml b/alchemy-service/pom.xml
index d8f5ab4d..5497a5ac 100644
--- a/alchemy-service/pom.xml
+++ b/alchemy-service/pom.xml
@@ -1,114 +1,170 @@
+ 4.0.0
+
alchemy-parent
io.rtr.alchemy
- 2.0.10-SNAPSHOT
+ 2.1.0-SNAPSHOT
+
Alchemy REST Service
REST service for hosting Alchemy as a service
- 4.0.0
-
alchemy-service
+
+
+
+
+ io.rtr.alchemy
+ alchemy-dependencies
+ ${project.version}
+ pom
+ import
+
+
+
+
+ io.rtr.alchemy
+ alchemy-api
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-core
+ ${project.version}
+
+
+ io.rtr.alchemy
+ alchemy-mapping
+ ${project.version}
+
+
+
+
+ io.rtr.alchemy
+ alchemy-db-memory
+ ${project.version}
+ test
+
+
+
+
+
- io.dropwizard
- dropwizard-core
+ io.rtr.alchemy
+ alchemy-api
io.rtr.alchemy
alchemy-core
- ${project.version}
io.rtr.alchemy
alchemy-mapping
- ${project.version}
+
+
- io.rtr.alchemy
- alchemy-db-mongo
- ${project.version}
+ com.fasterxml.jackson.core
+ jackson-annotations
- io.rtr.alchemy
- alchemy-db-memory
- ${project.version}
+ com.fasterxml.jackson.core
+ jackson-databind
- io.rtr.alchemy
- alchemy-api
- ${project.version}
+ com.fasterxml.jackson.datatype
+ jackson-datatype-guava
com.fasterxml.jackson.module
jackson-module-jsonSchema
- org.slf4j
- slf4j-api
+ com.google.code.findbugs
+ jsr305
+
+
+ com.google.guava
+ guava
+
+
+ com.google.inject
+ guice
+
+
+ io.dropwizard
+ dropwizard-core
+
+
+ io.dropwizard
+ dropwizard-jersey
+
+
+ io.dropwizard
+ dropwizard-lifecycle
+
+
+ io.dropwizard.metrics
+ metrics-annotation
+
+
+ io.dropwizard.metrics
+ metrics-core
+
+
+ io.dropwizard.metrics
+ metrics-healthchecks
+
+
+ io.dropwizard.metrics
+ metrics-jmx
+
+
+ javax.validation
+ validation-api
+
+
+ javax.ws.rs
+ javax.ws.rs-api
+
+
+ joda-time
+ joda-time
+
+
+
+
+ io.dropwizard
+ dropwizard-jackson
+ test
io.dropwizard
dropwizard-testing
- ${dropwizard.version}
test
-
-
- junit
- junit
-
-
- com.fasterxml.jackson.core
- jackson-databind
- ${jackson.version}
+ io.rtr.alchemy
+ alchemy-db-memory
+ test
- com.codahale.metrics
- metrics-core
- 3.0.2
+ junit
+ junit
+ test
+
+
+ org.glassfish.jersey.core
+ jersey-common
+ test
+
+
+ org.mockito
+ mockito-core
+ test
-
-
-
-
- org.apache.maven.plugins
- maven-shade-plugin
- ${maven-shade-plugin.version}
-
- false
-
-
- *:*
-
- META-INF/*.SF
- META-INF/*.DSA
- META-INF/*.RSA
-
-
-
-
-
-
- package
-
- shade
-
-
-
-
-
- io.rtr.alchemy.service.AlchemyService
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/alchemy-service/src/main/java/io/rtr/alchemy/service/health/ExperimentsDatabaseProviderCheck.java b/alchemy-service/src/main/java/io/rtr/alchemy/service/health/ExperimentsDatabaseProviderCheck.java
index cfcc388f..539c7bb2 100644
--- a/alchemy-service/src/main/java/io/rtr/alchemy/service/health/ExperimentsDatabaseProviderCheck.java
+++ b/alchemy-service/src/main/java/io/rtr/alchemy/service/health/ExperimentsDatabaseProviderCheck.java
@@ -2,6 +2,7 @@
import com.codahale.metrics.health.HealthCheck;
import com.google.inject.Inject;
+
import io.rtr.alchemy.db.Filter;
import io.rtr.alchemy.models.Experiments;
diff --git a/alchemy-service/src/main/java/io/rtr/alchemy/service/jackson/ClassKeyDeserializer.java b/alchemy-service/src/main/java/io/rtr/alchemy/service/jackson/ClassKeyDeserializer.java
index 335b76ad..ce096cea 100644
--- a/alchemy-service/src/main/java/io/rtr/alchemy/service/jackson/ClassKeyDeserializer.java
+++ b/alchemy-service/src/main/java/io/rtr/alchemy/service/jackson/ClassKeyDeserializer.java
@@ -12,7 +12,7 @@ public Object deserializeKey(String className, DeserializationContext context)
throws IOException {
try {
return Class.forName(className);
- } catch (ClassNotFoundException e) {
+ } catch (final Exception e) {
throw new IOException(String.format("could not find class %s", className));
}
}
diff --git a/alchemy-service/src/main/java/io/rtr/alchemy/service/metrics/JmxMetricsManaged.java b/alchemy-service/src/main/java/io/rtr/alchemy/service/metrics/JmxMetricsManaged.java
index 756214b5..749bcdf7 100644
--- a/alchemy-service/src/main/java/io/rtr/alchemy/service/metrics/JmxMetricsManaged.java
+++ b/alchemy-service/src/main/java/io/rtr/alchemy/service/metrics/JmxMetricsManaged.java
@@ -1,6 +1,7 @@
package io.rtr.alchemy.service.metrics;
-import com.codahale.metrics.JmxReporter;
+import com.codahale.metrics.jmx.JmxReporter;
+
import io.dropwizard.lifecycle.Managed;
import io.dropwizard.setup.Environment;
diff --git a/alchemy-testing/pom.xml b/alchemy-testing/pom.xml
index c6493368..99bdb5ed 100644
--- a/alchemy-testing/pom.xml
+++ b/alchemy-testing/pom.xml
@@ -1,42 +1,63 @@
+ 4.0.0
+
alchemy-parent
io.rtr.alchemy
- 2.0.10-SNAPSHOT
+ 2.1.0-SNAPSHOT
- 4.0.0
Alchemy Unit Test Helpers
-
alchemy-testing
+
+
+
+
+ io.rtr.alchemy
+ alchemy-dependencies
+ ${project.version}
+ pom
+ import
+
+
+
+
+ io.rtr.alchemy
+ alchemy-core
+ ${project.version}
+
+
+
+
+
io.rtr.alchemy
alchemy-core
- ${project.version}
+
+
- io.rtr.alchemy
- alchemy-api
- ${project.version}
+ com.google.guava
+ guava
- io.rtr.alchemy
- alchemy-mapping
- ${project.version}
+ javax.validation
+ validation-api
+
+
junit
junit
- ${junit.version}
+ compile
org.mockito
mockito-core
- ${mockito.version}
+ compile
-
\ No newline at end of file
diff --git a/alchemy-testing/src/main/java/io/rtr/alchemy/testing/db/ExperimentsStoreProviderTest.java b/alchemy-testing/src/main/java/io/rtr/alchemy/testing/db/ExperimentsStoreProviderTest.java
index f45407d1..088d30f3 100644
--- a/alchemy-testing/src/main/java/io/rtr/alchemy/testing/db/ExperimentsStoreProviderTest.java
+++ b/alchemy-testing/src/main/java/io/rtr/alchemy/testing/db/ExperimentsStoreProviderTest.java
@@ -1,7 +1,17 @@
package io.rtr.alchemy.testing.db;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
+
import io.rtr.alchemy.db.ExperimentsStoreProvider;
import io.rtr.alchemy.db.Filter;
import io.rtr.alchemy.db.Ordering;
@@ -12,19 +22,13 @@
import io.rtr.alchemy.models.Allocations;
import io.rtr.alchemy.models.Experiment;
import io.rtr.alchemy.models.Experiments;
+
import org.junit.Before;
import org.junit.Test;
-import javax.validation.ValidationException;
import java.util.Set;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
+import javax.validation.ValidationException;
/**
* The purpose of this class is to provide a base class for testing whether an implementation of a
@@ -33,7 +37,7 @@
public abstract class ExperimentsStoreProviderTest {
private Experiments experiments;
- protected abstract ExperimentsStoreProvider createProvider() throws Exception;
+ protected abstract ExperimentsStoreProvider createProvider();
protected abstract void resetStore();
@@ -57,7 +61,7 @@ public AttributesMap computeAttributes() {
}
@Before
- public void setUp() throws Exception {
+ public void setUp() {
resetStore();
final ExperimentsStoreProvider provider = createProvider();
assertNotNull("provider cannot be null", provider);
@@ -296,29 +300,33 @@ public void testExperimentObjectReference() throws ValidationException {
final Experiment obj2 = experiments.get("foo");
- assertFalse(
+ assertNotSame(
"saved experiment object reference should not be same object reference from get()",
- obj1 == obj2);
+ obj1,
+ obj2);
final Experiment obj3 = experiments.find().iterator().next();
- assertFalse(
+ assertNotSame(
"saved experiment object reference should not be same object reference from find()",
- obj1 == obj3);
+ obj1,
+ obj3);
final Experiment obj4 = experiments.getActiveExperiments().iterator().next();
- assertFalse(
+ assertNotSame(
"saved experiment object reference should not be same object reference from getActiveExperiments()",
- obj1 == obj4);
+ obj1,
+ obj4);
final Identity identity = mock(Identity.class);
doReturn(AttributesMap.empty()).when(identity).computeAttributes();
final Experiment obj5 =
experiments.getActiveTreatments(identity).keySet().iterator().next();
- assertFalse(
+ assertNotSame(
"saved experiment object reference should not be same object reference from getActiveTreatments()",
- obj1 == obj5);
+ obj1,
+ obj5);
}
}
diff --git a/findBugsExclusions.xml b/findBugsExclusions.xml
deleted file mode 100644
index db4b37b2..00000000
--- a/findBugsExclusions.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index bc15b116..de303d36 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,26 +5,27 @@
io.rtr.alchemy
alchemy-parent
pom
- 2.0.10-SNAPSHOT
+ 2.1.0-SNAPSHOT
https://github.com/RentTheRunway/alchemy
Alchemy Project
+
+ Alchemy is a library and a REST service for managing and tracking experiments and A/B testing
+
- alchemy-core
- alchemy-service
alchemy-api
+ alchemy-bom
alchemy-client
- alchemy-mapping
+ alchemy-core
alchemy-db-mongo
alchemy-db-memory
+ alchemy-dependencies
alchemy-example
+ alchemy-mapping
+ alchemy-service
alchemy-testing
-
- Alchemy is a library and a REST service for managing and tracking experiments and A/B testing
-
-
UTF-8
1.8
@@ -33,59 +34,10 @@
${encoding}
${encoding}
-
-
- 4.5.13
-
- 3.6
-
- 3.8.1
-
- 1.3.20
-
- 3.0.2
-
- 22.0
-
- 5.4.3.Final
-
- 2.9.10
-
- 2.25.1
-
- 2.10.5
-
- 4.1.0
-
- 1.7.6
-
-
-
- 2.2.2
-
-
-
- 3.24.1-GA
-
-
-
- 1.4.1
-
- 1.3
-
- 4.13.1
-
- 2.24.5
-
-
- 1.1
-
3.2.0
- 3.0.5
-
2.9.1
3.6.0
@@ -121,163 +73,9 @@
3.1.2
1.6.13
-
-
-
-
- org.hibernate
- hibernate-validator
- ${hibernate-validator.version}
-
-
- org.apache.commons
- commons-lang3
- ${apache-lang.version}
-
-
- org.apache.commons
- commons-math3
- ${apache-math3.version}
-
-
- org.apache.httpcomponents
- httpclient
- ${apache-httpclient.version}
-
-
- joda-time
- joda-time
- ${joda-time.version}
-
-
- org.javassist
- javassist
- ${javassist.version}
-
-
- ma.glasnost.orika
- orika-core
- ${orika.version}
-
-
- org.glassfish.jersey.core
- jersey-client
- ${jersey.version}
-
-
- com.google.guava
- guava
- ${guava.version}
-
-
- io.dropwizard
- dropwizard-core
- ${dropwizard.version}
-
-
- io.dropwizard
- dropwizard-client
- ${dropwizard.version}
-
-
- io.dropwizard
- dropwizard-jackson
- ${dropwizard.version}
-
-
- io.dropwizard
- dropwizard-validation
- ${dropwizard.version}
-
-
- com.fasterxml.jackson.core
- jackson-databind
- ${jackson.version}
-
-
- com.fasterxml.jackson.core
- jackson-core
- ${jackson.version}
-
-
- com.fasterxml.jackson.core
- jackson-annotations
- ${jackson.version}
-
-
- com.fasterxml.jackson.module
- jackson-module-jsonSchema
- ${jackson.version}
-
-
- com.fasterxml.jackson.datatype
- jackson-datatype-guava
- ${jackson.version}
-
-
- com.fasterxml.jackson.module
- jackson-module-afterburner
- ${jackson.version}
-
-
- com.google.inject
- guice
- ${guice.version}
-
-
- org.slf4j
- slf4j-api
- ${slf4j.version}
-
-
- org.objenesis
- objenesis
- ${objenesis.version}
-
-
- org.hamcrest
- hamcrest-core
- ${hamcrest.version}
-
-
- com.google.code.findbugs
- jsr305
- ${findbugs.version}
-
-
- cglib
- cglib-nodep
- ${cglib.version}
-
-
- junit
- junit
- ${junit.version}
-
-
-
-
-
-
- junit
- junit
- ${junit.version}
- test
-
-
- nl.jqno.equalsverifier
- equalsverifier
- ${equalsverifier.version}
- test
-
-
- org.mockito
- mockito-core
- ${mockito.version}
- test
-
-
+ 4.7.3.6
+
@@ -300,6 +98,24 @@
+
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ ${spotbugs-maven-plugin.version}
+
+
+ false
+
+
+
+ spotbugs-check
+
+ check
+
+
+
+
+
org.apache.maven.plugins
maven-assembly-plugin
@@ -331,6 +147,14 @@
org.apache.maven.plugins
maven-dependency-plugin
${maven-dependency-plugin.version}
+
+
+ analyze
+
+ analyze-only
+
+
+
@@ -464,28 +288,6 @@
false
-
-
- org.codehaus.mojo
- findbugs-maven-plugin
- ${findbugs-maven-plugin.version}
-
- Max
- Low
- true
- ${project.build.directory}/findbugs
- findBugsExclusions.xml
-
-
-
- analyze-compile
- compile
-
- check
-
-
-
-
@@ -496,6 +298,12 @@
${fmt-maven-plugin.version}
+
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ ${spotbugs-maven-plugin.version}
+
+
org.apache.maven.plugins
maven-dependency-plugin
@@ -525,12 +333,6 @@
buildnumber-maven-plugin
${buildnumber-maven-plugin.version}
-
-
- org.codehaus.mojo
- findbugs-maven-plugin
- ${findbugs-maven-plugin.version}
-