embulk 0.8.36 → 0.8.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/build.gradle +8 -4
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +34 -7
- data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampParser.java +232 -0
- data/embulk-docs/src/release.rst +1 -0
- data/embulk-docs/src/release/release-0.8.37.rst +20 -0
- data/embulk-jruby-strptime/src/main/java/org/embulk/spi/time/StrptimeFormat.java +1 -1
- data/embulk-jruby-strptime/src/main/java/org/embulk/spi/time/StrptimeParser.java +1 -1
- data/embulk-jruby-strptime/src/main/java/org/embulk/spi/time/StrptimeToken.java +1 -1
- data/lib/embulk/java/bootstrap.rb +1 -1
- data/lib/embulk/version.rb +1 -1
- data/test/{mri → monkey_strptime/mri}/date/test_date_strptime.rb +0 -0
- data/test/{run-test.rb → monkey_strptime/run-test.rb} +3 -2
- data/test/{guess → vanilla/guess}/test_csv_all_strings.rb +0 -0
- data/test/{guess → vanilla/guess}/test_csv_guess.rb +0 -0
- data/test/{guess → vanilla/guess}/test_schema_guess.rb +0 -0
- data/test/{guess → vanilla/guess}/test_time_format_guess.rb +0 -0
- data/test/vanilla/run-test.rb +14 -0
- data/test/vanilla/time/test_timestamp_parser.rb +102 -0
- metadata +24 -21
- data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelper.java +0 -8
- data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelperFactory.java +0 -6
- data/lib/embulk/java/time_helper.rb +0 -79
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b48d88dbd34d7791315fabde49b264dab335024b
|
4
|
+
data.tar.gz: 08b8a533ac632ec41afc94dbe7106891a1ae854f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 612667193d1ef43cfd11ae9c87faad0aeb1db3dc51d81834e97cafef48a8b4333dd57b28f982f3a0e91b8499c5fd454500b483a6fade6ce3ff18b2c276b5a55d
|
7
|
+
data.tar.gz: 84aa864147d51d67626a52917d63b99ab70e2a9c85b7e04ea735789073ad598681263544ac204893a026721011cbbe9f74b6c3a1b056a64d9e6b7c5cf79d6ee3
|
data/build.gradle
CHANGED
@@ -24,7 +24,7 @@ def release_projects = [project(":embulk-core"), project(":embulk-standards"), p
|
|
24
24
|
|
25
25
|
allprojects {
|
26
26
|
group = 'org.embulk'
|
27
|
-
version = '0.8.
|
27
|
+
version = '0.8.37'
|
28
28
|
|
29
29
|
ext {
|
30
30
|
jrubyVersion = '9.1.13.0'
|
@@ -276,10 +276,14 @@ project(':embulk-cli') {
|
|
276
276
|
}
|
277
277
|
}
|
278
278
|
|
279
|
-
task
|
280
|
-
jrubyArgs '-Ilib', '-Itest', '-rtest/unit', '--debug', './test/run-test.rb'
|
279
|
+
task rubyTestVanilla(type: JRubyExec, dependsOn: "classpath") {
|
280
|
+
jrubyArgs '-Ilib', '-Itest', '-rtest/unit', '--debug', './test/vanilla/run-test.rb'
|
281
|
+
}
|
282
|
+
task rubyTestMonkeyStrptime(type: JRubyExec, dependsOn: "classpath") {
|
283
|
+
jrubyArgs '-Ilib', '-Itest', '-rtest/unit', '--debug', './test/monkey_strptime/run-test.rb'
|
284
|
+
}
|
285
|
+
task rubyTest(dependsOn: ["rubyTestVanilla", "rubyTestMonkeyStrptime"]) {
|
281
286
|
}
|
282
|
-
rubyTest.dependsOn('classpath')
|
283
287
|
|
284
288
|
//
|
285
289
|
// gem task
|
@@ -57,6 +57,12 @@ public class TimestampFormat
|
|
57
57
|
|
58
58
|
public static DateTimeZone parseDateTimeZone(String s)
|
59
59
|
{
|
60
|
+
final int rubyStyleTimeOffsetInSecond = TimeZoneConverter.dateZoneToDiff(s);
|
61
|
+
|
62
|
+
if (rubyStyleTimeOffsetInSecond != Integer.MIN_VALUE) {
|
63
|
+
return DateTimeZone.forOffsetMillis(rubyStyleTimeOffsetInSecond * 1000);
|
64
|
+
}
|
65
|
+
|
60
66
|
if(s.startsWith("+") || s.startsWith("-")) {
|
61
67
|
return DateTimeZone.forID(s);
|
62
68
|
|
@@ -187,7 +187,7 @@ public class TimestampParser
|
|
187
187
|
// TODO cache parsed zone?
|
188
188
|
timeZone = parseDateTimeZone(zone);
|
189
189
|
if (timeZone == null) {
|
190
|
-
throw new TimestampParseException("Invalid time zone name '" + text + "'");
|
190
|
+
throw new TimestampParseException("Invalid time zone name '" + zone + "' in '" + text + "'");
|
191
191
|
}
|
192
192
|
}
|
193
193
|
else {
|
@@ -201,7 +201,24 @@ public class TimestampParser
|
|
201
201
|
public LocalTime createLocalTimeFromFormatBag(FormatBag bag)
|
202
202
|
{
|
203
203
|
final long secFractionNsec;
|
204
|
-
if (FormatBag.has(bag.
|
204
|
+
if (FormatBag.has(bag.getSecondsSize())) { // %Q is specified.
|
205
|
+
// Fractions by %Q are prioritized over fractions by %N.
|
206
|
+
// irb(main):002:0> Time.strptime("123456789 12.345", "%Q %S.%N").nsec
|
207
|
+
// => 789000000
|
208
|
+
// irb(main):003:0> Time.strptime("12.345 123456789", "%S.%N %Q").nsec
|
209
|
+
// => 789000000
|
210
|
+
// irb(main):004:0> Time.strptime("12.345", "%S.%N").nsec
|
211
|
+
// => 345000000
|
212
|
+
if (bag.hasSeconds()) {
|
213
|
+
secFractionNsec = (bag.getSeconds() % (int)Math.pow(10, bag.getSecondsSize())) *
|
214
|
+
(int)Math.pow(10, 9 - bag.getSecondsSize());
|
215
|
+
}
|
216
|
+
else {
|
217
|
+
// It must not happen -- |seconds| is always set if |secondsSize| is set.
|
218
|
+
secFractionNsec = 0;
|
219
|
+
}
|
220
|
+
}
|
221
|
+
else if (FormatBag.has(bag.getSecFraction())) {
|
205
222
|
secFractionNsec = bag.getSecFraction() * (int)Math.pow(10, 9 - bag.getSecFractionSize());
|
206
223
|
}
|
207
224
|
else {
|
@@ -228,11 +245,16 @@ public class TimestampParser
|
|
228
245
|
|
229
246
|
// set up with min this and then add to allow rolling over
|
230
247
|
DateTime dt = new DateTime(year, 1, 1, 0, 0, 0, 0, DateTimeZone.UTC);
|
231
|
-
if (FormatBag.has(bag.
|
232
|
-
dt = dt.
|
248
|
+
if (FormatBag.has(bag.getYDay())) { // yday is more prioritized than mon/mday in Ruby's strptime.
|
249
|
+
dt = dt.plusDays(bag.getYDay() - 1);
|
233
250
|
}
|
234
|
-
|
235
|
-
|
251
|
+
else {
|
252
|
+
if (FormatBag.has(bag.getMon())) {
|
253
|
+
dt = dt.plusMonths(bag.getMon() - 1);
|
254
|
+
}
|
255
|
+
if (FormatBag.has(bag.getMDay())) {
|
256
|
+
dt = dt.plusDays(bag.getMDay() - 1);
|
257
|
+
}
|
236
258
|
}
|
237
259
|
if (FormatBag.has(bag.getHour())) {
|
238
260
|
dt = dt.plusHours(bag.getHour());
|
@@ -241,7 +263,12 @@ public class TimestampParser
|
|
241
263
|
dt = dt.plusMinutes(bag.getMin());
|
242
264
|
}
|
243
265
|
if (FormatBag.has(bag.getSec())) {
|
244
|
-
|
266
|
+
if (bag.getSec() == 60) { // Leap seconds are considered as 59 when Ruby converts them to epochs.
|
267
|
+
dt = dt.plusSeconds(59);
|
268
|
+
}
|
269
|
+
else {
|
270
|
+
dt = dt.plusSeconds(bag.getSec());
|
271
|
+
}
|
245
272
|
}
|
246
273
|
sec = dt.getMillis() / 1000;
|
247
274
|
}
|
@@ -0,0 +1,232 @@
|
|
1
|
+
package org.embulk.spi.time;
|
2
|
+
|
3
|
+
import static org.junit.Assert.assertEquals;
|
4
|
+
import static org.junit.Assert.fail;
|
5
|
+
|
6
|
+
import org.joda.time.DateTimeZone;
|
7
|
+
import org.junit.Test;
|
8
|
+
|
9
|
+
/**
|
10
|
+
* TestTimestampParser tests org.embulk.spi.time.TimestampParser.
|
11
|
+
*
|
12
|
+
* Some test cases are imported from Ruby v2.3.1's test/date/test_date_strptime.rb. See its COPYING for license.
|
13
|
+
*
|
14
|
+
* @see <a href="https://svn.ruby-lang.org/cgi-bin/viewvc.cgi/tags/v2_3_1/test/date/test_date_strptime.rb?view=markup">test/date/test_date_strptime.rb</a>
|
15
|
+
* @see <a href="https://svn.ruby-lang.org/cgi-bin/viewvc.cgi/tags/v2_3_1/COPYING?view=markup">COPYING</a>
|
16
|
+
*/
|
17
|
+
public class TestTimestampParser {
|
18
|
+
@Test // Imported from test__strptime__3 in Ruby v2.3.1's test/date/test_date_strptime.rb.
|
19
|
+
public void test__strptime__3_iso8601() {
|
20
|
+
testToParse("2001-02-03", "%Y-%m-%d", 981158400L);
|
21
|
+
testToParse("2001-02-03T23:59:60", "%Y-%m-%dT%H:%M:%S", 981244799L);
|
22
|
+
testToParse("2001-02-03T23:59:60+09:00", "%Y-%m-%dT%H:%M:%S%Z", 981212399L);
|
23
|
+
testToParse("-2001-02-03T23:59:60+09:00", "%Y-%m-%dT%H:%M:%S%Z", -125309754001L);
|
24
|
+
testToParse("+012345-02-03T23:59:60+09:00", "%Y-%m-%dT%H:%M:%S%Z", 327406287599L);
|
25
|
+
testToParse("-012345-02-03T23:59:60+09:00", "%Y-%m-%dT%H:%M:%S%Z", -451734829201L);
|
26
|
+
}
|
27
|
+
|
28
|
+
@Test // Imported from test__strptime__3 in Ruby v2.3.1's test/date/test_date_strptime.rb.
|
29
|
+
public void test__strptime__3_ctime3_asctime3() {
|
30
|
+
testToParse("Thu Jul 29 14:47:19 1999", "%c", 933259639L);
|
31
|
+
testToParse("Thu Jul 29 14:47:19 -1999", "%c", -125231389961L);
|
32
|
+
}
|
33
|
+
|
34
|
+
@Test // Imported from test__strptime__3 in Ruby v2.3.1's test/date/test_date_strptime.rb.
|
35
|
+
public void test__strptime__3_date1() {
|
36
|
+
testToParse("Thu Jul 29 16:39:41 EST 1999", "%a %b %d %H:%M:%S %Z %Y", 933284381L);
|
37
|
+
testToParse("Thu Jul 29 16:39:41 MET DST 1999", "%a %b %d %H:%M:%S %Z %Y", 933259181L);
|
38
|
+
// Their time zones are "AMT" actually in Ruby v2.3.1's tests, but "AST" is used here instead.
|
39
|
+
// "AMT" is not recognized even by Ruby v2.3.1's zonetab.
|
40
|
+
testToParse("Thu Jul 29 16:39:41 AST 1999", "%a %b %d %H:%M:%S %Z %Y", 933280781L);
|
41
|
+
testToParse("Thu Jul 29 16:39:41 AST -1999", "%a %b %d %H:%M:%S %Z %Y", -125231368819L);
|
42
|
+
testToParse("Thu Jul 29 16:39:41 GMT+09 1999", "%a %b %d %H:%M:%S %Z %Y", 933233981L);
|
43
|
+
testToParse("Thu Jul 29 16:39:41 GMT+0908 1999", "%a %b %d %H:%M:%S %Z %Y", 933233501L);
|
44
|
+
testToParse("Thu Jul 29 16:39:41 GMT+090807 1999", "%a %b %d %H:%M:%S %Z %Y", 933233494L);
|
45
|
+
testToParse("Thu Jul 29 16:39:41 GMT-09 1999", "%a %b %d %H:%M:%S %Z %Y", 933298781L);
|
46
|
+
testToParse("Thu Jul 29 16:39:41 GMT-09:08 1999", "%a %b %d %H:%M:%S %Z %Y", 933299261L);
|
47
|
+
testToParse("Thu Jul 29 16:39:41 GMT-09:08:07 1999", "%a %b %d %H:%M:%S %Z %Y", 933299268L);
|
48
|
+
testToParse("Thu Jul 29 16:39:41 GMT-3.5 1999", "%a %b %d %H:%M:%S %Z %Y", 933278981L);
|
49
|
+
testToParse("Thu Jul 29 16:39:41 GMT-3,5 1999", "%a %b %d %H:%M:%S %Z %Y", 933278981L);
|
50
|
+
testToParse("Thu Jul 29 16:39:41 Mountain Daylight Time 1999", "%a %b %d %H:%M:%S %Z %Y", 933287981L);
|
51
|
+
testToParse("Thu Jul 29 16:39:41 E. Australia Standard Time 1999", "%a %b %d %H:%M:%S %Z %Y", 933230381L);
|
52
|
+
}
|
53
|
+
|
54
|
+
@Test // Imported from test__strptime__3 in Ruby v2.3.1's test/date/test_date_strptime.rb.
|
55
|
+
public void test__strptime__3_rfc822() {
|
56
|
+
testToParse("Thu, 29 Jul 1999 09:54:21 UT", "%a, %d %b %Y %H:%M:%S %Z", 933242061L);
|
57
|
+
testToParse("Thu, 29 Jul 1999 09:54:21 GMT", "%a, %d %b %Y %H:%M:%S %Z", 933242061L);
|
58
|
+
testToParse("Thu, 29 Jul 1999 09:54:21 PDT", "%a, %d %b %Y %H:%M:%S %Z", 933267261L);
|
59
|
+
testToParse("Thu, 29 Jul 1999 09:54:21 z", "%a, %d %b %Y %H:%M:%S %Z", 933242061L);
|
60
|
+
testToParse("Thu, 29 Jul 1999 09:54:21 +0900", "%a, %d %b %Y %H:%M:%S %Z", 933209661L);
|
61
|
+
testToParse("Thu, 29 Jul 1999 09:54:21 +0430", "%a, %d %b %Y %H:%M:%S %Z", 933225861L);
|
62
|
+
testToParse("Thu, 29 Jul 1999 09:54:21 -0430", "%a, %d %b %Y %H:%M:%S %Z", 933258261L);
|
63
|
+
testToParse("Thu, 29 Jul -1999 09:54:21 -0430", "%a, %d %b %Y %H:%M:%S %Z", -125231391339L);
|
64
|
+
}
|
65
|
+
|
66
|
+
@Test // Imported from test__strptime__3 in Ruby v2.3.1's test/date/test_date_strptime.rb.
|
67
|
+
public void test__strptime__3_etc() {
|
68
|
+
testToParse("06-DEC-99", "%d-%b-%y", 944438400L);
|
69
|
+
testToParse("sUnDay oCtoBer 31 01", "%A %B %d %y", 1004486400L);
|
70
|
+
// Their "\u000b" are actually "\v" in Ruby v2.3.1's tests. "\v" is not recognized as a character in Java.
|
71
|
+
testToParse("October\t\n\u000b\f\r 15,\t\n\u000b\f\r99", "%B %d, %y", 939945600L);
|
72
|
+
testToParse("October\t\n\u000b\f\r 15,\t\n\u000b\f\r99", "%B%t%d,%n%y", 939945600L);
|
73
|
+
|
74
|
+
testToParse("09:02:11 AM", "%I:%M:%S %p", 81955357331L);
|
75
|
+
testToParse("09:02:11 A.M.", "%I:%M:%S %p", 81955357331L);
|
76
|
+
testToParse("09:02:11 PM", "%I:%M:%S %p", 81955400531L);
|
77
|
+
testToParse("09:02:11 P.M.", "%I:%M:%S %p", 81955400531L);
|
78
|
+
|
79
|
+
testToParse("12:33:44 AM", "%r", 81955326824L);
|
80
|
+
testToParse("01:33:44 AM", "%r", 81955330424L);
|
81
|
+
testToParse("11:33:44 AM", "%r", 81955366424L);
|
82
|
+
testToParse("12:33:44 PM", "%r", 81955370024L);
|
83
|
+
testToParse("01:33:44 PM", "%r", 81955373624L);
|
84
|
+
testToParse("11:33:44 PM", "%r", 81955409624L);
|
85
|
+
|
86
|
+
// Their time zones are "AMT" actually in Ruby v2.3.1's tests, but "AST" is used here instead.
|
87
|
+
// "AMT" is not recognized even by Ruby v2.3.1's zonetab.
|
88
|
+
testToParse("11:33:44 PM AST", "%I:%M:%S %p %Z", 81955424024L);
|
89
|
+
testToParse("11:33:44 P.M. AST", "%I:%M:%S %p %Z", 81955424024L);
|
90
|
+
|
91
|
+
testToParse("fri1feb034pm+5", "%a%d%b%y%H%p%Z", 1044097200L);
|
92
|
+
}
|
93
|
+
|
94
|
+
@Test // Imported from test__strptime__width in Ruby v2.3.1's test/date/test_date_strptime.rb.
|
95
|
+
public void test__strptime__width() {
|
96
|
+
testToParse("99", "%y", 917049600L);
|
97
|
+
testToParse("01", "%y", 980208000L);
|
98
|
+
testToParse("19 99", "%C %y", 917049600L);
|
99
|
+
testToParse("20 01", "%C %y", 980208000L);
|
100
|
+
testToParse("30 99", "%C %y", 35629718400L);
|
101
|
+
testToParse("30 01", "%C %y", 32537116800L);
|
102
|
+
testToParse("1999", "%C%y", 917049600L);
|
103
|
+
testToParse("2001", "%C%y", 980208000L);
|
104
|
+
testToParse("3099", "%C%y", 35629718400L);
|
105
|
+
testToParse("3001", "%C%y", 32537116800L);
|
106
|
+
|
107
|
+
testToParse("20060806", "%Y", 632995726752000L);
|
108
|
+
// Its " " is actually "\s" in Ruby v2.3.1's tests. "\s" is not recognized as a character in Java.
|
109
|
+
testToParse("20060806", "%Y ", 632995726752000L);
|
110
|
+
testToParse("20060806", "%Y%m%d", 1154822400L);
|
111
|
+
testToParse("2006908906", "%Y9%m9%d", 1154822400L);
|
112
|
+
testToParse("12006 08 06", "%Y %m %d", 316724342400L);
|
113
|
+
testToParse("12006-08-06", "%Y-%m-%d", 316724342400L);
|
114
|
+
testToParse("200608 6", "%Y%m%e", 1154822400L);
|
115
|
+
|
116
|
+
testToParse("2006333", "%Y%j", 1164758400L);
|
117
|
+
testToParse("20069333", "%Y9%j", 1164758400L);
|
118
|
+
testToParse("12006 333", "%Y %j", 316734278400L);
|
119
|
+
testToParse("12006-333", "%Y-%j", 316734278400L);
|
120
|
+
|
121
|
+
testToParse("232425", "%H%M%S", 81955409065L);
|
122
|
+
testToParse("23924925", "%H9%M9%S", 81955409065L);
|
123
|
+
testToParse("23 24 25", "%H %M %S", 81955409065L);
|
124
|
+
testToParse("23:24:25", "%H:%M:%S", 81955409065L);
|
125
|
+
testToParse(" 32425", "%k%M%S", 81955337065L);
|
126
|
+
testToParse(" 32425", "%l%M%S", 81955337065L);
|
127
|
+
|
128
|
+
// They are intentionally skipped as a month and a day of week are not sufficient to build a timestamp.
|
129
|
+
// [['FriAug', '%a%b'], [nil,8,nil,nil,nil,nil,nil,nil,5], __LINE__],
|
130
|
+
// [['FriAug', '%A%B'], [nil,8,nil,nil,nil,nil,nil,nil,5], __LINE__],
|
131
|
+
// [['FridayAugust', '%A%B'], [nil,8,nil,nil,nil,nil,nil,nil,5], __LINE__],
|
132
|
+
// [['FridayAugust', '%a%b'], [nil,8,nil,nil,nil,nil,nil,nil,5], __LINE__],
|
133
|
+
}
|
134
|
+
|
135
|
+
@Test // Imported from test__strptime__fail in Ruby v2.3.1's test/date/test_date_strptime.rb.
|
136
|
+
public void test__strptime__fail() {
|
137
|
+
testToParse("2001.", "%Y.", 980208000L);
|
138
|
+
// Its " " is actually "\s" in Ruby v2.3.1's tests. "\s" is not recognized as a character in Java.
|
139
|
+
testToParse("2001. ", "%Y.", 980208000L);
|
140
|
+
testToParse("2001.", "%Y. ", 980208000L);
|
141
|
+
// Its " " is actually "\s" in Ruby v2.3.1's tests. "\s" is not recognized as a character in Java.
|
142
|
+
testToParse("2001. ", "%Y. ", 980208000L);
|
143
|
+
|
144
|
+
failToParse("2001", "%Y.");
|
145
|
+
// Its " " is actually "\s" in Ruby v2.3.1's tests. "\s" is not recognized as a character in Java.
|
146
|
+
failToParse("2001 ", "%Y.");
|
147
|
+
failToParse("2001", "%Y. ");
|
148
|
+
// Its " " is actually "\s" in Ruby v2.3.1's tests. "\s" is not recognized as a character in Java.
|
149
|
+
failToParse("2001 ", "%Y. ");
|
150
|
+
|
151
|
+
failToParse("2001-13-31", "%Y-%m-%d");
|
152
|
+
failToParse("2001-12-00", "%Y-%m-%d");
|
153
|
+
failToParse("2001-12-32", "%Y-%m-%d");
|
154
|
+
failToParse("2001-12-00", "%Y-%m-%e");
|
155
|
+
failToParse("2001-12-32", "%Y-%m-%e");
|
156
|
+
failToParse("2001-12-31", "%y-%m-%d");
|
157
|
+
|
158
|
+
failToParse("2004-000", "%Y-%j");
|
159
|
+
failToParse("2004-367", "%Y-%j");
|
160
|
+
failToParse("2004-366", "%y-%j");
|
161
|
+
|
162
|
+
testToParse("24:59:59", "%H:%M:%S", 81955414799L);
|
163
|
+
testToParse("24:59:59", "%k:%M:%S", 81955414799L);
|
164
|
+
testToParse("24:59:60", "%H:%M:%S", 81955414799L);
|
165
|
+
testToParse("24:59:60", "%k:%M:%S", 81955414799L);
|
166
|
+
|
167
|
+
failToParse("24:60:59", "%H:%M:%S");
|
168
|
+
failToParse("24:60:59", "%k:%M:%S");
|
169
|
+
failToParse("24:59:61", "%H:%M:%S");
|
170
|
+
failToParse("24:59:61", "%k:%M:%S");
|
171
|
+
failToParse("00:59:59", "%I:%M:%S");
|
172
|
+
failToParse("13:59:59", "%I:%M:%S");
|
173
|
+
failToParse("00:59:59", "%l:%M:%S");
|
174
|
+
failToParse("13:59:59", "%l:%M:%S");
|
175
|
+
|
176
|
+
testToParse("0", "%U", 81955324800L);
|
177
|
+
failToParse("54", "%U");
|
178
|
+
testToParse("0", "%W", 81955324800L);
|
179
|
+
failToParse("54", "%W");
|
180
|
+
failToParse("0", "%V");
|
181
|
+
failToParse("54", "%V");
|
182
|
+
failToParse("0", "%u");
|
183
|
+
testToParse("7", "%u", 81955324800L);
|
184
|
+
testToParse("0", "%w", 81955324800L);
|
185
|
+
failToParse("7", "%w");
|
186
|
+
|
187
|
+
failToParse("Sanday", "%A");
|
188
|
+
failToParse("Jenuary", "%B");
|
189
|
+
testToParse("Sundai", "%A", 81955324800L);
|
190
|
+
testToParse("Januari", "%B", 81955324800L);
|
191
|
+
failToParse("Sundai,", "%A,");
|
192
|
+
failToParse("Januari,", "%B,");
|
193
|
+
}
|
194
|
+
|
195
|
+
@Test // Imported partially from test_strptime in Ruby v2.3.1's test/date/test_date_strptime.rb.
|
196
|
+
public void test_strptime() {
|
197
|
+
testToParse("2002-03-14T11:22:33Z", "%Y-%m-%dT%H:%M:%S%Z", 1016104953L);
|
198
|
+
testToParse("2002-03-14T11:22:33+09:00", "%Y-%m-%dT%H:%M:%S%Z", 1016072553L);
|
199
|
+
testToParse("2002-03-14T11:22:33-09:00", "%FT%T%Z", 1016137353L);
|
200
|
+
testToParse("2002-03-14T11:22:33.123456789-09:00", "%FT%T.%N%Z", 1016137353L, 123456789);
|
201
|
+
}
|
202
|
+
|
203
|
+
@Test // Imported from test_strptime__minus in Ruby v2.3.1's test/date/test_date_strptime.rb.
|
204
|
+
public void test_strptime__minus() {
|
205
|
+
testToParse("-1", "%s", -1L);
|
206
|
+
testToParse("-86400", "%s", -86400L);
|
207
|
+
|
208
|
+
testToParse("-999", "%Q", 0L, -999000000);
|
209
|
+
testToParse("-1000", "%Q", -1L);
|
210
|
+
}
|
211
|
+
|
212
|
+
private void testToParse(final String string, final String format, final long second, final int nanoOfSecond) {
|
213
|
+
final TimestampParser parser = new TimestampParser(format, DateTimeZone.UTC, "4567-01-23");
|
214
|
+
final Timestamp timestamp = parser.parse(string);
|
215
|
+
assertEquals(second, timestamp.getEpochSecond());
|
216
|
+
assertEquals(nanoOfSecond,timestamp.getNano());
|
217
|
+
}
|
218
|
+
|
219
|
+
private void testToParse(final String string, final String format, final long second) {
|
220
|
+
testToParse(string, format, second, 0);
|
221
|
+
}
|
222
|
+
|
223
|
+
private void failToParse(final String string, final String format) {
|
224
|
+
final TimestampParser parser = new TimestampParser(format, DateTimeZone.UTC, "4567-01-23");
|
225
|
+
try {
|
226
|
+
parser.parse(string);
|
227
|
+
} catch (TimestampParseException ex) {
|
228
|
+
return;
|
229
|
+
}
|
230
|
+
fail();
|
231
|
+
}
|
232
|
+
}
|
data/embulk-docs/src/release.rst
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
Release 0.8.37
|
2
|
+
==================================
|
3
|
+
|
4
|
+
General Changes
|
5
|
+
----------------
|
6
|
+
|
7
|
+
* Parse Ruby-style time zone names in addition [#833] [#840]
|
8
|
+
* Remove dead code around the Ruby timestamp parser replaced [#813] [#823]
|
9
|
+
|
10
|
+
Bug Fixes
|
11
|
+
----------
|
12
|
+
|
13
|
+
* Fix parsing leap seconds to get the same Timestamp with pure Ruby's [#842]
|
14
|
+
* Process yday (day of the year) in TimestampParser as well [#834] [#843]
|
15
|
+
* Fix nanoseconds set by StrptimeParser's %Q [#848]
|
16
|
+
|
17
|
+
|
18
|
+
Release Date
|
19
|
+
------------------
|
20
|
+
2017-11-21
|
@@ -36,7 +36,7 @@ enum StrptimeFormat
|
|
36
36
|
FORMAT_NANOSEC, // %N
|
37
37
|
FORMAT_MERIDIAN_LOWER_CASE, // %P
|
38
38
|
FORMAT_MERIDIAN, // %p
|
39
|
-
|
39
|
+
FORMAT_MILLISEC_EPOCH, // %Q Only for Date/DateTime from here
|
40
40
|
FORMAT_SECONDS, // %S
|
41
41
|
FORMAT_EPOCH, // %s
|
42
42
|
FORMAT_WEEK_YEAR_S, // %U
|
@@ -576,7 +576,7 @@ public class StrptimeParser
|
|
576
576
|
}
|
577
577
|
break;
|
578
578
|
}
|
579
|
-
case
|
579
|
+
case FORMAT_MILLISEC_EPOCH: { // %Q - Number of milliseconds since 1970-01-01 00:00:00 UTC.
|
580
580
|
boolean negative = false;
|
581
581
|
if (isMinus(text, pos)) {
|
582
582
|
negative = true;
|
@@ -39,7 +39,7 @@ public class StrptimeToken
|
|
39
39
|
CONVERSION2TOKEN['N'] = new StrptimeToken(FORMAT_NANOSEC);
|
40
40
|
CONVERSION2TOKEN['P'] = new StrptimeToken(FORMAT_MERIDIAN_LOWER_CASE);
|
41
41
|
CONVERSION2TOKEN['p'] = new StrptimeToken(FORMAT_MERIDIAN);
|
42
|
-
CONVERSION2TOKEN['Q'] = new StrptimeToken(
|
42
|
+
CONVERSION2TOKEN['Q'] = new StrptimeToken(FORMAT_MILLISEC_EPOCH);
|
43
43
|
CONVERSION2TOKEN['S'] = new StrptimeToken(FORMAT_SECONDS);
|
44
44
|
CONVERSION2TOKEN['s'] = new StrptimeToken(FORMAT_EPOCH);
|
45
45
|
CONVERSION2TOKEN['U'] = new StrptimeToken(FORMAT_WEEK_YEAR_S);
|
data/lib/embulk/version.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
module Embulk
|
4
4
|
@@warned = false
|
5
5
|
|
6
|
-
VERSION_INTERNAL = '0.8.
|
6
|
+
VERSION_INTERNAL = '0.8.37'
|
7
7
|
|
8
8
|
DEPRECATED_MESSAGE = 'Embulk::VERSION in (J)Ruby is deprecated. Use org.embulk.EmbulkVersion::VERSION instead. If this message is from a plugin, please tell this to the author of the plugin!'
|
9
9
|
def self.const_missing(name)
|
File without changes
|
@@ -1,10 +1,11 @@
|
|
1
|
-
base_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
1
|
+
base_dir = File.expand_path(File.join(File.dirname(__FILE__), "..", ".."))
|
2
2
|
lib_dir = File.join(base_dir, "lib")
|
3
3
|
test_dir = File.join(base_dir, "test")
|
4
4
|
|
5
5
|
$LOAD_PATH.unshift(lib_dir)
|
6
6
|
$LOAD_PATH.unshift(test_dir)
|
7
7
|
|
8
|
+
require "helper"
|
8
9
|
require "date"
|
9
10
|
require "test/unit"
|
10
11
|
|
@@ -21,7 +22,7 @@ module DateExt
|
|
21
22
|
end
|
22
23
|
Date.send(:include, DateExt)
|
23
24
|
|
24
|
-
Dir.glob("#{base_dir}/test/**/test{_,-}*.rb") do |file|
|
25
|
+
Dir.glob("#{base_dir}/test/monkey_strptime/**/test{_,-}*.rb") do |file|
|
25
26
|
require file.sub(/\.rb$/,"")
|
26
27
|
end
|
27
28
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,14 @@
|
|
1
|
+
base_dir = File.expand_path(File.join(File.dirname(__FILE__), "..", ".."))
|
2
|
+
lib_dir = File.join(base_dir, "lib")
|
3
|
+
test_dir = File.join(base_dir, "test")
|
4
|
+
|
5
|
+
$LOAD_PATH.unshift(lib_dir)
|
6
|
+
$LOAD_PATH.unshift(test_dir)
|
7
|
+
|
8
|
+
require "test/unit"
|
9
|
+
|
10
|
+
Dir.glob("#{base_dir}/test/vanilla/**/test{_,-}*.rb") do |file|
|
11
|
+
require file.sub(/\.rb$/,"")
|
12
|
+
end
|
13
|
+
|
14
|
+
exit Test::Unit::AutoRunner.run
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'date'
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
# TimestampParserTest test org.embulk.spi.time.TimestampParser by comparing with Ruby's DateTime.strptime.
|
6
|
+
#
|
7
|
+
# Some test cases are imported from Ruby v2.3.1's test/date/test_date_strptime.rb. See its COPYING for license.
|
8
|
+
#
|
9
|
+
# *{test/date/test_date_strptime.rb}[https://svn.ruby-lang.org/cgi-bin/viewvc.cgi/tags/v2_3_1/test/date/test_date_strptime.rb?view=markup]
|
10
|
+
# *{COPYING}[https://svn.ruby-lang.org/cgi-bin/viewvc.cgi/tags/v2_3_1/COPYING?view=markup]
|
11
|
+
|
12
|
+
class TimestampParserTest < ::Test::Unit::TestCase
|
13
|
+
def test__strptime__3
|
14
|
+
[
|
15
|
+
# iso8601
|
16
|
+
['2001-02-03', '%Y-%m-%d'],
|
17
|
+
['2001-02-03T23:59:60', '%Y-%m-%dT%H:%M:%S'],
|
18
|
+
['2001-02-03T23:59:60+09:00', '%Y-%m-%dT%H:%M:%S%Z'],
|
19
|
+
['-2001-02-03T23:59:60+09:00', '%Y-%m-%dT%H:%M:%S%Z'],
|
20
|
+
['+012345-02-03T23:59:60+09:00', '%Y-%m-%dT%H:%M:%S%Z'],
|
21
|
+
['-012345-02-03T23:59:60+09:00', '%Y-%m-%dT%H:%M:%S%Z'],
|
22
|
+
|
23
|
+
# ctime(3), asctime(3)
|
24
|
+
['Thu Jul 29 14:47:19 1999', '%c'],
|
25
|
+
['Thu Jul 29 14:47:19 -1999', '%c'],
|
26
|
+
|
27
|
+
# date(1)
|
28
|
+
['Thu Jul 29 16:39:41 EST 1999', '%a %b %d %H:%M:%S %Z %Y'],
|
29
|
+
['Thu Jul 29 16:39:41 MET DST 1999', '%a %b %d %H:%M:%S %Z %Y'],
|
30
|
+
# Their time zones are "AMT" actually in Ruby v2.3.1's tests, but "AST" is used here instead.
|
31
|
+
# "AMT" is not recognized even by Ruby v2.3.1's zonetab.
|
32
|
+
['Thu Jul 29 16:39:41 AST 1999', '%a %b %d %H:%M:%S %Z %Y'],
|
33
|
+
['Thu Jul 29 16:39:41 AST -1999', '%a %b %d %H:%M:%S %Z %Y'],
|
34
|
+
['Thu Jul 29 16:39:41 GMT+09 1999', '%a %b %d %H:%M:%S %Z %Y'],
|
35
|
+
['Thu Jul 29 16:39:41 GMT+0908 1999', '%a %b %d %H:%M:%S %Z %Y'],
|
36
|
+
['Thu Jul 29 16:39:41 GMT+090807 1999', '%a %b %d %H:%M:%S %Z %Y'],
|
37
|
+
['Thu Jul 29 16:39:41 GMT-09 1999', '%a %b %d %H:%M:%S %Z %Y'],
|
38
|
+
['Thu Jul 29 16:39:41 GMT-09:08 1999', '%a %b %d %H:%M:%S %Z %Y'],
|
39
|
+
['Thu Jul 29 16:39:41 GMT-09:08:07 1999', '%a %b %d %H:%M:%S %Z %Y'],
|
40
|
+
['Thu Jul 29 16:39:41 GMT-3.5 1999', '%a %b %d %H:%M:%S %Z %Y'],
|
41
|
+
['Thu Jul 29 16:39:41 GMT-3,5 1999', '%a %b %d %H:%M:%S %Z %Y'],
|
42
|
+
['Thu Jul 29 16:39:41 Mountain Daylight Time 1999', '%a %b %d %H:%M:%S %Z %Y'],
|
43
|
+
['Thu Jul 29 16:39:41 E. Australia Standard Time 1999', '%a %b %d %H:%M:%S %Z %Y'],
|
44
|
+
|
45
|
+
# rfc822
|
46
|
+
['Thu, 29 Jul 1999 09:54:21 UT', '%a, %d %b %Y %H:%M:%S %Z'],
|
47
|
+
['Thu, 29 Jul 1999 09:54:21 GMT', '%a, %d %b %Y %H:%M:%S %Z'],
|
48
|
+
['Thu, 29 Jul 1999 09:54:21 PDT', '%a, %d %b %Y %H:%M:%S %Z'],
|
49
|
+
['Thu, 29 Jul 1999 09:54:21 z', '%a, %d %b %Y %H:%M:%S %Z'],
|
50
|
+
['Thu, 29 Jul 1999 09:54:21 +0900', '%a, %d %b %Y %H:%M:%S %Z'],
|
51
|
+
['Thu, 29 Jul 1999 09:54:21 +0430', '%a, %d %b %Y %H:%M:%S %Z'],
|
52
|
+
['Thu, 29 Jul 1999 09:54:21 -0430', '%a, %d %b %Y %H:%M:%S %Z'],
|
53
|
+
['Thu, 29 Jul -1999 09:54:21 -0430', '%a, %d %b %Y %H:%M:%S %Z'],
|
54
|
+
|
55
|
+
# etc
|
56
|
+
['06-DEC-99', '%d-%b-%y'],
|
57
|
+
['sUnDay oCtoBer 31 01', '%A %B %d %y'],
|
58
|
+
["October\t\n\v\f\r 15,\t\n\v\f\r99", '%B %d, %y'],
|
59
|
+
["October\t\n\v\f\r 15,\t\n\v\f\r99", '%B%t%d,%n%y'],
|
60
|
+
|
61
|
+
['09:02:11 AM', '%I:%M:%S %p'],
|
62
|
+
['09:02:11 A.M.', '%I:%M:%S %p'],
|
63
|
+
['09:02:11 PM', '%I:%M:%S %p'],
|
64
|
+
['09:02:11 P.M.', '%I:%M:%S %p'],
|
65
|
+
|
66
|
+
['12:33:44 AM', '%r'],
|
67
|
+
['01:33:44 AM', '%r'],
|
68
|
+
['11:33:44 AM', '%r'],
|
69
|
+
['12:33:44 PM', '%r'],
|
70
|
+
['01:33:44 PM', '%r'],
|
71
|
+
['11:33:44 PM', '%r'],
|
72
|
+
|
73
|
+
# Their time zones are "AMT" actually in Ruby v2.3.1's tests, but "AST" is used here instead.
|
74
|
+
# "AMT" is not recognized even by Ruby v2.3.1's zonetab.
|
75
|
+
['11:33:44 PM AST', '%I:%M:%S %p %Z'],
|
76
|
+
['11:33:44 P.M. AST', '%I:%M:%S %p %Z'],
|
77
|
+
|
78
|
+
['fri1feb034pm+5', '%a%d%b%y%H%p%Z'],
|
79
|
+
].each do |string, format|
|
80
|
+
before_date = Date.today
|
81
|
+
after_date = nil
|
82
|
+
while before_date != after_date do
|
83
|
+
before_date = Date.today
|
84
|
+
expected_datetime = DateTime.strptime(string, format)
|
85
|
+
expected_time = expected_datetime.new_offset(0).to_time.utc
|
86
|
+
after_date = Date.today
|
87
|
+
if expected_datetime.to_date == after_date # DateTime.strptime fills today's date if date is not contained.
|
88
|
+
# Getting the Time of 00:00:00 UTC on after_date.
|
89
|
+
expected_time = expected_time - after_date.to_datetime.new_offset(0).to_time.utc
|
90
|
+
end
|
91
|
+
expected_epoch = expected_time.to_i
|
92
|
+
end
|
93
|
+
|
94
|
+
timestamp_parser =
|
95
|
+
Java::org.embulk.spi.time.TimestampParser.new(format, Java::org.joda.time.DateTimeZone::UTC, "1970-01-01")
|
96
|
+
actual_timestamp = timestamp_parser.parse(string)
|
97
|
+
actual_epoch = actual_timestamp.getEpochSecond()
|
98
|
+
|
99
|
+
assert_equal(expected_epoch, actual_epoch, string)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.37
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jruby-jars
|
@@ -115,10 +115,10 @@ files:
|
|
115
115
|
- classpath/commons-compress-1.10.jar
|
116
116
|
- classpath/commons-lang-2.4.jar
|
117
117
|
- classpath/commons-lang3-3.4.jar
|
118
|
-
- classpath/embulk-cli-0.8.
|
119
|
-
- classpath/embulk-core-0.8.
|
120
|
-
- classpath/embulk-jruby-strptime-0.8.
|
121
|
-
- classpath/embulk-standards-0.8.
|
118
|
+
- classpath/embulk-cli-0.8.37.jar
|
119
|
+
- classpath/embulk-core-0.8.37.jar
|
120
|
+
- classpath/embulk-jruby-strptime-0.8.37.jar
|
121
|
+
- classpath/embulk-standards-0.8.37.jar
|
122
122
|
- classpath/guava-18.0.jar
|
123
123
|
- classpath/guice-4.0.jar
|
124
124
|
- classpath/guice-bootstrap-0.1.1.jar
|
@@ -306,8 +306,6 @@ files:
|
|
306
306
|
- embulk-core/src/main/java/org/embulk/spi/json/JsonParser.java
|
307
307
|
- embulk-core/src/main/java/org/embulk/spi/json/RubyValueApi.java
|
308
308
|
- embulk-core/src/main/java/org/embulk/spi/time/DateTimeZoneSerDe.java
|
309
|
-
- embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelper.java
|
310
|
-
- embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelperFactory.java
|
311
309
|
- embulk-core/src/main/java/org/embulk/spi/time/Timestamp.java
|
312
310
|
- embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java
|
313
311
|
- embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java
|
@@ -397,6 +395,7 @@ files:
|
|
397
395
|
- embulk-core/src/test/java/org/embulk/spi/time/TestTimestamp.java
|
398
396
|
- embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParser.java
|
399
397
|
- embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParserDeprecated.java
|
398
|
+
- embulk-core/src/test/java/org/embulk/spi/time/TestTimestampParser.java
|
400
399
|
- embulk-core/src/test/java/org/embulk/spi/type/TestTypeSerDe.java
|
401
400
|
- embulk-core/src/test/java/org/embulk/spi/unit/TestByteSize.java
|
402
401
|
- embulk-core/src/test/java/org/embulk/spi/util/TestLineDecoder.java
|
@@ -526,6 +525,7 @@ files:
|
|
526
525
|
- embulk-docs/src/release/release-0.8.34.rst
|
527
526
|
- embulk-docs/src/release/release-0.8.35.rst
|
528
527
|
- embulk-docs/src/release/release-0.8.36.rst
|
528
|
+
- embulk-docs/src/release/release-0.8.37.rst
|
529
529
|
- embulk-docs/src/release/release-0.8.4.rst
|
530
530
|
- embulk-docs/src/release/release-0.8.5.rst
|
531
531
|
- embulk-docs/src/release/release-0.8.6.rst
|
@@ -740,7 +740,6 @@ files:
|
|
740
740
|
- lib/embulk/input_plugin.rb
|
741
741
|
- lib/embulk/java/bootstrap.rb
|
742
742
|
- lib/embulk/java/imports.rb
|
743
|
-
- lib/embulk/java/time_helper.rb
|
744
743
|
- lib/embulk/java_plugin.rb
|
745
744
|
- lib/embulk/logger.rb
|
746
745
|
- lib/embulk/output_plugin.rb
|
@@ -753,13 +752,15 @@ files:
|
|
753
752
|
- lib/embulk/schema.rb
|
754
753
|
- lib/embulk/version.rb
|
755
754
|
- settings.gradle
|
756
|
-
- test/guess/test_csv_all_strings.rb
|
757
|
-
- test/guess/test_csv_guess.rb
|
758
|
-
- test/guess/test_schema_guess.rb
|
759
|
-
- test/guess/test_time_format_guess.rb
|
760
755
|
- test/helper.rb
|
761
|
-
- test/mri/date/test_date_strptime.rb
|
762
|
-
- test/run-test.rb
|
756
|
+
- test/monkey_strptime/mri/date/test_date_strptime.rb
|
757
|
+
- test/monkey_strptime/run-test.rb
|
758
|
+
- test/vanilla/guess/test_csv_all_strings.rb
|
759
|
+
- test/vanilla/guess/test_csv_guess.rb
|
760
|
+
- test/vanilla/guess/test_schema_guess.rb
|
761
|
+
- test/vanilla/guess/test_time_format_guess.rb
|
762
|
+
- test/vanilla/run-test.rb
|
763
|
+
- test/vanilla/time/test_timestamp_parser.rb
|
763
764
|
homepage: https://github.com/embulk/embulk
|
764
765
|
licenses:
|
765
766
|
- Apache 2.0
|
@@ -785,10 +786,12 @@ signing_key:
|
|
785
786
|
specification_version: 4
|
786
787
|
summary: Embulk, a plugin-based parallel bulk data loader
|
787
788
|
test_files:
|
788
|
-
- test/guess/test_csv_all_strings.rb
|
789
|
-
- test/guess/test_csv_guess.rb
|
790
|
-
- test/guess/test_schema_guess.rb
|
791
|
-
- test/guess/test_time_format_guess.rb
|
792
789
|
- test/helper.rb
|
793
|
-
- test/mri/date/test_date_strptime.rb
|
794
|
-
- test/run-test.rb
|
790
|
+
- test/monkey_strptime/mri/date/test_date_strptime.rb
|
791
|
+
- test/monkey_strptime/run-test.rb
|
792
|
+
- test/vanilla/guess/test_csv_all_strings.rb
|
793
|
+
- test/vanilla/guess/test_csv_guess.rb
|
794
|
+
- test/vanilla/guess/test_schema_guess.rb
|
795
|
+
- test/vanilla/guess/test_time_format_guess.rb
|
796
|
+
- test/vanilla/run-test.rb
|
797
|
+
- test/vanilla/time/test_timestamp_parser.rb
|
@@ -1,79 +0,0 @@
|
|
1
|
-
module Embulk
|
2
|
-
module Java
|
3
|
-
#require 'embulk/java/imports'
|
4
|
-
require 'time' # Date._strptime
|
5
|
-
|
6
|
-
class TimeParserHelper
|
7
|
-
#include Java::JRubyTimeParserHelper
|
8
|
-
include org.embulk.spi.time.JRubyTimeParserHelper
|
9
|
-
|
10
|
-
class Factory
|
11
|
-
#include Java::JRubyTimeParserHelperFactory
|
12
|
-
include org.embulk.spi.time.JRubyTimeParserHelperFactory
|
13
|
-
|
14
|
-
def newInstance(format_string, year, mon, day, hour, min, sec, usec)
|
15
|
-
default_time = Time.utc(year, mon, day, hour, min, sec, usec)
|
16
|
-
TimeParserHelper.new(format_string, default_time)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def initialize(format_string, default_time)
|
21
|
-
@format_string = format_string
|
22
|
-
@default_time = default_time
|
23
|
-
end
|
24
|
-
|
25
|
-
# Override
|
26
|
-
def strptimeUsec(text)
|
27
|
-
hash = Date._strptime(text, @format_string)
|
28
|
-
unless hash
|
29
|
-
raise Java::TimestampParseException.new("Failed to parse '" + text + "'")
|
30
|
-
end
|
31
|
-
|
32
|
-
if seconds = hash[:seconds] # if %s, it's Integer. if %Q, Rational.
|
33
|
-
sec_fraction = hash[:sec_fraction] # Rational
|
34
|
-
usec = sec_fraction * 1_000_000 if sec_fraction
|
35
|
-
return (seconds * 1_000_000).to_i + usec.to_i
|
36
|
-
|
37
|
-
else
|
38
|
-
year = hash[:year]
|
39
|
-
mon = hash[:mon]
|
40
|
-
day = hash[:mday]
|
41
|
-
hour = hash[:hour]
|
42
|
-
min = hash[:min]
|
43
|
-
sec = hash[:sec]
|
44
|
-
sec_fraction = hash[:sec_fraction]
|
45
|
-
usec = sec_fraction * 1_000_000 if sec_fraction
|
46
|
-
zone = hash[:zone]
|
47
|
-
|
48
|
-
now = @default_time
|
49
|
-
begin
|
50
|
-
break if year; year = now.year
|
51
|
-
break if mon; mon = now.mon
|
52
|
-
break if day; day = now.day
|
53
|
-
break if hour; hour = now.hour
|
54
|
-
break if min; min = now.min
|
55
|
-
break if sec; sec = now.sec
|
56
|
-
break if sec_fraction; usec = now.tv_usec
|
57
|
-
end until true
|
58
|
-
|
59
|
-
year ||= 1970
|
60
|
-
mon ||= 1
|
61
|
-
day ||= 1
|
62
|
-
hour ||= 0
|
63
|
-
min ||= 0
|
64
|
-
sec ||= 0
|
65
|
-
usec ||= 0
|
66
|
-
|
67
|
-
@zone = zone
|
68
|
-
time = Time.utc(year, mon, day, hour, min, sec, usec)
|
69
|
-
return time.tv_sec * 1_000_000 + time.tv_usec
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
# Override
|
74
|
-
def getZone
|
75
|
-
@zone
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|