embulk-input-datastore 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 15a06b07d8765e66681ac6636340eddae2bc84dcc15303d538c89db1619bbb1e
4
- data.tar.gz: cdb37b7382f2921fb9fa351dba8f1d1a2abe18951f4f887003c11011c1bfced4
3
+ metadata.gz: 7073922589f46f02c4b1e1534ccccec56bf56eb9d6316bde1f6f6d7f80b7d1b1
4
+ data.tar.gz: 6ced669ff8d160252dd8806f801b5e28b8ce7f0a51c65fc969c5a07412897a82
5
5
  SHA512:
6
- metadata.gz: e35e6c6d76da73a4e76d50b202cb80b157cc3b5308b5b159eb91e1c3c2ca9b1c43c83a9938b507a70fe7341a8d21af00d2f60cac72aa1d8ec810bbfad451f14c
7
- data.tar.gz: 37a8123d2607064598eed79b02c714785f9ca93e331b481bd5802384b86ed9b1665f7368c9b81ba3b12853030b1b27da53847a81ad4f2c15919bb8a08054ea15
6
+ metadata.gz: 891dd771e4683e046c413308ca0c71efbe349ff29ebf9dfc8b7f65ce16442e7d8bd2f010a87c7cbe39d2de2882b63170fe6a0baabfcf8716184018db86152aa1
7
+ data.tar.gz: beacaf4852d72788a3d77494ee96badb04ff4548e97b3304475a64f62aec856fdbca669bdc0691e45194499ef7a010ddb6b3899c894b9ec79888abff5d5e5830
data/build.gradle CHANGED
@@ -8,12 +8,26 @@ buildscript {
8
8
  classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
9
9
  classpath "com.github.kamatama41:gradle-embulk-plugin:0.2.0"
10
10
  classpath "net.researchgate:gradle-release:2.6.0"
11
+ classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0'
11
12
  }
12
13
  }
13
14
 
14
15
  apply plugin: "kotlin"
15
16
  apply plugin: "com.github.kamatama41.embulk"
16
17
  apply plugin: "net.researchgate.release"
18
+ apply plugin: 'org.junit.platform.gradle.plugin'
19
+
20
+ junitPlatform {
21
+ filters {
22
+ engines {
23
+ include 'spek'
24
+ }
25
+ }
26
+ }
27
+
28
+ repositories {
29
+ maven { url "http://dl.bintray.com/jetbrains/spek" }
30
+ }
17
31
 
18
32
  embulk {
19
33
  version = "0.8.18"
@@ -30,6 +44,16 @@ embulk {
30
44
  dependencies {
31
45
  // To refer KClass::class.java
32
46
  compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
33
-
34
47
  compile 'com.google.cloud:google-cloud-datastore:1.27.0'
48
+
49
+ testCompile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
50
+ testCompile group: 'org.jetbrains.kotlin', name: 'kotlin-test', version: '1.2.50'
51
+ testCompile group: 'org.jetbrains.kotlin', name: 'kotlin-test-annotations-common', version: '1.2.50'
52
+ testCompile ('org.jetbrains.spek:spek-api:1.1.5') {
53
+ exclude group: 'org.jetbrains.kotlin'
54
+ }
55
+ testRuntime ('org.jetbrains.spek:spek-junit-platform-engine:1.1.5') {
56
+ exclude group: 'org.junit.platform'
57
+ exclude group: 'org.jetbrains.kotlin'
58
+ }
35
59
  }
data/gradle.properties CHANGED
@@ -1 +1 @@
1
- version=0.0.4
1
+ version=0.1.0
@@ -11,12 +11,14 @@ import org.embulk.spi.*
11
11
  import org.embulk.spi.type.Types
12
12
  import org.msgpack.value.ValueFactory
13
13
  import java.io.FileInputStream
14
+ import java.util.Base64
14
15
 
15
- class DatastoreInputPlugin : InputPlugin {
16
+ class DatastoreInputPlugin(doLogging: Boolean = true) : InputPlugin {
16
17
  // number of run() method calls
17
18
  private val TASK_COUNT = 1
18
19
 
19
- private val logger = Exec.getLogger(javaClass)
20
+ private val logger = if (doLogging) { Exec.getLogger(javaClass) } else { null }
21
+ private val b64encoder = Base64.getEncoder()
20
22
 
21
23
  override fun transaction(config: ConfigSource,
22
24
  control: InputPlugin.Control): ConfigDiff {
@@ -59,10 +61,10 @@ class DatastoreInputPlugin : InputPlugin {
59
61
 
60
62
  datastore.run(query)
61
63
  .forEach { entity ->
62
- logger.debug(entity.toString())
64
+ logger?.debug(entity.toString())
63
65
 
64
66
  val json = entityToJsonObject(entity)
65
- logger.debug(json)
67
+ logger?.debug(json)
66
68
 
67
69
  pageBuilder.setJson(col, ValueFactory.newString(json))
68
70
  pageBuilder.addRecord()
@@ -134,7 +136,7 @@ class DatastoreInputPlugin : InputPlugin {
134
136
  */
135
137
  private fun valueToField(dsValue: Value<Any>): String? {
136
138
  return when (dsValue.type) {
137
- ValueType.BLOB -> (dsValue.get() as ByteArray).toString()
139
+ ValueType.BLOB -> "\"${b64encoder.encodeToString((dsValue.get() as Blob).toByteArray())}\""
138
140
  ValueType.BOOLEAN -> (dsValue.get() as Boolean).toString()
139
141
  ValueType.DOUBLE -> (dsValue.get() as Double).toString()
140
142
  ValueType.ENTITY -> entityToJsonObject(dsValue.get() as FullEntity<*>)
@@ -145,7 +147,7 @@ class DatastoreInputPlugin : InputPlugin {
145
147
  ValueType.NULL -> "null"
146
148
  ValueType.RAW_VALUE -> (dsValue.get() as RawValue).toString()
147
149
  ValueType.STRING -> "\"${dsValue.get() as String}\""
148
- ValueType.TIMESTAMP -> (dsValue.get() as Timestamp).toString()
150
+ ValueType.TIMESTAMP -> "\"${dsValue.get() as Timestamp}\""
149
151
  else -> null // NOTE: unexpected or unsupported type
150
152
  }
151
153
  }
@@ -0,0 +1,116 @@
1
+ package org.embulk.input.datastore
2
+
3
+ import com.google.cloud.Timestamp
4
+ import com.google.cloud.datastore.*
5
+ import org.jetbrains.spek.api.Spek
6
+ import org.jetbrains.spek.api.dsl.describe
7
+ import org.jetbrains.spek.api.dsl.it
8
+ import org.jetbrains.spek.api.dsl.on
9
+ import kotlin.reflect.full.memberFunctions
10
+ import kotlin.reflect.jvm.isAccessible
11
+ import kotlin.test.assertEquals
12
+ import java.util.Base64
13
+
14
+ object DatastoreInputPluginSpec : Spek({
15
+ val b64Encoder = Base64.getEncoder()
16
+
17
+ describe("entityToJsonObject()") {
18
+ val plugin = DatastoreInputPlugin(false)
19
+
20
+ val method = plugin::class.memberFunctions.find { it.name == "entityToJsonObject" }
21
+ val accesibleMethod = method!!.let {
22
+ it.isAccessible = true
23
+ it
24
+ }
25
+
26
+ on("single property values") {
27
+ val testcases = listOf<Pair<FullEntity<IncompleteKey>, String>>(
28
+ Pair(
29
+ Entity.newBuilder().set("blobProp", Blob.copyFrom("test".toByteArray())).build(),
30
+ "{\"blobProp\":\"${b64Encoder.encodeToString("test".toByteArray())}\"}"
31
+ ),
32
+ Pair(
33
+ Entity.newBuilder().set("boolProp", true).build(),
34
+ "{\"boolProp\":true}"
35
+ ),
36
+ Pair(
37
+ Entity.newBuilder().set("doubleProp", 1.1).build(),
38
+ "{\"doubleProp\":1.1}"
39
+ ),
40
+ Pair(
41
+ Entity.newBuilder().set("entityProp", FullEntity.newBuilder().set("name1", 1).build()).build(),
42
+ "{\"entityProp\":{\"name1\":1}}"
43
+ ),
44
+ Pair(
45
+ Entity.newBuilder().set("listProp", 1, 2, 3).build(),
46
+ "{\"listProp\":[1, 2, 3]}"
47
+ ),
48
+ Pair(
49
+ Entity.newBuilder().set("nullProp", NullValue.of()).build(),
50
+ "{\"nullProp\":null}"
51
+ ),
52
+ Pair(
53
+ Entity.newBuilder().set("longProp", 1).build(),
54
+ "{\"longProp\":1}"
55
+ ),
56
+ Pair(
57
+ Entity.newBuilder().set("stringProp", "test").build(),
58
+ "{\"stringProp\":\"test\"}"
59
+ ),
60
+ Pair(
61
+ Entity.newBuilder().set("timestampProp", Timestamp.MIN_VALUE).build(),
62
+ "{\"timestampProp\":\"0001-01-01T00:00:00Z\"}"
63
+ )
64
+ )
65
+
66
+ it("should be converted json value") {
67
+ testcases.forEach { pair ->
68
+ val entity = pair.first
69
+ val expected = pair.second
70
+
71
+ val actual = accesibleMethod.call(plugin, entity) as String
72
+ assertEquals(expected, actual)
73
+ }
74
+ }
75
+ }
76
+
77
+ on("combinational property values") {
78
+ val testcases = listOf<Pair<FullEntity<IncompleteKey>, String>>(
79
+ Pair(
80
+ Entity.newBuilder()
81
+ .set("blobProp", Blob.copyFrom("test".toByteArray()))
82
+ .set("boolProp", true)
83
+ .set("doubleProp", 1.1)
84
+ .set("entityProp", FullEntity.newBuilder().set("name1", 1).build())
85
+ .set("listProp", 1, 2, 3)
86
+ .set("nullProp", NullValue.of())
87
+ .set("longProp", 1)
88
+ .set("stringProp", "test")
89
+ .set("timestampProp", Timestamp.MIN_VALUE)
90
+ .build(),
91
+ "{" +
92
+ "\"blobProp\":\"${b64Encoder.encodeToString("test".toByteArray())}\", " +
93
+ "\"boolProp\":true, " +
94
+ "\"doubleProp\":1.1, " +
95
+ "\"entityProp\":{\"name1\":1}, " +
96
+ "\"listProp\":[1, 2, 3], " +
97
+ "\"longProp\":1, " +
98
+ "\"nullProp\":null, " +
99
+ "\"stringProp\":\"test\", " +
100
+ "\"timestampProp\":\"0001-01-01T00:00:00Z\"" +
101
+ "}"
102
+ )
103
+ )
104
+
105
+ it("should be converted json value") {
106
+ testcases.forEach { pair ->
107
+ val entity = pair.first
108
+ val expected = pair.second
109
+
110
+ val actual = accesibleMethod.call(plugin, entity) as String
111
+ assertEquals(expected, actual)
112
+ }
113
+ }
114
+ }
115
+ }
116
+ })
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-input-datastore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - syucream
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-22 00:00:00.000000000 Z
11
+ date: 2018-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -55,7 +55,7 @@ files:
55
55
  - classpath/commons-codec-1.3.jar
56
56
  - classpath/commons-logging-1.1.1.jar
57
57
  - classpath/datastore-v1-proto-client-1.6.0.jar
58
- - classpath/embulk-input-datastore-0.0.4.jar
58
+ - classpath/embulk-input-datastore-0.1.0.jar
59
59
  - classpath/error_prone_annotations-2.2.0.jar
60
60
  - classpath/gax-1.23.0.jar
61
61
  - classpath/gax-httpjson-0.40.0.jar
@@ -95,7 +95,7 @@ files:
95
95
  - lib/embulk/input/datastore.rb
96
96
  - src/main/java/org/embulk/input/datastore/DatastoreInputPlugin.kt
97
97
  - src/main/java/org/embulk/input/datastore/PluginTask.kt
98
- - src/test/java/org/embulk/input/datastore/TestDatastoreInputPlugin.java
98
+ - src/test/java/org/embulk/input/datastore/DatastoreInputPluginSpec.kt
99
99
  homepage: https://github.com/syucream/embulk-input-datastore
100
100
  licenses:
101
101
  - MIT
@@ -1,5 +0,0 @@
1
- package org.embulk.input.datastore;
2
-
3
- public class TestDatastoreInputPlugin
4
- {
5
- }