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,155 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'embulk/input/google_spreadsheets'
|
3
|
+
require_relative 'assert_embulk_raise'
|
4
|
+
|
5
|
+
module Embulk
|
6
|
+
class Input::GoogleSpreadsheets < InputPlugin
|
7
|
+
|
8
|
+
class TestConfigure < Test::Unit::TestCase
|
9
|
+
|
10
|
+
setup do
|
11
|
+
# TODO: to keep class instance variables' default value always
|
12
|
+
@_default_format = CustomColumns.default_format
|
13
|
+
@_default_timezone = CustomColumns.default_timezone
|
14
|
+
@_default_typecast = CustomColumns.default_typecast
|
15
|
+
end
|
16
|
+
|
17
|
+
teardown do
|
18
|
+
CustomColumns.default_format = @_default_format
|
19
|
+
CustomColumns.default_timezone = @_default_timezone
|
20
|
+
CustomColumns.default_typecast = @_default_typecast
|
21
|
+
end
|
22
|
+
|
23
|
+
include AssertEmbulkRaise
|
24
|
+
|
25
|
+
GoogleSpreadsheets = Embulk::Input::GoogleSpreadsheets unless defined?(GoogleSpreadsheets)
|
26
|
+
|
27
|
+
def least_config
|
28
|
+
DataSource.new({
|
29
|
+
'spreadsheets_url' => TEST_SPREADSHEETS_URL,
|
30
|
+
'worksheet_title' => TEST_WORKSHEET_TITLE,
|
31
|
+
'columns' => columns,
|
32
|
+
})
|
33
|
+
end
|
34
|
+
|
35
|
+
def columns
|
36
|
+
[
|
37
|
+
{'name' => '_c1', 'type' => 'boolean'},
|
38
|
+
{'name' => '_c2', 'type' => 'string'},
|
39
|
+
{'name' => '_c3', 'type' => 'long'},
|
40
|
+
{'name' => '_c4', 'type' => 'double'},
|
41
|
+
{'name' => '_c5', 'type' => 'timestamp'},
|
42
|
+
]
|
43
|
+
end
|
44
|
+
|
45
|
+
def config(config = {})
|
46
|
+
least_config.merge(config)
|
47
|
+
end
|
48
|
+
|
49
|
+
sub_test_case 'configure by buildin API' do
|
50
|
+
test 'default' do
|
51
|
+
task = GoogleSpreadsheets.configure(config)
|
52
|
+
assert_equal(1, task['start_column'])
|
53
|
+
assert_equal(1, task['start_row'])
|
54
|
+
assert_equal(-1, task['end_row'])
|
55
|
+
assert_equal(10000, task['max_fetch_rows'])
|
56
|
+
assert_equal('', task['null_string'])
|
57
|
+
assert_equal(true, task['stop_on_invalid_record'])
|
58
|
+
assert_equal('%Y-%m-%d %H:%M:%S.%N %z', task['default_timestamp_format'])
|
59
|
+
assert_equal('UTC', task['default_timezone'])
|
60
|
+
assert_equal('strict', task['default_typecast'])
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
sub_test_case 'end_column' do
|
65
|
+
test 'end_column' do
|
66
|
+
task = GoogleSpreadsheets.configure(config('start_column' => 5, 'columns' => [{},{},{}]))
|
67
|
+
assert_equal(7, task['end_column'])
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
sub_test_case 'LocalFile' do
|
72
|
+
test 'not set json_keyfile' do
|
73
|
+
task = GoogleSpreadsheets.configure(config)
|
74
|
+
assert_equal(nil, task['json_keyfile'])
|
75
|
+
end
|
76
|
+
|
77
|
+
test 'set file path' do
|
78
|
+
dummy = File.join(APP_ROOT, 'Gemfile')
|
79
|
+
task = GoogleSpreadsheets.configure(config('json_keyfile' => dummy))
|
80
|
+
assert_equal(File.read(dummy), task['json_keyfile'])
|
81
|
+
end
|
82
|
+
|
83
|
+
test 'set content' do
|
84
|
+
dummy = 'hoge'
|
85
|
+
task = GoogleSpreadsheets.configure(config('json_keyfile' => {'content' => dummy}))
|
86
|
+
assert_equal(dummy, task['json_keyfile'])
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
sub_test_case 'CustomColumns' do
|
91
|
+
test 'not array' do
|
92
|
+
assert_embulk_raise Embulk::ConfigError do
|
93
|
+
GoogleSpreadsheets.configure(config('columns' => 'hoge'))
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
test 'not array of hash' do
|
98
|
+
assert_embulk_raise Embulk::ConfigError do
|
99
|
+
GoogleSpreadsheets.configure(config('columns' => ['hoge']))
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
test 'complete default' do
|
104
|
+
task = GoogleSpreadsheets.configure(config('columns' => [{'name' => '_c5', 'type' => 'timestamp'}]))
|
105
|
+
assert_equal('%Y-%m-%d %H:%M:%S.%N %z', task['columns'].first['format'])
|
106
|
+
assert_equal('UTC', task['columns'].first['timezone'])
|
107
|
+
assert_equal('strict', task['columns'].first['typecast'])
|
108
|
+
end
|
109
|
+
|
110
|
+
test 'complete default by user defined default' do
|
111
|
+
task = GoogleSpreadsheets.configure(config(
|
112
|
+
'default_timestamp_format' => '%N',
|
113
|
+
'default_timezone' => 'Asia/Tokyo',
|
114
|
+
'default_typecast' => 'loose',
|
115
|
+
'columns' => [{'name' => '_c5', 'type' => 'timestamp'}]
|
116
|
+
))
|
117
|
+
assert_equal('%N', task['columns'].first['format'])
|
118
|
+
assert_equal('Asia/Tokyo', task['columns'].first['timezone'])
|
119
|
+
assert_equal('loose', task['columns'].first['typecast'])
|
120
|
+
end
|
121
|
+
|
122
|
+
test 'not complete except timestamp' do
|
123
|
+
task = GoogleSpreadsheets.configure(config(
|
124
|
+
'columns' => [
|
125
|
+
{'name' => '_c1', 'type' => 'boolean'},
|
126
|
+
{'name' => '_c2', 'type' => 'string'},
|
127
|
+
{'name' => '_c3', 'type' => 'long'},
|
128
|
+
{'name' => '_c4', 'type' => 'double'},
|
129
|
+
{'name' => '_c5', 'type' => 'json'},
|
130
|
+
]))
|
131
|
+
5.times do |i|
|
132
|
+
assert_equal(nil, task['columns'][i]['format'], i)
|
133
|
+
assert_equal(nil, task['columns'][i]['timezone'], i)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
test 'complete typecast if any type' do
|
138
|
+
task = GoogleSpreadsheets.configure(config(
|
139
|
+
'columns' => [
|
140
|
+
{'name' => '_c1', 'type' => 'boolean'},
|
141
|
+
{'name' => '_c2', 'type' => 'string'},
|
142
|
+
{'name' => '_c3', 'type' => 'long'},
|
143
|
+
{'name' => '_c4', 'type' => 'double'},
|
144
|
+
{'name' => '_c5', 'type' => 'json'},
|
145
|
+
]))
|
146
|
+
5.times do |i|
|
147
|
+
assert_equal('strict', task['columns'][i]['typecast'], i)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,194 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'embulk/input/google_spreadsheets'
|
3
|
+
require 'embulk/input/google_spreadsheets/typecast/loose_typecast'
|
4
|
+
|
5
|
+
module Embulk
|
6
|
+
class Input::GoogleSpreadsheets < InputPlugin
|
7
|
+
class TestStrictTypecast < Test::Unit::TestCase
|
8
|
+
def least_task
|
9
|
+
{
|
10
|
+
'null_string' => ''
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
sub_test_case 'as_string' do
|
15
|
+
test 'value is unknown class' do
|
16
|
+
expect = nil
|
17
|
+
result = Typecast::LooseTypecast.new(least_task).as_string(self)
|
18
|
+
assert_equal(expect, result)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
sub_test_case 'as_long' do
|
23
|
+
test 'value is TrueClass' do
|
24
|
+
expect = nil
|
25
|
+
result = Typecast::LooseTypecast.new(least_task).as_long(true)
|
26
|
+
assert_equal(expect, result)
|
27
|
+
end
|
28
|
+
|
29
|
+
test 'value is FalseClass' do
|
30
|
+
expect = nil
|
31
|
+
result = Typecast::LooseTypecast.new(least_task).as_long(false)
|
32
|
+
assert_equal(expect, result)
|
33
|
+
end
|
34
|
+
|
35
|
+
test 'value is Float: the first decimal place < 5' do
|
36
|
+
expect = nil
|
37
|
+
result = Typecast::LooseTypecast.new(least_task).as_long(1.1)
|
38
|
+
assert_equal(expect, result)
|
39
|
+
end
|
40
|
+
|
41
|
+
test 'value is Float: the first decimal place >= 5' do
|
42
|
+
expect = nil
|
43
|
+
result = Typecast::LooseTypecast.new(least_task).as_long(1.9)
|
44
|
+
assert_equal(expect, result)
|
45
|
+
end
|
46
|
+
|
47
|
+
test 'value is unable to typecast to String' do
|
48
|
+
expect = nil
|
49
|
+
result = Typecast::LooseTypecast.new(least_task).as_long('111:222:333')
|
50
|
+
assert_equal(expect, result)
|
51
|
+
end
|
52
|
+
|
53
|
+
test 'value is Hash' do
|
54
|
+
expect = nil
|
55
|
+
result = Typecast::LooseTypecast.new(least_task).as_long({'test' => 1})
|
56
|
+
assert_equal(expect, result)
|
57
|
+
end
|
58
|
+
test 'value is Array' do
|
59
|
+
expect = nil
|
60
|
+
result = Typecast::LooseTypecast.new(least_task).as_long([1, 2, 3])
|
61
|
+
assert_equal(expect, result)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
sub_test_case 'as_double' do
|
66
|
+
test 'value is TrueClass' do
|
67
|
+
expect = nil
|
68
|
+
result = Typecast::LooseTypecast.new(least_task).as_double(true)
|
69
|
+
assert_equal(expect, result)
|
70
|
+
end
|
71
|
+
|
72
|
+
test 'value is FalseClass' do
|
73
|
+
expect = nil
|
74
|
+
result = Typecast::LooseTypecast.new(least_task).as_double(false)
|
75
|
+
assert_equal(expect, result)
|
76
|
+
end
|
77
|
+
|
78
|
+
test 'value is unable to typecast to String' do
|
79
|
+
expect = nil
|
80
|
+
result = Typecast::LooseTypecast.new(least_task).as_double('44:55:3.6')
|
81
|
+
assert_equal(expect, result)
|
82
|
+
end
|
83
|
+
|
84
|
+
test 'value is Hash' do
|
85
|
+
expect = nil
|
86
|
+
result = Typecast::LooseTypecast.new(least_task).as_double({'test' => 1})
|
87
|
+
assert_equal(expect, result)
|
88
|
+
end
|
89
|
+
|
90
|
+
test 'value is Array' do
|
91
|
+
expect = nil
|
92
|
+
result = Typecast::LooseTypecast.new(least_task).as_double([1, 2, 3])
|
93
|
+
assert_equal(expect, result)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
sub_test_case 'as_boolean' do
|
98
|
+
test 'value is unable to typecast to String' do
|
99
|
+
expect = nil
|
100
|
+
result = Typecast::LooseTypecast.new(least_task).as_boolean('test')
|
101
|
+
assert_equal(expect, result)
|
102
|
+
end
|
103
|
+
|
104
|
+
test 'value is Hash' do
|
105
|
+
expect = nil
|
106
|
+
result = Typecast::LooseTypecast.new(least_task).as_boolean({'test' => 1})
|
107
|
+
assert_equal(expect, result)
|
108
|
+
end
|
109
|
+
|
110
|
+
test 'value is Array' do
|
111
|
+
expect = nil
|
112
|
+
result = Typecast::LooseTypecast.new(least_task).as_boolean([1, 2, 3])
|
113
|
+
assert_equal(expect, result)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
sub_test_case 'as_timestamp' do
|
118
|
+
test 'value is TrueClass' do
|
119
|
+
expect = nil
|
120
|
+
result = Typecast::LooseTypecast.new(least_task).as_timestamp(true)
|
121
|
+
assert_equal(expect, result)
|
122
|
+
end
|
123
|
+
|
124
|
+
test 'value is FalseClass' do
|
125
|
+
expect = nil
|
126
|
+
result = Typecast::LooseTypecast.new(least_task).as_timestamp(false)
|
127
|
+
assert_equal(expect, result)
|
128
|
+
end
|
129
|
+
|
130
|
+
test 'value is unable to typecast to String' do
|
131
|
+
expect = nil
|
132
|
+
result = Typecast::LooseTypecast.new(least_task).as_timestamp('test')
|
133
|
+
assert_equal(expect, result)
|
134
|
+
end
|
135
|
+
|
136
|
+
test 'value is Hash' do
|
137
|
+
expect = nil
|
138
|
+
result = Typecast::LooseTypecast.new(least_task).as_timestamp({'test' => 1})
|
139
|
+
assert_equal(expect, result)
|
140
|
+
end
|
141
|
+
|
142
|
+
test 'value is Array' do
|
143
|
+
expect = nil
|
144
|
+
result = Typecast::LooseTypecast.new(least_task).as_timestamp([1, 2, 3])
|
145
|
+
assert_equal(expect, result)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
sub_test_case 'as_json' do
|
150
|
+
test 'value is true' do
|
151
|
+
expect = nil
|
152
|
+
result = Typecast::LooseTypecast.new(least_task).as_json(true)
|
153
|
+
assert_equal(expect, result)
|
154
|
+
end
|
155
|
+
|
156
|
+
test 'value is false' do
|
157
|
+
expect = nil
|
158
|
+
result = Typecast::LooseTypecast.new(least_task).as_json(false)
|
159
|
+
assert_equal(expect, result)
|
160
|
+
end
|
161
|
+
|
162
|
+
test 'value is Fixnum' do
|
163
|
+
expect = nil
|
164
|
+
result = Typecast::LooseTypecast.new(least_task).as_json(10)
|
165
|
+
assert_equal(expect, result)
|
166
|
+
end
|
167
|
+
|
168
|
+
test 'value is Bignum' do
|
169
|
+
expect = nil
|
170
|
+
result = Typecast::LooseTypecast.new(least_task).as_json(10000000000000000000)
|
171
|
+
assert_equal(expect, result)
|
172
|
+
end
|
173
|
+
|
174
|
+
test 'value is Float' do
|
175
|
+
expect = nil
|
176
|
+
result = Typecast::LooseTypecast.new(least_task).as_json(5.5)
|
177
|
+
assert_equal(expect, result)
|
178
|
+
end
|
179
|
+
|
180
|
+
test 'value is Time class' do
|
181
|
+
expect = nil
|
182
|
+
result = Typecast::LooseTypecast.new(least_task).as_json(Time.at(1475572099))
|
183
|
+
assert_equal(expect, result)
|
184
|
+
end
|
185
|
+
|
186
|
+
test 'value is unknown class' do
|
187
|
+
expect = nil
|
188
|
+
result = Typecast::LooseTypecast.new(least_task).as_json(self)
|
189
|
+
assert_equal(expect, result)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
@@ -0,0 +1,616 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'embulk/input/google_spreadsheets'
|
3
|
+
require 'embulk/input/google_spreadsheets/typecast/minimal_typecast'
|
4
|
+
require_relative 'assert_embulk_raise'
|
5
|
+
|
6
|
+
module Embulk
|
7
|
+
class Input::GoogleSpreadsheets < InputPlugin
|
8
|
+
class TestMinimalTypecast < 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::MinimalTypecast.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::MinimalTypecast.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::MinimalTypecast.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::MinimalTypecast.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::MinimalTypecast.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::MinimalTypecast.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}.to_s
|
58
|
+
result = Typecast::MinimalTypecast.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].to_s
|
64
|
+
result = Typecast::MinimalTypecast.new(least_task).as_string([1, 2, 3])
|
65
|
+
assert_equal(expect, result)
|
66
|
+
end
|
67
|
+
|
68
|
+
test 'value is an unknown instance' do
|
69
|
+
expect = self.to_s
|
70
|
+
result = Typecast::MinimalTypecast.new(least_task).as_string(self)
|
71
|
+
assert_equal(expect, result)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
sub_test_case 'return nil' do
|
76
|
+
test 'value is nil' do
|
77
|
+
expect = nil
|
78
|
+
result = Typecast::MinimalTypecast.new(least_task).as_string(nil)
|
79
|
+
assert_equal(expect, result)
|
80
|
+
end
|
81
|
+
|
82
|
+
test 'value is empty String' do
|
83
|
+
expect = nil
|
84
|
+
result = Typecast::MinimalTypecast.new(least_task).as_string('')
|
85
|
+
assert_equal(expect, result)
|
86
|
+
end
|
87
|
+
|
88
|
+
test 'value and null_string is `\N`' do
|
89
|
+
expect = nil
|
90
|
+
result = Typecast::MinimalTypecast.new(least_task.tap{|t|t['null_string'] = '\N'}).as_string('\N')
|
91
|
+
assert_equal(expect, result)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
sub_test_case 'as_long' do
|
97
|
+
sub_test_case 'return Fixnum or Bignum' do
|
98
|
+
test 'value is Fixnum' do
|
99
|
+
expect = 7
|
100
|
+
result = Typecast::MinimalTypecast.new(least_task).as_long(7)
|
101
|
+
assert_equal(expect, result)
|
102
|
+
end
|
103
|
+
|
104
|
+
test 'value is Bignum' do
|
105
|
+
expect = 10000000000000000000
|
106
|
+
result = Typecast::MinimalTypecast.new(least_task).as_long(10000000000000000000)
|
107
|
+
assert_equal(expect, result)
|
108
|
+
end
|
109
|
+
|
110
|
+
test 'value is String' do
|
111
|
+
expect = 7
|
112
|
+
result = Typecast::MinimalTypecast.new(least_task).as_long('7')
|
113
|
+
assert_equal(expect, result)
|
114
|
+
end
|
115
|
+
|
116
|
+
test 'value is String which has numbers' do
|
117
|
+
expect = 111
|
118
|
+
result = Typecast::MinimalTypecast.new(least_task).as_long('111:222:333')
|
119
|
+
assert_equal(expect, result)
|
120
|
+
end
|
121
|
+
|
122
|
+
test 'value is Float: the first decimal place < 5' do
|
123
|
+
expect = 1
|
124
|
+
result = Typecast::MinimalTypecast.new(least_task).as_long(1.1)
|
125
|
+
assert_equal(expect, result)
|
126
|
+
end
|
127
|
+
|
128
|
+
test 'value is Float: the first decimal place >= 5' do
|
129
|
+
expect = 1
|
130
|
+
result = Typecast::MinimalTypecast.new(least_task).as_long(1.9)
|
131
|
+
assert_equal(expect, result)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
sub_test_case 'return nil' do
|
136
|
+
test 'value is nil' do
|
137
|
+
expect = nil
|
138
|
+
result = Typecast::MinimalTypecast.new(least_task).as_long(nil)
|
139
|
+
assert_equal(expect, result)
|
140
|
+
end
|
141
|
+
|
142
|
+
test 'value is empty String' do
|
143
|
+
expect = nil
|
144
|
+
result = Typecast::MinimalTypecast.new(least_task).as_string('')
|
145
|
+
assert_equal(expect, result)
|
146
|
+
end
|
147
|
+
|
148
|
+
test 'value and null_string is `\N`' do
|
149
|
+
expect = nil
|
150
|
+
result = Typecast::MinimalTypecast.new(least_task.tap{|t|t['null_string'] = '\N'}).as_string('\N')
|
151
|
+
assert_equal(expect, result)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
sub_test_case 'call TypecastError' do
|
156
|
+
test 'value is TrueClass' do
|
157
|
+
assert_embulk_raise TypecastError do
|
158
|
+
Typecast::MinimalTypecast.new(least_task).as_long(true)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
test 'value is FalseClass' do
|
163
|
+
assert_embulk_raise TypecastError do
|
164
|
+
Typecast::MinimalTypecast.new(least_task).as_long(false)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
test 'value is Hash' do
|
169
|
+
assert_embulk_raise TypecastError do
|
170
|
+
Typecast::MinimalTypecast.new(least_task).as_long({'test' => 1})
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
test 'value is Array' do
|
175
|
+
assert_embulk_raise TypecastError do
|
176
|
+
Typecast::MinimalTypecast.new(least_task).as_long([1, 2, 3])
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
sub_test_case 'as_double' do
|
183
|
+
sub_test_case 'return Float' do
|
184
|
+
test 'value is Float' do
|
185
|
+
expect = 7.7
|
186
|
+
result = Typecast::MinimalTypecast.new(least_task).as_double(7.7)
|
187
|
+
assert_equal(expect, result)
|
188
|
+
end
|
189
|
+
|
190
|
+
test 'value is String' do
|
191
|
+
expect = 7.7
|
192
|
+
result = Typecast::MinimalTypecast.new(least_task).as_double('7.7')
|
193
|
+
assert_equal(expect, result)
|
194
|
+
end
|
195
|
+
|
196
|
+
test 'value is Fixnum' do
|
197
|
+
expect = 7.0
|
198
|
+
result = Typecast::MinimalTypecast.new(least_task).as_double(7)
|
199
|
+
assert_equal(expect, result)
|
200
|
+
end
|
201
|
+
|
202
|
+
test 'value is Bignum' do
|
203
|
+
expect = 10000000000000000000.0
|
204
|
+
result = Typecast::MinimalTypecast.new(least_task).as_double(10000000000000000000)
|
205
|
+
assert_equal(expect, result)
|
206
|
+
end
|
207
|
+
|
208
|
+
test 'value is String which has numbers' do
|
209
|
+
expect = 44.0
|
210
|
+
result = Typecast::MinimalTypecast.new(least_task).as_double('44:55:3.6')
|
211
|
+
assert_equal(expect, result)
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
sub_test_case 'return nil' do
|
216
|
+
test 'value is nil' do
|
217
|
+
expect = nil
|
218
|
+
result = Typecast::MinimalTypecast.new(least_task).as_double(nil)
|
219
|
+
assert_equal(expect, result)
|
220
|
+
end
|
221
|
+
|
222
|
+
test 'value is empty String' do
|
223
|
+
expect = nil
|
224
|
+
result = Typecast::MinimalTypecast.new(least_task).as_string('')
|
225
|
+
assert_equal(expect, result)
|
226
|
+
end
|
227
|
+
|
228
|
+
test 'value and null_string is `\N`' do
|
229
|
+
expect = nil
|
230
|
+
result = Typecast::MinimalTypecast.new(least_task.tap{|t|t['null_string'] = '\N'}).as_string('\N')
|
231
|
+
assert_equal(expect, result)
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
sub_test_case 'call TypecastError' do
|
236
|
+
test 'value is TrueClass' do
|
237
|
+
assert_embulk_raise TypecastError do
|
238
|
+
Typecast::MinimalTypecast.new(least_task).as_double(true)
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
test 'value is FalseClass' do
|
243
|
+
assert_embulk_raise TypecastError do
|
244
|
+
Typecast::MinimalTypecast.new(least_task).as_double(false)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
test 'value is Hash' do
|
249
|
+
assert_embulk_raise TypecastError do
|
250
|
+
Typecast::MinimalTypecast.new(least_task).as_double({'test' => 1})
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
test 'value is Array' do
|
255
|
+
assert_embulk_raise TypecastError do
|
256
|
+
Typecast::MinimalTypecast.new(least_task).as_double([1, 2, 3])
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
sub_test_case 'as_boolean' do
|
263
|
+
sub_test_case 'return false' do
|
264
|
+
test 'value is FalseClass' do
|
265
|
+
expect = false
|
266
|
+
result = Typecast::MinimalTypecast.new(least_task).as_boolean(false)
|
267
|
+
assert_equal(expect, result)
|
268
|
+
end
|
269
|
+
|
270
|
+
test "value is String 'false'" do
|
271
|
+
expect = false
|
272
|
+
result = Typecast::MinimalTypecast.new(least_task).as_boolean('false')
|
273
|
+
assert_equal(expect, result)
|
274
|
+
end
|
275
|
+
|
276
|
+
test "value is String 'FaLsE'" do
|
277
|
+
expect = false
|
278
|
+
result = Typecast::MinimalTypecast.new(least_task).as_boolean('FaLsE')
|
279
|
+
assert_equal(expect, result)
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
sub_test_case 'return true' do
|
284
|
+
test 'value is TrueClass' do
|
285
|
+
expect = true
|
286
|
+
result = Typecast::MinimalTypecast.new(least_task).as_boolean(true)
|
287
|
+
assert_equal(expect, result)
|
288
|
+
end
|
289
|
+
|
290
|
+
test "value is String 'true'" do
|
291
|
+
expect = true
|
292
|
+
result = Typecast::MinimalTypecast.new(least_task).as_boolean('true')
|
293
|
+
assert_equal(expect, result)
|
294
|
+
end
|
295
|
+
|
296
|
+
test "value is String 'TrUe'" do
|
297
|
+
expect = true
|
298
|
+
result = Typecast::MinimalTypecast.new(least_task).as_boolean('TrUe')
|
299
|
+
assert_equal(expect, result)
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
sub_test_case 'return nil' do
|
304
|
+
test 'value is nil' do
|
305
|
+
expect = nil
|
306
|
+
result = Typecast::MinimalTypecast.new(least_task).as_boolean(nil)
|
307
|
+
assert_equal(expect, result)
|
308
|
+
end
|
309
|
+
|
310
|
+
test 'value is empty String' do
|
311
|
+
expect = nil
|
312
|
+
result = Typecast::MinimalTypecast.new(least_task).as_string('')
|
313
|
+
assert_equal(expect, result)
|
314
|
+
end
|
315
|
+
|
316
|
+
test 'value and null_string is `\N`' do
|
317
|
+
expect = nil
|
318
|
+
result = Typecast::MinimalTypecast.new(least_task.tap{|t|t['null_string'] = '\N'}).as_string('\N')
|
319
|
+
assert_equal(expect, result)
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
sub_test_case 'call TypecastError' do
|
324
|
+
test 'value is unable to typecast to String' do
|
325
|
+
assert_embulk_raise TypecastError do
|
326
|
+
Typecast::MinimalTypecast.new(least_task).as_boolean('test')
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
test "value is String 'y'" do
|
331
|
+
assert_embulk_raise TypecastError do
|
332
|
+
Typecast::MinimalTypecast.new(least_task).as_boolean('y')
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
test "value is String 'n'" do
|
337
|
+
assert_embulk_raise TypecastError do
|
338
|
+
Typecast::MinimalTypecast.new(least_task).as_boolean('y')
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
test "value is String 't'" do
|
343
|
+
assert_embulk_raise TypecastError do
|
344
|
+
Typecast::MinimalTypecast.new(least_task).as_boolean('t')
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
test "value is String 'f'" do
|
349
|
+
assert_embulk_raise TypecastError do
|
350
|
+
Typecast::MinimalTypecast.new(least_task).as_boolean('f')
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
test 'value is Hash' do
|
355
|
+
assert_embulk_raise TypecastError do
|
356
|
+
Typecast::MinimalTypecast.new(least_task).as_boolean({'test' => 1})
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
test 'value is Array' do
|
361
|
+
assert_embulk_raise TypecastError do
|
362
|
+
Typecast::MinimalTypecast.new(least_task).as_boolean([1, 2, 3])
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
test "value is String 'no'" do
|
367
|
+
assert_embulk_raise TypecastError do
|
368
|
+
Typecast::MinimalTypecast.new(least_task).as_boolean('no')
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
test "value is String '0'" do
|
373
|
+
assert_embulk_raise TypecastError do
|
374
|
+
Typecast::MinimalTypecast.new(least_task).as_boolean('0')
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
test 'value is 0' do
|
379
|
+
assert_embulk_raise TypecastError do
|
380
|
+
Typecast::MinimalTypecast.new(least_task).as_boolean(0)
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
test "value is String 'yes'" do
|
385
|
+
assert_embulk_raise TypecastError do
|
386
|
+
Typecast::MinimalTypecast.new(least_task).as_boolean('yes')
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
390
|
+
test "value is String '1'" do
|
391
|
+
assert_embulk_raise TypecastError do
|
392
|
+
Typecast::MinimalTypecast.new(least_task).as_boolean('1')
|
393
|
+
end
|
394
|
+
end
|
395
|
+
|
396
|
+
test 'value is 1' do
|
397
|
+
assert_embulk_raise TypecastError do
|
398
|
+
Typecast::MinimalTypecast.new(least_task).as_boolean(1)
|
399
|
+
end
|
400
|
+
end
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
sub_test_case 'as_timestamp' do
|
405
|
+
sub_test_case 'return Time' do
|
406
|
+
sub_test_case 'no timestamp_format, no timezone' do
|
407
|
+
test 'value is String with timezone' do
|
408
|
+
expect = Time.parse('2015-12-15 09:31:09 UTC')
|
409
|
+
result = Typecast::MinimalTypecast.new(least_task).as_timestamp('2015-12-15 09:31:09 UTC')
|
410
|
+
assert_equal(expect, result)
|
411
|
+
end
|
412
|
+
|
413
|
+
test 'value is String without timezone' do
|
414
|
+
expect = Time.parse('2015-12-15 09:31:09 JST')
|
415
|
+
result = Typecast::MinimalTypecast.new(least_task).as_timestamp('2015-12-15 09:31:09')
|
416
|
+
assert_equal(expect, result)
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
sub_test_case 'has timestamp_format, no timezone' do
|
421
|
+
test 'value is JST' do
|
422
|
+
expect = Time.parse('2001-02-03 06:05:04 +0900')
|
423
|
+
result = Typecast::MinimalTypecast.new(least_task).as_timestamp('2001-02-03T04:05:06+09:00', '%Y-%m-%dT%S:%M:%H%z')
|
424
|
+
assert_equal(expect, result)
|
425
|
+
end
|
426
|
+
|
427
|
+
test 'value is UTC' do
|
428
|
+
expect = Time.parse('2001-02-03 06:05:04 UTC')
|
429
|
+
result = Typecast::MinimalTypecast.new(least_task).as_timestamp('2001-02-03T04:05:06UTC', '%Y-%m-%dT%S:%M:%H%Z')
|
430
|
+
assert_equal(expect, result)
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
434
|
+
sub_test_case 'no timestamp_format, has timezone' do
|
435
|
+
test 'value is String without timezone' do
|
436
|
+
expect = Time.parse('2015-12-15 09:31:09 JST')
|
437
|
+
result = Typecast::MinimalTypecast.new(least_task).as_timestamp('2015-12-15 09:31:09', nil, 'Asia/Tokyo')
|
438
|
+
assert_equal(expect, result)
|
439
|
+
end
|
440
|
+
|
441
|
+
test 'value is String with timezone' do
|
442
|
+
expect = Time.parse('2015-12-15 09:31:09 JST')
|
443
|
+
result = Typecast::MinimalTypecast.new(least_task).as_timestamp('2015-12-15 09:31:09 UTC', nil, 'Asia/Tokyo')
|
444
|
+
assert_equal(expect, result)
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
sub_test_case 'has timestamp_format, has timezone' do
|
449
|
+
test 'value is without timezone' do
|
450
|
+
expect = Time.parse('2001-02-03 06:05:04 JST')
|
451
|
+
result = Typecast::MinimalTypecast.new(least_task).as_timestamp('2001-02-03T04:05:06', '%Y-%m-%dT%S:%M:%H', 'Asia/Tokyo')
|
452
|
+
assert_equal(expect, result)
|
453
|
+
end
|
454
|
+
|
455
|
+
test 'value is with timezone' do
|
456
|
+
expect = Time.parse('2001-02-03 06:05:04 UTC')
|
457
|
+
result = Typecast::MinimalTypecast.new(least_task).as_timestamp('2001/02/03T06:05:04+00:00', '%Y/%m/%dT%H:%M:%S%z', 'Asia/Tokyo')
|
458
|
+
assert_equal(expect, result)
|
459
|
+
end
|
460
|
+
end
|
461
|
+
end
|
462
|
+
|
463
|
+
sub_test_case 'return nil' do
|
464
|
+
test 'value is nil' do
|
465
|
+
expect = nil
|
466
|
+
result = Typecast::MinimalTypecast.new(least_task).as_timestamp(nil)
|
467
|
+
assert_equal(expect, result)
|
468
|
+
end
|
469
|
+
|
470
|
+
test 'value is empty String' do
|
471
|
+
expect = nil
|
472
|
+
result = Typecast::MinimalTypecast.new(least_task).as_string('')
|
473
|
+
assert_equal(expect, result)
|
474
|
+
end
|
475
|
+
|
476
|
+
test 'value and null_string is `\N`' do
|
477
|
+
expect = nil
|
478
|
+
result = Typecast::MinimalTypecast.new(least_task.tap{|t|t['null_string'] = '\N'}).as_string('\N')
|
479
|
+
assert_equal(expect, result)
|
480
|
+
end
|
481
|
+
end
|
482
|
+
|
483
|
+
sub_test_case 'call TypecastError' do
|
484
|
+
test 'invalid timezone format' do
|
485
|
+
assert_embulk_raise TypecastError do
|
486
|
+
Typecast::MinimalTypecast.new(least_task).as_timestamp('2015-12-15 09:31:09 UTC', nil, 'JST')
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
490
|
+
test 'value is TrueClass' do
|
491
|
+
assert_embulk_raise TypecastError do
|
492
|
+
Typecast::MinimalTypecast.new(least_task).as_timestamp(true)
|
493
|
+
end
|
494
|
+
end
|
495
|
+
|
496
|
+
test 'value is FalseClass' do
|
497
|
+
assert_embulk_raise TypecastError do
|
498
|
+
Typecast::MinimalTypecast.new(least_task).as_timestamp(false)
|
499
|
+
end
|
500
|
+
end
|
501
|
+
|
502
|
+
test 'value is unable to typecast to String' do
|
503
|
+
assert_embulk_raise TypecastError do
|
504
|
+
Typecast::MinimalTypecast.new(least_task).as_timestamp('test')
|
505
|
+
end
|
506
|
+
end
|
507
|
+
|
508
|
+
test 'value is Hash' do
|
509
|
+
assert_embulk_raise TypecastError do
|
510
|
+
Typecast::MinimalTypecast.new(least_task).as_timestamp({'test' => 1})
|
511
|
+
end
|
512
|
+
end
|
513
|
+
|
514
|
+
test 'value is Array' do
|
515
|
+
assert_embulk_raise TypecastError do
|
516
|
+
Typecast::MinimalTypecast.new(least_task).as_timestamp([1, 2, 3])
|
517
|
+
end
|
518
|
+
end
|
519
|
+
end
|
520
|
+
end
|
521
|
+
|
522
|
+
sub_test_case 'as_json' do
|
523
|
+
sub_test_case 'return String' do
|
524
|
+
test 'value is String' do
|
525
|
+
expect = {'hoge' => 'fuga'}
|
526
|
+
result = Typecast::MinimalTypecast.new(least_task).as_json('{"hoge":"fuga"}')
|
527
|
+
assert_equal(expect, result)
|
528
|
+
end
|
529
|
+
|
530
|
+
test 'value is true' do
|
531
|
+
expect = true
|
532
|
+
result = Typecast::MinimalTypecast.new(least_task).as_json(true)
|
533
|
+
assert_equal(expect, result)
|
534
|
+
end
|
535
|
+
|
536
|
+
test 'value is false' do
|
537
|
+
expect = false
|
538
|
+
result = Typecast::MinimalTypecast.new(least_task).as_json(false)
|
539
|
+
assert_equal(expect, result)
|
540
|
+
end
|
541
|
+
|
542
|
+
test 'value is Fixnum' do
|
543
|
+
expect = 10
|
544
|
+
result = Typecast::MinimalTypecast.new(least_task).as_json(10)
|
545
|
+
assert_equal(expect, result)
|
546
|
+
end
|
547
|
+
|
548
|
+
test 'value is Bignum' do
|
549
|
+
expect = 10000000000000000000
|
550
|
+
result = Typecast::MinimalTypecast.new(least_task).as_json(10000000000000000000)
|
551
|
+
assert_equal(expect, result)
|
552
|
+
end
|
553
|
+
|
554
|
+
test 'value is Float' do
|
555
|
+
expect = 5.5
|
556
|
+
result = Typecast::MinimalTypecast.new(least_task).as_json(5.5)
|
557
|
+
assert_equal(expect, result)
|
558
|
+
end
|
559
|
+
|
560
|
+
test 'value is Hash' do
|
561
|
+
expect = {'test' => 1}
|
562
|
+
result = Typecast::MinimalTypecast.new(least_task).as_json({'test' => 1})
|
563
|
+
assert_equal(expect, result)
|
564
|
+
end
|
565
|
+
|
566
|
+
test 'value is Array' do
|
567
|
+
expect = [1,2,3]
|
568
|
+
result = Typecast::MinimalTypecast.new(least_task).as_json([1, 2, 3])
|
569
|
+
assert_equal(expect, result)
|
570
|
+
end
|
571
|
+
end
|
572
|
+
|
573
|
+
sub_test_case 'return nil' do
|
574
|
+
test 'value is nil' do
|
575
|
+
expect = nil
|
576
|
+
result = Typecast::MinimalTypecast.new(least_task).as_json(nil)
|
577
|
+
assert_equal(expect, result)
|
578
|
+
end
|
579
|
+
|
580
|
+
test 'value is empty String' do
|
581
|
+
expect = nil
|
582
|
+
result = Typecast::MinimalTypecast.new(least_task).as_string('')
|
583
|
+
assert_equal(expect, result)
|
584
|
+
end
|
585
|
+
|
586
|
+
test 'value and null_string is `\N`' do
|
587
|
+
expect = nil
|
588
|
+
result = Typecast::MinimalTypecast.new(least_task.tap{|t|t['null_string'] = '\N'}).as_string('\N')
|
589
|
+
assert_equal(expect, result)
|
590
|
+
end
|
591
|
+
end
|
592
|
+
|
593
|
+
sub_test_case 'call TypecastError' do
|
594
|
+
test 'value is not JSON String' do
|
595
|
+
assert_embulk_raise TypecastError do
|
596
|
+
Typecast::MinimalTypecast.new(least_task).as_json('hoge')
|
597
|
+
end
|
598
|
+
end
|
599
|
+
|
600
|
+
test 'value is Time class' do
|
601
|
+
assert_embulk_raise TypecastError do
|
602
|
+
Typecast::MinimalTypecast.new(least_task).as_json(Time.at(1475572099))
|
603
|
+
end
|
604
|
+
end
|
605
|
+
|
606
|
+
test 'value is unknown class' do
|
607
|
+
assert_embulk_raise TypecastError do
|
608
|
+
Typecast::MinimalTypecast.new(least_task).as_json(self)
|
609
|
+
end
|
610
|
+
end
|
611
|
+
end
|
612
|
+
end
|
613
|
+
end
|
614
|
+
|
615
|
+
end
|
616
|
+
end
|