embulk-input-dynamodb 0.0.3 → 0.1.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.
- checksums.yaml +4 -4
- data/README.md +19 -3
- data/build.gradle +29 -5
- data/circle.yml +8 -0
- data/config/checkstyle/checkstyle.xml +128 -0
- data/config/checkstyle/default.xml +108 -0
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +2 -2
- data/lib/embulk/input/dynamodb.rb +1 -1
- data/src/main/scala/org/embulk/input/dynamodb/AttributeValueHelper.scala +41 -0
- data/src/main/scala/org/embulk/input/dynamodb/AwsCredentials.scala +71 -0
- data/src/main/scala/org/embulk/input/{DynamoDBUtil.scala → dynamodb/DynamoDBUtil.scala} +54 -62
- data/src/main/scala/org/embulk/input/{DynamodbInputPlugin.scala → dynamodb/DynamodbInputPlugin.scala} +14 -8
- data/src/main/scala/org/embulk/input/{Filter.scala → dynamodb/Filter.scala} +2 -2
- data/src/main/scala/org/embulk/input/{FilterConfig.scala → dynamodb/FilterConfig.scala} +1 -1
- data/src/main/scala/org/embulk/input/{PluginTask.scala → dynamodb/PluginTask.scala} +10 -2
- data/src/test/resources/json/test.json +50 -0
- data/src/test/resources/json/test.template +27 -0
- data/src/test/resources/yaml/authMethodBasic.yml +20 -0
- data/src/test/resources/yaml/authMethodBasic_Error.yml +18 -0
- data/src/test/resources/yaml/authMethodEnv.yml +18 -0
- data/src/test/resources/yaml/authMethodProfile.yml +19 -0
- data/src/test/resources/yaml/notSetAuthMethod.yml +19 -0
- data/src/test/scala/org/embulk/input/dynamodb/AttributeValueHelperTest.scala +192 -0
- data/src/test/scala/org/embulk/input/dynamodb/AwsCredentialsTest.scala +135 -0
- metadata +29 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb06f7f31e946edcde0e6fde44443d11c20b2f1b
|
4
|
+
data.tar.gz: 83f448ad04d7f262c9a1438c79091ce1c6ac2765
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00544333da3be446d2e479fe1055f5599ea50655f0ba77d6ba465b0d4a0b58316675ac269a0299aaddd8469599b6d43dc02f05fb9b2d07b5daa25d68b4448f9f
|
7
|
+
data.tar.gz: 8960d06019a11c3e291f7724b0404e9dbd44df041a91cbe4bdaccb9b2e430a5213d60ff597aafab99ff9d6daa3409bead9b634126fa59a2712338e3084c6f318
|
data/README.md
CHANGED
@@ -9,19 +9,34 @@
|
|
9
9
|
|
10
10
|
|
11
11
|
## Configuration
|
12
|
-
- **
|
13
|
-
|
14
|
-
|
12
|
+
- **auth_method**: AWS Credential Type.
|
13
|
+
Available values options are: `basic`, `env`, `instance`, `profile`, `properties`
|
14
|
+
- **basic**: AWS access key and secret access key
|
15
|
+
- **env**: Environment variables
|
16
|
+
- **instance**: EC2 Instance Metadata Service
|
17
|
+
- **profile**: Profile configuration file
|
18
|
+
- **properties**: Java system properties
|
19
|
+
- If **auth_method** is set `basic`
|
20
|
+
- **access_key**: AWS access key (string, required)
|
21
|
+
- **secret_key**: AWS secret key (string, required)
|
22
|
+
- If **auth_method** is set `profile`
|
23
|
+
- **profile_name**: The name of a local configuration profile (string, optional)
|
15
24
|
- **region**: Region Name (string, default: ap-northeast-1)
|
16
25
|
- **table**: Table Name (string, required)
|
17
26
|
- **scan_limit**: DynamoDB 1time Scan Query size limit (Int, optional)
|
18
27
|
- **record_limit**: Max Record Search limit (Long, optional)
|
28
|
+
- **columns**: a key-value pairs where key is a column name and value is options for the column (required)
|
29
|
+
- **name**: Column name.
|
30
|
+
- **type**: Column values are converted to this embulk type.
|
31
|
+
Available values options are: `boolean`, `long`, `double`, `string`, `json`
|
32
|
+
- **filters**: query filter (optional)
|
19
33
|
|
20
34
|
## Example
|
21
35
|
|
22
36
|
```yaml
|
23
37
|
in:
|
24
38
|
type: dynamodb
|
39
|
+
auth_method: basic
|
25
40
|
access_key: YOUR_ACCESS_KEY
|
26
41
|
secret_key: YOUR_SECRET_KEY
|
27
42
|
region: ap-northeast-1
|
@@ -31,6 +46,7 @@ in:
|
|
31
46
|
- {name: ColumnB, type: double}
|
32
47
|
- {name: ColumnC, type: string}
|
33
48
|
- {name: ColumnD, type: boolean}
|
49
|
+
- {name: ColumnE, type: json}
|
34
50
|
filters:
|
35
51
|
- {name: ColumnA, type: long, condition: BETWEEN, value: 10000, value2: 20000}
|
36
52
|
- {name: ColumnC, type: string, condition: EQ, value: foobar}
|
data/build.gradle
CHANGED
@@ -2,6 +2,7 @@ plugins {
|
|
2
2
|
id "com.jfrog.bintray" version "1.1"
|
3
3
|
id "com.github.jruby-gradle.base" version "0.1.5"
|
4
4
|
id "scala"
|
5
|
+
id "checkstyle"
|
5
6
|
}
|
6
7
|
|
7
8
|
import com.github.jrubygradle.JRubyExec
|
@@ -13,16 +14,22 @@ configurations {
|
|
13
14
|
provided
|
14
15
|
}
|
15
16
|
|
16
|
-
version = "0.0
|
17
|
+
version = "0.1.0"
|
18
|
+
|
19
|
+
sourceCompatibility = 1.7
|
20
|
+
targetCompatibility = 1.7
|
17
21
|
|
18
22
|
dependencies {
|
19
|
-
compile "org.scala-lang:scala-library:2.11.
|
23
|
+
compile "org.scala-lang:scala-library:2.11.7"
|
24
|
+
|
25
|
+
compile "org.embulk:embulk-core:0.8.6"
|
26
|
+
provided "org.embulk:embulk-core:0.8.6"
|
20
27
|
|
21
|
-
compile
|
22
|
-
provided "org.embulk:embulk-core:0.4.10"
|
28
|
+
compile "com.amazonaws:aws-java-sdk-dynamodb:1.10.43"
|
23
29
|
|
24
|
-
compile "com.amazonaws:aws-java-sdk-dynamodb:1.9.22"
|
25
30
|
testCompile "junit:junit:4.+"
|
31
|
+
testCompile "org.embulk:embulk-standards:0.8.6"
|
32
|
+
testCompile "org.embulk:embulk-core:0.8.6:tests"
|
26
33
|
}
|
27
34
|
|
28
35
|
compileScala {
|
@@ -48,6 +55,23 @@ task classpath(type: Copy, dependsOn: ["jar"]) {
|
|
48
55
|
}
|
49
56
|
clean { delete 'classpath' }
|
50
57
|
|
58
|
+
checkstyle {
|
59
|
+
configFile = file("${project.rootDir}/config/checkstyle/checkstyle.xml")
|
60
|
+
toolVersion = '6.14.1'
|
61
|
+
}
|
62
|
+
checkstyleMain {
|
63
|
+
configFile = file("${project.rootDir}/config/checkstyle/default.xml")
|
64
|
+
ignoreFailures = true
|
65
|
+
}
|
66
|
+
checkstyleTest {
|
67
|
+
configFile = file("${project.rootDir}/config/checkstyle/default.xml")
|
68
|
+
ignoreFailures = true
|
69
|
+
}
|
70
|
+
task checkstyle(type: Checkstyle) {
|
71
|
+
classpath = sourceSets.main.output + sourceSets.test.output
|
72
|
+
source = sourceSets.main.allJava + sourceSets.test.allJava
|
73
|
+
}
|
74
|
+
|
51
75
|
task gem(type: JRubyExec, dependsOn: ["build", "gemspec", "classpath"]) {
|
52
76
|
jrubyArgs "-rrubygems/gem_runner", "-eGem::GemRunner.new.run(ARGV)", "build"
|
53
77
|
script "build/gemspec"
|
data/circle.yml
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE module PUBLIC
|
3
|
+
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
|
4
|
+
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
|
5
|
+
<module name="Checker">
|
6
|
+
<!-- https://github.com/facebook/presto/blob/master/src/checkstyle/checks.xml -->
|
7
|
+
<module name="FileTabCharacter"/>
|
8
|
+
<module name="NewlineAtEndOfFile">
|
9
|
+
<property name="lineSeparator" value="lf"/>
|
10
|
+
</module>
|
11
|
+
<module name="RegexpMultiline">
|
12
|
+
<property name="format" value="\r"/>
|
13
|
+
<property name="message" value="Line contains carriage return"/>
|
14
|
+
</module>
|
15
|
+
<module name="RegexpMultiline">
|
16
|
+
<property name="format" value=" \n"/>
|
17
|
+
<property name="message" value="Line has trailing whitespace"/>
|
18
|
+
</module>
|
19
|
+
<module name="RegexpMultiline">
|
20
|
+
<property name="format" value="\{\n\n"/>
|
21
|
+
<property name="message" value="Blank line after opening brace"/>
|
22
|
+
</module>
|
23
|
+
<module name="RegexpMultiline">
|
24
|
+
<property name="format" value="\n\n\s*\}"/>
|
25
|
+
<property name="message" value="Blank line before closing brace"/>
|
26
|
+
</module>
|
27
|
+
<module name="RegexpMultiline">
|
28
|
+
<property name="format" value="\n\n\n"/>
|
29
|
+
<property name="message" value="Multiple consecutive blank lines"/>
|
30
|
+
</module>
|
31
|
+
<module name="RegexpMultiline">
|
32
|
+
<property name="format" value="\n\n\Z"/>
|
33
|
+
<property name="message" value="Blank line before end of file"/>
|
34
|
+
</module>
|
35
|
+
<module name="RegexpMultiline">
|
36
|
+
<property name="format" value="Preconditions\.checkNotNull"/>
|
37
|
+
<property name="message" value="Use of checkNotNull"/>
|
38
|
+
</module>
|
39
|
+
|
40
|
+
<module name="TreeWalker">
|
41
|
+
<module name="EmptyBlock">
|
42
|
+
<property name="option" value="text"/>
|
43
|
+
<property name="tokens" value="
|
44
|
+
LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_IF,
|
45
|
+
LITERAL_FOR, LITERAL_TRY, LITERAL_WHILE, INSTANCE_INIT, STATIC_INIT"/>
|
46
|
+
</module>
|
47
|
+
<module name="EmptyStatement"/>
|
48
|
+
<module name="EmptyForInitializerPad"/>
|
49
|
+
<module name="EmptyForIteratorPad">
|
50
|
+
<property name="option" value="space"/>
|
51
|
+
</module>
|
52
|
+
<module name="MethodParamPad">
|
53
|
+
<property name="allowLineBreaks" value="true"/>
|
54
|
+
<property name="option" value="nospace"/>
|
55
|
+
</module>
|
56
|
+
<module name="ParenPad"/>
|
57
|
+
<module name="TypecastParenPad"/>
|
58
|
+
<module name="NeedBraces"/>
|
59
|
+
<module name="LeftCurly">
|
60
|
+
<property name="option" value="nl"/>
|
61
|
+
<property name="tokens" value="CLASS_DEF, CTOR_DEF, INTERFACE_DEF, METHOD_DEF"/>
|
62
|
+
</module>
|
63
|
+
<module name="LeftCurly">
|
64
|
+
<property name="option" value="eol"/>
|
65
|
+
<property name="tokens" value="
|
66
|
+
LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR,
|
67
|
+
LITERAL_IF, LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE"/>
|
68
|
+
</module>
|
69
|
+
<module name="RightCurly">
|
70
|
+
<property name="option" value="alone"/>
|
71
|
+
</module>
|
72
|
+
<module name="GenericWhitespace"/>
|
73
|
+
<module name="WhitespaceAfter"/>
|
74
|
+
<module name="NoWhitespaceBefore"/>
|
75
|
+
|
76
|
+
<module name="UpperEll"/>
|
77
|
+
<module name="DefaultComesLast"/>
|
78
|
+
<module name="ArrayTypeStyle"/>
|
79
|
+
<module name="MultipleVariableDeclarations"/>
|
80
|
+
<module name="ModifierOrder"/>
|
81
|
+
<module name="OneStatementPerLine"/>
|
82
|
+
<module name="StringLiteralEquality"/>
|
83
|
+
<module name="MutableException"/>
|
84
|
+
<module name="EqualsHashCode"/>
|
85
|
+
<module name="InnerAssignment"/>
|
86
|
+
<module name="InterfaceIsType"/>
|
87
|
+
<module name="HideUtilityClassConstructor"/>
|
88
|
+
|
89
|
+
<module name="MemberName"/>
|
90
|
+
<module name="LocalVariableName"/>
|
91
|
+
<module name="LocalFinalVariableName"/>
|
92
|
+
<module name="TypeName"/>
|
93
|
+
<module name="PackageName"/>
|
94
|
+
<module name="ParameterName"/>
|
95
|
+
<module name="StaticVariableName"/>
|
96
|
+
<module name="ClassTypeParameterName">
|
97
|
+
<property name="format" value="^[A-Z][0-9]?$"/>
|
98
|
+
</module>
|
99
|
+
<module name="MethodTypeParameterName">
|
100
|
+
<property name="format" value="^[A-Z][0-9]?$"/>
|
101
|
+
</module>
|
102
|
+
|
103
|
+
<module name="AvoidStarImport"/>
|
104
|
+
<module name="RedundantImport"/>
|
105
|
+
<module name="UnusedImports"/>
|
106
|
+
<module name="ImportOrder">
|
107
|
+
<property name="groups" value="*,javax,java"/>
|
108
|
+
<property name="separated" value="true"/>
|
109
|
+
<property name="option" value="bottom"/>
|
110
|
+
<property name="sortStaticImportsAlphabetically" value="true"/>
|
111
|
+
</module>
|
112
|
+
|
113
|
+
<module name="WhitespaceAround">
|
114
|
+
<property name="allowEmptyConstructors" value="true"/>
|
115
|
+
<property name="allowEmptyMethods" value="true"/>
|
116
|
+
<property name="ignoreEnhancedForColon" value="false"/>
|
117
|
+
<property name="tokens" value="
|
118
|
+
ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN,
|
119
|
+
BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, EQUAL, GE, GT, LAND, LE,
|
120
|
+
LITERAL_ASSERT, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE,
|
121
|
+
LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_RETURN,
|
122
|
+
LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE,
|
123
|
+
LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL,
|
124
|
+
PLUS, PLUS_ASSIGN, QUESTION, SL, SLIST, SL_ASSIGN, SR, SR_ASSIGN,
|
125
|
+
STAR, STAR_ASSIGN, TYPE_EXTENSION_AND"/>
|
126
|
+
</module>
|
127
|
+
</module>
|
128
|
+
</module>
|
@@ -0,0 +1,108 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE module PUBLIC
|
3
|
+
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
|
4
|
+
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
|
5
|
+
<!--
|
6
|
+
This is a subset of ./checkstyle.xml which allows some loose styles
|
7
|
+
-->
|
8
|
+
<module name="Checker">
|
9
|
+
<module name="FileTabCharacter"/>
|
10
|
+
<module name="NewlineAtEndOfFile">
|
11
|
+
<property name="lineSeparator" value="lf"/>
|
12
|
+
</module>
|
13
|
+
<module name="RegexpMultiline">
|
14
|
+
<property name="format" value="\r"/>
|
15
|
+
<property name="message" value="Line contains carriage return"/>
|
16
|
+
</module>
|
17
|
+
<module name="RegexpMultiline">
|
18
|
+
<property name="format" value=" \n"/>
|
19
|
+
<property name="message" value="Line has trailing whitespace"/>
|
20
|
+
</module>
|
21
|
+
<module name="RegexpMultiline">
|
22
|
+
<property name="format" value="\n\n\n"/>
|
23
|
+
<property name="message" value="Multiple consecutive blank lines"/>
|
24
|
+
</module>
|
25
|
+
<module name="RegexpMultiline">
|
26
|
+
<property name="format" value="\n\n\Z"/>
|
27
|
+
<property name="message" value="Blank line before end of file"/>
|
28
|
+
</module>
|
29
|
+
|
30
|
+
<module name="TreeWalker">
|
31
|
+
<module name="EmptyBlock">
|
32
|
+
<property name="option" value="text"/>
|
33
|
+
<property name="tokens" value="
|
34
|
+
LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_IF,
|
35
|
+
LITERAL_FOR, LITERAL_TRY, LITERAL_WHILE, INSTANCE_INIT, STATIC_INIT"/>
|
36
|
+
</module>
|
37
|
+
<module name="EmptyStatement"/>
|
38
|
+
<module name="EmptyForInitializerPad"/>
|
39
|
+
<module name="EmptyForIteratorPad">
|
40
|
+
<property name="option" value="space"/>
|
41
|
+
</module>
|
42
|
+
<module name="MethodParamPad">
|
43
|
+
<property name="allowLineBreaks" value="true"/>
|
44
|
+
<property name="option" value="nospace"/>
|
45
|
+
</module>
|
46
|
+
<module name="ParenPad"/>
|
47
|
+
<module name="TypecastParenPad"/>
|
48
|
+
<module name="NeedBraces"/>
|
49
|
+
<module name="LeftCurly">
|
50
|
+
<property name="option" value="nl"/>
|
51
|
+
<property name="tokens" value="CLASS_DEF, CTOR_DEF, INTERFACE_DEF, METHOD_DEF"/>
|
52
|
+
</module>
|
53
|
+
<module name="LeftCurly">
|
54
|
+
<property name="option" value="eol"/>
|
55
|
+
<property name="tokens" value="
|
56
|
+
LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR,
|
57
|
+
LITERAL_IF, LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE"/>
|
58
|
+
</module>
|
59
|
+
<module name="RightCurly">
|
60
|
+
<property name="option" value="alone"/>
|
61
|
+
</module>
|
62
|
+
<module name="GenericWhitespace"/>
|
63
|
+
<module name="WhitespaceAfter"/>
|
64
|
+
<module name="NoWhitespaceBefore"/>
|
65
|
+
|
66
|
+
<module name="UpperEll"/>
|
67
|
+
<module name="DefaultComesLast"/>
|
68
|
+
<module name="ArrayTypeStyle"/>
|
69
|
+
<module name="MultipleVariableDeclarations"/>
|
70
|
+
<module name="ModifierOrder"/>
|
71
|
+
<module name="OneStatementPerLine"/>
|
72
|
+
<module name="StringLiteralEquality"/>
|
73
|
+
<module name="MutableException"/>
|
74
|
+
<module name="EqualsHashCode"/>
|
75
|
+
<module name="InnerAssignment"/>
|
76
|
+
<module name="InterfaceIsType"/>
|
77
|
+
<module name="HideUtilityClassConstructor"/>
|
78
|
+
|
79
|
+
<module name="MemberName"/>
|
80
|
+
<module name="LocalVariableName"/>
|
81
|
+
<module name="LocalFinalVariableName"/>
|
82
|
+
<module name="TypeName"/>
|
83
|
+
<module name="PackageName"/>
|
84
|
+
<module name="ParameterName"/>
|
85
|
+
<module name="StaticVariableName"/>
|
86
|
+
<module name="ClassTypeParameterName">
|
87
|
+
<property name="format" value="^[A-Z][0-9]?$"/>
|
88
|
+
</module>
|
89
|
+
<module name="MethodTypeParameterName">
|
90
|
+
<property name="format" value="^[A-Z][0-9]?$"/>
|
91
|
+
</module>
|
92
|
+
|
93
|
+
<module name="WhitespaceAround">
|
94
|
+
<property name="allowEmptyConstructors" value="true"/>
|
95
|
+
<property name="allowEmptyMethods" value="true"/>
|
96
|
+
<property name="ignoreEnhancedForColon" value="false"/>
|
97
|
+
<property name="tokens" value="
|
98
|
+
ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN,
|
99
|
+
BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, EQUAL, GE, GT, LAND, LE,
|
100
|
+
LITERAL_ASSERT, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE,
|
101
|
+
LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_RETURN,
|
102
|
+
LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE,
|
103
|
+
LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL,
|
104
|
+
PLUS, PLUS_ASSIGN, QUESTION, SL, SLIST, SL_ASSIGN, SR, SR_ASSIGN,
|
105
|
+
STAR, STAR_ASSIGN, TYPE_EXTENSION_AND"/>
|
106
|
+
</module>
|
107
|
+
</module>
|
108
|
+
</module>
|
Binary file
|
@@ -1,6 +1,6 @@
|
|
1
|
-
#
|
1
|
+
#Wed Jan 13 12:41:02 JST 2016
|
2
2
|
distributionBase=GRADLE_USER_HOME
|
3
3
|
distributionPath=wrapper/dists
|
4
4
|
zipStoreBase=GRADLE_USER_HOME
|
5
5
|
zipStorePath=wrapper/dists
|
6
|
-
distributionUrl=https\://services.gradle.org/distributions/gradle-2.
|
6
|
+
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-bin.zip
|
@@ -0,0 +1,41 @@
|
|
1
|
+
package org.embulk.input.dynamodb
|
2
|
+
|
3
|
+
import com.amazonaws.services.dynamodbv2.model.AttributeValue
|
4
|
+
import org.msgpack.value.{Value, ValueFactory}
|
5
|
+
|
6
|
+
import scala.util.Try
|
7
|
+
|
8
|
+
object AttributeValueHelper {
|
9
|
+
|
10
|
+
// referring aws-scala
|
11
|
+
def decodeToValue(value: AttributeValue): Value = {
|
12
|
+
import scala.collection.JavaConverters._
|
13
|
+
|
14
|
+
// FIXME: Need Encode?
|
15
|
+
lazy val _bin = Option(value.getB).map(v => ValueFactory.newBinary(v.array))
|
16
|
+
lazy val _bool = Option(value.getBOOL).map(v => ValueFactory.newBoolean(v))
|
17
|
+
lazy val _num = Option(value.getN).map(v =>
|
18
|
+
Try(v.toLong).map(ValueFactory.newInteger).getOrElse(ValueFactory.newFloat(v.toDouble)))
|
19
|
+
lazy val _str = Option(value.getS).map(v => ValueFactory.newString(v))
|
20
|
+
lazy val _nil = Option(value.getNULL).map(v => ValueFactory.newNil)
|
21
|
+
|
22
|
+
lazy val _list = Option(value.getL).map(l =>
|
23
|
+
ValueFactory.newArray(l.asScala.map(v => decodeToValue(v)).asJava))
|
24
|
+
lazy val _ss = Option(value.getSS).map(l =>
|
25
|
+
ValueFactory.newArray(l.asScala.map(v => ValueFactory.newString(v)).asJava))
|
26
|
+
lazy val _ns = Option(value.getNS).map(l =>
|
27
|
+
ValueFactory.newArray(l.asScala.map(v =>
|
28
|
+
Try(v.toLong).map(ValueFactory.newInteger).getOrElse(ValueFactory.newFloat(v.toDouble))).asJava))
|
29
|
+
// FIXME: Need Encode?
|
30
|
+
lazy val _bs = Option(value.getBS).map(l =>
|
31
|
+
ValueFactory.newArray(l.asScala.map(v => ValueFactory.newBinary(v.array)).asJava))
|
32
|
+
lazy val _map = Option(value.getM).map(m =>
|
33
|
+
ValueFactory.newMap(m.asScala.map(v => ValueFactory.newString(v._1) -> decodeToValue(v._2)).asJava))
|
34
|
+
|
35
|
+
_bin.orElse(_bool).orElse(_num).orElse(_str).orElse(_nil)
|
36
|
+
.orElse(_list).orElse(_ss).orElse(_ns).orElse(_bs).orElse(_map) match {
|
37
|
+
case None => ValueFactory.newNil
|
38
|
+
case Some(j) => j
|
39
|
+
}
|
40
|
+
}
|
41
|
+
}
|
@@ -0,0 +1,71 @@
|
|
1
|
+
package org.embulk.input.dynamodb
|
2
|
+
|
3
|
+
import com.amazonaws.auth._
|
4
|
+
import com.amazonaws.auth.profile.ProfileCredentialsProvider
|
5
|
+
import com.google.common.base.Optional
|
6
|
+
import org.embulk.config.ConfigException
|
7
|
+
|
8
|
+
object AwsCredentials {
|
9
|
+
def getCredentialsProvider(task: PluginTask): AWSCredentialsProvider = {
|
10
|
+
if (!task.getAuthMethod.isPresent) {
|
11
|
+
// backward compatibility
|
12
|
+
if (task.getAccessKey.isPresent && task.getSecretKey.isPresent) {
|
13
|
+
new AWSCredentialsProvider {
|
14
|
+
override def refresh(): Unit = {}
|
15
|
+
|
16
|
+
override def getCredentials: AWSCredentials = {
|
17
|
+
new BasicAWSCredentials(
|
18
|
+
task.getAccessKey.get(),
|
19
|
+
task.getSecretKey.get())
|
20
|
+
}
|
21
|
+
}
|
22
|
+
} else {
|
23
|
+
new ProfileCredentialsProvider()
|
24
|
+
}
|
25
|
+
} else {
|
26
|
+
val cred = task.getAuthMethod.get() match {
|
27
|
+
case "basic" =>
|
28
|
+
val accessKey = require(task.getAccessKey, "'access_key'")
|
29
|
+
val secretKey = require(task.getSecretKey, "'secret_key'")
|
30
|
+
|
31
|
+
new BasicAWSCredentials(accessKey, secretKey)
|
32
|
+
|
33
|
+
case "env" =>
|
34
|
+
new EnvironmentVariableCredentialsProvider().getCredentials
|
35
|
+
|
36
|
+
case "instance" =>
|
37
|
+
new InstanceProfileCredentialsProvider().getCredentials
|
38
|
+
|
39
|
+
case "profile" =>
|
40
|
+
val profileName = task.getProfileName.or("default")
|
41
|
+
|
42
|
+
try {
|
43
|
+
new ProfileCredentialsProvider(profileName).getCredentials
|
44
|
+
} catch {
|
45
|
+
case e: IllegalArgumentException =>
|
46
|
+
throw new ConfigException(s"No AWS profile named $profileName")
|
47
|
+
}
|
48
|
+
|
49
|
+
case "properties" =>
|
50
|
+
new SystemPropertiesCredentialsProvider().getCredentials
|
51
|
+
|
52
|
+
case _ =>
|
53
|
+
throw new ConfigException(s"Unknown 'auth_method' ${task.getAuthMethod.get()}")
|
54
|
+
}
|
55
|
+
|
56
|
+
new AWSCredentialsProvider {
|
57
|
+
override def refresh(): Unit = {}
|
58
|
+
|
59
|
+
override def getCredentials: AWSCredentials = { cred }
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
private def require[A](value: Optional[A], message: String): A = {
|
65
|
+
if (value.isPresent) {
|
66
|
+
value.get()
|
67
|
+
} else {
|
68
|
+
throw new ConfigException("Required option is not set: " + message)
|
69
|
+
}
|
70
|
+
}
|
71
|
+
}
|