embulk-input-dynamodb 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/master.yml +34 -0
  3. data/.github/workflows/test.yml +30 -0
  4. data/.scalafmt.conf +5 -0
  5. data/CHANGELOG.md +49 -0
  6. data/README.md +204 -54
  7. data/build.gradle +53 -44
  8. data/example/config-deprecated.yml +20 -0
  9. data/example/config-query-as-json.yml +18 -0
  10. data/example/config-query.yml +22 -0
  11. data/example/config-scan.yml +18 -0
  12. data/example/prepare_dynamodb_table.sh +67 -0
  13. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  14. data/gradle/wrapper/gradle-wrapper.properties +1 -2
  15. data/gradlew +67 -48
  16. data/gradlew.bat +20 -10
  17. data/{test/run_dynamodb_local.sh → run_dynamodb_local.sh} +2 -1
  18. data/settings.gradle +1 -0
  19. data/src/main/scala/org/embulk/input/dynamodb/DeprecatedDynamodbInputPlugin.scala +73 -0
  20. data/src/main/scala/org/embulk/input/dynamodb/DynamodbInputPlugin.scala +76 -25
  21. data/src/main/scala/org/embulk/input/dynamodb/PluginTask.scala +132 -32
  22. data/src/main/scala/org/embulk/input/dynamodb/aws/Aws.scala +44 -0
  23. data/src/main/scala/org/embulk/input/dynamodb/aws/AwsClientConfiguration.scala +37 -0
  24. data/src/main/scala/org/embulk/input/dynamodb/aws/AwsCredentials.scala +240 -0
  25. data/src/main/scala/org/embulk/input/dynamodb/aws/AwsDynamodbConfiguration.scala +35 -0
  26. data/src/main/scala/org/embulk/input/dynamodb/aws/AwsEndpointConfiguration.scala +79 -0
  27. data/src/main/scala/org/embulk/input/dynamodb/aws/HttpProxy.scala +61 -0
  28. data/src/main/scala/org/embulk/input/dynamodb/deprecated/AttributeValueHelper.scala +72 -0
  29. data/src/main/scala/org/embulk/input/dynamodb/{Filter.scala → deprecated/Filter.scala} +3 -3
  30. data/src/main/scala/org/embulk/input/dynamodb/{FilterConfig.scala → deprecated/FilterConfig.scala} +13 -13
  31. data/src/main/scala/org/embulk/input/dynamodb/{ope → deprecated/ope}/AbstractOperation.scala +36 -18
  32. data/src/main/scala/org/embulk/input/dynamodb/{ope → deprecated/ope}/QueryOperation.scala +21 -13
  33. data/src/main/scala/org/embulk/input/dynamodb/{ope → deprecated/ope}/ScanOperation.scala +20 -13
  34. data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbAttributeValue.scala +154 -0
  35. data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbAttributeValueEmbulkTypeTransformable.scala +245 -0
  36. data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbAttributeValueType.scala +33 -0
  37. data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbItemColumnVisitor.scala +50 -0
  38. data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbItemConsumer.scala +40 -0
  39. data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbItemIterator.scala +19 -0
  40. data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbItemReader.scala +64 -0
  41. data/src/main/scala/org/embulk/input/dynamodb/item/DynamodbItemSchema.scala +135 -0
  42. data/src/main/scala/org/embulk/input/dynamodb/operation/AbstractDynamodbOperation.scala +169 -0
  43. data/src/main/scala/org/embulk/input/dynamodb/operation/DynamodbOperationProxy.scala +59 -0
  44. data/src/main/scala/org/embulk/input/dynamodb/operation/DynamodbQueryOperation.scala +72 -0
  45. data/src/main/scala/org/embulk/input/dynamodb/operation/DynamodbScanOperation.scala +93 -0
  46. data/src/main/scala/org/embulk/input/dynamodb/operation/EmbulkDynamodbOperation.scala +15 -0
  47. data/src/main/scala/org/embulk/input/dynamodb/package.scala +4 -9
  48. data/src/test/scala/org/embulk/input/dynamodb/AttributeValueHelperTest.scala +245 -101
  49. data/src/test/scala/org/embulk/input/dynamodb/AwsCredentialsTest.scala +150 -97
  50. data/src/test/scala/org/embulk/input/dynamodb/DynamodbQueryOperationTest.scala +188 -0
  51. data/src/test/scala/org/embulk/input/dynamodb/DynamodbScanOperationTest.scala +181 -0
  52. data/src/test/scala/org/embulk/input/dynamodb/testutil/EmbulkTestBase.scala +85 -0
  53. metadata +73 -49
  54. data/circle.yml +0 -16
  55. data/config/checkstyle/checkstyle.xml +0 -128
  56. data/config/checkstyle/default.xml +0 -108
  57. data/src/main/scala/org/embulk/input/dynamodb/AttributeValueHelper.scala +0 -41
  58. data/src/main/scala/org/embulk/input/dynamodb/AwsCredentials.scala +0 -63
  59. data/src/main/scala/org/embulk/input/dynamodb/DynamoDBClient.scala +0 -23
  60. data/src/test/resources/yaml/authMethodBasic.yml +0 -21
  61. data/src/test/resources/yaml/authMethodBasic_Error.yml +0 -19
  62. data/src/test/resources/yaml/authMethodEnv.yml +0 -19
  63. data/src/test/resources/yaml/authMethodProfile.yml +0 -20
  64. data/src/test/resources/yaml/dynamodb-local-query.yml +0 -25
  65. data/src/test/resources/yaml/dynamodb-local-scan.yml +0 -23
  66. data/src/test/resources/yaml/notSetAuthMethod.yml +0 -20
  67. data/src/test/scala/org/embulk/input/dynamodb/ope/QueryOperationTest.scala +0 -83
  68. data/src/test/scala/org/embulk/input/dynamodb/ope/ScanOperationTest.scala +0 -83
  69. data/test/create_table.sh +0 -16
  70. data/test/put_items.sh +0 -25
@@ -1,20 +0,0 @@
1
- in:
2
- type: dynamodb
3
- region: ENV_VAR
4
- operation: scan
5
- table: ENV_VAR
6
- auth_method: profile
7
- profile_name: ENV_VAR
8
- columns:
9
- - {name: pri-key, type: string}
10
- - {name: sort-key, type: long}
11
- - {name: value, type: string}
12
-
13
- out:
14
- type: file
15
- path_prefix: result
16
- file_ext: tsv
17
- formatter:
18
- type: csv
19
- delimiter: "\t"
20
- header_line: false
@@ -1,25 +0,0 @@
1
- in:
2
- type: dynamodb
3
- end_point: http://localhost:8000/
4
- table: ENV_VAR
5
- auth_method: basic
6
- access_key: dummy
7
- secret_key: dummy
8
- filters:
9
- - {name: pri-key, type: string, condition: EQ, value: key-1}
10
- columns:
11
- - {name: pri-key, type: string}
12
- - {name: sort-key, type: long}
13
- - {name: doubleValue, type: double}
14
- - {name: boolValue, type: boolean}
15
- - {name: listValue, type: json}
16
- - {name: mapValue, type: json}
17
-
18
- out:
19
- type: file
20
- path_prefix: dynamodb-local-result
21
- file_ext: tsv
22
- formatter:
23
- type: csv
24
- delimiter: "\t"
25
- header_line: false
@@ -1,23 +0,0 @@
1
- in:
2
- type: dynamodb
3
- end_point: http://localhost:8000/
4
- table: ENV_VAR
5
- auth_method: basic
6
- access_key: dummy
7
- secret_key: dummy
8
- columns:
9
- - {name: pri-key, type: string}
10
- - {name: sort-key, type: long}
11
- - {name: doubleValue, type: double}
12
- - {name: boolValue, type: boolean}
13
- - {name: listValue, type: json}
14
- - {name: mapValue, type: json}
15
-
16
- out:
17
- type: file
18
- path_prefix: dynamodb-local-result
19
- file_ext: tsv
20
- formatter:
21
- type: csv
22
- delimiter: "\t"
23
- header_line: false
@@ -1,20 +0,0 @@
1
- in:
2
- type: dynamodb
3
- region: ENV_VAR
4
- operation: scan
5
- table: ENV_VAR
6
- access_key: ENV_VAR
7
- secret_key: ENV_VAR
8
- columns:
9
- - {name: pri-key, type: string}
10
- - {name: sort-key, type: long}
11
- - {name: value, type: string}
12
-
13
- out:
14
- type: file
15
- path_prefix: result
16
- file_ext: tsv
17
- formatter:
18
- type: csv
19
- delimiter: "\t"
20
- header_line: false
@@ -1,83 +0,0 @@
1
- package org.embulk.input.dynamodb.ope
2
-
3
- import java.io.File
4
- import java.nio.charset.Charset
5
- import java.nio.file.{FileSystems, Files}
6
-
7
- import com.fasterxml.jackson.databind.ObjectMapper
8
- import com.google.inject.{Binder, Module}
9
- import org.embulk.EmbulkEmbed
10
- import org.embulk.config.ConfigSource
11
- import org.embulk.input.dynamodb.DynamodbInputPlugin
12
- import org.embulk.plugin.InjectedPluginSource
13
- import org.embulk.spi.InputPlugin
14
- import org.hamcrest.CoreMatchers._
15
- import org.junit.Assert._
16
- import org.junit.{Before, Test}
17
-
18
- class QueryOperationTest {
19
- private var embulk: EmbulkEmbed = null
20
-
21
- private var EMBULK_DYNAMODB_TEST_TABLE: String = null
22
- private var mapper: ObjectMapper = null
23
-
24
- @Before
25
- def createResources() {
26
- // Get Environments
27
- EMBULK_DYNAMODB_TEST_TABLE = System.getenv("EMBULK_DYNAMODB_TEST_TABLE")
28
-
29
- val bootstrap = new EmbulkEmbed.Bootstrap()
30
- bootstrap.addModules(new Module {
31
- def configure(binder: Binder): Unit = {
32
- InjectedPluginSource.registerPluginTo(binder,
33
- classOf[InputPlugin],
34
- "dynamodb",
35
- classOf[DynamodbInputPlugin])
36
- }
37
- })
38
-
39
- embulk = bootstrap.initializeCloseable()
40
-
41
- mapper = new ObjectMapper()
42
- }
43
-
44
-
45
- def doTest(config: ConfigSource) {
46
- embulk.run(config)
47
-
48
- val fs = FileSystems.getDefault
49
- val lines = Files.readAllLines(fs.getPath("dynamodb-local-result000.00.tsv"), Charset.forName("UTF-8"))
50
- assertEquals(lines.size, 1)
51
-
52
- val head = lines.get(0)
53
- val values = head.split("\t")
54
-
55
- assertThat(values(0), is("key-1"))
56
- assertThat(values(1), is("0"))
57
- assertThat(values(2), is("42.195"))
58
- assertThat(values(3), is("true"))
59
-
60
- val listValue = mapper.readValue(values(4).replaceAll("\"(?!\")", ""), classOf[java.util.List[Object]])
61
- assertThat(listValue.size(), is(2))
62
- assertThat(listValue.get(0).asInstanceOf[String], is("list-value"))
63
- assertThat(listValue.get(1).asInstanceOf[Int], is(123))
64
-
65
- val mapValue = mapper.readValue(values(5).replaceAll("\"(?!\")", ""), classOf[java.util.Map[String, Object]])
66
- assert(mapValue.containsKey("map-key-1"))
67
- assertThat(mapValue.get("map-key-1").asInstanceOf[String], is("map-value-1"))
68
- assert(mapValue.containsKey("map-key-2"))
69
- assertThat(mapValue.get("map-key-2").asInstanceOf[Int], is(456))
70
- }
71
-
72
- @Test
73
- def queryTest() {
74
- val config = embulk.newConfigLoader().fromYamlFile(
75
- new File("src/test/resources/yaml/dynamodb-local-query.yml"))
76
-
77
- config.getNested("in")
78
- .set("operation", "query")
79
- .set("table", EMBULK_DYNAMODB_TEST_TABLE)
80
-
81
- doTest(config)
82
- }
83
- }
@@ -1,83 +0,0 @@
1
- package org.embulk.input.dynamodb.ope
2
-
3
- import java.io.File
4
- import java.nio.charset.Charset
5
- import java.nio.file.{FileSystems, Files}
6
-
7
- import com.fasterxml.jackson.databind.ObjectMapper
8
- import com.google.inject.{Binder, Module}
9
- import org.embulk.EmbulkEmbed
10
- import org.embulk.config.ConfigSource
11
- import org.embulk.input.dynamodb.DynamodbInputPlugin
12
- import org.embulk.plugin.InjectedPluginSource
13
- import org.embulk.spi.InputPlugin
14
- import org.hamcrest.CoreMatchers._
15
- import org.junit.Assert._
16
- import org.junit.{Before, Test}
17
-
18
- class ScanOperationTest {
19
- private var embulk: EmbulkEmbed = null
20
-
21
- private var EMBULK_DYNAMODB_TEST_TABLE: String = null
22
- private var mapper: ObjectMapper = null
23
-
24
- @Before
25
- def createResources() {
26
- // Get Environments
27
- EMBULK_DYNAMODB_TEST_TABLE = System.getenv("EMBULK_DYNAMODB_TEST_TABLE")
28
-
29
- val bootstrap = new EmbulkEmbed.Bootstrap()
30
- bootstrap.addModules(new Module {
31
- def configure(binder: Binder): Unit = {
32
- InjectedPluginSource.registerPluginTo(binder,
33
- classOf[InputPlugin],
34
- "dynamodb",
35
- classOf[DynamodbInputPlugin])
36
- }
37
- })
38
-
39
- embulk = bootstrap.initializeCloseable()
40
-
41
- mapper = new ObjectMapper()
42
- }
43
-
44
-
45
- def doTest(config: ConfigSource) {
46
- embulk.run(config)
47
-
48
- val fs = FileSystems.getDefault
49
- val lines = Files.readAllLines(fs.getPath("dynamodb-local-result000.00.tsv"), Charset.forName("UTF-8"))
50
- assertEquals(lines.size, 1)
51
-
52
- val head = lines.get(0)
53
- val values = head.split("\t")
54
-
55
- assertThat(values(0), is("key-1"))
56
- assertThat(values(1), is("0"))
57
- assertThat(values(2), is("42.195"))
58
- assertThat(values(3), is("true"))
59
-
60
- val listValue = mapper.readValue(values(4).replaceAll("\"(?!\")", ""), classOf[java.util.List[Object]])
61
- assertThat(listValue.size(), is(2))
62
- assertThat(listValue.get(0).asInstanceOf[String], is("list-value"))
63
- assertThat(listValue.get(1).asInstanceOf[Int], is(123))
64
-
65
- val mapValue = mapper.readValue(values(5).replaceAll("\"(?!\")", ""), classOf[java.util.Map[String, Object]])
66
- assert(mapValue.containsKey("map-key-1"))
67
- assertThat(mapValue.get("map-key-1").asInstanceOf[String], is("map-value-1"))
68
- assert(mapValue.containsKey("map-key-2"))
69
- assertThat(mapValue.get("map-key-2").asInstanceOf[Int], is(456))
70
- }
71
-
72
- @Test
73
- def scanTest() {
74
- val config = embulk.newConfigLoader().fromYamlFile(
75
- new File("src/test/resources/yaml/dynamodb-local-scan.yml"))
76
-
77
- config.getNested("in")
78
- .set("operation", "scan")
79
- .set("table", EMBULK_DYNAMODB_TEST_TABLE)
80
-
81
- doTest(config)
82
- }
83
- }
data/test/create_table.sh DELETED
@@ -1,16 +0,0 @@
1
- #!/bin/sh
2
-
3
- aws dynamodb create-table \
4
- --table-name='EMBULK_DYNAMODB_TEST_TABLE' \
5
- --attribute-definitions='[
6
- {"AttributeName":"pri-key","AttributeType":"S"},
7
- {"AttributeName":"sort-key","AttributeType":"N"}
8
- ]' \
9
- --key-schema='[
10
- {"AttributeName":"pri-key","KeyType":"HASH"},
11
- {"AttributeName":"sort-key","KeyType":"RANGE"}
12
- ]' \
13
- --provisioned-throughput='{"ReadCapacityUnits":5, "WriteCapacityUnits":5}' \
14
- --endpoint-url http://localhost:8000 \
15
- --region us-east-1
16
-
data/test/put_items.sh DELETED
@@ -1,25 +0,0 @@
1
- #!/bin/sh
2
-
3
- aws dynamodb put-item \
4
- --table-name='EMBULK_DYNAMODB_TEST_TABLE' \
5
- --item='{
6
- "pri-key" : { "S" : "key-1" },
7
- "sort-key" : { "N" : "0" },
8
- "doubleValue" : { "N" : "42.195" },
9
- "boolValue" : { "BOOL" : true },
10
- "listValue" : { "L":
11
- [
12
- { "S" : "list-value"},
13
- { "N" : "123"}
14
- ]
15
- },
16
- "mapValue" : { "M":
17
- {
18
- "map-key-1" : { "S" : "map-value-1" },
19
- "map-key-2" : { "N" : "456" }
20
- }
21
- }
22
- }' \
23
- --endpoint-url http://localhost:8000 \
24
- --region us-east-1
25
-