embulk 0.8.26-java → 0.8.27-java
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 +4 -3
- data/embulk-core/build.gradle +2 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +126 -27
- data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParser.java +3 -3
- data/embulk-docs/src/release.rst +1 -0
- data/embulk-docs/src/release/release-0.8.27.rst +15 -0
- data/embulk-jruby-strptime/build.gradle +3 -0
- data/embulk-jruby-strptime/src/main/java/org/embulk/spi/time/RubyDateParser.java +121 -0
- data/embulk-jruby-strptime/src/main/java/org/embulk/spi/time/StrptimeFormat.java +53 -0
- data/embulk-jruby-strptime/src/main/java/org/embulk/spi/time/StrptimeParser.java +884 -0
- data/embulk-jruby-strptime/src/main/java/org/embulk/spi/time/StrptimeToken.java +111 -0
- data/embulk-jruby-strptime/src/main/java/org/embulk/spi/time/TimeZoneConverter.java +466 -0
- data/embulk-jruby-strptime/src/main/java/org/embulk/spi/time/lexer/StrptimeLexer.flex +62 -0
- data/embulk-jruby-strptime/src/main/java/org/embulk/spi/time/lexer/StrptimeLexer.java +577 -0
- data/lib/embulk/version.rb +1 -1
- data/settings.gradle +1 -0
- data/test/run-test.rb +14 -0
- metadata +15 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61453ab9514646a642d390b971aeca9cb45ea066
|
4
|
+
data.tar.gz: 6c034da535e1687bcf3f6f9a75f12557b73d1f17
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10c5d683990626cbe25dcfc6dcdc5f967d74d7420743f6c33ba1a1997765156b5e4ee1a0914737baa4f1ba80206864e404941b309e1b1efb9c05e2efae293c87
|
7
|
+
data.tar.gz: 9f21b019c2752622b0108b649859fbb1a39ea2420c2381e71df50ec683ee7f9a742fe0038096a5e6cf0e294fe5068ddf6f32ca8ee9e71bfd6f83cc01167b5027
|
data/build.gradle
CHANGED
@@ -11,12 +11,12 @@ apply plugin: "com.github.jruby-gradle.jar"
|
|
11
11
|
apply plugin: 'com.jfrog.bintray'
|
12
12
|
apply plugin: 'com.github.johnrengelman.shadow'
|
13
13
|
|
14
|
-
def java_projects = [project(":embulk-core"), project(":embulk-standards"), project(":embulk-cli"), project(":embulk-test")]
|
15
|
-
def release_projects = [project(":embulk-core"), project(":embulk-standards"), project(":embulk-test")]
|
14
|
+
def java_projects = [project(":embulk-core"), project(":embulk-standards"), project(":embulk-cli"), project(":embulk-test"), project(":embulk-jruby-strptime")]
|
15
|
+
def release_projects = [project(":embulk-core"), project(":embulk-standards"), project(":embulk-test"), project(":embulk-jruby-strptime")]
|
16
16
|
|
17
17
|
allprojects {
|
18
18
|
group = 'org.embulk'
|
19
|
-
version = '0.8.
|
19
|
+
version = '0.8.27'
|
20
20
|
|
21
21
|
ext {
|
22
22
|
jrubyVersion = '9.1.5.0'
|
@@ -28,6 +28,7 @@ allprojects {
|
|
28
28
|
|
29
29
|
test {
|
30
30
|
maxHeapSize = "1536m"
|
31
|
+
forkEvery = 1 // test processes are forked by each test class (default is 0)
|
31
32
|
}
|
32
33
|
|
33
34
|
//
|
data/embulk-core/build.gradle
CHANGED
@@ -16,6 +16,8 @@ import com.github.jrubygradle.JRubyPrepare
|
|
16
16
|
|
17
17
|
// determine which dependencies have updates: $ gradle dependencyUpdates
|
18
18
|
dependencies {
|
19
|
+
compile project(':embulk-jruby-strptime')
|
20
|
+
|
19
21
|
compile 'org.embulk:guice-bootstrap:0.1.1'
|
20
22
|
compile 'com.google.guava:guava:18.0'
|
21
23
|
compile 'com.google.inject:guice:4.0'
|
@@ -1,18 +1,24 @@
|
|
1
1
|
package org.embulk.spi.time;
|
2
2
|
|
3
|
+
import com.google.common.annotations.VisibleForTesting;
|
4
|
+
import com.google.common.base.Optional;
|
5
|
+
import java.text.ParseException;
|
6
|
+
import java.text.SimpleDateFormat;
|
7
|
+
import java.util.Calendar;
|
3
8
|
import java.util.Date;
|
9
|
+
import java.util.List;
|
4
10
|
import java.util.Locale;
|
5
11
|
import java.util.TimeZone;
|
6
|
-
import java.util.Calendar;
|
7
|
-
import java.text.SimpleDateFormat;
|
8
|
-
import java.text.ParseException;
|
9
|
-
import org.joda.time.DateTimeZone;
|
10
|
-
import com.google.common.base.Optional;
|
11
|
-
import org.jruby.embed.ScriptingContainer;
|
12
12
|
import org.embulk.config.Config;
|
13
|
-
import org.embulk.config.ConfigInject;
|
14
13
|
import org.embulk.config.ConfigDefault;
|
15
14
|
import org.embulk.config.ConfigException;
|
15
|
+
import org.embulk.config.ConfigInject;
|
16
|
+
import org.embulk.spi.time.StrptimeParser.FormatBag;
|
17
|
+
import org.joda.time.DateTime;
|
18
|
+
import org.joda.time.DateTimeZone;
|
19
|
+
import org.jruby.embed.ScriptingContainer;
|
20
|
+
|
21
|
+
import static com.google.common.base.Strings.isNullOrEmpty;
|
16
22
|
import static org.embulk.spi.time.TimestampFormat.parseDateTimeZone;
|
17
23
|
|
18
24
|
public class TimestampParser
|
@@ -62,8 +68,11 @@ public class TimestampParser
|
|
62
68
|
public Optional<String> getDate();
|
63
69
|
}
|
64
70
|
|
65
|
-
private final JRubyTimeParserHelper helper;
|
66
71
|
private final DateTimeZone defaultTimeZone;
|
72
|
+
private final String format;
|
73
|
+
private final StrptimeParser parser;
|
74
|
+
private final Calendar calendar;
|
75
|
+
private final List<StrptimeToken> compiledPattern;
|
67
76
|
|
68
77
|
@Deprecated
|
69
78
|
public TimestampParser(String format, ParserTask task)
|
@@ -71,9 +80,11 @@ public class TimestampParser
|
|
71
80
|
this(task.getJRuby(), format, task.getDefaultTimeZone());
|
72
81
|
}
|
73
82
|
|
74
|
-
|
83
|
+
@VisibleForTesting
|
84
|
+
static TimestampParser createTimestampParserForTesting(Task task)
|
85
|
+
|
75
86
|
{
|
76
|
-
|
87
|
+
return new TimestampParser(task.getJRuby(), task.getDefaultTimestampFormat(), task.getDefaultTimeZone(), task.getDefaultDate());
|
77
88
|
}
|
78
89
|
|
79
90
|
public TimestampParser(Task task, TimestampColumnOption columnOption)
|
@@ -91,7 +102,11 @@ public class TimestampParser
|
|
91
102
|
|
92
103
|
public TimestampParser(ScriptingContainer jruby, String format, DateTimeZone defaultTimeZone, String defaultDate)
|
93
104
|
{
|
94
|
-
|
105
|
+
// TODO get default current time from ExecTask.getExecTimestamp
|
106
|
+
this.format = format;
|
107
|
+
this.parser = new StrptimeParser();
|
108
|
+
this.compiledPattern = this.parser.compilePattern(format);
|
109
|
+
this.defaultTimeZone = defaultTimeZone;
|
95
110
|
|
96
111
|
// calculate default date
|
97
112
|
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
|
@@ -103,15 +118,8 @@ public class TimestampParser
|
|
103
118
|
catch (ParseException ex) {
|
104
119
|
throw new ConfigException("Invalid date format. Expected yyyy-MM-dd: " + defaultDate);
|
105
120
|
}
|
106
|
-
|
107
|
-
|
108
|
-
int year = cal.get(Calendar.YEAR);
|
109
|
-
int month = cal.get(Calendar.MONTH) + 1;
|
110
|
-
int day = cal.get(Calendar.DAY_OF_MONTH);
|
111
|
-
|
112
|
-
// TODO get default current time from ExecTask.getExecTimestamp
|
113
|
-
this.helper = (JRubyTimeParserHelper) helperFactory.newInstance(format, year, month, day, 0, 0, 0, 0); // TODO default time zone
|
114
|
-
this.defaultTimeZone = defaultTimeZone;
|
121
|
+
this.calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.ENGLISH);
|
122
|
+
this.calendar.setTime(utc);
|
115
123
|
}
|
116
124
|
|
117
125
|
public DateTimeZone getDefaultTimeZone()
|
@@ -121,10 +129,21 @@ public class TimestampParser
|
|
121
129
|
|
122
130
|
public Timestamp parse(String text) throws TimestampParseException
|
123
131
|
{
|
124
|
-
|
125
|
-
|
132
|
+
if (isNullOrEmpty(text)) {
|
133
|
+
throw new TimestampParseException("text is null or empty string.");
|
134
|
+
}
|
135
|
+
|
136
|
+
final FormatBag bag = parser.parse(compiledPattern, text);
|
137
|
+
if (bag == null) {
|
138
|
+
throw new TimestampParseException("Cannot parse '" + text + "' by '" + format + "'");
|
139
|
+
}
|
140
|
+
bag.setYearIfNotSet(calendar.get(Calendar.YEAR));
|
141
|
+
bag.setMonthIfNotSet(calendar.get(Calendar.MONTH) + 1);
|
142
|
+
bag.setMdayIfNotSet(calendar.get(Calendar.DAY_OF_MONTH));
|
126
143
|
|
127
|
-
|
144
|
+
final LocalTime local = createLocalTimeFromFormatBag(bag);
|
145
|
+
final String zone = local.getZone();
|
146
|
+
final DateTimeZone timeZone;
|
128
147
|
if (zone != null) {
|
129
148
|
// TODO cache parsed zone?
|
130
149
|
timeZone = parseDateTimeZone(zone);
|
@@ -132,11 +151,91 @@ public class TimestampParser
|
|
132
151
|
throw new TimestampParseException("Invalid time zone name '" + text + "'");
|
133
152
|
}
|
134
153
|
}
|
154
|
+
else {
|
155
|
+
timeZone = defaultTimeZone;
|
156
|
+
}
|
135
157
|
|
136
|
-
long
|
137
|
-
|
138
|
-
|
158
|
+
final long sec = timeZone.convertLocalToUTC(local.getSeconds() * 1000, false) / 1000;
|
159
|
+
return Timestamp.ofEpochSecond(sec, local.getNsecFraction());
|
160
|
+
}
|
139
161
|
|
140
|
-
|
162
|
+
public LocalTime createLocalTimeFromFormatBag(FormatBag bag)
|
163
|
+
{
|
164
|
+
final long secFractionNsec;
|
165
|
+
if (FormatBag.has(bag.getSecFraction())) {
|
166
|
+
secFractionNsec = bag.getSecFraction() * (int)Math.pow(10, 9 - bag.getSecFractionSize());
|
167
|
+
}
|
168
|
+
else {
|
169
|
+
secFractionNsec = 0;
|
170
|
+
}
|
171
|
+
|
172
|
+
final long sec;
|
173
|
+
if (bag.hasSeconds()) {
|
174
|
+
if (FormatBag.has(bag.getSecondsSize())) {
|
175
|
+
sec = bag.getSeconds() / (int)Math.pow(10, bag.getSecondsSize());
|
176
|
+
}
|
177
|
+
else { // int
|
178
|
+
sec = bag.getSeconds();
|
179
|
+
}
|
180
|
+
|
181
|
+
} else {
|
182
|
+
final int year;
|
183
|
+
if (FormatBag.has(bag.getYear())) {
|
184
|
+
year = bag.getYear();
|
185
|
+
}
|
186
|
+
else {
|
187
|
+
year = 1970;
|
188
|
+
}
|
189
|
+
|
190
|
+
// set up with min this and then add to allow rolling over
|
191
|
+
DateTime dt = new DateTime(year, 1, 1, 0, 0, 0, 0, DateTimeZone.UTC);
|
192
|
+
if (FormatBag.has(bag.getMon())) {
|
193
|
+
dt = dt.plusMonths(bag.getMon() - 1);
|
194
|
+
}
|
195
|
+
if (FormatBag.has(bag.getMDay())) {
|
196
|
+
dt = dt.plusDays(bag.getMDay() - 1);
|
197
|
+
}
|
198
|
+
if (FormatBag.has(bag.getHour())) {
|
199
|
+
dt = dt.plusHours(bag.getHour());
|
200
|
+
}
|
201
|
+
if (FormatBag.has(bag.getMin())) {
|
202
|
+
dt = dt.plusMinutes(bag.getMin());
|
203
|
+
}
|
204
|
+
if (FormatBag.has(bag.getSec())) {
|
205
|
+
dt = dt.plusSeconds(bag.getSec());
|
206
|
+
}
|
207
|
+
sec = dt.getMillis() / 1000;
|
208
|
+
}
|
209
|
+
|
210
|
+
return new LocalTime(sec, secFractionNsec, bag.getZone());
|
211
|
+
}
|
212
|
+
|
213
|
+
private static class LocalTime
|
214
|
+
{
|
215
|
+
private final long seconds;
|
216
|
+
private final long nsecFraction;
|
217
|
+
private final String zone; // +0900, JST, UTC
|
218
|
+
|
219
|
+
public LocalTime(long seconds, long nsecFraction, String zone)
|
220
|
+
{
|
221
|
+
this.seconds = seconds;
|
222
|
+
this.nsecFraction = nsecFraction;
|
223
|
+
this.zone = zone;
|
224
|
+
}
|
225
|
+
|
226
|
+
public long getSeconds()
|
227
|
+
{
|
228
|
+
return seconds;
|
229
|
+
}
|
230
|
+
|
231
|
+
public long getNsecFraction()
|
232
|
+
{
|
233
|
+
return nsecFraction;
|
234
|
+
}
|
235
|
+
|
236
|
+
public String getZone()
|
237
|
+
{
|
238
|
+
return zone;
|
239
|
+
}
|
141
240
|
}
|
142
241
|
}
|
@@ -42,7 +42,7 @@ public class TestTimestampFormatterParser
|
|
42
42
|
.set("default_timestamp_format", "%Y-%m-%d %H:%M:%S %z"); // %Z is OS-dependent
|
43
43
|
ParserTestTask task = config.loadConfig(ParserTestTask.class);
|
44
44
|
|
45
|
-
TimestampParser parser =
|
45
|
+
TimestampParser parser = TimestampParser.createTimestampParserForTesting(task);
|
46
46
|
assertEquals(Timestamp.ofEpochSecond(1416365189, 0), parser.parse("2014-11-19 02:46:29 +0000"));
|
47
47
|
}
|
48
48
|
|
@@ -57,7 +57,7 @@ public class TestTimestampFormatterParser
|
|
57
57
|
assertEquals("1416365189", formatter.format(Timestamp.ofEpochSecond(1416365189)));
|
58
58
|
|
59
59
|
ParserTestTask ptask = config.loadConfig(ParserTestTask.class);
|
60
|
-
TimestampParser parser =
|
60
|
+
TimestampParser parser = TimestampParser.createTimestampParserForTesting(ptask);
|
61
61
|
assertEquals(Timestamp.ofEpochSecond(1416365189), parser.parse("1416365189"));
|
62
62
|
}
|
63
63
|
|
@@ -69,7 +69,7 @@ public class TestTimestampFormatterParser
|
|
69
69
|
.set("default_date", "2016-02-03");
|
70
70
|
|
71
71
|
ParserTestTask ptask = config.loadConfig(ParserTestTask.class);
|
72
|
-
TimestampParser parser =
|
72
|
+
TimestampParser parser = TimestampParser.createTimestampParserForTesting(ptask);
|
73
73
|
assertEquals(Timestamp.ofEpochSecond(1454467589, 0), parser.parse("02:46:29 +0000"));
|
74
74
|
}
|
75
75
|
}
|
data/embulk-docs/src/release.rst
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
Release 0.8.27
|
2
|
+
==================================
|
3
|
+
|
4
|
+
General Changes
|
5
|
+
------------------
|
6
|
+
|
7
|
+
* Add Java timestamp parser [#611]
|
8
|
+
* Add the test for the timestamp parser [#712]
|
9
|
+
* Fix build.gradle to set forkEvery=1 to improve CI build stability [#714]
|
10
|
+
* Fix Javadoc in embulk-jruby-strptime classes to avoid Javadoc errors [#719]
|
11
|
+
|
12
|
+
|
13
|
+
Release Date
|
14
|
+
------------------
|
15
|
+
2017-07-09
|
@@ -0,0 +1,121 @@
|
|
1
|
+
package org.embulk.spi.time;
|
2
|
+
|
3
|
+
import org.jruby.runtime.ThreadContext;
|
4
|
+
|
5
|
+
import java.util.HashMap;
|
6
|
+
import java.util.List;
|
7
|
+
|
8
|
+
import static org.embulk.spi.time.StrptimeParser.FormatBag.has;
|
9
|
+
import static org.jruby.RubyRational.newRationalCanonicalize;
|
10
|
+
|
11
|
+
/**
|
12
|
+
* This class has {@code StrptimeParser} and provides methods that are calls from JRuby.
|
13
|
+
*
|
14
|
+
* TODO
|
15
|
+
* This class is tentatively required for executing test/mri/date/test_date_strptime.rb
|
16
|
+
* (#617). The {@code StrptimeParser} and {@code RubyDateParser} will be merged into
|
17
|
+
* JRuby (jruby/jruby#4591). embulk-jruby-strptime is removed when Embulk start using
|
18
|
+
* the JRuby that bundles embulk-jruby-strptime.
|
19
|
+
*/
|
20
|
+
public class RubyDateParser
|
21
|
+
{
|
22
|
+
private final StrptimeParser strptimeParser;
|
23
|
+
|
24
|
+
public RubyDateParser()
|
25
|
+
{
|
26
|
+
this.strptimeParser = new StrptimeParser();
|
27
|
+
}
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Date._strptime method in JRuby 9.1.5.0's lib/ruby/stdlib/date/format.rb is replaced
|
31
|
+
* with this method. This is Java implementation of date__strptime method in MRI 2.3.1's
|
32
|
+
* ext/date/date_strptime.c.
|
33
|
+
* @see <a href="https://github.com/jruby/jruby/blob/036ce39f0476d4bd718e23e64caff36bb50b8dbc/lib/ruby/stdlib/date/format.rb">format.rb</a>
|
34
|
+
* @see <a href="https://github.com/ruby/ruby/blob/394fa89c67722d35bdda89f10c7de5c304a5efb1/ext/date/date_strptime.c">date_strptime.c</a>
|
35
|
+
*/
|
36
|
+
public HashMap<String, Object> parse(ThreadContext context, final String format, final String text)
|
37
|
+
{
|
38
|
+
final List<StrptimeToken> compiledPattern = strptimeParser.compilePattern(format);
|
39
|
+
final StrptimeParser.FormatBag bag = strptimeParser.parse(compiledPattern, text);
|
40
|
+
if (bag != null) {
|
41
|
+
return convertFormatBagToHash(context, bag);
|
42
|
+
}
|
43
|
+
else {
|
44
|
+
return null;
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
private HashMap<String, Object> convertFormatBagToHash(ThreadContext context, StrptimeParser.FormatBag bag)
|
49
|
+
{
|
50
|
+
final HashMap<String, Object> map = new HashMap<>();
|
51
|
+
|
52
|
+
if (has(bag.getMDay())) {
|
53
|
+
map.put("mday", bag.getMDay());
|
54
|
+
}
|
55
|
+
if (has(bag.getWDay())) {
|
56
|
+
map.put("wday", bag.getWDay());
|
57
|
+
}
|
58
|
+
if (has(bag.getCWDay())) {
|
59
|
+
map.put("cwday", bag.getCWDay());
|
60
|
+
}
|
61
|
+
if (has(bag.getYDay())) {
|
62
|
+
map.put("yday", bag.getYDay());
|
63
|
+
}
|
64
|
+
if (has(bag.getCWeek())) {
|
65
|
+
map.put("cweek", bag.getCWeek());
|
66
|
+
}
|
67
|
+
if (has(bag.getCWYear())) {
|
68
|
+
map.put("cwyear", bag.getCWYear());
|
69
|
+
}
|
70
|
+
if (has(bag.getMin())) {
|
71
|
+
map.put("min", bag.getMin());
|
72
|
+
}
|
73
|
+
if (has(bag.getMon())) {
|
74
|
+
map.put("mon", bag.getMon());
|
75
|
+
}
|
76
|
+
if (has(bag.getHour())) {
|
77
|
+
map.put("hour", bag.getHour());
|
78
|
+
}
|
79
|
+
if (has(bag.getYear())) {
|
80
|
+
map.put("year", bag.getYear());
|
81
|
+
}
|
82
|
+
if (has(bag.getSec())) {
|
83
|
+
map.put("sec", bag.getSec());
|
84
|
+
}
|
85
|
+
if (has(bag.getWNum0())) {
|
86
|
+
map.put("wnum0", bag.getWNum0());
|
87
|
+
}
|
88
|
+
if (has(bag.getWNum1())) {
|
89
|
+
map.put("wnum1", bag.getWNum1());
|
90
|
+
}
|
91
|
+
if (bag.getZone() != null) {
|
92
|
+
map.put("zone", bag.getZone());
|
93
|
+
int offset = TimeZoneConverter.dateZoneToDiff(bag.getZone());
|
94
|
+
if (offset != Integer.MIN_VALUE) {
|
95
|
+
map.put("offset", offset);
|
96
|
+
}
|
97
|
+
}
|
98
|
+
if (has(bag.getSecFraction())) {
|
99
|
+
map.put("sec_fraction", newRationalCanonicalize(context, bag.getSecFraction(), (long)Math.pow(10, bag.getSecFractionSize())));
|
100
|
+
}
|
101
|
+
if (bag.hasSeconds()) {
|
102
|
+
if (has(bag.getSecondsSize())) {
|
103
|
+
map.put("seconds", newRationalCanonicalize(context, bag.getSeconds(), (long) Math.pow(10, bag.getSecondsSize())));
|
104
|
+
}
|
105
|
+
else {
|
106
|
+
map.put("seconds", bag.getSeconds());
|
107
|
+
}
|
108
|
+
}
|
109
|
+
if (has(bag.getMerid())) {
|
110
|
+
map.put("_merid", bag.getMerid());
|
111
|
+
}
|
112
|
+
if (has(bag.getCent())) {
|
113
|
+
map.put("_cent", bag.getCent());
|
114
|
+
}
|
115
|
+
if (bag.getLeftover() != null) {
|
116
|
+
map.put("leftover", bag.getLeftover());
|
117
|
+
}
|
118
|
+
|
119
|
+
return map;
|
120
|
+
}
|
121
|
+
}
|
@@ -0,0 +1,53 @@
|
|
1
|
+
package org.embulk.spi.time;
|
2
|
+
|
3
|
+
/**
|
4
|
+
* This class is ported from org.jruby.util.RubyDateFormatter.Format in JRuby
|
5
|
+
* 9.1.5.0 and modified for StrptimeParser under EPL.
|
6
|
+
* @see <a href="https://github.com/jruby/jruby/blob/036ce39f0476d4bd718e23e64caff36bb50b8dbc/core/src/main/java/org/jruby/util/RubyDateFormatter.java>RubyDateFormatter.java</a>.
|
7
|
+
*
|
8
|
+
* TODO
|
9
|
+
* This class is tentatively required for {@code StrptimeParser} class.
|
10
|
+
* The {@code StrptimeParser} and {@code RubyDateParser} will be merged into JRuby
|
11
|
+
* (jruby/jruby#4591). embulk-jruby-strptime is removed when Embulk start using
|
12
|
+
* the JRuby that bundles embulk-jruby-strptime.
|
13
|
+
*/
|
14
|
+
enum StrptimeFormat
|
15
|
+
{
|
16
|
+
FORMAT_STRING, // raw string, no formatting
|
17
|
+
FORMAT_SPECIAL, // composition of other formats
|
18
|
+
|
19
|
+
FORMAT_WEEK_LONG, // %A
|
20
|
+
FORMAT_WEEK_SHORT, // %a
|
21
|
+
FORMAT_MONTH_LONG, // %B
|
22
|
+
FORMAT_MONTH_SHORT, // %b, %h
|
23
|
+
FORMAT_CENTURY, // %C
|
24
|
+
FORMAT_DAY, // %d
|
25
|
+
FORMAT_DAY_S, // %e
|
26
|
+
FORMAT_WEEKYEAR, // %G
|
27
|
+
FORMAT_WEEKYEAR_SHORT, // %g
|
28
|
+
FORMAT_HOUR, // %H
|
29
|
+
FORMAT_HOUR_M, // %I
|
30
|
+
FORMAT_DAY_YEAR, // %j
|
31
|
+
FORMAT_HOUR_BLANK, // %k
|
32
|
+
FORMAT_MILLISEC, // %L
|
33
|
+
FORMAT_HOUR_S, // %l
|
34
|
+
FORMAT_MINUTES, // %M
|
35
|
+
FORMAT_MONTH, // %m
|
36
|
+
FORMAT_NANOSEC, // %N
|
37
|
+
FORMAT_MERIDIAN_LOWER_CASE, // %P
|
38
|
+
FORMAT_MERIDIAN, // %p
|
39
|
+
FORMAT_MICROSEC_EPOCH, // %Q Only for Date/DateTime from here
|
40
|
+
FORMAT_SECONDS, // %S
|
41
|
+
FORMAT_EPOCH, // %s
|
42
|
+
FORMAT_WEEK_YEAR_S, // %U
|
43
|
+
FORMAT_DAY_WEEK2, // %u
|
44
|
+
FORMAT_WEEK_WEEKYEAR, // %V
|
45
|
+
FORMAT_WEEK_YEAR_M, // %W
|
46
|
+
FORMAT_DAY_WEEK, // %w
|
47
|
+
FORMAT_YEAR_LONG, // %Y
|
48
|
+
FORMAT_YEAR_SHORT, // %y
|
49
|
+
|
50
|
+
FORMAT_COLON_ZONE_OFF, // %z, %:z, %::z, %:::z must be given number of colons as data
|
51
|
+
|
52
|
+
FORMAT_ZONE_ID; // %Z Change between Time and Date
|
53
|
+
}
|