embulk-filter-base64 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +45 -73
- data/build.gradle +3 -2
- data/example/example_decode.csv +2 -2
- data/example/example_decode.yml +11 -13
- data/example/example_encode.csv +2 -2
- data/example/example_encode.yml +11 -13
- data/src/main/java/org/embulk/filter/base64/Base64Filter.java +100 -0
- data/src/main/java/org/embulk/filter/base64/Base64FilterPlugin.java +36 -20
- data/src/main/java/org/embulk/filter/base64/ColumnVisitorImpl.java +7 -62
- data/src/test/java/org/embulk/filter/base64/TestBase64FilterPlugin.java +10 -10
- data/src/test/java/org/embulk/filter/base64/TestColumnVisitorImpl.java +274 -31
- metadata +5 -5
- data/example/example_decode_with_typecast.yml +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 076a19622912f88e9f4c0446a5ff1b656de12cad
|
4
|
+
data.tar.gz: 62fe25a76158dfacafc3af6b57b34bb76cd1f34c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 04e9a03179c8c906dda682eaa3db724a83fbf321f9559f0de6dd1797518ddc9be7382a0440e43c93ec440d574c79c23a3c1927e82b4e18d49a82162a26eb749c
|
7
|
+
data.tar.gz: a6b749e4f88042449bd4e0ee3b8cfa2fbfd937fe5a2370a6f10f833b818fa4a2305c7e0d811344010685b45d0171fde3e3707cc659c1f7ee7dc306bcd79ed877
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Base64 filter plugin for Embulk
|
2
2
|
|
3
|
-
An Embulk filter plugin to encode/decode string by Base64.
|
3
|
+
An Embulk filter plugin to encode/decode string by Base64, Base32 and Base16.
|
4
4
|
|
5
5
|
## Overview
|
6
6
|
|
@@ -8,23 +8,21 @@ An Embulk filter plugin to encode/decode string by Base64.
|
|
8
8
|
|
9
9
|
## Configuration
|
10
10
|
|
11
|
-
* columns
|
11
|
+
* **columns**: Input columns to encode/decode (array of hash, required)
|
12
12
|
- **name**
|
13
13
|
+ name of input column (string, required)
|
14
14
|
- **decode**, **encode**
|
15
15
|
+ whether to encode or decode the value (boolean, default: `false`)
|
16
|
-
+ either one must be `true` and exception is thrown
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
+ e.g. MTIzNA==(string) is decoded into 1234(string)
|
27
|
-
- if you want type casting, use [embulk-filter-typecast](https://github.com/sonots/embulk-filter-typecast)
|
16
|
+
+ either one must be `true` and exception is thrown when both are `true` or both are `false`
|
17
|
+
- **encording**
|
18
|
+
+ encording type (string, default: 'Base64')
|
19
|
+
+ must be one of the follwing, Base64, Base32, Base16
|
20
|
+
- **urlsafe**
|
21
|
+
+ whether to use urlsafe character in encoded string
|
22
|
+
+ works only when `encording: Base64`
|
23
|
+
- **hex**
|
24
|
+
+ whether to maintain sort order of encoded string
|
25
|
+
+ works only when `encording: Base32`
|
28
26
|
|
29
27
|
## Example
|
30
28
|
|
@@ -32,79 +30,53 @@ An Embulk filter plugin to encode/decode string by Base64.
|
|
32
30
|
|
33
31
|
See [example_encode.yml](./example/example_encode.yml) and [example_encode.csv](./example/example_encode.csv).
|
34
32
|
|
33
|
+
input:
|
34
|
+
|
35
|
+
```csv
|
36
|
+
100,A0?B1>,A0?B1>,A0?B1>,A0?B1>,A0?B1>
|
37
|
+
101,ab?cd~,ab?cd~,ab?cd~,ab?cd~,ab?cd~
|
38
|
+
```
|
39
|
+
|
40
|
+
output:
|
41
|
+
|
35
42
|
```bash
|
36
|
-
$ embulk preview
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
timestamp to encode (string) : MjAxNi0xMi0zMSAyMzo1OTo1OQ==
|
44
|
-
json to encode (string) : eyJhZ2UiOiAyM30=
|
45
|
-
*************************** 2 ***************************
|
46
|
-
id ( long) : 11
|
47
|
-
string to encode (string) : RGF2aWQ=
|
48
|
-
long to encode (string) : MjM0NTY3
|
49
|
-
double to encode (string) : MTI1LjE=
|
50
|
-
boolean to encode (string) : ZmFsc2U=
|
51
|
-
timestamp to encode (string) : MjAxNy0wMS0wMSAwMDowMDowMA==
|
52
|
-
json to encode (string) : eyJhZ2UiOiAzNH0=
|
43
|
+
$ embulk preview example/example_encode.yml
|
44
|
+
+---------+---------------+------------------+------------------+------------------+---------------+
|
45
|
+
| id:long | Base64:string | Base64Url:string | Base32:string | Base32Hex:string | Base16:string |
|
46
|
+
+---------+---------------+------------------+------------------+------------------+---------------+
|
47
|
+
| 100 | QTA/QjE+ | QTA_QjE- | IEYD6QRRHY====== | 84O3UGHH7O====== | 41303F42313E |
|
48
|
+
| 101 | YWI/Y2R+ | YWI_Y2R- | MFRD6Y3EPY====== | C5H3UOR4FO====== | 61623F63647E |
|
49
|
+
+---------+---------------+------------------+------------------+------------------+---------------+
|
53
50
|
```
|
54
51
|
|
55
52
|
### decode
|
56
53
|
|
57
54
|
See [example_decode.yml](./example/example_decode.yml) and [example_decode.csv](./example/example_decode.csv).
|
58
55
|
|
59
|
-
|
60
|
-
$ embulk preview -G example/example_decode.yml
|
61
|
-
*************************** 1 ***************************
|
62
|
-
id ( long) : 10
|
63
|
-
string to decode (string) : John
|
64
|
-
long to decode (string) : 123456
|
65
|
-
double to decode (string) : 36.28
|
66
|
-
boolean to decode (string) : true
|
67
|
-
timestamp to decode (string) : 2016-12-31 23:59:59
|
68
|
-
json to decode (string) : {"age": 23}
|
69
|
-
*************************** 2 ***************************
|
70
|
-
id ( long) : 11
|
71
|
-
string to decode (string) : David
|
72
|
-
long to decode (string) : 234567
|
73
|
-
double to decode (string) : 125.01
|
74
|
-
boolean to decode (string) : false
|
75
|
-
timestamp to decode (string) : 2017-01-01 00:00:00
|
76
|
-
json to decode (string) : {"age": 34}
|
77
|
-
```
|
56
|
+
input:
|
78
57
|
|
79
|
-
|
58
|
+
```csv
|
59
|
+
100,QTA/QjE+,QTA_QjE-,IEYD6QRRHY======,84O3UGHH7O======,41303F42313E
|
60
|
+
101,YWI/Y2R+,YWI_Y2R-,MFRD6Y3EPY======,C5H3UOR4FO======,61623F63647E
|
61
|
+
```
|
80
62
|
|
81
|
-
|
63
|
+
output:
|
82
64
|
|
83
65
|
```bash
|
84
|
-
$ embulk preview
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
timestamp to decode (timestamp) : 2016-12-31 23:59:00.590 UTC
|
92
|
-
json to decode ( json) : {"age":23}
|
93
|
-
*************************** 2 ***************************
|
94
|
-
id ( long) : 11
|
95
|
-
string to decode ( string) : David
|
96
|
-
long to decode ( long) : 234,567
|
97
|
-
double to decode ( double) : 125.01
|
98
|
-
boolean to decode ( boolean) : false
|
99
|
-
timestamp to decode (timestamp) : 2017-01-01 00:00:00 UTC
|
100
|
-
json to decode ( json) : {"age":34}
|
66
|
+
$ embulk preview example/example_decode.yml
|
67
|
+
+---------+---------------+------------------+---------------+------------------+---------------+
|
68
|
+
| id:long | Base64:string | Base64Url:string | Base32:string | Base32Hex:string | Base16:string |
|
69
|
+
+---------+---------------+------------------+---------------+------------------+---------------+
|
70
|
+
| 100 | A0?B1> | A0?B1> | A0?B1> | A0?B1> | A0?B1> |
|
71
|
+
| 101 | ab?cd~ | ab?cd~ | ab?cd~ | ab?cd~ | ab?cd~ |
|
72
|
+
+---------+---------------+------------------+---------------+------------------+---------------+
|
101
73
|
```
|
102
74
|
|
75
|
+
## Limitation
|
103
76
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
* [Support encoder/decoder of URL and MIME](https://github.com/ysk24ok/embulk-filter-base64/issues/2)
|
77
|
+
* Type of input value to be encoded must be string.
|
78
|
+
* Type of decoded output value will be string
|
79
|
+
- if you want type casting, use [embulk-filter-typecast](https://github.com/sonots/embulk-filter-typecast)
|
108
80
|
|
109
81
|
## Build
|
110
82
|
|
data/build.gradle
CHANGED
@@ -13,7 +13,7 @@ configurations {
|
|
13
13
|
provided
|
14
14
|
}
|
15
15
|
|
16
|
-
version = "0.
|
16
|
+
version = "0.2.0"
|
17
17
|
|
18
18
|
sourceCompatibility = 1.7
|
19
19
|
targetCompatibility = 1.7
|
@@ -23,6 +23,7 @@ dependencies {
|
|
23
23
|
provided "org.embulk:embulk-core:0.8.15"
|
24
24
|
// compile "YOUR_JAR_DEPENDENCY_GROUP:YOUR_JAR_DEPENDENCY_MODULE:YOUR_JAR_DEPENDENCY_VERSION"
|
25
25
|
testCompile "junit:junit:4.+"
|
26
|
+
testCompile "org.hamcrest:hamcrest-library:1.+"
|
26
27
|
testCompile "org.embulk:embulk-core:0.8.15:tests"
|
27
28
|
}
|
28
29
|
|
@@ -76,7 +77,7 @@ Gem::Specification.new do |spec|
|
|
76
77
|
spec.version = "${project.version}"
|
77
78
|
spec.authors = ["Yusuke NISHIOKA"]
|
78
79
|
spec.summary = %[Base64 filter plugin for Embulk]
|
79
|
-
spec.description = %[An Embulk filter plugin to encode/decode string by Base64.]
|
80
|
+
spec.description = %[An Embulk filter plugin to encode/decode string by Base64, Base32 and Base16.]
|
80
81
|
spec.email = ["yusuke.nishioka.0713@gmail.com"]
|
81
82
|
spec.licenses = ["MIT"]
|
82
83
|
spec.homepage = "https://github.com/ysk24ok/embulk-filter-base64"
|
data/example/example_decode.csv
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
100,QTA/QjE+,QTA_QjE-,IEYD6QRRHY======,84O3UGHH7O======,41303F42313E
|
2
|
+
101,YWI/Y2R+,YWI_Y2R-,MFRD6Y3EPY======,C5H3UOR4FO======,61623F63647E
|
data/example/example_decode.yml
CHANGED
@@ -4,21 +4,19 @@ in:
|
|
4
4
|
parser:
|
5
5
|
type: csv
|
6
6
|
columns:
|
7
|
-
- {name: id,
|
8
|
-
- {name:
|
9
|
-
- {name:
|
10
|
-
- {name:
|
11
|
-
- {name:
|
12
|
-
- {name:
|
13
|
-
- {name: json to decode, type: string}
|
7
|
+
- {name: id, type: long}
|
8
|
+
- {name: Base64, type: string}
|
9
|
+
- {name: Base64Url, type: string}
|
10
|
+
- {name: Base32, type: string}
|
11
|
+
- {name: Base32Hex, type: string}
|
12
|
+
- {name: Base16, type: string}
|
14
13
|
filters:
|
15
14
|
- type: base64
|
16
15
|
columns:
|
17
|
-
- {name:
|
18
|
-
- {name:
|
19
|
-
- {name:
|
20
|
-
- {name:
|
21
|
-
- {name:
|
22
|
-
- {name: json to decode, decode: true}
|
16
|
+
- {name: Base64, decode: true}
|
17
|
+
- {name: Base64Url, decode: true, urlsafe: true}
|
18
|
+
- {name: Base32, decode: true, encoding: Base32}
|
19
|
+
- {name: Base32Hex, decode: true, encoding: Base32, hex: true}
|
20
|
+
- {name: Base16, decode: true, encoding: Base16}
|
23
21
|
out:
|
24
22
|
type: stdout
|
data/example/example_encode.csv
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
100,A0?B1>,A0?B1>,A0?B1>,A0?B1>,A0?B1>
|
2
|
+
101,ab?cd~,ab?cd~,ab?cd~,ab?cd~,ab?cd~
|
data/example/example_encode.yml
CHANGED
@@ -4,21 +4,19 @@ in:
|
|
4
4
|
parser:
|
5
5
|
type: csv
|
6
6
|
columns:
|
7
|
-
- {name: id,
|
8
|
-
- {name:
|
9
|
-
- {name:
|
10
|
-
- {name:
|
11
|
-
- {name:
|
12
|
-
- {name:
|
13
|
-
- {name: json to encode, type: string}
|
7
|
+
- {name: id, type: long}
|
8
|
+
- {name: Base64, type: string}
|
9
|
+
- {name: Base64Url, type: string}
|
10
|
+
- {name: Base32, type: string}
|
11
|
+
- {name: Base32Hex, type: string}
|
12
|
+
- {name: Base16, type: string}
|
14
13
|
filters:
|
15
14
|
- type: base64
|
16
15
|
columns:
|
17
|
-
- {name:
|
18
|
-
- {name:
|
19
|
-
- {name:
|
20
|
-
- {name:
|
21
|
-
- {name:
|
22
|
-
- {name: json to encode, encode: true}
|
16
|
+
- {name: Base64, encode: true}
|
17
|
+
- {name: Base64Url, encode: true, urlsafe: true}
|
18
|
+
- {name: Base32, encode: true, encoding: Base32}
|
19
|
+
- {name: Base32Hex, encode: true, encoding: Base32, hex: true}
|
20
|
+
- {name: Base16, encode: true, encoding: Base16}
|
23
21
|
out:
|
24
22
|
type: stdout
|
@@ -0,0 +1,100 @@
|
|
1
|
+
package org.embulk.filter.base64;
|
2
|
+
|
3
|
+
import com.google.common.io.BaseEncoding;
|
4
|
+
|
5
|
+
import org.embulk.filter.base64.Base64FilterPlugin.ColumnTask;
|
6
|
+
import org.embulk.filter.base64.Base64FilterPlugin.PluginTask;
|
7
|
+
import org.embulk.spi.Column;
|
8
|
+
|
9
|
+
import java.util.HashMap;
|
10
|
+
import java.util.List;
|
11
|
+
import java.util.Map;
|
12
|
+
import java.util.Objects;
|
13
|
+
|
14
|
+
public class Base64Filter
|
15
|
+
{
|
16
|
+
private PluginTask task;
|
17
|
+
private final Map<String, ColumnTask> columnTaskMap;
|
18
|
+
|
19
|
+
Base64Filter(PluginTask task)
|
20
|
+
{
|
21
|
+
this.task = task;
|
22
|
+
this.columnTaskMap = getColumnTaskMap(task.getColumns());
|
23
|
+
}
|
24
|
+
|
25
|
+
private Map<String, ColumnTask> getColumnTaskMap(
|
26
|
+
List<ColumnTask> columnTasks)
|
27
|
+
{
|
28
|
+
Map<String, ColumnTask> m = new HashMap<>();
|
29
|
+
for (ColumnTask columnTask : columnTasks) {
|
30
|
+
m.put(columnTask.getName(), columnTask);
|
31
|
+
}
|
32
|
+
return m;
|
33
|
+
}
|
34
|
+
|
35
|
+
private ColumnTask getTask(Column column)
|
36
|
+
{
|
37
|
+
String colName = column.getName();
|
38
|
+
return columnTaskMap.get(colName);
|
39
|
+
}
|
40
|
+
|
41
|
+
public String doFilter(Column column, String inputValue)
|
42
|
+
{
|
43
|
+
ColumnTask colTask = getTask(column);
|
44
|
+
if (colTask == null) {
|
45
|
+
return inputValue;
|
46
|
+
}
|
47
|
+
String encoding = colTask.getEncoding();
|
48
|
+
boolean doEncode = colTask.getDoEncode().get();
|
49
|
+
boolean doDecode = colTask.getDoDecode().get();
|
50
|
+
// encode
|
51
|
+
if (doEncode && ! doDecode) {
|
52
|
+
byte[] inputAsBytes = inputValue.getBytes();
|
53
|
+
String encoded = null;
|
54
|
+
if (Objects.equals(encoding, "Base64")) {
|
55
|
+
if (colTask.getDoUrlsafe().get()) {
|
56
|
+
encoded = BaseEncoding.base64Url().encode(inputAsBytes);
|
57
|
+
}
|
58
|
+
else {
|
59
|
+
encoded = BaseEncoding.base64().encode(inputAsBytes);
|
60
|
+
}
|
61
|
+
}
|
62
|
+
else if (Objects.equals(encoding, "Base32")) {
|
63
|
+
if (colTask.getUseHex().get()) {
|
64
|
+
encoded = BaseEncoding.base32Hex().encode(inputAsBytes);
|
65
|
+
}
|
66
|
+
else {
|
67
|
+
encoded = BaseEncoding.base32().encode(inputAsBytes);
|
68
|
+
}
|
69
|
+
}
|
70
|
+
else if (Objects.equals(encoding, "Base16")) {
|
71
|
+
encoded = BaseEncoding.base16().encode(inputAsBytes);
|
72
|
+
}
|
73
|
+
return encoded;
|
74
|
+
}
|
75
|
+
// decode
|
76
|
+
else {
|
77
|
+
byte[] decodedAsBytes = null;
|
78
|
+
if (Objects.equals(encoding, "Base64")) {
|
79
|
+
if (colTask.getDoUrlsafe().get()) {
|
80
|
+
decodedAsBytes = BaseEncoding.base64Url().decode(inputValue);
|
81
|
+
}
|
82
|
+
else {
|
83
|
+
decodedAsBytes = BaseEncoding.base64().decode(inputValue);
|
84
|
+
}
|
85
|
+
}
|
86
|
+
else if (Objects.equals(encoding, "Base32")) {
|
87
|
+
if (colTask.getUseHex().get()) {
|
88
|
+
decodedAsBytes = BaseEncoding.base32Hex().decode(inputValue);
|
89
|
+
}
|
90
|
+
else {
|
91
|
+
decodedAsBytes = BaseEncoding.base32().decode(inputValue);
|
92
|
+
}
|
93
|
+
}
|
94
|
+
else if (Objects.equals(encoding, "Base16")) {
|
95
|
+
decodedAsBytes = BaseEncoding.base16().decode(inputValue);
|
96
|
+
}
|
97
|
+
return new String(decodedAsBytes);
|
98
|
+
}
|
99
|
+
}
|
100
|
+
}
|
@@ -1,29 +1,27 @@
|
|
1
1
|
package org.embulk.filter.base64;
|
2
2
|
|
3
|
-
import java.util.List;
|
4
|
-
import java.util.Map;
|
5
|
-
import java.util.HashMap;
|
6
|
-
import java.util.Base64;
|
7
|
-
|
8
3
|
import com.google.common.base.Optional;
|
4
|
+
|
9
5
|
import org.embulk.config.Config;
|
10
6
|
import org.embulk.config.ConfigDefault;
|
7
|
+
import org.embulk.config.ConfigException;
|
11
8
|
import org.embulk.config.ConfigSource;
|
12
9
|
import org.embulk.config.Task;
|
13
10
|
import org.embulk.config.TaskSource;
|
14
11
|
import org.embulk.spi.Column;
|
15
|
-
import org.embulk.spi.ColumnVisitor;
|
16
|
-
import org.embulk.spi.DataException;
|
17
12
|
import org.embulk.spi.Exec;
|
18
13
|
import org.embulk.spi.FilterPlugin;
|
19
14
|
import org.embulk.spi.Page;
|
20
15
|
import org.embulk.spi.PageBuilder;
|
21
|
-
import org.embulk.spi.PageReader;
|
22
16
|
import org.embulk.spi.PageOutput;
|
17
|
+
import org.embulk.spi.PageReader;
|
23
18
|
import org.embulk.spi.Schema;
|
24
19
|
import org.embulk.spi.type.Type;
|
25
20
|
import org.embulk.spi.type.Types;
|
26
21
|
|
22
|
+
import java.util.Arrays;
|
23
|
+
import java.util.List;
|
24
|
+
|
27
25
|
public class Base64FilterPlugin
|
28
26
|
implements FilterPlugin
|
29
27
|
{
|
@@ -31,17 +29,15 @@ public class Base64FilterPlugin
|
|
31
29
|
extends Task
|
32
30
|
{
|
33
31
|
@Config("columns")
|
34
|
-
public List<
|
32
|
+
public List<ColumnTask> getColumns();
|
35
33
|
}
|
36
34
|
|
37
|
-
public interface
|
35
|
+
public interface ColumnTask
|
38
36
|
extends Task
|
39
37
|
{
|
40
38
|
@Config("name")
|
41
39
|
public String getName();
|
42
40
|
|
43
|
-
// TODO: getType
|
44
|
-
|
45
41
|
@Config("encode")
|
46
42
|
@ConfigDefault("false")
|
47
43
|
public Optional<Boolean> getDoEncode();
|
@@ -49,27 +45,46 @@ public class Base64FilterPlugin
|
|
49
45
|
@Config("decode")
|
50
46
|
@ConfigDefault("false")
|
51
47
|
public Optional<Boolean> getDoDecode();
|
48
|
+
|
49
|
+
@Config("encoding")
|
50
|
+
@ConfigDefault("\"Base64\"")
|
51
|
+
public String getEncoding();
|
52
|
+
|
53
|
+
@Config("urlsafe")
|
54
|
+
@ConfigDefault("false")
|
55
|
+
public Optional<Boolean> getDoUrlsafe();
|
56
|
+
|
57
|
+
@Config("hex")
|
58
|
+
@ConfigDefault("false")
|
59
|
+
public Optional<Boolean> getUseHex();
|
52
60
|
}
|
53
61
|
|
54
62
|
public void validate(PluginTask pluginTask, Schema inputSchema)
|
55
63
|
{
|
56
|
-
for (
|
57
|
-
// throws exception
|
58
|
-
inputSchema.lookupColumn(task.getName());
|
64
|
+
for (ColumnTask task : pluginTask.getColumns()) {
|
65
|
+
// throws exception when the column does not exist
|
66
|
+
Column column = inputSchema.lookupColumn(task.getName());
|
67
|
+
// check 'encode: true' or 'decode: true' in ColumnTask
|
59
68
|
boolean doEncode = task.getDoEncode().get();
|
60
69
|
boolean doDecode = task.getDoDecode().get();
|
61
70
|
boolean bothTrue = doEncode && doDecode;
|
62
71
|
boolean bothFalse = !doEncode && !doDecode;
|
63
72
|
if (bothTrue || bothFalse) {
|
64
73
|
String errMsg = "Specify either 'encode: true' or 'decode: true'";
|
65
|
-
throw new
|
74
|
+
throw new ConfigException(errMsg);
|
66
75
|
}
|
67
|
-
|
68
|
-
|
76
|
+
// check 'encoding' option in ColumnTask
|
77
|
+
String[] allowedEncordings = {"Base16", "Base32", "Base64"};
|
78
|
+
String encoding = task.getEncoding();
|
79
|
+
if (!Arrays.asList(allowedEncordings).contains(encoding)) {
|
80
|
+
String errMsg = "Encording must be one of the following: Base16, Base32, Base64";
|
81
|
+
throw new ConfigException(errMsg);
|
82
|
+
}
|
83
|
+
// check type of input cloumn
|
69
84
|
Type colType = column.getType();
|
70
85
|
if (!Types.STRING.equals(colType)) {
|
71
86
|
String errMsg = "Type of input columns must be string";
|
72
|
-
throw new
|
87
|
+
throw new ConfigException(errMsg);
|
73
88
|
}
|
74
89
|
}
|
75
90
|
}
|
@@ -92,8 +107,9 @@ public class Base64FilterPlugin
|
|
92
107
|
PageBuilder pageBuilder = new PageBuilder(
|
93
108
|
Exec.getBufferAllocator(), outputSchema, output);
|
94
109
|
PageReader pageReader = new PageReader(inputSchema);
|
110
|
+
Base64Filter filter = new Base64Filter(task);
|
95
111
|
ColumnVisitorImpl visitor = new ColumnVisitorImpl(
|
96
|
-
|
112
|
+
pageReader, pageBuilder, filter);
|
97
113
|
|
98
114
|
return new PageOutputImpl(
|
99
115
|
pageReader, pageBuilder, outputSchema, visitor);
|
@@ -1,68 +1,21 @@
|
|
1
1
|
package org.embulk.filter.base64;
|
2
2
|
|
3
|
-
import java.util.List;
|
4
|
-
import java.util.Map;
|
5
|
-
import java.util.HashMap;
|
6
|
-
import java.util.Base64;
|
7
|
-
|
8
|
-
import org.embulk.config.Config;
|
9
|
-
import org.embulk.config.ConfigDefault;
|
10
|
-
import org.embulk.config.Task;
|
11
3
|
import org.embulk.spi.Column;
|
12
4
|
import org.embulk.spi.ColumnVisitor;
|
13
|
-
import org.embulk.spi.DataException;
|
14
5
|
import org.embulk.spi.PageBuilder;
|
15
6
|
import org.embulk.spi.PageReader;
|
16
|
-
import org.embulk.spi.Schema;
|
17
|
-
|
18
|
-
import org.embulk.filter.base64.Base64FilterPlugin.Base64ColumnTask;
|
19
|
-
import org.embulk.filter.base64.Base64FilterPlugin.PluginTask;
|
20
7
|
|
21
|
-
public class ColumnVisitorImpl
|
22
|
-
implements ColumnVisitor
|
8
|
+
public class ColumnVisitorImpl implements ColumnVisitor
|
23
9
|
{
|
24
10
|
private final PageReader pageReader;
|
25
11
|
private final PageBuilder pageBuilder;
|
26
|
-
private final
|
12
|
+
private final Base64Filter filter;
|
27
13
|
|
28
|
-
ColumnVisitorImpl(
|
14
|
+
ColumnVisitorImpl(PageReader reader, PageBuilder builder, Base64Filter filter)
|
29
15
|
{
|
30
16
|
this.pageReader = reader;
|
31
17
|
this.pageBuilder = builder;
|
32
|
-
this.
|
33
|
-
}
|
34
|
-
|
35
|
-
private static Map<String, Base64ColumnTask> getBase64ColumnMap(
|
36
|
-
List<Base64ColumnTask> columnTasks)
|
37
|
-
{
|
38
|
-
Map<String, Base64ColumnTask> m = new HashMap<>();
|
39
|
-
for (Base64ColumnTask columnTask : columnTasks) {
|
40
|
-
m.put(columnTask.getName(), columnTask);
|
41
|
-
}
|
42
|
-
return m;
|
43
|
-
}
|
44
|
-
|
45
|
-
private Base64ColumnTask getTask(Column column)
|
46
|
-
{
|
47
|
-
String colName = column.getName();
|
48
|
-
return base64ColumnMap.get(colName);
|
49
|
-
}
|
50
|
-
|
51
|
-
private String executeTask(Base64ColumnTask task, Column column)
|
52
|
-
{
|
53
|
-
boolean doEncode = task.getDoEncode().get();
|
54
|
-
boolean doDecode = task.getDoDecode().get();
|
55
|
-
// encode
|
56
|
-
if (doEncode) {
|
57
|
-
String raw = pageReader.getString(column);
|
58
|
-
return Base64.getEncoder().encodeToString(raw.getBytes());
|
59
|
-
}
|
60
|
-
// decode
|
61
|
-
//else if (doDecode) {
|
62
|
-
else {
|
63
|
-
String encoded = pageReader.getString(column);
|
64
|
-
return new String(Base64.getDecoder().decode(encoded));
|
65
|
-
}
|
18
|
+
this.filter = filter;
|
66
19
|
}
|
67
20
|
|
68
21
|
@Override
|
@@ -108,17 +61,9 @@ public class ColumnVisitorImpl
|
|
108
61
|
pageBuilder.setNull(outputColumn);
|
109
62
|
}
|
110
63
|
else {
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
pageBuilder.setString(
|
115
|
-
outputColumn, pageReader.getString(outputColumn));
|
116
|
-
// when there is a task
|
117
|
-
}
|
118
|
-
else {
|
119
|
-
String str = executeTask(task, outputColumn);
|
120
|
-
pageBuilder.setString(outputColumn, str);
|
121
|
-
}
|
64
|
+
String outputValue = filter.doFilter(
|
65
|
+
outputColumn, pageReader.getString(outputColumn));
|
66
|
+
pageBuilder.setString(outputColumn, outputValue);
|
122
67
|
}
|
123
68
|
}
|
124
69
|
|
@@ -1,14 +1,14 @@
|
|
1
1
|
package org.embulk.filter.base64;
|
2
2
|
|
3
3
|
import org.embulk.EmbulkTestRuntime;
|
4
|
+
import org.embulk.config.ConfigException;
|
4
5
|
import org.embulk.config.ConfigLoader;
|
5
6
|
import org.embulk.config.ConfigSource;
|
6
|
-
import org.embulk.
|
7
|
+
import org.embulk.filter.base64.Base64FilterPlugin.PluginTask;
|
7
8
|
import org.embulk.spi.Exec;
|
8
9
|
import org.embulk.spi.Schema;
|
9
10
|
import org.embulk.spi.SchemaConfigException;
|
10
11
|
import org.embulk.spi.type.Types;
|
11
|
-
import org.embulk.filter.base64.Base64FilterPlugin.PluginTask;
|
12
12
|
|
13
13
|
import org.junit.Rule;
|
14
14
|
import org.junit.Test;
|
@@ -39,8 +39,8 @@ public class TestBase64FilterPlugin
|
|
39
39
|
PluginTask task = taskFromYamlString(
|
40
40
|
"type: base64",
|
41
41
|
"columns:",
|
42
|
-
" - {name: to encode,
|
43
|
-
" - {name: to decode,
|
42
|
+
" - {name: to encode, encode: true}",
|
43
|
+
" - {name: to decode, decode: true}"
|
44
44
|
);
|
45
45
|
Schema inputSchema = Schema.builder()
|
46
46
|
.add("to encode", Types.STRING)
|
@@ -48,13 +48,13 @@ public class TestBase64FilterPlugin
|
|
48
48
|
plugin.validate(task, inputSchema);
|
49
49
|
}
|
50
50
|
|
51
|
-
@Test(expected =
|
51
|
+
@Test(expected = ConfigException.class)
|
52
52
|
public void testValidate_bothSpecified()
|
53
53
|
{
|
54
54
|
PluginTask task = taskFromYamlString(
|
55
55
|
"type: base64",
|
56
56
|
"columns:",
|
57
|
-
" - {name: to encode,
|
57
|
+
" - {name: to encode, encode: true, decode: true}"
|
58
58
|
);
|
59
59
|
Schema inputSchema = Schema.builder()
|
60
60
|
.add("to encode", Types.STRING)
|
@@ -62,13 +62,13 @@ public class TestBase64FilterPlugin
|
|
62
62
|
plugin.validate(task, inputSchema);
|
63
63
|
}
|
64
64
|
|
65
|
-
@Test(expected =
|
65
|
+
@Test(expected = ConfigException.class)
|
66
66
|
public void testValidate_bothNotSpecified()
|
67
67
|
{
|
68
68
|
PluginTask task = taskFromYamlString(
|
69
69
|
"type: base64",
|
70
70
|
"columns:",
|
71
|
-
" - {name: to encode
|
71
|
+
" - {name: to encode}"
|
72
72
|
);
|
73
73
|
Schema inputSchema = Schema.builder()
|
74
74
|
.add("to encode", Types.STRING)
|
@@ -76,13 +76,13 @@ public class TestBase64FilterPlugin
|
|
76
76
|
plugin.validate(task, inputSchema);
|
77
77
|
}
|
78
78
|
|
79
|
-
@Test(expected =
|
79
|
+
@Test(expected = ConfigException.class)
|
80
80
|
public void testValidate_invalidInputType()
|
81
81
|
{
|
82
82
|
PluginTask task = taskFromYamlString(
|
83
83
|
"type: base64",
|
84
84
|
"columns:",
|
85
|
-
" - {name: to encode,
|
85
|
+
" - {name: to encode, encode: true}"
|
86
86
|
);
|
87
87
|
Schema inputSchema = Schema.builder()
|
88
88
|
.add("to encode", Types.DOUBLE)
|
@@ -1,11 +1,8 @@
|
|
1
1
|
package org.embulk.filter.base64;
|
2
2
|
|
3
|
-
import java.util.List;
|
4
|
-
|
5
3
|
import org.embulk.EmbulkTestRuntime;
|
6
|
-
import org.embulk.
|
7
|
-
import org.embulk.
|
8
|
-
import org.embulk.spi.Exec;
|
4
|
+
import org.embulk.filter.base64.Base64FilterPlugin.PageOutputImpl;
|
5
|
+
import org.embulk.filter.base64.Base64FilterPlugin.PluginTask;
|
9
6
|
import org.embulk.spi.Page;
|
10
7
|
import org.embulk.spi.PageBuilder;
|
11
8
|
import org.embulk.spi.PageOutput;
|
@@ -15,20 +12,37 @@ import org.embulk.spi.Schema;
|
|
15
12
|
import org.embulk.spi.TestPageBuilderReader.MockPageOutput;
|
16
13
|
import org.embulk.spi.type.Types;
|
17
14
|
import org.embulk.spi.util.Pages;
|
18
|
-
import org.embulk.filter.base64.Base64FilterPlugin.PluginTask;
|
19
|
-
import org.embulk.filter.base64.Base64FilterPlugin.PageOutputImpl;
|
20
|
-
import org.embulk.filter.base64.ColumnVisitorImpl;
|
21
|
-
import static org.embulk.filter.base64.TestBase64FilterPlugin.taskFromYamlString;
|
22
15
|
|
16
|
+
import org.junit.Before;
|
23
17
|
import org.junit.Rule;
|
24
18
|
import org.junit.Test;
|
25
|
-
|
19
|
+
|
20
|
+
import static org.embulk.filter.base64.TestBase64FilterPlugin.taskFromYamlString;
|
21
|
+
import static org.junit.Assert.assertEquals;
|
22
|
+
|
23
|
+
import java.util.List;
|
26
24
|
|
27
25
|
public class TestColumnVisitorImpl
|
28
26
|
{
|
29
27
|
@Rule
|
30
28
|
public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
|
31
29
|
|
30
|
+
private Schema inputSchemaToEncode;
|
31
|
+
private Schema inputSchemaToDecode;
|
32
|
+
|
33
|
+
@Before
|
34
|
+
public void createResource()
|
35
|
+
{
|
36
|
+
inputSchemaToEncode = Schema.builder()
|
37
|
+
.add("id", Types.LONG)
|
38
|
+
.add("to encode", Types.STRING)
|
39
|
+
.build();
|
40
|
+
inputSchemaToDecode = Schema.builder()
|
41
|
+
.add("id", Types.LONG)
|
42
|
+
.add("to decode", Types.STRING)
|
43
|
+
.build();
|
44
|
+
}
|
45
|
+
|
32
46
|
private List<Object[]> filter(PluginTask task, Schema inputSchema, Object... objects)
|
33
47
|
{
|
34
48
|
MockPageOutput output = new MockPageOutput();
|
@@ -36,8 +50,9 @@ public class TestColumnVisitorImpl
|
|
36
50
|
PageBuilder pageBuilder = new PageBuilder(
|
37
51
|
runtime.getBufferAllocator(), outputSchema, output);
|
38
52
|
PageReader pageReader = new PageReader(inputSchema);
|
53
|
+
Base64Filter filter = new Base64Filter(task);
|
39
54
|
ColumnVisitorImpl visitor = new ColumnVisitorImpl(
|
40
|
-
|
55
|
+
pageReader, pageBuilder, filter);
|
41
56
|
|
42
57
|
List<Page> pages = PageTestUtils.buildPage(
|
43
58
|
runtime.getBufferAllocator(), inputSchema, objects);
|
@@ -52,42 +67,270 @@ public class TestColumnVisitorImpl
|
|
52
67
|
}
|
53
68
|
|
54
69
|
@Test
|
55
|
-
public void
|
70
|
+
public void testExecuteTask_encodeByBase64()
|
56
71
|
{
|
72
|
+
// implicit
|
57
73
|
PluginTask task = taskFromYamlString(
|
58
74
|
"type: base64",
|
59
75
|
"columns:",
|
60
|
-
" - {name:
|
76
|
+
" - {name: id}",
|
77
|
+
" - {name: to encode, encode: true}"
|
61
78
|
);
|
62
|
-
|
63
|
-
.
|
64
|
-
.
|
65
|
-
List<Object[]> records = filter(task, inputSchema,
|
66
|
-
"John",
|
67
|
-
"David"
|
79
|
+
List<Object[]> records = filter(task, inputSchemaToEncode,
|
80
|
+
Long.valueOf(100), "A0?B1>",
|
81
|
+
Long.valueOf(101), "ab?cd~"
|
68
82
|
);
|
69
83
|
assertEquals(2, records.size());
|
70
|
-
assertEquals(
|
71
|
-
assertEquals("
|
84
|
+
assertEquals(Long.valueOf(100), records.get(0)[0]);
|
85
|
+
assertEquals("QTA/QjE+", records.get(0)[1]);
|
86
|
+
assertEquals(Long.valueOf(101), records.get(1)[0]);
|
87
|
+
assertEquals("YWI/Y2R+", records.get(1)[1]);
|
88
|
+
// explicit
|
89
|
+
task = taskFromYamlString(
|
90
|
+
"type: base64",
|
91
|
+
"columns:",
|
92
|
+
" - {name: id}",
|
93
|
+
" - {name: to encode, encode: true, encoding: Base64}"
|
94
|
+
);
|
95
|
+
records = filter(task, inputSchemaToEncode,
|
96
|
+
Long.valueOf(100), "A0?B1>",
|
97
|
+
Long.valueOf(101), "ab?cd~"
|
98
|
+
);
|
99
|
+
assertEquals(2, records.size());
|
100
|
+
assertEquals(Long.valueOf(100), records.get(0)[0]);
|
101
|
+
assertEquals("QTA/QjE+", records.get(0)[1]);
|
102
|
+
assertEquals(Long.valueOf(101), records.get(1)[0]);
|
103
|
+
assertEquals("YWI/Y2R+", records.get(1)[1]);
|
72
104
|
}
|
73
105
|
|
74
106
|
@Test
|
75
|
-
public void
|
107
|
+
public void testExecuteTask_encodeByBase64Url()
|
76
108
|
{
|
109
|
+
// implicit
|
77
110
|
PluginTask task = taskFromYamlString(
|
78
111
|
"type: base64",
|
79
112
|
"columns:",
|
80
|
-
" - {name:
|
113
|
+
" - {name: id}",
|
114
|
+
" - {name: to encode, encode: true, urlsafe: true}"
|
81
115
|
);
|
82
|
-
|
83
|
-
.
|
84
|
-
.
|
85
|
-
|
86
|
-
|
87
|
-
|
116
|
+
List<Object[]> records = filter(task, inputSchemaToEncode,
|
117
|
+
Long.valueOf(100), "A0?B1>",
|
118
|
+
Long.valueOf(101), "ab?cd~"
|
119
|
+
);
|
120
|
+
assertEquals(2, records.size());
|
121
|
+
assertEquals(Long.valueOf(100), records.get(0)[0]);
|
122
|
+
assertEquals("QTA_QjE-", records.get(0)[1]);
|
123
|
+
assertEquals(Long.valueOf(101), records.get(1)[0]);
|
124
|
+
assertEquals("YWI_Y2R-", records.get(1)[1]);
|
125
|
+
// explicit
|
126
|
+
task = taskFromYamlString(
|
127
|
+
"type: base64",
|
128
|
+
"columns:",
|
129
|
+
" - {name: id}",
|
130
|
+
" - {name: to encode, encode: true, encoding: Base64, urlsafe: true}"
|
131
|
+
);
|
132
|
+
records = filter(task, inputSchemaToEncode,
|
133
|
+
Long.valueOf(100), "A0?B1>",
|
134
|
+
Long.valueOf(101), "ab?cd~"
|
135
|
+
);
|
136
|
+
assertEquals(2, records.size());
|
137
|
+
assertEquals(Long.valueOf(100), records.get(0)[0]);
|
138
|
+
assertEquals("QTA_QjE-", records.get(0)[1]);
|
139
|
+
assertEquals(Long.valueOf(101), records.get(1)[0]);
|
140
|
+
assertEquals("YWI_Y2R-", records.get(1)[1]);
|
141
|
+
}
|
142
|
+
|
143
|
+
@Test
|
144
|
+
public void testExecuteTask_encodeByBase32()
|
145
|
+
{
|
146
|
+
PluginTask task = taskFromYamlString(
|
147
|
+
"type: base64",
|
148
|
+
"columns:",
|
149
|
+
" - {name: id}",
|
150
|
+
" - {name: to encode, encode: true, encoding: Base32}"
|
151
|
+
);
|
152
|
+
List<Object[]> records = filter(task, inputSchemaToEncode,
|
153
|
+
Long.valueOf(100), "A0?B1>",
|
154
|
+
Long.valueOf(101), "ab?cd~"
|
155
|
+
);
|
156
|
+
assertEquals(2, records.size());
|
157
|
+
assertEquals(Long.valueOf(100), records.get(0)[0]);
|
158
|
+
assertEquals("IEYD6QRRHY======", records.get(0)[1]);
|
159
|
+
assertEquals(Long.valueOf(101), records.get(1)[0]);
|
160
|
+
assertEquals("MFRD6Y3EPY======", records.get(1)[1]);
|
161
|
+
}
|
162
|
+
|
163
|
+
@Test
|
164
|
+
public void testExecuteTask_encodeByBase32Hex()
|
165
|
+
{
|
166
|
+
PluginTask task = taskFromYamlString(
|
167
|
+
"type: base64",
|
168
|
+
"columns:",
|
169
|
+
" - {name: id}",
|
170
|
+
" - {name: to encode, encode: true, encoding: Base32, hex: true}"
|
171
|
+
);
|
172
|
+
List<Object[]> records = filter(task, inputSchemaToEncode,
|
173
|
+
Long.valueOf(100), "A0?B1>",
|
174
|
+
Long.valueOf(101), "ab?cd~"
|
175
|
+
);
|
176
|
+
assertEquals(2, records.size());
|
177
|
+
assertEquals(Long.valueOf(100), records.get(0)[0]);
|
178
|
+
assertEquals("84O3UGHH7O======", records.get(0)[1]);
|
179
|
+
assertEquals(Long.valueOf(101), records.get(1)[0]);
|
180
|
+
assertEquals("C5H3UOR4FO======", records.get(1)[1]);
|
181
|
+
}
|
182
|
+
|
183
|
+
@Test
|
184
|
+
public void testExecuteTask_encodeByBase16()
|
185
|
+
{
|
186
|
+
PluginTask task = taskFromYamlString(
|
187
|
+
"type: base64",
|
188
|
+
"columns:",
|
189
|
+
" - {name: id}",
|
190
|
+
" - {name: to encode, encode: true, encoding: Base16}"
|
191
|
+
);
|
192
|
+
List<Object[]> records = filter(task, inputSchemaToEncode,
|
193
|
+
Long.valueOf(100), "A0?B1>",
|
194
|
+
Long.valueOf(101), "ab?cd~"
|
195
|
+
);
|
196
|
+
assertEquals(2, records.size());
|
197
|
+
assertEquals(Long.valueOf(100), records.get(0)[0]);
|
198
|
+
assertEquals("41303F42313E", records.get(0)[1]);
|
199
|
+
assertEquals(Long.valueOf(101), records.get(1)[0]);
|
200
|
+
assertEquals("61623F63647E", records.get(1)[1]);
|
201
|
+
}
|
202
|
+
|
203
|
+
@Test
|
204
|
+
public void testExecuteTask_decodeByBase64()
|
205
|
+
{
|
206
|
+
// implicit
|
207
|
+
PluginTask task = taskFromYamlString(
|
208
|
+
"type: base64",
|
209
|
+
"columns:",
|
210
|
+
" - {name: id}",
|
211
|
+
" - {name: to decode, decode: true}"
|
212
|
+
);
|
213
|
+
List<Object[]> records = filter(task, inputSchemaToDecode,
|
214
|
+
Long.valueOf(100), "QTA/QjE+",
|
215
|
+
Long.valueOf(101), "YWI/Y2R+"
|
216
|
+
);
|
217
|
+
assertEquals(2, records.size());
|
218
|
+
assertEquals(Long.valueOf(100), records.get(0)[0]);
|
219
|
+
assertEquals("A0?B1>", records.get(0)[1]);
|
220
|
+
assertEquals(Long.valueOf(101), records.get(1)[0]);
|
221
|
+
assertEquals("ab?cd~", records.get(1)[1]);
|
222
|
+
// explicit
|
223
|
+
task = taskFromYamlString(
|
224
|
+
"type: base64",
|
225
|
+
"columns:",
|
226
|
+
" - {name: id}",
|
227
|
+
" - {name: to decode, decode: true, encoding: Base64}"
|
228
|
+
);
|
229
|
+
records = filter(task, inputSchemaToDecode,
|
230
|
+
Long.valueOf(100), "QTA/QjE+",
|
231
|
+
Long.valueOf(101), "YWI/Y2R+"
|
232
|
+
);
|
233
|
+
assertEquals(2, records.size());
|
234
|
+
assertEquals(Long.valueOf(100), records.get(0)[0]);
|
235
|
+
assertEquals("A0?B1>", records.get(0)[1]);
|
236
|
+
assertEquals(Long.valueOf(101), records.get(1)[0]);
|
237
|
+
assertEquals("ab?cd~", records.get(1)[1]);
|
238
|
+
}
|
239
|
+
|
240
|
+
@Test
|
241
|
+
public void testExecuteTask_decodeByBase64Url()
|
242
|
+
{
|
243
|
+
// implicit
|
244
|
+
PluginTask task = taskFromYamlString(
|
245
|
+
"type: base64",
|
246
|
+
"columns:",
|
247
|
+
" - {name: id}",
|
248
|
+
" - {name: to decode, decode: true, urlsafe: true}"
|
249
|
+
);
|
250
|
+
List<Object[]> records = filter(task, inputSchemaToDecode,
|
251
|
+
Long.valueOf(100), "QTA_QjE-",
|
252
|
+
Long.valueOf(101), "YWI_Y2R-"
|
253
|
+
);
|
254
|
+
assertEquals(2, records.size());
|
255
|
+
assertEquals(Long.valueOf(100), records.get(0)[0]);
|
256
|
+
assertEquals("A0?B1>", records.get(0)[1]);
|
257
|
+
assertEquals(Long.valueOf(101), records.get(1)[0]);
|
258
|
+
assertEquals("ab?cd~", records.get(1)[1]);
|
259
|
+
// explicit
|
260
|
+
task = taskFromYamlString(
|
261
|
+
"type: base64",
|
262
|
+
"columns:",
|
263
|
+
" - {name: id}",
|
264
|
+
" - {name: to decode, decode: true, encoding: Base64, urlsafe: true}"
|
265
|
+
);
|
266
|
+
records = filter(task, inputSchemaToDecode,
|
267
|
+
Long.valueOf(100), "QTA_QjE-",
|
268
|
+
Long.valueOf(101), "YWI_Y2R-"
|
269
|
+
);
|
270
|
+
assertEquals(2, records.size());
|
271
|
+
assertEquals(Long.valueOf(100), records.get(0)[0]);
|
272
|
+
assertEquals("A0?B1>", records.get(0)[1]);
|
273
|
+
assertEquals(Long.valueOf(101), records.get(1)[0]);
|
274
|
+
assertEquals("ab?cd~", records.get(1)[1]);
|
275
|
+
}
|
276
|
+
|
277
|
+
@Test
|
278
|
+
public void testExecuteTask_decodeByBase32()
|
279
|
+
{
|
280
|
+
PluginTask task = taskFromYamlString(
|
281
|
+
"type: base64",
|
282
|
+
"columns:",
|
283
|
+
" - {name: id}",
|
284
|
+
" - {name: to decode, decode: true, encoding: Base32}"
|
285
|
+
);
|
286
|
+
List<Object[]> records = filter(task, inputSchemaToDecode,
|
287
|
+
Long.valueOf(100), "IEYD6QRRHY======",
|
288
|
+
Long.valueOf(101), "MFRD6Y3EPY======"
|
289
|
+
);
|
290
|
+
assertEquals(2, records.size());
|
291
|
+
assertEquals(Long.valueOf(100), records.get(0)[0]);
|
292
|
+
assertEquals("A0?B1>", records.get(0)[1]);
|
293
|
+
assertEquals(Long.valueOf(101), records.get(1)[0]);
|
294
|
+
assertEquals("ab?cd~", records.get(1)[1]);
|
295
|
+
}
|
296
|
+
|
297
|
+
@Test
|
298
|
+
public void testExecuteTask_decodeByBase32Hex()
|
299
|
+
{
|
300
|
+
PluginTask task = taskFromYamlString(
|
301
|
+
"type: base64",
|
302
|
+
"columns:",
|
303
|
+
" - {name: id}",
|
304
|
+
" - {name: to decode, decode: true, encoding: Base32, hex: true}"
|
305
|
+
);
|
306
|
+
List<Object[]> records = filter(task, inputSchemaToDecode,
|
307
|
+
Long.valueOf(100), "84O3UGHH7O======",
|
308
|
+
Long.valueOf(101), "C5H3UOR4FO======"
|
309
|
+
);
|
310
|
+
assertEquals(2, records.size());
|
311
|
+
assertEquals(Long.valueOf(100), records.get(0)[0]);
|
312
|
+
assertEquals("A0?B1>", records.get(0)[1]);
|
313
|
+
assertEquals(Long.valueOf(101), records.get(1)[0]);
|
314
|
+
assertEquals("ab?cd~", records.get(1)[1]);
|
315
|
+
}
|
316
|
+
|
317
|
+
@Test
|
318
|
+
public void testExecuteTask_decodeByBase16()
|
319
|
+
{
|
320
|
+
PluginTask task = taskFromYamlString(
|
321
|
+
"type: base64",
|
322
|
+
"columns:",
|
323
|
+
" - {name: id}",
|
324
|
+
" - {name: to decode, decode: true, encoding: Base16}"
|
325
|
+
);
|
326
|
+
List<Object[]> records = filter(task, inputSchemaToDecode,
|
327
|
+
Long.valueOf(100), "41303F42313E",
|
328
|
+
Long.valueOf(101), "61623F63647E"
|
88
329
|
);
|
89
330
|
assertEquals(2, records.size());
|
90
|
-
assertEquals(
|
91
|
-
assertEquals("
|
331
|
+
assertEquals(Long.valueOf(100), records.get(0)[0]);
|
332
|
+
assertEquals("A0?B1>", records.get(0)[1]);
|
333
|
+
assertEquals(Long.valueOf(101), records.get(1)[0]);
|
334
|
+
assertEquals("ab?cd~", records.get(1)[1]);
|
92
335
|
}
|
93
336
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk-filter-base64
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yusuke NISHIOKA
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01-
|
11
|
+
date: 2017-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,7 +38,7 @@ dependencies:
|
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
|
-
description: An Embulk filter plugin to encode/decode string by Base64.
|
41
|
+
description: An Embulk filter plugin to encode/decode string by Base64, Base32 and Base16.
|
42
42
|
email:
|
43
43
|
- yusuke.nishioka.0713@gmail.com
|
44
44
|
executables: []
|
@@ -53,7 +53,6 @@ files:
|
|
53
53
|
- config/checkstyle/default.xml
|
54
54
|
- example/example_decode.csv
|
55
55
|
- example/example_decode.yml
|
56
|
-
- example/example_decode_with_typecast.yml
|
57
56
|
- example/example_encode.csv
|
58
57
|
- example/example_encode.yml
|
59
58
|
- example/get_string.py
|
@@ -62,11 +61,12 @@ files:
|
|
62
61
|
- gradlew
|
63
62
|
- gradlew.bat
|
64
63
|
- lib/embulk/filter/base64.rb
|
64
|
+
- src/main/java/org/embulk/filter/base64/Base64Filter.java
|
65
65
|
- src/main/java/org/embulk/filter/base64/Base64FilterPlugin.java
|
66
66
|
- src/main/java/org/embulk/filter/base64/ColumnVisitorImpl.java
|
67
67
|
- src/test/java/org/embulk/filter/base64/TestBase64FilterPlugin.java
|
68
68
|
- src/test/java/org/embulk/filter/base64/TestColumnVisitorImpl.java
|
69
|
-
- classpath/embulk-filter-base64-0.
|
69
|
+
- classpath/embulk-filter-base64-0.2.0.jar
|
70
70
|
homepage: https://github.com/ysk24ok/embulk-filter-base64
|
71
71
|
licenses:
|
72
72
|
- MIT
|
@@ -1,32 +0,0 @@
|
|
1
|
-
in:
|
2
|
-
type: file
|
3
|
-
path_prefix: example/example_decode.csv
|
4
|
-
parser:
|
5
|
-
type: csv
|
6
|
-
columns:
|
7
|
-
- {name: id, type: long}
|
8
|
-
- {name: string to decode, type: string}
|
9
|
-
- {name: long to decode, type: string}
|
10
|
-
- {name: double to decode, type: string}
|
11
|
-
- {name: boolean to decode, type: string}
|
12
|
-
- {name: timestamp to decode, type: string}
|
13
|
-
- {name: json to decode, type: string}
|
14
|
-
filters:
|
15
|
-
- type: base64
|
16
|
-
columns:
|
17
|
-
- {name: string to decode, decode: true}
|
18
|
-
- {name: long to decode, decode: true}
|
19
|
-
- {name: double to decode, decode: true}
|
20
|
-
- {name: boolean to decode, decode: true}
|
21
|
-
- {name: timestamp to decode, decode: true}
|
22
|
-
- {name: json to decode, decode: true}
|
23
|
-
- type: typecast
|
24
|
-
columns:
|
25
|
-
- {name: string to decode, type: string}
|
26
|
-
- {name: long to decode, type: long}
|
27
|
-
- {name: double to decode, type: double}
|
28
|
-
- {name: boolean to decode, type: boolean}
|
29
|
-
- {name: timestamp to decode, type: timestamp, format: "%Y-%m-%d %H:%M:%N", timezone: "UTC"}
|
30
|
-
- {name: json to decode, type: json}
|
31
|
-
out:
|
32
|
-
type: stdout
|