Skip to content
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

bump embulk to 0.10.0 #48

Merged
merged 6 commits into from
Sep 2, 2024
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
20 changes: 13 additions & 7 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,23 @@ tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:deprecation" << "-Xlint:unchecked"
}

def embulkVersion = '0.10.43'

dependencies {
compileOnly "org.embulk:embulk-core:0.9.23"
// compile "YOUR_JAR_DEPENDENCY_GROUP:YOUR_JAR_DEPENDENCY_MODULE:YOUR_JAR_DEPENDENCY_VERSION"
compileOnly("org.embulk:embulk-api:$embulkVersion") { exclude group: "org.slf4j", module: "slf4j-api" }
compileOnly("org.embulk:embulk-spi:$embulkVersion") { exclude group: "org.slf4j", module: "slf4j-api" }
compile "org.embulk:embulk-util-timestamp:0.2.1"
compile "org.embulk:embulk-util-config:0.3.3"
compile "org.embulk:embulk-util-json:0.2.2"
compile "com.google.guava:guava:31.1-jre"
compile "org.slf4j:slf4j-log4j12:1.7.36"
compile project(path: ":shadow-google-ads-helper", configuration: "shadow")

testCompile "junit:junit:4.13"
testCompile 'org.embulk:embulk-standards:0.9.23'
testCompile 'org.embulk:embulk-test:0.9.23'
testCompile "org.mockito:mockito-core:1.10.19"
testCompile "org.embulk:embulk-core:0.9.23:tests"
testCompile "org.embulk:embulk-deps-buffer:0.9.23"
testCompile "org.embulk:embulk-deps-config:0.9.23"
testCompile("org.embulk:embulk-core:$embulkVersion") { exclude group: "org.slf4j", module: "slf4j-api" }
testCompile("org.embulk:embulk-deps:$embulkVersion") { exclude group: "org.slf4j", module: "slf4j-api" }
testCompile("org.embulk:embulk-junit4:$embulkVersion") { exclude group: "org.slf4j", module: "slf4j-api" }
}

embulkPlugin {
Expand Down
19 changes: 19 additions & 0 deletions gradle/dependency-locks/embulkPluginRuntime.lockfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,22 @@
# This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised.
# This file is expected to be part of source control.
ch.qos.reload4j:reload4j:1.2.19
com.fasterxml.jackson.core:jackson-annotations:2.6.7
com.fasterxml.jackson.core:jackson-core:2.6.7
com.fasterxml.jackson.core:jackson-databind:2.6.7.5
com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.6.7
com.google.code.findbugs:jsr305:3.0.2
com.google.errorprone:error_prone_annotations:2.11.0
com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.j2objc:j2objc-annotations:1.3
javax.validation:validation-api:1.1.0.Final
org.checkerframework:checker-qual:3.12.0
org.embulk:embulk-util-config:0.3.3
org.embulk:embulk-util-json:0.2.2
org.embulk:embulk-util-rubytime:0.3.2
org.embulk:embulk-util-timestamp:0.2.1
org.slf4j:slf4j-api:1.7.36
org.slf4j:slf4j-reload4j:1.7.36
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

import com.google.gson.JsonElement;
import org.embulk.spi.Column;
import org.embulk.spi.ColumnConfig;

import org.embulk.spi.ColumnVisitor;
import org.embulk.spi.PageBuilder;
import org.embulk.spi.json.JsonParser;
import org.embulk.spi.time.Timestamp;
import org.embulk.spi.time.TimestampParser;

import org.embulk.util.config.units.ColumnConfig;
import org.embulk.util.json.JsonParser;
import org.embulk.util.timestamp.TimestampFormatter;

import java.util.List;

Expand Down Expand Up @@ -69,6 +70,7 @@ public void doubleColumn(Column column)
}
}

@SuppressWarnings("deprecation") // After the end of embulk v0.9 support, replace Timestamp with Instant
@Override
public void timestampColumn(Column column)
{
Expand All @@ -79,15 +81,13 @@ public void timestampColumn(Column column)
String configColumnName = GoogleAdsUtil.escapeColumnName(config.getName(), task);
if (configColumnName.equals(column.getName())
&& config.getConfigSource() != null
&& config.getConfigSource().getObjectNode() != null
&& config.getConfigSource().getObjectNode().get("format") != null
&& config.getConfigSource().getObjectNode().get("format").isTextual()) {
pattern = config.getConfigSource().getObjectNode().get("format").asText();
&& config.getConfigSource().get(String.class, "format", null) != null) {
pattern = config.getConfigSource().get(String.class, "format", null);
break;
}
}
TimestampParser parser = TimestampParser.of(pattern, "UTC");
Timestamp result = parser.parse(accessor.get(column.getName()));
TimestampFormatter formatter = TimestampFormatter.builder(pattern, true).build();
org.embulk.spi.time.Timestamp result = org.embulk.spi.time.Timestamp.ofInstant(formatter.parse(accessor.get(column.getName())));
pageBuilder.setTimestamp(column, result);
} catch (Exception e) {
pageBuilder.setNull(column);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@
import org.embulk.config.TaskSource;

import org.embulk.spi.Column;
import org.embulk.spi.ColumnConfig;
import org.embulk.spi.Exec;
import org.embulk.spi.InputPlugin;
import org.embulk.spi.PageBuilder;
import org.embulk.spi.PageOutput;
import org.embulk.spi.Schema;

import org.embulk.util.config.ConfigMapper;
import org.embulk.util.config.ConfigMapperFactory;
import org.embulk.util.config.TaskMapper;
import org.embulk.util.config.units.ColumnConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -27,18 +29,20 @@
public class GoogleAdsInputPlugin
implements InputPlugin
{
private static final ConfigMapperFactory CONFIG_MAPPER_FACTORY = ConfigMapperFactory.builder().addDefaultModules().build();
private final Logger logger = LoggerFactory.getLogger(GoogleAdsInputPlugin.class);

@Override
public ConfigDiff transaction(ConfigSource config,
InputPlugin.Control control)
{
PluginTask task = config.loadConfig(PluginTask.class);
final ConfigMapper configMapper = CONFIG_MAPPER_FACTORY.createConfigMapper();
final PluginTask task = configMapper.map(config, PluginTask.class);
Schema schema = buildSchema(task);

int taskCount = 1; // number of run() method calls

return resume(task.dump(), schema, taskCount, control);
return resume(task.toTaskSource(), schema, taskCount, control);
}

@Override
Expand All @@ -47,7 +51,7 @@ public ConfigDiff resume(TaskSource taskSource,
InputPlugin.Control control)
{
control.run(taskSource, schema, taskCount);
return Exec.newConfigDiff();
return CONFIG_MAPPER_FACTORY.newConfigDiff();
}

@Override
Expand All @@ -62,7 +66,9 @@ public TaskReport run(TaskSource taskSource,
Schema schema, int taskIndex,
PageOutput output)
{
PluginTask task = taskSource.loadTask(PluginTask.class);
final TaskMapper taskMapper = CONFIG_MAPPER_FACTORY.createTaskMapper();
final PluginTask task = taskMapper.map(taskSource, PluginTask.class);

GoogleAdsReporter reporter = new GoogleAdsReporter(task);
reporter.connect();
try {
Expand All @@ -87,13 +93,13 @@ public TaskReport run(TaskSource taskSource,
throw e;
}

return Exec.newTaskReport();
return CONFIG_MAPPER_FACTORY.newTaskReport();
}

@Override
public ConfigDiff guess(ConfigSource config)
{
return Exec.newConfigDiff();
return CONFIG_MAPPER_FACTORY.newConfigDiff();
}

public GoogleAdsReporter getClient(PluginTask task)
Expand All @@ -112,6 +118,7 @@ public Schema buildSchema(PluginTask task)
return new Schema(builder.build());
}

@SuppressWarnings("deprecation") // After the end of embulk v0.9 support, use Exec.getPageBuilder
protected PageBuilder getPageBuilder(final Schema schema, final PageOutput output)
{
return new PageBuilder(Exec.getBufferAllocator(), schema, output);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
import com.google.protobuf.Descriptors;
import com.google.protobuf.GeneratedMessageV3;
import com.google.protobuf.util.JsonFormat;
import org.embulk.spi.ColumnConfig;

import org.embulk.util.config.units.ColumnConfig;
import org.msgpack.core.annotations.VisibleForTesting;

import org.slf4j.Logger;
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/org/embulk/input/google_ads/PluginTask.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package org.embulk.input.google_ads;

import org.embulk.config.Config;
import org.embulk.config.ConfigDefault;
import org.embulk.config.Task;
import org.embulk.spi.SchemaConfig;
import org.embulk.util.config.Config;
import org.embulk.util.config.ConfigDefault;

import org.embulk.util.config.Task;
import org.embulk.util.config.units.SchemaConfig;

import java.util.List;
import java.util.Optional;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.embulk.config.ConfigSource;
import org.embulk.spi.InputPlugin;
import org.embulk.test.TestingEmbulk;

import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
Expand All @@ -24,7 +25,7 @@ public void testAccessor()
row.put("name2", "value2");

ConfigSource conf = TestHelper.getBaseConfig(embulk);
GoogleAdsAccessor accessor = new GoogleAdsAccessor(conf.loadConfig(PluginTask.class), row);
GoogleAdsAccessor accessor = new GoogleAdsAccessor(TestHelper.loadTask(conf), row);
String result = accessor.get("name");
String notExist = accessor.get("not_exist");

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
package org.embulk.input.google_ads;

import com.google.common.collect.ImmutableList;
import org.embulk.EmbulkTestRuntime;
import org.embulk.config.ConfigSource;
import org.embulk.spi.Column;
import org.embulk.spi.InputPlugin;
import org.embulk.spi.PageBuilder;
import org.embulk.spi.PageBuilderImpl;
import org.embulk.spi.PageReader;
import org.embulk.spi.Schema;
import org.embulk.spi.TestPageBuilderReader;
import org.embulk.test.TestingEmbulk;
import org.embulk.util.config.units.ColumnConfig;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import java.time.Instant;
import java.util.HashMap;

public class TestGoogleAdsColumnVisitor
{
@Rule
public TestingEmbulk embulk = TestingEmbulk.builder()
.registerPlugin(InputPlugin.class, "google_ads", GoogleAdsInputPlugin.class)
.build();

@Rule public EmbulkTestRuntime runtime;

@Before
public void setUp()
{
runtime = new EmbulkTestRuntime();
}

@Test
public void testStringColumn()
{
PageReader pageReader = visitColumns("100", embulk.newConfig().set("name", "name").set("type", "string"));
Assert.assertTrue(pageReader.nextRecord());
Assert.assertEquals("100", pageReader.getString(0));
Assert.assertFalse(pageReader.nextRecord());
}

@Test
public void testLongColumn()
{
PageReader pageReader = visitColumns("100", embulk.newConfig().set("name", "name").set("type", "long"));
Assert.assertTrue(pageReader.nextRecord());
Assert.assertEquals(100, pageReader.getLong(0));
Assert.assertFalse(pageReader.nextRecord());
}

@Test
public void testBooleanColumnTrue()
{
PageReader pageReader = visitColumns("true", embulk.newConfig().set("name", "name").set("type", "boolean"));
Assert.assertTrue(pageReader.nextRecord());
Assert.assertTrue(pageReader.getBoolean(0));
Assert.assertFalse(pageReader.nextRecord());
}

@Test
public void testBooleanColumnFalse()
{
PageReader pageReader = visitColumns("false", embulk.newConfig().set("name", "name").set("type", "boolean"));
Assert.assertTrue(pageReader.nextRecord());
Assert.assertFalse(pageReader.getBoolean(0));
Assert.assertFalse(pageReader.nextRecord());
}

@Test
public void testDoubleColumn()
{
PageReader pageReader = visitColumns("1.23", embulk.newConfig().set("name", "name").set("type", "double"));
Assert.assertTrue(pageReader.nextRecord());
Assert.assertEquals(1.23, pageReader.getDouble(0), 0.01);
Assert.assertFalse(pageReader.nextRecord());
}

@Test
public void testTimestampColumn()
{
PageReader pageReader = visitColumns("1970-01-01T09:00:10+09:00", embulk.newConfig().set("name", "name").set("type", "timestamp"));
Assert.assertTrue(pageReader.nextRecord());
Assert.assertEquals(Instant.ofEpochSecond(10), pageReader.getTimestampInstant(0));
Assert.assertFalse(pageReader.nextRecord());
}

@Test
public void testTimestampColumnWithFormat()
{
PageReader pageReader = visitColumns("1970/01/01 00:00:10", embulk.newConfig().set("name", "name").set("type", "timestamp").set("format", "%Y/%m/%d %H:%M:%S"));
Assert.assertTrue(pageReader.nextRecord());
Assert.assertEquals(Instant.ofEpochSecond(10), pageReader.getTimestampInstant(0));
Assert.assertFalse(pageReader.nextRecord());
}

@Test
public void testJsonColumn()
{
PageReader pageReader = visitColumns("{\"key0\":\"value0\"}", embulk.newConfig().set("name", "name").set("type", "json"));
Assert.assertTrue(pageReader.nextRecord());
Assert.assertEquals("{\"key0\":\"value0\"}", pageReader.getJsonValue(0).toJson());
Assert.assertFalse(pageReader.nextRecord());
}

private PageReader visitColumns(String value, ConfigSource configSource)
{
ConfigSource conf = TestHelper.getBaseConfigWithFields(embulk, configSource);

PluginTask task = TestHelper.loadTask(conf);
Schema schema = buildSchema(task);
HashMap<String, String> row = new HashMap<>();
row.put("name", value);
GoogleAdsAccessor accessor = new GoogleAdsAccessor(task, row);
final TestPageBuilderReader.MockPageOutput output = new TestPageBuilderReader.MockPageOutput();
final PageBuilder pageBuilder = new PageBuilderImpl(runtime.getBufferAllocator(), schema, output);
GoogleAdsColumnVisitor columnVisitor = new GoogleAdsColumnVisitor(accessor, pageBuilder, task);
schema.visitColumns(columnVisitor);
pageBuilder.addRecord();
pageBuilder.finish();

Assert.assertEquals(1, output.pages.size());

@SuppressWarnings("deprecation") // embulk v0.9-compatible
PageReader pageReader = new PageReader(schema);
pageReader.setPage(output.pages.get(0));

return pageReader;
}

private Schema buildSchema(PluginTask task)
{
ImmutableList.Builder<Column> builder = ImmutableList.builder();
for (int i = 0; i < task.getFields().size(); i++) {
ColumnConfig columnConfig = task.getFields().getColumn(i);
ColumnConfig escapedColumnConfig = new ColumnConfig(GoogleAdsUtil.escapeColumnName(columnConfig.getName(), task), columnConfig.getType(), columnConfig.getOption());
builder.add(escapedColumnConfig.toColumn(i));
}
return new Schema(builder.build());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public void testTraverse()
"}";
ObjectMapper mapper = new ObjectMapper();
ConfigSource conf = TestHelper.getBaseConfig(embulk);
GoogleAdsReporter reporter = new GoogleAdsReporter(conf.loadConfig(PluginTask.class));
GoogleAdsReporter reporter = new GoogleAdsReporter(TestHelper.loadTask(conf));
try {
JsonNode jsonNode = mapper.readTree(json);
JsonNode resultJson = reporter.traverse(jsonNode);
Expand Down
Loading
Loading