embulk-input-google_spreadsheets 1.0.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 +7 -0
- data/.gitignore +10 -0
- data/.travis.yml +12 -0
- data/CHANGELOG.md +67 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +21 -0
- data/README.md +94 -0
- data/Rakefile +13 -0
- data/embulk-input-google_spreadsheets.gemspec +24 -0
- data/example/config_authorized_user.yml +19 -0
- data/example/config_authorized_user.yml.liquid +25 -0
- data/example/config_authorized_user_emoji_worksheet.yml +19 -0
- data/example/config_authorized_user_empty_rows_appears_at_the_same_as_max_fetch_rows.yml +20 -0
- data/example/config_authorized_user_large_data.yml +19 -0
- data/example/config_authorized_user_no_data.yml +18 -0
- data/example/config_service_account.yml +19 -0
- data/example/config_service_account_emoji_worksheet.yml +19 -0
- data/example/config_service_account_empty_rows_appears_at_the_same_as_max_fetch_rows.yml +20 -0
- data/example/config_service_account_large_data.yml +19 -0
- data/example/config_service_account_no_data.yml +18 -0
- data/example/setup_authorized_user_credentials.rb +34 -0
- data/lib/embulk/input/google_spreadsheets.rb +182 -0
- data/lib/embulk/input/google_spreadsheets/auth.rb +63 -0
- data/lib/embulk/input/google_spreadsheets/error.rb +36 -0
- data/lib/embulk/input/google_spreadsheets/pager.rb +107 -0
- data/lib/embulk/input/google_spreadsheets/pager_util.rb +28 -0
- data/lib/embulk/input/google_spreadsheets/record_typecaster.rb +73 -0
- data/lib/embulk/input/google_spreadsheets/spreadsheets_client.rb +75 -0
- data/lib/embulk/input/google_spreadsheets/spreadsheets_url_util.rb +23 -0
- data/lib/embulk/input/google_spreadsheets/typecast/base.rb +62 -0
- data/lib/embulk/input/google_spreadsheets/typecast/loose_typecast.rb +84 -0
- data/lib/embulk/input/google_spreadsheets/typecast/minimal_typecast.rb +109 -0
- data/lib/embulk/input/google_spreadsheets/typecast/strict_typecast.rb +236 -0
- data/lib/embulk/input/google_spreadsheets/typecast/timestamp_format_util.rb +29 -0
- data/lib/embulk/input/google_spreadsheets/typecast_factory.rb +34 -0
- data/test/assert_embulk_nothing_raised.rb +11 -0
- data/test/assert_embulk_raise.rb +11 -0
- data/test/dummy.key +27 -0
- data/test/helper.rb +21 -0
- data/test/test_auth.rb +82 -0
- data/test/test_configure.rb +155 -0
- data/test/test_loose_typecast.rb +194 -0
- data/test/test_minimal_typecast.rb +616 -0
- data/test/test_pager_util.rb +24 -0
- data/test/test_run_examples.rb +125 -0
- data/test/test_spreadsheets_client.rb +87 -0
- data/test/test_spreadsheets_url_util.rb +23 -0
- data/test/test_strict_typecast.rb +666 -0
- data/test/test_typecast_factory.rb +36 -0
- metadata +220 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'embulk/input/google_spreadsheets/pager_util'
|
3
|
+
|
4
|
+
module Embulk
|
5
|
+
class Input::GoogleSpreadsheets < InputPlugin
|
6
|
+
class TestPagerUtil < Test::Unit::TestCase
|
7
|
+
|
8
|
+
sub_test_case 'PagerUtil.num2col' do
|
9
|
+
test 'positive value' do
|
10
|
+
assert_equal('A', PagerUtil.num2col(1))
|
11
|
+
assert_equal('Z', PagerUtil.num2col(26))
|
12
|
+
assert_equal('AA', PagerUtil.num2col(27))
|
13
|
+
end
|
14
|
+
|
15
|
+
test '0 or negative value' do
|
16
|
+
assert_equal('', PagerUtil.num2col(0))
|
17
|
+
assert_equal('', PagerUtil.num2col(-1))
|
18
|
+
assert_equal('', PagerUtil.num2col(-26))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'embulk/input/google_spreadsheets'
|
3
|
+
|
4
|
+
module Embulk
|
5
|
+
class Input::GoogleSpreadsheets < InputPlugin
|
6
|
+
class TestRunExample < Test::Unit::TestCase
|
7
|
+
def embulk_path
|
8
|
+
if File.exist?("#{ENV['PATH']}/.embulk/bin/embulk")
|
9
|
+
"#{ENV['PATH']}/.embulk/bin/embulk"
|
10
|
+
elsif File.exist?('/usr/local/bin/embulk')
|
11
|
+
'/usr/local/bin/embulk'
|
12
|
+
else
|
13
|
+
'embulk'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def embulk_run(config_path)
|
18
|
+
Bundler.with_clean_env do
|
19
|
+
cmd = "#{embulk_path} run -X page_size=1 -b . -l trace #{config_path}"
|
20
|
+
puts '=' * 64
|
21
|
+
puts cmd
|
22
|
+
system(cmd)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
sub_test_case 'run' do
|
27
|
+
unless File.exist?(JSON_KEYFILE_AUTHORIZED_USER)
|
28
|
+
puts "'#{JSON_KEYFILE_AUTHORIZED_USER}' is not found. Skip case authorized_user"
|
29
|
+
else
|
30
|
+
test 'authorized_user' do
|
31
|
+
assert_true embulk_run(File.join(EXAMPLE_ROOT, 'config_authorized_user.yml'))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
unless File.exist?(JSON_KEYFILE_SERVICE_ACCOUNT)
|
36
|
+
puts "'#{JSON_KEYFILE_SERVICE_ACCOUNT}' is not found. Skip case service_account"
|
37
|
+
else
|
38
|
+
test 'service_account' do
|
39
|
+
assert_true embulk_run(File.join(EXAMPLE_ROOT, 'config_service_account.yml'))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
sub_test_case 'run emoji worksheet title' do
|
45
|
+
unless File.exist?(JSON_KEYFILE_AUTHORIZED_USER)
|
46
|
+
puts "'#{JSON_KEYFILE_AUTHORIZED_USER}' is not found. Skip case authorized_user"
|
47
|
+
else
|
48
|
+
test 'authorized_user' do
|
49
|
+
omit 'Skip until closing https://github.com/medjed/embulk-input-google_spreadsheets/issues/6'
|
50
|
+
assert_true embulk_run(File.join(EXAMPLE_ROOT, 'config_authorized_user_emoji_worksheet.yml'))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
unless File.exist?(JSON_KEYFILE_SERVICE_ACCOUNT)
|
55
|
+
puts "'#{JSON_KEYFILE_SERVICE_ACCOUNT}' is not found. Skip case service_account"
|
56
|
+
else
|
57
|
+
test 'service_account' do
|
58
|
+
omit 'Skip until closing https://github.com/medjed/embulk-input-google_spreadsheets/issues/6'
|
59
|
+
assert_true embulk_run(File.join(EXAMPLE_ROOT, 'config_service_account_emoji_worksheet.yml'))
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
sub_test_case 'run no data case' do
|
65
|
+
unless File.exist?(JSON_KEYFILE_AUTHORIZED_USER)
|
66
|
+
puts "'#{JSON_KEYFILE_AUTHORIZED_USER}' is not found. Skip case authorized_user"
|
67
|
+
else
|
68
|
+
test 'authorized_user' do
|
69
|
+
|
70
|
+
assert_true embulk_run(File.join(EXAMPLE_ROOT, 'config_authorized_user_no_data.yml'))
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
unless File.exist?(JSON_KEYFILE_SERVICE_ACCOUNT)
|
75
|
+
puts "'#{JSON_KEYFILE_SERVICE_ACCOUNT}' is not found. Skip case service_account"
|
76
|
+
else
|
77
|
+
test 'service_account' do
|
78
|
+
|
79
|
+
assert_true embulk_run(File.join(EXAMPLE_ROOT, 'config_service_account_no_data.yml'))
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
sub_test_case 'run empty rows appears at the same as max fetch rows case' do
|
85
|
+
unless File.exist?(JSON_KEYFILE_AUTHORIZED_USER)
|
86
|
+
puts "'#{JSON_KEYFILE_AUTHORIZED_USER}' is not found. Skip case authorized_user"
|
87
|
+
else
|
88
|
+
test 'authorized_user' do
|
89
|
+
|
90
|
+
assert_true embulk_run(File.join(EXAMPLE_ROOT, 'config_authorized_user_empty_rows_appears_at_the_same_as_max_fetch_rows.yml'))
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
unless File.exist?(JSON_KEYFILE_SERVICE_ACCOUNT)
|
95
|
+
puts "'#{JSON_KEYFILE_SERVICE_ACCOUNT}' is not found. Skip case service_account"
|
96
|
+
else
|
97
|
+
test 'service_account' do
|
98
|
+
|
99
|
+
assert_true embulk_run(File.join(EXAMPLE_ROOT, 'config_service_account_empty_rows_appears_at_the_same_as_max_fetch_rows.yml'))
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
sub_test_case 'run large data case' do
|
105
|
+
unless File.exist?(JSON_KEYFILE_AUTHORIZED_USER)
|
106
|
+
puts "'#{JSON_KEYFILE_AUTHORIZED_USER}' is not found. Skip case authorized_user"
|
107
|
+
else
|
108
|
+
test 'authorized_user' do
|
109
|
+
|
110
|
+
assert_true embulk_run(File.join(EXAMPLE_ROOT, 'config_authorized_user_large_data.yml'))
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
unless File.exist?(JSON_KEYFILE_SERVICE_ACCOUNT)
|
115
|
+
puts "'#{JSON_KEYFILE_SERVICE_ACCOUNT}' is not found. Skip case service_account"
|
116
|
+
else
|
117
|
+
test 'service_account' do
|
118
|
+
|
119
|
+
assert_true embulk_run(File.join(EXAMPLE_ROOT, 'config_service_account_large_data.yml'))
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'embulk/input/google_spreadsheets'
|
3
|
+
require_relative 'assert_embulk_nothing_raised'
|
4
|
+
|
5
|
+
if !File.exist?(JSON_KEYFILE_AUTHORIZED_USER) and !File.exist?(JSON_KEYFILE_SERVICE_ACCOUNT)
|
6
|
+
puts "Neither '#{JSON_KEYFILE_AUTHORIZED_USER}' nor '#{JSON_KEYFILE_SERVICE_ACCOUNT}' is not found. Skip test/test_spreadsheets_client.rb"
|
7
|
+
else
|
8
|
+
module Embulk
|
9
|
+
class Input::GoogleSpreadsheets < InputPlugin
|
10
|
+
class TestSpreadsheetsClient < Test::Unit::TestCase
|
11
|
+
|
12
|
+
include AssertEmbulkNothingRaised
|
13
|
+
|
14
|
+
def auth_config
|
15
|
+
if File.exist?(JSON_KEYFILE_AUTHORIZED_USER)
|
16
|
+
{
|
17
|
+
'auth_method' => 'authorized_user',
|
18
|
+
'json_keyfile' => File.read(JSON_KEYFILE_AUTHORIZED_USER)
|
19
|
+
}
|
20
|
+
elsif File.exist?(JSON_KEYFILE_SERVICE_ACCOUNT)
|
21
|
+
{
|
22
|
+
'auth_method' => 'service_account',
|
23
|
+
'json_keyfile' => File.read(JSON_KEYFILE_SERVICE_ACCOUNT)
|
24
|
+
}
|
25
|
+
else
|
26
|
+
raise "Neither '#{JSON_KEYFILE_AUTHORIZED_USER}' nor '#{JSON_KEYFILE_SERVICE_ACCOUNT}' is not found."
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def least_task
|
31
|
+
{
|
32
|
+
'spreadsheets_url' => TEST_SPREADSHEETS_URL,
|
33
|
+
'worksheet_title' => TEST_WORKSHEET_TITLE,
|
34
|
+
'start_column' => 1,
|
35
|
+
'start_row' => 2,
|
36
|
+
'end_row' => -1,
|
37
|
+
'end_column' => 6,
|
38
|
+
'max_fetch_rows' => 10000,
|
39
|
+
'columns' => columns,
|
40
|
+
}.merge(auth_config)
|
41
|
+
end
|
42
|
+
|
43
|
+
def columns
|
44
|
+
[
|
45
|
+
{'name' => '_c1', 'type' => 'boolean', 'typecast' => 'strict'},
|
46
|
+
{'name' => '_c2', 'type' => 'string', 'typecast' => 'strict'},
|
47
|
+
{'name' => '_c3', 'type' => 'long', 'typecast' => 'strict'},
|
48
|
+
{'name' => '_c4', 'type' => 'double', 'typecast' => 'strict'},
|
49
|
+
{'name' => '_c5', 'type' => 'timestamp', 'format' => '%Y-%m-%d %H:%M:%S.%N', 'timezone' => 'Asia/Tokyo', 'typecast' => 'strict'},
|
50
|
+
{'name' => '_c6', 'type' => 'timestamp', 'format' => '%Y-%m-%d', 'timezone' => 'Asia/Tokyo', 'typecast' => 'strict'}
|
51
|
+
]
|
52
|
+
end
|
53
|
+
|
54
|
+
def client(task = {})
|
55
|
+
task = least_task.merge(task)
|
56
|
+
SpreadsheetsClient.new(task, auth: Auth.new(task), pager: Pager.new(task))
|
57
|
+
end
|
58
|
+
|
59
|
+
test 'parse spreadsheets id' do
|
60
|
+
expect = TEST_SPREADSHEETS_ID
|
61
|
+
result = client.spreadsheets_id
|
62
|
+
assert_equal(expect, result)
|
63
|
+
end
|
64
|
+
|
65
|
+
test 'get spreadsheet' do
|
66
|
+
assert_embulk_nothing_raised do
|
67
|
+
client.spreadsheets
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
test 'worksheet values' do
|
72
|
+
expect = [%w(_c1 _c2 _c3)]
|
73
|
+
result = client.worksheet_values('A1:C1')
|
74
|
+
assert_equal(expect, result)
|
75
|
+
end
|
76
|
+
|
77
|
+
test 'multi byte worksheet title' do
|
78
|
+
omit 'Skip until closing this issue https://github.com/medjed/embulk-input-google_spreadsheets/issues/6'
|
79
|
+
|
80
|
+
assert_embulk_nothing_raised do
|
81
|
+
client('worksheet_title' => TEST_WORKSHEET_TITLE_MULTI_BYTE).worksheet_values('A1:C1')
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'embulk/input/google_spreadsheets/spreadsheets_url_util'
|
3
|
+
|
4
|
+
module Embulk
|
5
|
+
class Input::GoogleSpreadsheets < InputPlugin
|
6
|
+
class TestSpreadsheetsUrlUtil < Test::Unit::TestCase
|
7
|
+
|
8
|
+
sub_test_case 'SpreadsheetsUrlUtil.capture_id' do
|
9
|
+
test 'correct url' do
|
10
|
+
assert_equal(TEST_SPREADSHEETS_ID, SpreadsheetsUrlUtil.capture_id(TEST_SPREADSHEETS_URL))
|
11
|
+
assert_equal('a', SpreadsheetsUrlUtil.capture_id('https://docs.google.com/spreadsheets/d/a/'))
|
12
|
+
end
|
13
|
+
|
14
|
+
test 'incorrect url' do
|
15
|
+
assert_equal(nil, SpreadsheetsUrlUtil.capture_id(''))
|
16
|
+
assert_equal(nil, SpreadsheetsUrlUtil.capture_id('https://docs.google.com/spreadsheets/d/'))
|
17
|
+
assert_equal(nil, SpreadsheetsUrlUtil.capture_id('https://docs.google.com/spreadsheets/d//'))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,666 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'embulk/input/google_spreadsheets'
|
3
|
+
require 'embulk/input/google_spreadsheets/typecast/strict_typecast'
|
4
|
+
require_relative 'assert_embulk_raise'
|
5
|
+
|
6
|
+
module Embulk
|
7
|
+
class Input::GoogleSpreadsheets < InputPlugin
|
8
|
+
class TestStrictTypecast < Test::Unit::TestCase
|
9
|
+
|
10
|
+
include AssertEmbulkRaise
|
11
|
+
|
12
|
+
def least_task
|
13
|
+
{
|
14
|
+
'null_string' => ''
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
sub_test_case 'as_string' do
|
19
|
+
sub_test_case 'return String' do
|
20
|
+
test 'value is String' do
|
21
|
+
expect = 'hoge'
|
22
|
+
result = Typecast::StrictTypecast.new(least_task).as_string('hoge')
|
23
|
+
assert_equal(expect, result)
|
24
|
+
end
|
25
|
+
|
26
|
+
test 'value is true' do
|
27
|
+
expect = 'true'
|
28
|
+
result = Typecast::StrictTypecast.new(least_task).as_string(true)
|
29
|
+
assert_equal(expect, result)
|
30
|
+
end
|
31
|
+
|
32
|
+
test 'value is false' do
|
33
|
+
expect = 'false'
|
34
|
+
result = Typecast::StrictTypecast.new(least_task).as_string(false)
|
35
|
+
assert_equal(expect, result)
|
36
|
+
end
|
37
|
+
|
38
|
+
test 'value is Fixnum' do
|
39
|
+
expect = '10'
|
40
|
+
result = Typecast::StrictTypecast.new(least_task).as_string(10)
|
41
|
+
assert_equal(expect, result)
|
42
|
+
end
|
43
|
+
|
44
|
+
test 'value is Bignum' do
|
45
|
+
expect = '10000000000000000000'
|
46
|
+
result = Typecast::StrictTypecast.new(least_task).as_string(10000000000000000000)
|
47
|
+
assert_equal(expect, result)
|
48
|
+
end
|
49
|
+
|
50
|
+
test 'value is Float' do
|
51
|
+
expect = '5.5'
|
52
|
+
result = Typecast::StrictTypecast.new(least_task).as_string(5.5)
|
53
|
+
assert_equal(expect, result)
|
54
|
+
end
|
55
|
+
|
56
|
+
test 'value is Hash' do
|
57
|
+
expect = "{\"test\":1}"
|
58
|
+
result = Typecast::StrictTypecast.new(least_task).as_string({'test' => 1})
|
59
|
+
assert_equal(expect, result)
|
60
|
+
end
|
61
|
+
|
62
|
+
test 'value is Array' do
|
63
|
+
expect = '[1,2,3]'
|
64
|
+
result = Typecast::StrictTypecast.new(least_task).as_string([1, 2, 3])
|
65
|
+
assert_equal(expect, result)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
sub_test_case 'return nil' do
|
70
|
+
test 'value is nil' do
|
71
|
+
expect = nil
|
72
|
+
result = Typecast::StrictTypecast.new(least_task).as_string(nil)
|
73
|
+
assert_equal(expect, result)
|
74
|
+
end
|
75
|
+
|
76
|
+
test 'value is empty String' do
|
77
|
+
expect = nil
|
78
|
+
result = Typecast::StrictTypecast.new(least_task).as_string('')
|
79
|
+
assert_equal(expect, result)
|
80
|
+
end
|
81
|
+
|
82
|
+
test 'value and null_string is `\N`' do
|
83
|
+
expect = nil
|
84
|
+
result = Typecast::StrictTypecast.new(least_task.tap{|t|t['null_string'] = '\N'}).as_string('\N')
|
85
|
+
assert_equal(expect, result)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
sub_test_case 'call TypecastError' do
|
90
|
+
test 'value is unknown class' do
|
91
|
+
assert_embulk_raise TypecastError do
|
92
|
+
Typecast::StrictTypecast.new(least_task).as_string(self)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
sub_test_case 'as_long' do
|
99
|
+
sub_test_case 'return Fixnum or Bignum' do
|
100
|
+
test 'value is Fixnum' do
|
101
|
+
expect = 7
|
102
|
+
result = Typecast::StrictTypecast.new(least_task).as_long(7)
|
103
|
+
assert_equal(expect, result)
|
104
|
+
end
|
105
|
+
|
106
|
+
test 'value is Bignum' do
|
107
|
+
expect = 10000000000000000000
|
108
|
+
result = Typecast::StrictTypecast.new(least_task).as_long(10000000000000000000)
|
109
|
+
assert_equal(expect, result)
|
110
|
+
end
|
111
|
+
|
112
|
+
test 'value is String' do
|
113
|
+
expect = 7
|
114
|
+
result = Typecast::StrictTypecast.new(least_task).as_long('7')
|
115
|
+
assert_equal(expect, result)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
sub_test_case 'return nil' do
|
120
|
+
test 'value is nil' do
|
121
|
+
expect = nil
|
122
|
+
result = Typecast::StrictTypecast.new(least_task).as_long(nil)
|
123
|
+
assert_equal(expect, result)
|
124
|
+
end
|
125
|
+
|
126
|
+
test 'value is empty String' do
|
127
|
+
expect = nil
|
128
|
+
result = Typecast::StrictTypecast.new(least_task).as_string('')
|
129
|
+
assert_equal(expect, result)
|
130
|
+
end
|
131
|
+
|
132
|
+
test 'value and null_string is `\N`' do
|
133
|
+
expect = nil
|
134
|
+
result = Typecast::StrictTypecast.new(least_task.tap{|t|t['null_string'] = '\N'}).as_string('\N')
|
135
|
+
assert_equal(expect, result)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
sub_test_case 'call TypecastError' do
|
140
|
+
test 'value is TrueClass' do
|
141
|
+
assert_embulk_raise TypecastError do
|
142
|
+
Typecast::StrictTypecast.new(least_task).as_long(true)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
test 'value is FalseClass' do
|
147
|
+
assert_embulk_raise TypecastError do
|
148
|
+
Typecast::StrictTypecast.new(least_task).as_long(false)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
test 'value is Float: the first decimal place < 5' do
|
153
|
+
assert_embulk_raise TypecastError do
|
154
|
+
Typecast::StrictTypecast.new(least_task).as_long(1.1)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
test 'value is Float: the first decimal place >= 5' do
|
159
|
+
assert_embulk_raise TypecastError do
|
160
|
+
Typecast::StrictTypecast.new(least_task).as_long(1.9)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
test 'value is String unable to typecast' do
|
165
|
+
assert_embulk_raise TypecastError do
|
166
|
+
Typecast::StrictTypecast.new(least_task).as_long('111:222:333')
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
test 'value is Hash' do
|
171
|
+
assert_embulk_raise TypecastError do
|
172
|
+
Typecast::StrictTypecast.new(least_task).as_long({'test' => 1})
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
test 'value is Array' do
|
177
|
+
assert_embulk_raise TypecastError do
|
178
|
+
Typecast::StrictTypecast.new(least_task).as_long([1, 2, 3])
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
sub_test_case 'as_double' do
|
185
|
+
sub_test_case 'return Float' do
|
186
|
+
test 'value is Float' do
|
187
|
+
expect = 7.7
|
188
|
+
result = Typecast::StrictTypecast.new(least_task).as_double(7.7)
|
189
|
+
assert_equal(expect, result)
|
190
|
+
end
|
191
|
+
|
192
|
+
test 'value is String' do
|
193
|
+
expect = 7.7
|
194
|
+
result = Typecast::StrictTypecast.new(least_task).as_double('7.7')
|
195
|
+
assert_equal(expect, result)
|
196
|
+
end
|
197
|
+
|
198
|
+
test 'value is Fixnum' do
|
199
|
+
expect = 7.0
|
200
|
+
result = Typecast::StrictTypecast.new(least_task).as_double(7)
|
201
|
+
assert_equal(expect, result)
|
202
|
+
end
|
203
|
+
|
204
|
+
test 'value is Bignum' do
|
205
|
+
expect = 10000000000000000000.0
|
206
|
+
result = Typecast::StrictTypecast.new(least_task).as_double(10000000000000000000)
|
207
|
+
assert_equal(expect, result)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
sub_test_case 'return nil' do
|
212
|
+
test 'value is nil' do
|
213
|
+
expect = nil
|
214
|
+
result = Typecast::StrictTypecast.new(least_task).as_double(nil)
|
215
|
+
assert_equal(expect, result)
|
216
|
+
end
|
217
|
+
|
218
|
+
test 'value is empty String' do
|
219
|
+
expect = nil
|
220
|
+
result = Typecast::StrictTypecast.new(least_task).as_string('')
|
221
|
+
assert_equal(expect, result)
|
222
|
+
end
|
223
|
+
|
224
|
+
test 'value and null_string is `\N`' do
|
225
|
+
expect = nil
|
226
|
+
result = Typecast::StrictTypecast.new(least_task.tap{|t|t['null_string'] = '\N'}).as_string('\N')
|
227
|
+
assert_equal(expect, result)
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
sub_test_case 'call TypecastError' do
|
232
|
+
test 'value is TrueClass' do
|
233
|
+
assert_embulk_raise TypecastError do
|
234
|
+
Typecast::StrictTypecast.new(least_task).as_double(true)
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
test 'value is FalseClass' do
|
239
|
+
assert_embulk_raise TypecastError do
|
240
|
+
Typecast::StrictTypecast.new(least_task).as_double(false)
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
test 'value is String unable to typecast' do
|
245
|
+
assert_embulk_raise TypecastError do
|
246
|
+
Typecast::StrictTypecast.new(least_task).as_double('44:55:3.6')
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
test 'value is Hash' do
|
251
|
+
assert_embulk_raise TypecastError do
|
252
|
+
Typecast::StrictTypecast.new(least_task).as_double({'test' => 1})
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
test 'value is Array' do
|
257
|
+
assert_embulk_raise TypecastError do
|
258
|
+
Typecast::StrictTypecast.new(least_task).as_double([1, 2, 3])
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
sub_test_case 'as_boolean' do
|
265
|
+
sub_test_case 'return false' do
|
266
|
+
test 'value is FalseClass' do
|
267
|
+
expect = false
|
268
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean(false)
|
269
|
+
assert_equal(expect, result)
|
270
|
+
end
|
271
|
+
|
272
|
+
test "value is String 'false'" do
|
273
|
+
expect = false
|
274
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('false')
|
275
|
+
assert_equal(expect, result)
|
276
|
+
end
|
277
|
+
|
278
|
+
test "value is String 'f'" do
|
279
|
+
expect = false
|
280
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('f')
|
281
|
+
assert_equal(expect, result)
|
282
|
+
end
|
283
|
+
|
284
|
+
test "value is String 'no'" do
|
285
|
+
expect = false
|
286
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('no')
|
287
|
+
assert_equal(expect, result)
|
288
|
+
end
|
289
|
+
|
290
|
+
test "value is String 'n'" do
|
291
|
+
expect = false
|
292
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('n')
|
293
|
+
assert_equal(expect, result)
|
294
|
+
end
|
295
|
+
|
296
|
+
test "value is String 'FALSE'" do
|
297
|
+
expect = false
|
298
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('FALSE')
|
299
|
+
assert_equal(expect, result)
|
300
|
+
end
|
301
|
+
|
302
|
+
test "value is String 'F'" do
|
303
|
+
expect = false
|
304
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('F')
|
305
|
+
assert_equal(expect, result)
|
306
|
+
end
|
307
|
+
|
308
|
+
test "value is String 'NO'" do
|
309
|
+
expect = false
|
310
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('NO')
|
311
|
+
assert_equal(expect, result)
|
312
|
+
end
|
313
|
+
|
314
|
+
test "value is String 'N'" do
|
315
|
+
expect = false
|
316
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('N')
|
317
|
+
assert_equal(expect, result)
|
318
|
+
end
|
319
|
+
|
320
|
+
test "value is String 'FaLsE'" do
|
321
|
+
expect = false
|
322
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('FaLsE')
|
323
|
+
assert_equal(expect, result)
|
324
|
+
end
|
325
|
+
|
326
|
+
test "value is String '0'" do
|
327
|
+
expect = false
|
328
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('0')
|
329
|
+
assert_equal(expect, result)
|
330
|
+
end
|
331
|
+
|
332
|
+
test 'value is 0' do
|
333
|
+
expect = false
|
334
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean(0)
|
335
|
+
assert_equal(expect, result)
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
sub_test_case 'return true' do
|
340
|
+
test 'value is TrueClass' do
|
341
|
+
expect = true
|
342
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean(true)
|
343
|
+
assert_equal(expect, result)
|
344
|
+
end
|
345
|
+
|
346
|
+
test "value is String 'true'" do
|
347
|
+
expect = true
|
348
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('true')
|
349
|
+
assert_equal(expect, result)
|
350
|
+
end
|
351
|
+
|
352
|
+
test "value is String 't'" do
|
353
|
+
expect = true
|
354
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('t')
|
355
|
+
assert_equal(expect, result)
|
356
|
+
end
|
357
|
+
|
358
|
+
test "value is String 'yes'" do
|
359
|
+
expect = true
|
360
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('yes')
|
361
|
+
assert_equal(expect, result)
|
362
|
+
end
|
363
|
+
|
364
|
+
test "value is String 'y'" do
|
365
|
+
expect = true
|
366
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('y')
|
367
|
+
assert_equal(expect, result)
|
368
|
+
end
|
369
|
+
|
370
|
+
test "value is String 'TRUE'" do
|
371
|
+
expect = true
|
372
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('TRUE')
|
373
|
+
assert_equal(expect, result)
|
374
|
+
end
|
375
|
+
|
376
|
+
test "value is String 'T'" do
|
377
|
+
expect = true
|
378
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('T')
|
379
|
+
assert_equal(expect, result)
|
380
|
+
end
|
381
|
+
|
382
|
+
test "value is String 'YES'" do
|
383
|
+
expect = true
|
384
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('YES')
|
385
|
+
assert_equal(expect, result)
|
386
|
+
end
|
387
|
+
|
388
|
+
test "value is String 'Y'" do
|
389
|
+
expect = true
|
390
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('Y')
|
391
|
+
assert_equal(expect, result)
|
392
|
+
end
|
393
|
+
|
394
|
+
test "value is String 'tRuE'" do
|
395
|
+
expect = true
|
396
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('tRuE')
|
397
|
+
assert_equal(expect, result)
|
398
|
+
end
|
399
|
+
|
400
|
+
test "value is String '1'" do
|
401
|
+
expect = true
|
402
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean('1')
|
403
|
+
assert_equal(expect, result)
|
404
|
+
end
|
405
|
+
|
406
|
+
test 'value is 1' do
|
407
|
+
expect = true
|
408
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean(1)
|
409
|
+
assert_equal(expect, result)
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
sub_test_case 'return nil' do
|
414
|
+
test 'value is nil' do
|
415
|
+
expect = nil
|
416
|
+
result = Typecast::StrictTypecast.new(least_task).as_boolean(nil)
|
417
|
+
assert_equal(expect, result)
|
418
|
+
end
|
419
|
+
|
420
|
+
test 'value is empty String' do
|
421
|
+
expect = nil
|
422
|
+
result = Typecast::StrictTypecast.new(least_task).as_string('')
|
423
|
+
assert_equal(expect, result)
|
424
|
+
end
|
425
|
+
|
426
|
+
test 'value and null_string is `\N`' do
|
427
|
+
expect = nil
|
428
|
+
result = Typecast::StrictTypecast.new(least_task.tap{|t|t['null_string'] = '\N'}).as_string('\N')
|
429
|
+
assert_equal(expect, result)
|
430
|
+
end
|
431
|
+
end
|
432
|
+
|
433
|
+
sub_test_case 'call TypecastError' do
|
434
|
+
test 'value is String unable to typecast' do
|
435
|
+
assert_embulk_raise TypecastError do
|
436
|
+
Typecast::StrictTypecast.new(least_task).as_boolean('test')
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
test 'value is Hash' do
|
441
|
+
assert_embulk_raise TypecastError do
|
442
|
+
Typecast::StrictTypecast.new(least_task).as_boolean({'test' => 1})
|
443
|
+
end
|
444
|
+
end
|
445
|
+
|
446
|
+
test 'value is Array' do
|
447
|
+
assert_embulk_raise TypecastError do
|
448
|
+
Typecast::StrictTypecast.new(least_task).as_boolean([1, 2, 3])
|
449
|
+
end
|
450
|
+
end
|
451
|
+
end
|
452
|
+
end
|
453
|
+
|
454
|
+
sub_test_case 'as_timestamp' do
|
455
|
+
sub_test_case 'return Time' do
|
456
|
+
sub_test_case 'no timestamp_format, no timezone' do
|
457
|
+
test 'value is String with timezone' do
|
458
|
+
expect = Time.parse('2015-12-15 09:31:09 UTC')
|
459
|
+
result = Typecast::StrictTypecast.new(least_task).as_timestamp('2015-12-15 09:31:09 UTC')
|
460
|
+
assert_equal(expect, result)
|
461
|
+
end
|
462
|
+
|
463
|
+
test 'value is String without timezone' do
|
464
|
+
expect = Time.parse('2015-12-15 09:31:09 JST')
|
465
|
+
result = Typecast::StrictTypecast.new(least_task).as_timestamp('2015-12-15 09:31:09')
|
466
|
+
assert_equal(expect, result)
|
467
|
+
end
|
468
|
+
end
|
469
|
+
|
470
|
+
sub_test_case 'has timestamp_format, no timezone' do
|
471
|
+
test 'value is JST' do
|
472
|
+
expect = Time.parse('2001-02-03 06:05:04 +0900')
|
473
|
+
result = Typecast::StrictTypecast.new(least_task).as_timestamp('2001-02-03T04:05:06+09:00', '%Y-%m-%dT%S:%M:%H%z')
|
474
|
+
assert_equal(expect, result)
|
475
|
+
end
|
476
|
+
|
477
|
+
test 'value is UTC' do
|
478
|
+
expect = Time.parse('2001-02-03 06:05:04 UTC')
|
479
|
+
result = Typecast::StrictTypecast.new(least_task).as_timestamp('2001-02-03T04:05:06UTC', '%Y-%m-%dT%S:%M:%H%Z')
|
480
|
+
assert_equal(expect, result)
|
481
|
+
end
|
482
|
+
end
|
483
|
+
|
484
|
+
sub_test_case 'no timestamp_format, has timezone' do
|
485
|
+
test 'value is String without timezone' do
|
486
|
+
expect = Time.parse('2015-12-15 09:31:09 JST')
|
487
|
+
result = Typecast::StrictTypecast.new(least_task).as_timestamp('2015-12-15 09:31:09', nil, 'Asia/Tokyo')
|
488
|
+
assert_equal(expect, result)
|
489
|
+
end
|
490
|
+
|
491
|
+
test 'value is String with timezone' do
|
492
|
+
expect = Time.parse('2015-12-15 09:31:09 JST')
|
493
|
+
result = Typecast::StrictTypecast.new(least_task).as_timestamp('2015-12-15 09:31:09 UTC', nil, 'Asia/Tokyo')
|
494
|
+
assert_equal(expect, result)
|
495
|
+
end
|
496
|
+
end
|
497
|
+
|
498
|
+
sub_test_case 'has timestamp_format, has timezone' do
|
499
|
+
test 'value is without timezone' do
|
500
|
+
expect = Time.parse('2001-02-03 06:05:04 JST')
|
501
|
+
result = Typecast::StrictTypecast.new(least_task).as_timestamp('2001-02-03T04:05:06', '%Y-%m-%dT%S:%M:%H', 'Asia/Tokyo')
|
502
|
+
assert_equal(expect, result)
|
503
|
+
end
|
504
|
+
|
505
|
+
test 'value is with timezone' do
|
506
|
+
expect = Time.parse('2001-02-03 06:05:04 UTC')
|
507
|
+
result = Typecast::StrictTypecast.new(least_task).as_timestamp('2001/02/03T06:05:04+00:00', '%Y/%m/%dT%H:%M:%S%z', 'Asia/Tokyo')
|
508
|
+
assert_equal(expect, result)
|
509
|
+
end
|
510
|
+
end
|
511
|
+
end
|
512
|
+
|
513
|
+
sub_test_case 'return nil' do
|
514
|
+
test 'value is nil' do
|
515
|
+
expect = nil
|
516
|
+
result = Typecast::StrictTypecast.new(least_task).as_timestamp(nil)
|
517
|
+
assert_equal(expect, result)
|
518
|
+
end
|
519
|
+
|
520
|
+
test 'value is empty String' do
|
521
|
+
expect = nil
|
522
|
+
result = Typecast::StrictTypecast.new(least_task).as_string('')
|
523
|
+
assert_equal(expect, result)
|
524
|
+
end
|
525
|
+
|
526
|
+
test 'value and null_string is `\N`' do
|
527
|
+
expect = nil
|
528
|
+
result = Typecast::StrictTypecast.new(least_task.tap{|t|t['null_string'] = '\N'}).as_string('\N')
|
529
|
+
assert_equal(expect, result)
|
530
|
+
end
|
531
|
+
end
|
532
|
+
|
533
|
+
sub_test_case 'call TypecastError' do
|
534
|
+
test 'invalid timezone format' do
|
535
|
+
assert_embulk_raise TypecastError do
|
536
|
+
Typecast::StrictTypecast.new(least_task).as_timestamp('2015-12-15 09:31:09 UTC', nil, 'JST')
|
537
|
+
end
|
538
|
+
end
|
539
|
+
|
540
|
+
test 'value is TrueClass' do
|
541
|
+
assert_embulk_raise TypecastError do
|
542
|
+
Typecast::StrictTypecast.new(least_task).as_timestamp(true)
|
543
|
+
end
|
544
|
+
end
|
545
|
+
|
546
|
+
test 'value is FalseClass' do
|
547
|
+
assert_embulk_raise TypecastError do
|
548
|
+
Typecast::StrictTypecast.new(least_task).as_timestamp(false)
|
549
|
+
end
|
550
|
+
end
|
551
|
+
|
552
|
+
test 'value is String unable to typecast' do
|
553
|
+
assert_embulk_raise TypecastError do
|
554
|
+
Typecast::StrictTypecast.new(least_task).as_timestamp('test')
|
555
|
+
end
|
556
|
+
end
|
557
|
+
|
558
|
+
test 'value is Hash' do
|
559
|
+
assert_embulk_raise TypecastError do
|
560
|
+
Typecast::StrictTypecast.new(least_task).as_timestamp({'test' => 1})
|
561
|
+
end
|
562
|
+
end
|
563
|
+
|
564
|
+
test 'value is Array' do
|
565
|
+
assert_embulk_raise TypecastError do
|
566
|
+
Typecast::StrictTypecast.new(least_task).as_timestamp([1, 2, 3])
|
567
|
+
end
|
568
|
+
end
|
569
|
+
end
|
570
|
+
end
|
571
|
+
|
572
|
+
sub_test_case 'as_json' do
|
573
|
+
sub_test_case 'return String' do
|
574
|
+
test 'value is String' do
|
575
|
+
expect = {'hoge' => 'fuga'}
|
576
|
+
result = Typecast::StrictTypecast.new(least_task).as_json('{"hoge":"fuga"}')
|
577
|
+
assert_equal(expect, result)
|
578
|
+
end
|
579
|
+
|
580
|
+
test 'value is Hash' do
|
581
|
+
expect = {'test' => 1}
|
582
|
+
result = Typecast::StrictTypecast.new(least_task).as_json({'test' => 1})
|
583
|
+
assert_equal(expect, result)
|
584
|
+
end
|
585
|
+
|
586
|
+
test 'value is Array' do
|
587
|
+
expect = [1,2,3]
|
588
|
+
result = Typecast::StrictTypecast.new(least_task).as_json([1, 2, 3])
|
589
|
+
assert_equal(expect, result)
|
590
|
+
end
|
591
|
+
end
|
592
|
+
|
593
|
+
sub_test_case 'return nil' do
|
594
|
+
test 'value is nil' do
|
595
|
+
expect = nil
|
596
|
+
result = Typecast::StrictTypecast.new(least_task).as_json(nil)
|
597
|
+
assert_equal(expect, result)
|
598
|
+
end
|
599
|
+
|
600
|
+
test 'value is empty String' do
|
601
|
+
expect = nil
|
602
|
+
result = Typecast::StrictTypecast.new(least_task).as_string('')
|
603
|
+
assert_equal(expect, result)
|
604
|
+
end
|
605
|
+
|
606
|
+
test 'value and null_string is `\N`' do
|
607
|
+
expect = nil
|
608
|
+
result = Typecast::StrictTypecast.new(least_task.tap{|t|t['null_string'] = '\N'}).as_string('\N')
|
609
|
+
assert_equal(expect, result)
|
610
|
+
end
|
611
|
+
end
|
612
|
+
|
613
|
+
sub_test_case 'call TypecastError' do
|
614
|
+
test 'value is not JSON String' do
|
615
|
+
assert_embulk_raise TypecastError do
|
616
|
+
Typecast::StrictTypecast.new(least_task).as_json('hoge')
|
617
|
+
end
|
618
|
+
end
|
619
|
+
|
620
|
+
test 'value is true' do
|
621
|
+
assert_embulk_raise TypecastError do
|
622
|
+
Typecast::StrictTypecast.new(least_task).as_json(true)
|
623
|
+
end
|
624
|
+
end
|
625
|
+
|
626
|
+
test 'value is false' do
|
627
|
+
assert_embulk_raise TypecastError do
|
628
|
+
Typecast::StrictTypecast.new(least_task).as_json(false)
|
629
|
+
end
|
630
|
+
end
|
631
|
+
|
632
|
+
test 'value is Fixnum' do
|
633
|
+
assert_embulk_raise TypecastError do
|
634
|
+
Typecast::StrictTypecast.new(least_task).as_json(10)
|
635
|
+
end
|
636
|
+
end
|
637
|
+
|
638
|
+
test 'value is Bignum' do
|
639
|
+
assert_embulk_raise TypecastError do
|
640
|
+
Typecast::StrictTypecast.new(least_task).as_json(10000000000000000000)
|
641
|
+
end
|
642
|
+
end
|
643
|
+
|
644
|
+
test 'value is Float' do
|
645
|
+
assert_embulk_raise TypecastError do
|
646
|
+
Typecast::StrictTypecast.new(least_task).as_json(5.5)
|
647
|
+
end
|
648
|
+
end
|
649
|
+
|
650
|
+
test 'value is Time class' do
|
651
|
+
assert_embulk_raise TypecastError do
|
652
|
+
Typecast::StrictTypecast.new(least_task).as_json(Time.at(1475572099))
|
653
|
+
end
|
654
|
+
end
|
655
|
+
|
656
|
+
test 'value is unknown class' do
|
657
|
+
assert_embulk_raise TypecastError do
|
658
|
+
Typecast::StrictTypecast.new(least_task).as_json(self)
|
659
|
+
end
|
660
|
+
end
|
661
|
+
end
|
662
|
+
end
|
663
|
+
|
664
|
+
end
|
665
|
+
end
|
666
|
+
end
|