Skip to content

Commit

Permalink
chore: adding a resolver transformer (#43)
Browse files Browse the repository at this point in the history
Adding the default implementation for the `ResolverTransformer` to set the value of a scalar based on a path lookup in the base resource item.

fixes: #32
  • Loading branch information
mnorbury authored Aug 15, 2023
1 parent 7529438 commit ef7c613
Show file tree
Hide file tree
Showing 8 changed files with 119 additions and 1 deletion.
2 changes: 2 additions & 0 deletions lib/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ dependencies {
testImplementation(platform('org.junit:junit-bom:5.10.0'))
testImplementation('org.junit.jupiter:junit-jupiter:5.10.0')
testImplementation('org.junit.jupiter:junit-jupiter-api:5.10.0')
testImplementation('org.mockito:mockito-core:5.4.0')
testImplementation('org.mockito:mockito-junit-jupiter:5.4.0')
testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.10.0')

testImplementation 'org.assertj:assertj-core:3.24.2'
Expand Down
4 changes: 4 additions & 0 deletions lib/src/main/java/io/cloudquery/schema/ClientMeta.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package io.cloudquery.schema;

public class ClientMeta {
}
10 changes: 10 additions & 0 deletions lib/src/main/java/io/cloudquery/schema/Column.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package io.cloudquery.schema;

import lombok.Builder;
import lombok.Getter;

@Builder
@Getter
public class Column {
private String name;
}
7 changes: 7 additions & 0 deletions lib/src/main/java/io/cloudquery/schema/ColumnResolver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package io.cloudquery.schema;

import io.cloudquery.transformers.TransformerException;

public interface ColumnResolver {
void resolve(ClientMeta meta, Resource resource, Column column) throws TransformerException;
}
14 changes: 14 additions & 0 deletions lib/src/main/java/io/cloudquery/schema/Resource.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.cloudquery.schema;

import lombok.Builder;
import lombok.Getter;

@Builder
@Getter
public class Resource {
private Object item;


public void set(String columnName, Object value) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.cloudquery.transformers;

import io.cloudquery.helper.ReflectionPathResolver;
import io.cloudquery.helper.ReflectionPathResolver.PathResolverException;
import io.cloudquery.schema.ColumnResolver;

import java.lang.reflect.Field;

public interface ResolverTransformer {
class DefaulResolverTransformer implements ResolverTransformer {
@Override
public ColumnResolver transform(Field field, String path) throws TransformerException {
return (meta, resource, column) -> {
try {
resource.set(column.getName(), ReflectionPathResolver.resolve(resource.getItem(), path));
} catch (PathResolverException ex) {
throw new TransformerException("Failed to resolve path: " + path, ex);
}
};
}
}

ColumnResolver transform(Field field, String path) throws TransformerException;
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package io.cloudquery.transformers;

public class TransformerException extends Exception{
public class TransformerException extends Exception {
public TransformerException(String message) {
super(message);
}

public TransformerException(String message, Throwable ex) {
super(message, ex);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package io.cloudquery.transformers;

import io.cloudquery.schema.Column;
import io.cloudquery.schema.Resource;
import io.cloudquery.transformers.ResolverTransformer.DefaulResolverTransformer;
import lombok.Builder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.junit.Assert.assertThrows;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
class DefaultResolverTransformerTest {

@Builder
public static class ResourceItem {
public String myCustomID;
}

private DefaulResolverTransformer transformer;

@Mock
private Resource resource;

@BeforeEach
void setUp() {
transformer = new DefaulResolverTransformer();

when(resource.getItem()).thenReturn(ResourceItem.builder().myCustomID("1234").build());
}

@Test
public void shouldTransformCustomFieldNamesFromResource() throws TransformerException {
Column targetColumn = Column.builder().name("id").build();

transformer.transform(null, "myCustomID").resolve(null, resource, targetColumn);

verify(resource).set(eq("id"), eq("1234"));
}

@Test
public void shouldThrowExceptionIfResourceFieldNameNotFound() throws TransformerException {
Column targetColumn = Column.builder().name("id").build();

assertThrows(TransformerException.class, () -> transformer.transform(null, "badFieldName").resolve(null, resource, targetColumn));
}
}

0 comments on commit ef7c613

Please sign in to comment.