embulk-input-datastore 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +0 -1
  3. data/Makefile +20 -0
  4. data/README.md +9 -3
  5. data/build.gradle +7 -2
  6. data/classpath/annotations-13.0.jar +0 -0
  7. data/classpath/api-common-1.5.0.jar +0 -0
  8. data/classpath/commons-codec-1.3.jar +0 -0
  9. data/classpath/commons-logging-1.1.1.jar +0 -0
  10. data/classpath/datastore-v1-proto-client-1.6.0.jar +0 -0
  11. data/classpath/embulk-input-datastore-0.0.3.jar +0 -0
  12. data/classpath/error_prone_annotations-2.2.0.jar +0 -0
  13. data/classpath/gax-1.23.0.jar +0 -0
  14. data/classpath/gax-httpjson-0.40.0.jar +0 -0
  15. data/classpath/google-api-client-1.23.0.jar +0 -0
  16. data/classpath/google-auth-library-credentials-0.9.0.jar +0 -0
  17. data/classpath/google-auth-library-oauth2-http-0.9.0.jar +0 -0
  18. data/classpath/google-cloud-core-1.27.0.jar +0 -0
  19. data/classpath/google-cloud-core-http-1.27.0.jar +0 -0
  20. data/classpath/google-cloud-datastore-1.27.0.jar +0 -0
  21. data/classpath/google-http-client-1.23.0.jar +0 -0
  22. data/classpath/google-http-client-appengine-1.23.0.jar +0 -0
  23. data/classpath/google-http-client-jackson-1.23.0.jar +0 -0
  24. data/classpath/google-http-client-jackson2-1.23.0.jar +0 -0
  25. data/classpath/google-http-client-protobuf-1.20.0.jar +0 -0
  26. data/classpath/google-oauth-client-1.23.0.jar +0 -0
  27. data/classpath/grpc-context-1.10.1.jar +0 -0
  28. data/classpath/grpc-core-1.10.1.jar +0 -0
  29. data/classpath/gson-2.7.jar +0 -0
  30. data/classpath/guava-20.0.jar +0 -0
  31. data/classpath/httpclient-4.0.1.jar +0 -0
  32. data/classpath/httpcore-4.0.1.jar +0 -0
  33. data/classpath/jackson-core-asl-1.9.11.jar +0 -0
  34. data/classpath/jsr305-3.0.1.jar +0 -0
  35. data/classpath/kotlin-reflect-1.2.31.jar +0 -0
  36. data/classpath/kotlin-stdlib-1.2.31.jar +0 -0
  37. data/classpath/opencensus-api-0.11.1.jar +0 -0
  38. data/classpath/opencensus-contrib-grpc-metrics-0.11.0.jar +0 -0
  39. data/classpath/opencensus-contrib-http-util-0.11.1.jar +0 -0
  40. data/classpath/proto-google-cloud-datastore-v1-0.10.0.jar +0 -0
  41. data/classpath/proto-google-common-protos-1.9.0.jar +0 -0
  42. data/classpath/proto-google-iam-v1-0.10.0.jar +0 -0
  43. data/classpath/protobuf-java-3.5.1.jar +0 -0
  44. data/classpath/protobuf-java-util-3.5.1.jar +0 -0
  45. data/classpath/threetenbp-1.3.3.jar +0 -0
  46. data/embulk-input-datastore.gemspec +18 -0
  47. data/embulk-input-datastore.iml +1 -1
  48. data/examples/datastore2stdout.yaml +8 -0
  49. data/gradle.properties +1 -1
  50. data/src/main/java/org/embulk/input/datastore/DatastoreInputPlugin.kt +54 -30
  51. data/src/main/java/org/embulk/input/datastore/PluginTask.kt +3 -0
  52. metadata +61 -19
  53. data/classpath/embulk-input-datastore-0.0.2.jar +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a08810cd4edfd6940aebe26cdb15a4471b5d77bb
4
- data.tar.gz: 77e8fd4024f7c3e9b7bb8fe444857c9dd907f0de
2
+ SHA256:
3
+ metadata.gz: 0418d992c45a1a40f72e4810dee870bd580daeb760f95f2725e436c401ffce25
4
+ data.tar.gz: dddd42cfa92264e2a597258cc70c093c45d5b4f1cbd816264a6fcdb4d54999e9
5
5
  SHA512:
6
- metadata.gz: b0f57598b143161a2721343ced65cab1b54de29b3d9c30661dc3aaaa4ead810c47816f6da463af3cf43c569c046b61a5de22d6d9f152a32aa8f671325504499a
7
- data.tar.gz: a4f63b161e32c4dbb54cd00572b0e3a034aef531bebd30c075e231f91f1c53699ac2bd090b9bd15746e186db2954671a6bbf03c2fc48220139fb92542a618297
6
+ metadata.gz: 8558927f2a5eafa9c859a911fdd10447c43cd890013e47a9dc7c526d4b31a14d149aa9e8adb056a1eeaca63982233bd9757096f602131f72904fcfb22ae6620f
7
+ data.tar.gz: a85c26e22745df865733a51f56560f58231db62168e36376264b6fee55ff624e431d1348609cd9281175a598ac68cc82ea66d62cde8e35d339aaff62d2b3328e
data/.gitignore CHANGED
@@ -1,7 +1,6 @@
1
1
  *~
2
2
  /pkg/
3
3
  /tmp/
4
- *.gemspec
5
4
  .gradle/
6
5
  /classpath/
7
6
  build/
data/Makefile ADDED
@@ -0,0 +1,20 @@
1
+ build:
2
+ gradle build
3
+
4
+ embulk_run:
5
+ gradle embulk_run
6
+
7
+ publish_gem: build
8
+ gradle classpath
9
+ gradle gemPush
10
+
11
+ .PHONY: start_datastore_emulator
12
+ start_datastore_emulator:
13
+ gcloud beta emulators datastore start --no-store-on-disk --quiet &
14
+ sleep 1
15
+ $(gcloud beta emulators datastore env-init)
16
+
17
+ .PHONY: stop_datastore_emulator
18
+ stop_datastore_emulator:
19
+ gcloud beta emulators datastore env-unset
20
+ ps aux | grep CloudDatastore | grep -v grep | awk '{ print "kill " $2 }' | sh
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Datastore input plugin for Embulk
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/embulk-input-datastore.svg)](https://badge.fury.io/rb/embulk-input-datastore)
4
+
3
5
  A embulk input plugin fetches Cloud Datastore entities.
4
6
 
5
7
  ## Overview
@@ -11,6 +13,7 @@ A embulk input plugin fetches Cloud Datastore entities.
11
13
 
12
14
  ## Configuration
13
15
 
16
+ - **project_id**: your GCP project_id. (string, required)
14
17
  - **json_keyfile**: A path to JSON keyfile. (string, required)
15
18
  - **gql**: A GQL fetches to Cloud Datastore (string, required)
16
19
  - **json_column_name**: description (string, default: `"record"`)
@@ -20,8 +23,9 @@ A embulk input plugin fetches Cloud Datastore entities.
20
23
  ```yaml
21
24
  in:
22
25
  type: datastore
23
- json_keyfile: example1
24
- gql: "SELECT * FROM myKind WHERE myProp >= 100 AND myProp < 200"
26
+ project_id: "your-gcppj-123"
27
+ json_keyfile: credential.json
28
+ gql: "SELECT * FROM myKind"
25
29
  ```
26
30
 
27
31
 
@@ -33,5 +37,7 @@ $ ./gradlew gem # -t to watch change of files and rebuild continuously
33
37
 
34
38
  ## NOTE
35
39
 
36
- Currently this plugin aggregates fetched entities to 1 'json' type column.
40
+ - Currently this plugin has below limitations:
41
+ - Aggregate fetched properties to 1 'json' type column.
42
+ - `ENTITY`, `KEY`, `LIST`, `LAT_LNG`, `NULL`, `RAW_VALUE` types are not supported.
37
43
 
data/build.gradle CHANGED
@@ -11,7 +11,9 @@ buildscript {
11
11
  }
12
12
  }
13
13
 
14
+ apply plugin: "kotlin"
14
15
  apply plugin: "com.github.kamatama41.embulk"
16
+ apply plugin: "net.researchgate.release"
15
17
 
16
18
  embulk {
17
19
  version = "0.8.18"
@@ -20,11 +22,14 @@ embulk {
20
22
  authors = ["syucream"]
21
23
  email = "syucream1031@gmail.com"
22
24
  homepage = "https://github.com/syucream/embulk-input-datastore"
25
+
26
+ // for debug
27
+ configYaml = "examples/datastore2stdout.yaml"
23
28
  }
24
29
 
25
30
  dependencies {
26
31
  // To refer KClass::class.java
27
- implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
32
+ compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
28
33
 
29
- implementation 'com.google.cloud:google-cloud-datastore:1.27.0'
34
+ compile 'com.google.cloud:google-cloud-datastore:1.27.0'
30
35
  }
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,18 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = "embulk-input-datastore"
3
+ spec.version = "0.0.3"
4
+ spec.authors = ["syucream"]
5
+ spec.summary = %[Datastore input plugin for Embulk]
6
+ spec.description = %[Loads records from datastore.]
7
+ spec.email = ["syucream1031@gmail.com"]
8
+ spec.licenses = ["MIT"]
9
+ spec.homepage = "https://github.com/syucream/embulk-input-datastore"
10
+
11
+ spec.files = `git ls-files`.split("\n") + Dir["classpath/*.jar"]
12
+ spec.test_files = spec.files.grep(%r"^(test|spec)/")
13
+ spec.require_paths = ["lib"]
14
+
15
+ #spec.add_dependency 'YOUR_GEM_DEPENDENCY', ['~> YOUR_GEM_DEPENDENCY_VERSION']
16
+ spec.add_development_dependency 'bundler', ['~> 1.0']
17
+ spec.add_development_dependency 'rake', ['>= 10.0']
18
+ end
@@ -1,5 +1,5 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <module external.linked.project.id="embulk-input-datastore" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="0.0.1" type="JAVA_MODULE" version="4">
2
+ <module external.linked.project.id="embulk-input-datastore" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="0.0.3" type="JAVA_MODULE" version="4">
3
3
  <component name="NewModuleRootManager" inherit-compiler-output="true">
4
4
  <exclude-output />
5
5
  <content url="file://$MODULE_DIR$">
@@ -0,0 +1,8 @@
1
+ in:
2
+ type: datastore
3
+ project_id: "deep-wares-182115"
4
+ json_keyfile: credential.json
5
+ gql: "SELECT * FROM myKind"
6
+
7
+ out:
8
+ type: stdout
data/gradle.properties CHANGED
@@ -1 +1 @@
1
- version=0.0.2
1
+ version=0.0.3
@@ -1,6 +1,7 @@
1
1
  package org.embulk.input.datastore
2
2
 
3
3
  import com.google.auth.oauth2.GoogleCredentials
4
+ import com.google.cloud.Timestamp
4
5
  import com.google.cloud.datastore.*
5
6
  import org.embulk.config.TaskReport
6
7
  import org.embulk.config.ConfigDiff
@@ -10,16 +11,15 @@ import org.embulk.spi.*
10
11
  import org.embulk.spi.type.Types
11
12
  import org.msgpack.value.ValueFactory
12
13
  import java.io.FileInputStream
13
- import java.io.IOException
14
14
 
15
15
  class DatastoreInputPlugin : InputPlugin {
16
16
  // number of run() method calls
17
- val TASK_COUNT = 1
17
+ private val TASK_COUNT = 1
18
18
 
19
- var datastore: Datastore? = null
19
+ private val logger = Exec.getLogger(javaClass)
20
20
 
21
21
  override fun transaction(config: ConfigSource,
22
- control: InputPlugin.Control): ConfigDiff {
22
+ control: InputPlugin.Control): ConfigDiff {
23
23
  val task: PluginTask = config.loadConfig(PluginTask::class.java)
24
24
 
25
25
  // Support only 1 'json' type column
@@ -27,33 +27,25 @@ class DatastoreInputPlugin : InputPlugin {
27
27
  .add(task.jsonColumnName, Types.JSON)
28
28
  .build()
29
29
 
30
- // Setup datastore client
31
- val cred = GoogleCredentials
32
- .fromStream(FileInputStream(task.jsonKeyfile))
33
- this.datastore = DatastoreOptions.newBuilder()
34
- .setCredentials(cred)
35
- .build()
36
- .service
37
-
38
30
  return resume(task.dump(), schema, TASK_COUNT, control)
39
31
  }
40
32
 
41
33
  override fun resume(taskSource: TaskSource,
42
- schema: Schema, taskCount: Int,
43
- control: InputPlugin.Control): ConfigDiff {
34
+ schema: Schema, taskCount: Int,
35
+ control: InputPlugin.Control): ConfigDiff {
44
36
  // XXX Unimplemented
45
37
  control.run(taskSource, schema, taskCount)
46
38
  return Exec.newConfigDiff()
47
39
  }
48
40
 
49
41
  override fun cleanup(taskSource: TaskSource,
50
- schema: Schema, taskCount: Int,
51
- successTaskReports: List<TaskReport>) {
42
+ schema: Schema, taskCount: Int,
43
+ successTaskReports: List<TaskReport>) {
52
44
  }
53
45
 
54
46
  override fun run(taskSource: TaskSource,
55
- schema: Schema, taskIndex: Int,
56
- output: PageOutput): TaskReport {
47
+ schema: Schema, taskIndex: Int,
48
+ output: PageOutput): TaskReport {
57
49
  val task = taskSource.loadTask(PluginTask::class.java)
58
50
  val allocator = task.getBufferAllocator()
59
51
  val pageBuilder = PageBuilder(allocator, schema, output)
@@ -62,20 +54,37 @@ class DatastoreInputPlugin : InputPlugin {
62
54
  .newGqlQueryBuilder(Query.ResultType.ENTITY, task.gql)
63
55
  .build()
64
56
 
65
- datastore?.let {
66
- val col = pageBuilder.schema.getColumn(0)
67
-
68
- it.run(query)
69
- .forEach { entity ->
70
- val msgpackValue = ValueFactory.newString(entity.toString())
71
- pageBuilder.setJson(col, msgpackValue)
72
- pageBuilder.addRecord()
57
+ val datastore = createDatastoreClient(task)
58
+ val col = pageBuilder.schema.getColumn(0)
59
+
60
+ datastore.run(query)
61
+ .forEach { entity ->
62
+ logger.debug(entity.toString())
63
+
64
+ // TODO separate/simplify generating JSON
65
+ val pairs = entity.names.flatMap { name ->
66
+ val dsValue = entity.getValue<Value<Any>>(name)
67
+ val strVal: String? = when (dsValue.type) {
68
+ ValueType.BLOB -> (dsValue.get() as ByteArray).toString()
69
+ ValueType.BOOLEAN -> (dsValue.get() as Boolean).toString()
70
+ ValueType.DOUBLE -> (dsValue.get() as Double).toString()
71
+ ValueType.LONG -> (dsValue.get() as Long).toString()
72
+ ValueType.STRING -> "\"${dsValue.get() as String}\""
73
+ ValueType.TIMESTAMP -> (dsValue.get() as Timestamp).toString()
74
+ else -> null // NOTE, TODO: LIST, ENTITY, ... is still unsupported
75
+ }
76
+ strVal?.let { listOf(Pair<String, String>(name, it)) } ?: listOf()
73
77
  }
78
+ val json = "{" + pairs.map { pair ->
79
+ "\"${pair.first}\": ${pair.second}"
80
+ }.joinToString() + "}"
81
+
82
+ val msgpackValue = ValueFactory.newString(json)
83
+ pageBuilder.setJson(col, msgpackValue)
84
+ pageBuilder.addRecord()
85
+ }
74
86
 
75
- pageBuilder.finish()
76
- } ?: run {
77
- throw IOException("Datastore client is unavailable.")
78
- }
87
+ pageBuilder.finish()
79
88
 
80
89
  return Exec.newTaskReport()
81
90
  }
@@ -84,4 +93,19 @@ class DatastoreInputPlugin : InputPlugin {
84
93
  // XXX Unimplemented
85
94
  return Exec.newConfigDiff()
86
95
  }
96
+
97
+ /**
98
+ * Setup datastore client
99
+ *
100
+ */
101
+ private fun createDatastoreClient(task: PluginTask): Datastore {
102
+ val cred = GoogleCredentials
103
+ .fromStream(FileInputStream(task.jsonKeyfile))
104
+
105
+ return DatastoreOptions.newBuilder()
106
+ .setProjectId(task.projectId)
107
+ .setCredentials(cred)
108
+ .build()
109
+ .service
110
+ }
87
111
  }
@@ -7,6 +7,9 @@ import org.embulk.config.Task
7
7
  import org.embulk.spi.BufferAllocator
8
8
 
9
9
  interface PluginTask : Task {
10
+ @get:Config("project_id")
11
+ val projectId: String
12
+
10
13
  @get:Config("json_keyfile")
11
14
  val jsonKeyfile: String
12
15
 
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-input-datastore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - syucream
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-19 00:00:00.000000000 Z
11
+ date: 2018-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
+ name: bundler
14
15
  requirement: !ruby/object:Gem::Requirement
15
16
  requirements:
16
- - - ~>
17
+ - - "~>"
17
18
  - !ruby/object:Gem::Version
18
19
  version: '1.0'
19
- name: bundler
20
- prerelease: false
21
20
  type: :development
21
+ prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
+ name: rake
28
29
  requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - '>='
31
+ - - ">="
31
32
  - !ruby/object:Gem::Version
32
33
  version: '10.0'
33
- name: rake
34
- prerelease: false
35
34
  type: :development
35
+ prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
41
  description: Loads records from datastore.
@@ -45,39 +45,81 @@ executables: []
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
- - .gitignore
48
+ - ".gitignore"
49
49
  - LICENSE
50
+ - Makefile
50
51
  - README.md
51
52
  - build.gradle
53
+ - classpath/annotations-13.0.jar
54
+ - classpath/api-common-1.5.0.jar
55
+ - classpath/commons-codec-1.3.jar
56
+ - classpath/commons-logging-1.1.1.jar
57
+ - classpath/datastore-v1-proto-client-1.6.0.jar
58
+ - classpath/embulk-input-datastore-0.0.3.jar
59
+ - classpath/error_prone_annotations-2.2.0.jar
60
+ - classpath/gax-1.23.0.jar
61
+ - classpath/gax-httpjson-0.40.0.jar
62
+ - classpath/google-api-client-1.23.0.jar
63
+ - classpath/google-auth-library-credentials-0.9.0.jar
64
+ - classpath/google-auth-library-oauth2-http-0.9.0.jar
65
+ - classpath/google-cloud-core-1.27.0.jar
66
+ - classpath/google-cloud-core-http-1.27.0.jar
67
+ - classpath/google-cloud-datastore-1.27.0.jar
68
+ - classpath/google-http-client-1.23.0.jar
69
+ - classpath/google-http-client-appengine-1.23.0.jar
70
+ - classpath/google-http-client-jackson-1.23.0.jar
71
+ - classpath/google-http-client-jackson2-1.23.0.jar
72
+ - classpath/google-http-client-protobuf-1.20.0.jar
73
+ - classpath/google-oauth-client-1.23.0.jar
74
+ - classpath/grpc-context-1.10.1.jar
75
+ - classpath/grpc-core-1.10.1.jar
76
+ - classpath/gson-2.7.jar
77
+ - classpath/guava-20.0.jar
78
+ - classpath/httpclient-4.0.1.jar
79
+ - classpath/httpcore-4.0.1.jar
80
+ - classpath/jackson-core-asl-1.9.11.jar
81
+ - classpath/jsr305-3.0.1.jar
82
+ - classpath/kotlin-reflect-1.2.31.jar
83
+ - classpath/kotlin-stdlib-1.2.31.jar
84
+ - classpath/opencensus-api-0.11.1.jar
85
+ - classpath/opencensus-contrib-grpc-metrics-0.11.0.jar
86
+ - classpath/opencensus-contrib-http-util-0.11.1.jar
87
+ - classpath/proto-google-cloud-datastore-v1-0.10.0.jar
88
+ - classpath/proto-google-common-protos-1.9.0.jar
89
+ - classpath/proto-google-iam-v1-0.10.0.jar
90
+ - classpath/protobuf-java-3.5.1.jar
91
+ - classpath/protobuf-java-util-3.5.1.jar
92
+ - classpath/threetenbp-1.3.3.jar
93
+ - embulk-input-datastore.gemspec
52
94
  - embulk-input-datastore.iml
95
+ - examples/datastore2stdout.yaml
53
96
  - gradle.properties
54
97
  - lib/embulk/input/datastore.rb
55
98
  - src/main/java/org/embulk/input/datastore/DatastoreInputPlugin.kt
56
99
  - src/main/java/org/embulk/input/datastore/PluginTask.kt
57
100
  - src/test/java/org/embulk/input/datastore/TestDatastoreInputPlugin.java
58
- - classpath/embulk-input-datastore-0.0.2.jar
59
101
  homepage: https://github.com/syucream/embulk-input-datastore
60
102
  licenses:
61
103
  - MIT
62
104
  metadata: {}
63
- post_install_message:
105
+ post_install_message:
64
106
  rdoc_options: []
65
107
  require_paths:
66
108
  - lib
67
109
  required_ruby_version: !ruby/object:Gem::Requirement
68
110
  requirements:
69
- - - '>='
111
+ - - ">="
70
112
  - !ruby/object:Gem::Version
71
113
  version: '0'
72
114
  required_rubygems_version: !ruby/object:Gem::Requirement
73
115
  requirements:
74
- - - '>='
116
+ - - ">="
75
117
  - !ruby/object:Gem::Version
76
118
  version: '0'
77
119
  requirements: []
78
- rubyforge_project:
79
- rubygems_version: 2.1.9
80
- signing_key:
120
+ rubyforge_project:
121
+ rubygems_version: 2.7.7
122
+ signing_key:
81
123
  specification_version: 4
82
124
  summary: Datastore input plugin for Embulk
83
125
  test_files: []