embulk 0.7.0-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 +7 -0
- data/.gitignore +15 -0
- data/.ruby-version +1 -0
- data/.travis.yml +18 -0
- data/COPYING +14 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +31 -0
- data/README.md +206 -0
- data/Rakefile +26 -0
- data/appveyor.yml +20 -0
- data/bin/embulk +106 -0
- data/build.gradle +338 -0
- data/embulk-cli/build.gradle +6 -0
- data/embulk-cli/src/main/java/org/embulk/cli/Main.java +22 -0
- data/embulk-cli/src/main/sh/selfrun.sh +158 -0
- data/embulk-cli/src/test/java/org/embulk/cli/DummyMain.java +23 -0
- data/embulk-cli/src/test/java/org/embulk/cli/SelfrunTest.java +281 -0
- data/embulk-core/build.gradle +59 -0
- data/embulk-core/src/main/java/org/embulk/EmbulkEmbed.java +315 -0
- data/embulk-core/src/main/java/org/embulk/EmbulkService.java +76 -0
- data/embulk-core/src/main/java/org/embulk/command/PreviewPrinter.java +84 -0
- data/embulk-core/src/main/java/org/embulk/command/TablePreviewPrinter.java +107 -0
- data/embulk-core/src/main/java/org/embulk/command/VerticalPreviewPrinter.java +47 -0
- data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +33 -0
- data/embulk-core/src/main/java/org/embulk/config/Config.java +15 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigDefault.java +15 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigDiff.java +29 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigException.java +20 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigInject.java +14 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +141 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigSource.java +31 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSource.java +39 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +231 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +84 -0
- data/embulk-core/src/main/java/org/embulk/config/GenericTypeReference.java +20 -0
- data/embulk-core/src/main/java/org/embulk/config/ModelManager.java +123 -0
- data/embulk-core/src/main/java/org/embulk/config/Task.java +10 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskInvocationHandler.java +180 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskReport.java +29 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +345 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskSource.java +31 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +38 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskValidator.java +24 -0
- data/embulk-core/src/main/java/org/embulk/exec/BulkLoader.java +652 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +52 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecutionInterruptedException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecutionResult.java +26 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExtensionServiceLoaderModule.java +43 -0
- data/embulk-core/src/main/java/org/embulk/exec/ForGuess.java +16 -0
- data/embulk-core/src/main/java/org/embulk/exec/ForSystemConfig.java +16 -0
- data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +373 -0
- data/embulk-core/src/main/java/org/embulk/exec/LocalExecutorPlugin.java +129 -0
- data/embulk-core/src/main/java/org/embulk/exec/LocalThreadExecutor.java +34 -0
- data/embulk-core/src/main/java/org/embulk/exec/LoggerProvider.java +60 -0
- data/embulk-core/src/main/java/org/embulk/exec/NoSampleException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/exec/PartialExecutionException.java +18 -0
- data/embulk-core/src/main/java/org/embulk/exec/PooledBufferAllocator.java +77 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewExecutor.java +183 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewResult.java +27 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewedNoticeError.java +17 -0
- data/embulk-core/src/main/java/org/embulk/exec/ResumeState.java +100 -0
- data/embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java +136 -0
- data/embulk-core/src/main/java/org/embulk/exec/SetCurrentThreadName.java +19 -0
- data/embulk-core/src/main/java/org/embulk/exec/SystemConfigModule.java +24 -0
- data/embulk-core/src/main/java/org/embulk/exec/TempFileAllocator.java +35 -0
- data/embulk-core/src/main/java/org/embulk/guice/Bootstrap.java +157 -0
- data/embulk-core/src/main/java/org/embulk/guice/CloseableInjector.java +22 -0
- data/embulk-core/src/main/java/org/embulk/guice/InjectorProxy.java +145 -0
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleInjector.java +26 -0
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleInjectorProxy.java +61 -0
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleManager.java +187 -0
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleMethods.java +89 -0
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleMethodsMap.java +38 -0
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleModule.java +97 -0
- data/embulk-core/src/main/java/org/embulk/jruby/JRubyPluginSource.java +72 -0
- data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +119 -0
- data/embulk-core/src/main/java/org/embulk/plugin/BuiltinPluginSourceModule.java +17 -0
- data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +96 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginClassLoader.java +168 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginClassLoaderFactory.java +9 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginClassLoaderModule.java +71 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +78 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginSource.java +6 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginSourceNotMatchException.java +19 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginType.java +47 -0
- data/embulk-core/src/main/java/org/embulk/plugin/compat/InputPluginWrapper.java +102 -0
- data/embulk-core/src/main/java/org/embulk/plugin/compat/PluginWrappers.java +30 -0
- data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalFileInputWrapper.java +96 -0
- data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalFileOutputWrapper.java +102 -0
- data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalPageOutputWrapper.java +95 -0
- data/embulk-core/src/main/java/org/embulk/spi/Buffer.java +148 -0
- data/embulk-core/src/main/java/org/embulk/spi/BufferAllocator.java +8 -0
- data/embulk-core/src/main/java/org/embulk/spi/Column.java +92 -0
- data/embulk-core/src/main/java/org/embulk/spi/ColumnConfig.java +112 -0
- data/embulk-core/src/main/java/org/embulk/spi/ColumnVisitor.java +14 -0
- data/embulk-core/src/main/java/org/embulk/spi/DecoderPlugin.java +16 -0
- data/embulk-core/src/main/java/org/embulk/spi/EncoderPlugin.java +16 -0
- data/embulk-core/src/main/java/org/embulk/spi/Exec.java +113 -0
- data/embulk-core/src/main/java/org/embulk/spi/ExecAction.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +217 -0
- data/embulk-core/src/main/java/org/embulk/spi/ExecutorPlugin.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/Extension.java +44 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInput.java +11 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +30 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +162 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutput.java +13 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +28 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +202 -0
- data/embulk-core/src/main/java/org/embulk/spi/FilterPlugin.java +18 -0
- data/embulk-core/src/main/java/org/embulk/spi/FormatterPlugin.java +18 -0
- data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +9 -0
- data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +33 -0
- data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +29 -0
- data/embulk-core/src/main/java/org/embulk/spi/Page.java +51 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageBuilder.java +338 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageFormat.java +47 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageOutput.java +11 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageReader.java +226 -0
- data/embulk-core/src/main/java/org/embulk/spi/ParserPlugin.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/ProcessState.java +10 -0
- data/embulk-core/src/main/java/org/embulk/spi/ProcessTask.java +117 -0
- data/embulk-core/src/main/java/org/embulk/spi/Schema.java +134 -0
- data/embulk-core/src/main/java/org/embulk/spi/SchemaConfig.java +93 -0
- data/embulk-core/src/main/java/org/embulk/spi/SchemaConfigException.java +22 -0
- data/embulk-core/src/main/java/org/embulk/spi/TaskState.java +81 -0
- data/embulk-core/src/main/java/org/embulk/spi/TempFileException.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/TempFileSpace.java +87 -0
- data/embulk-core/src/main/java/org/embulk/spi/Transactional.java +10 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileInput.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileOutput.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalPageOutput.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/DateTimeZoneSerDe.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelper.java +8 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelperFactory.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/Timestamp.java +159 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java +100 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +97 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParseException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +104 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampSerDe.java +49 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/AbstractType.java +58 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/BooleanType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/DoubleType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/LongType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/StringType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/TimestampType.java +41 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/Type.java +15 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/TypeDeserializer.java +44 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/Types.java +14 -0
- data/embulk-core/src/main/java/org/embulk/spi/unit/ByteSize.java +156 -0
- data/embulk-core/src/main/java/org/embulk/spi/unit/LocalFile.java +106 -0
- data/embulk-core/src/main/java/org/embulk/spi/unit/LocalFileSerDe.java +113 -0
- data/embulk-core/src/main/java/org/embulk/spi/unit/ToString.java +54 -0
- data/embulk-core/src/main/java/org/embulk/spi/unit/ToStringMap.java +34 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/CharsetSerDe.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Decoders.java +81 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/DynamicColumnNotFoundException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/DynamicColumnSetter.java +18 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/DynamicColumnSetterFactory.java +94 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/DynamicPageBuilder.java +161 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Encoders.java +81 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Executors.java +95 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/FileInputInputStream.java +111 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/FileOutputOutputStream.java +119 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Filters.java +100 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamFileInput.java +190 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamTransactionalFileInput.java +25 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Inputs.java +65 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/LineDecoder.java +118 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +123 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/ListFileInput.java +52 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Newline.java +38 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/OutputStreamFileOutput.java +88 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +102 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +139 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/ResumableInputStream.java +128 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/RetryExecutor.java +130 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Timestamps.java +53 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/AbstractDynamicColumnSetter.java +79 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/BooleanColumnSetter.java +64 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/DefaultValueSetter.java +18 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/DoubleColumnSetter.java +61 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/LongColumnSetter.java +69 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/NullDefaultValueSetter.java +34 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/SkipColumnSetter.java +52 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/StringColumnSetter.java +56 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/TimestampColumnSetter.java +64 -0
- data/embulk-core/src/main/resources/embulk/logback-color.xml +72 -0
- data/embulk-core/src/main/resources/embulk/logback-console.xml +14 -0
- data/embulk-core/src/main/resources/embulk/logback-file.xml +25 -0
- data/embulk-core/src/main/resources/embulk/parent_first_packages.properties +70 -0
- data/embulk-core/src/main/resources/embulk/parent_first_resources.properties +28 -0
- data/embulk-core/src/test/java/org/embulk/EmbulkTestRuntime.java +114 -0
- data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +72 -0
- data/embulk-core/src/test/java/org/embulk/RandomManager.java +53 -0
- data/embulk-core/src/test/java/org/embulk/TestPluginSourceModule.java +23 -0
- data/embulk-core/src/test/java/org/embulk/TestUtilityModule.java +17 -0
- data/embulk-core/src/test/java/org/embulk/config/TestConfigLoader.java +66 -0
- data/embulk-core/src/test/java/org/embulk/config/TestConfigSource.java +114 -0
- data/embulk-core/src/test/java/org/embulk/config/TestTaskSource.java +70 -0
- data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +58 -0
- data/embulk-core/src/test/java/org/embulk/plugin/TestPluginType.java +18 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockFileOutput.java +63 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +101 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockParserPlugin.java +73 -0
- data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +57 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestBuffer.java +24 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileInputInputStream.java +89 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +196 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +207 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestInputStreamFileInput.java +188 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestPageBuilderReader.java +319 -0
- data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestamp.java +116 -0
- data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParser.java +63 -0
- data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParserDeprecated.java +67 -0
- data/embulk-core/src/test/java/org/embulk/spi/type/TestTypeSerDe.java +45 -0
- data/embulk-core/src/test/java/org/embulk/spi/unit/TestByteSize.java +79 -0
- data/embulk-core/src/test/java/org/embulk/spi/util/TestLineDecoder.java +132 -0
- data/embulk-core/src/test/java/org/embulk/spi/util/TestLineEncoder.java +123 -0
- data/embulk-docs/Makefile +178 -0
- data/embulk-docs/build.gradle +32 -0
- data/embulk-docs/make.bat +243 -0
- data/embulk-docs/push-gh-pages.sh +49 -0
- data/embulk-docs/src/_static/embulk-architecture.png +0 -0
- data/embulk-docs/src/_static/embulk-logo.png +0 -0
- data/embulk-docs/src/_static/embulk-logo.svg +133 -0
- data/embulk-docs/src/built-in.rst +440 -0
- data/embulk-docs/src/conf.py +260 -0
- data/embulk-docs/src/customization.rst +184 -0
- data/embulk-docs/src/index.rst +84 -0
- data/embulk-docs/src/recipe.rst +8 -0
- data/embulk-docs/src/recipe/scheduled-csv-load-to-elasticsearch-kibana4.rst +153 -0
- data/embulk-docs/src/release.rst +57 -0
- data/embulk-docs/src/release/release-0.1.0.rst +8 -0
- data/embulk-docs/src/release/release-0.2.0.rst +16 -0
- data/embulk-docs/src/release/release-0.2.1.rst +19 -0
- data/embulk-docs/src/release/release-0.3.0.rst +34 -0
- data/embulk-docs/src/release/release-0.3.1.rst +11 -0
- data/embulk-docs/src/release/release-0.3.2.rst +15 -0
- data/embulk-docs/src/release/release-0.4.0.rst +74 -0
- data/embulk-docs/src/release/release-0.4.1.rst +18 -0
- data/embulk-docs/src/release/release-0.4.10.rst +17 -0
- data/embulk-docs/src/release/release-0.4.2.rst +18 -0
- data/embulk-docs/src/release/release-0.4.3.rst +34 -0
- data/embulk-docs/src/release/release-0.4.4.rst +39 -0
- data/embulk-docs/src/release/release-0.4.5.rst +24 -0
- data/embulk-docs/src/release/release-0.4.6.rst +30 -0
- data/embulk-docs/src/release/release-0.4.7.rst +16 -0
- data/embulk-docs/src/release/release-0.4.8.rst +15 -0
- data/embulk-docs/src/release/release-0.4.9.rst +23 -0
- data/embulk-docs/src/release/release-0.5.0.rst +89 -0
- data/embulk-docs/src/release/release-0.5.1.rst +13 -0
- data/embulk-docs/src/release/release-0.5.2.rst +30 -0
- data/embulk-docs/src/release/release-0.5.3.rst +22 -0
- data/embulk-docs/src/release/release-0.5.4.rst +24 -0
- data/embulk-docs/src/release/release-0.5.5.rst +18 -0
- data/embulk-docs/src/release/release-0.6.0.rst +34 -0
- data/embulk-docs/src/release/release-0.6.1.rst +11 -0
- data/embulk-docs/src/release/release-0.6.10.rst +15 -0
- data/embulk-docs/src/release/release-0.6.11.rst +19 -0
- data/embulk-docs/src/release/release-0.6.12.rst +31 -0
- data/embulk-docs/src/release/release-0.6.13.rst +23 -0
- data/embulk-docs/src/release/release-0.6.14.rst +47 -0
- data/embulk-docs/src/release/release-0.6.15.rst +26 -0
- data/embulk-docs/src/release/release-0.6.16.rst +26 -0
- data/embulk-docs/src/release/release-0.6.17.rst +39 -0
- data/embulk-docs/src/release/release-0.6.18.rst +14 -0
- data/embulk-docs/src/release/release-0.6.19.rst +18 -0
- data/embulk-docs/src/release/release-0.6.2.rst +17 -0
- data/embulk-docs/src/release/release-0.6.20.rst +19 -0
- data/embulk-docs/src/release/release-0.6.21.rst +20 -0
- data/embulk-docs/src/release/release-0.6.22.rst +26 -0
- data/embulk-docs/src/release/release-0.6.23.rst +17 -0
- data/embulk-docs/src/release/release-0.6.24.rst +13 -0
- data/embulk-docs/src/release/release-0.6.25.rst +12 -0
- data/embulk-docs/src/release/release-0.6.3.rst +23 -0
- data/embulk-docs/src/release/release-0.6.4.rst +13 -0
- data/embulk-docs/src/release/release-0.6.5.rst +17 -0
- data/embulk-docs/src/release/release-0.6.6.rst +17 -0
- data/embulk-docs/src/release/release-0.6.7.rst +17 -0
- data/embulk-docs/src/release/release-0.6.8.rst +24 -0
- data/embulk-docs/src/release/release-0.6.9.rst +24 -0
- data/embulk-docs/src/release/release-0.7.0.rst +96 -0
- data/embulk-standards/build.gradle +5 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +284 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +379 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +411 -0
- data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +55 -0
- data/embulk-standards/src/main/java/org/embulk/standards/GzipFileEncoderPlugin.java +71 -0
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +203 -0
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +148 -0
- data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +59 -0
- data/embulk-standards/src/main/java/org/embulk/standards/RenameFilterPlugin.java +56 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginExtension.java +16 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +53 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +85 -0
- data/embulk-standards/src/main/resources/META-INF/services/org.embulk.spi.Extension +1 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestCsvFormatterPlugin.java +312 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestCsvParserPlugin.java +75 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java +360 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestRenameFilterPlugin.java +88 -0
- data/embulk.gemspec +39 -0
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +6 -0
- data/gradlew +164 -0
- data/gradlew.bat +90 -0
- data/lib/embulk.rb +72 -0
- data/lib/embulk/buffer.rb +22 -0
- data/lib/embulk/column.rb +70 -0
- data/lib/embulk/command/embulk_bundle.rb +56 -0
- data/lib/embulk/command/embulk_example.rb +32 -0
- data/lib/embulk/command/embulk_generate_bin.rb +62 -0
- data/lib/embulk/command/embulk_main.rb +2 -0
- data/lib/embulk/command/embulk_migrate_plugin.rb +170 -0
- data/lib/embulk/command/embulk_new_plugin.rb +124 -0
- data/lib/embulk/command/embulk_run.rb +470 -0
- data/lib/embulk/command/embulk_selfupdate.rb +84 -0
- data/lib/embulk/data/bundle/.bundle/config +3 -0
- data/lib/embulk/data/bundle/.ruby-version +1 -0
- data/lib/embulk/data/bundle/Gemfile +26 -0
- data/lib/embulk/data/bundle/embulk/filter/example.rb +42 -0
- data/lib/embulk/data/bundle/embulk/input/example.rb +54 -0
- data/lib/embulk/data/bundle/embulk/output/example.rb +58 -0
- data/lib/embulk/data/new/LICENSE.txt +21 -0
- data/lib/embulk/data/new/README.md.erb +111 -0
- data/lib/embulk/data/new/gitignore.erb +13 -0
- data/lib/embulk/data/new/java/build.gradle.erb +73 -0
- data/lib/embulk/data/new/java/decoder.java.erb +84 -0
- data/lib/embulk/data/new/java/encoder.java.erb +86 -0
- data/lib/embulk/data/new/java/file_input.java.erb +143 -0
- data/lib/embulk/data/new/java/file_output.java.erb +93 -0
- data/lib/embulk/data/new/java/filter.java.erb +56 -0
- data/lib/embulk/data/new/java/formatter.java.erb +54 -0
- data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.properties +6 -0
- data/lib/embulk/data/new/java/gradlew +164 -0
- data/lib/embulk/data/new/java/gradlew.bat +90 -0
- data/lib/embulk/data/new/java/input.java.erb +87 -0
- data/lib/embulk/data/new/java/output.java.erb +77 -0
- data/lib/embulk/data/new/java/parser.java.erb +60 -0
- data/lib/embulk/data/new/java/plugin_loader.rb.erb +3 -0
- data/lib/embulk/data/new/java/test.java.erb +5 -0
- data/lib/embulk/data/new/ruby/.ruby-version +1 -0
- data/lib/embulk/data/new/ruby/Gemfile +2 -0
- data/lib/embulk/data/new/ruby/Rakefile +3 -0
- data/lib/embulk/data/new/ruby/decoder_guess.rb.erb +25 -0
- data/lib/embulk/data/new/ruby/filter.rb.erb +41 -0
- data/lib/embulk/data/new/ruby/formatter.rb.erb +49 -0
- data/lib/embulk/data/new/ruby/gemspec.erb +20 -0
- data/lib/embulk/data/new/ruby/input.rb.erb +59 -0
- data/lib/embulk/data/new/ruby/output.rb.erb +61 -0
- data/lib/embulk/data/new/ruby/parser.rb.erb +44 -0
- data/lib/embulk/data/new/ruby/parser_guess.rb.erb +65 -0
- data/lib/embulk/data/package_data.rb +50 -0
- data/lib/embulk/data_source.rb +220 -0
- data/lib/embulk/decoder_plugin.rb +27 -0
- data/lib/embulk/encoder_plugin.rb +27 -0
- data/lib/embulk/error.rb +8 -0
- data/lib/embulk/executor_plugin.rb +23 -0
- data/lib/embulk/file_input.rb +87 -0
- data/lib/embulk/file_input_plugin.rb +27 -0
- data/lib/embulk/file_output.rb +56 -0
- data/lib/embulk/file_output_plugin.rb +27 -0
- data/lib/embulk/filter_plugin.rb +105 -0
- data/lib/embulk/formatter_plugin.rb +105 -0
- data/lib/embulk/guess/charset.rb +44 -0
- data/lib/embulk/guess/csv.rb +327 -0
- data/lib/embulk/guess/gzip.rb +18 -0
- data/lib/embulk/guess/newline.rb +22 -0
- data/lib/embulk/guess/schema_guess.rb +118 -0
- data/lib/embulk/guess/time_format_guess.rb +394 -0
- data/lib/embulk/guess_plugin.rb +129 -0
- data/lib/embulk/input_plugin.rb +121 -0
- data/lib/embulk/java/bootstrap.rb +24 -0
- data/lib/embulk/java/imports.rb +69 -0
- data/lib/embulk/java/time_helper.rb +79 -0
- data/lib/embulk/java_plugin.rb +90 -0
- data/lib/embulk/logger.rb +154 -0
- data/lib/embulk/output_plugin.rb +150 -0
- data/lib/embulk/page.rb +30 -0
- data/lib/embulk/page_builder.rb +76 -0
- data/lib/embulk/parser_plugin.rb +78 -0
- data/lib/embulk/plugin.rb +239 -0
- data/lib/embulk/plugin_registry.rb +96 -0
- data/lib/embulk/runner.rb +184 -0
- data/lib/embulk/schema.rb +103 -0
- data/lib/embulk/version.rb +3 -0
- data/settings.gradle +6 -0
- data/test/guess/test_schema_guess.rb +11 -0
- data/test/guess/test_time_format_guess.rb +133 -0
- data/test/helper.rb +21 -0
- data/test/run-test.rb +14 -0
- metadata +566 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
package org.embulk.spi.time;
|
|
2
|
+
|
|
3
|
+
import java.util.regex.Pattern;
|
|
4
|
+
import java.util.regex.Matcher;
|
|
5
|
+
import org.joda.time.format.DateTimeFormat;
|
|
6
|
+
import org.joda.time.format.DateTimeFormatter;
|
|
7
|
+
import org.joda.time.DateTime;
|
|
8
|
+
import org.jruby.Ruby;
|
|
9
|
+
import org.jruby.RubyTime;
|
|
10
|
+
|
|
11
|
+
public class Timestamp
|
|
12
|
+
implements Comparable<Timestamp>
|
|
13
|
+
{
|
|
14
|
+
private final static DateTimeFormatter TO_STRING_FORMATTER_SECONDS = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss z").withZoneUTC();
|
|
15
|
+
private final static DateTimeFormatter TO_STRING_FORMATTER_MILLIS = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS z").withZoneUTC();
|
|
16
|
+
private final static DateTimeFormatter TO_STRING_FORMATTER_CUSTOM = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withZoneUTC();
|
|
17
|
+
private static final Pattern FROM_STRING_PATTERN = Pattern.compile("(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})(?:\\.(\\d{1,9}))? UTC");
|
|
18
|
+
|
|
19
|
+
private final long seconds;
|
|
20
|
+
private final int nano;
|
|
21
|
+
|
|
22
|
+
private Timestamp(long seconds, int nano)
|
|
23
|
+
{
|
|
24
|
+
this.seconds = seconds;
|
|
25
|
+
this.nano = nano;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public static Timestamp ofEpochSecond(long epochSecond)
|
|
29
|
+
{
|
|
30
|
+
return new Timestamp(epochSecond, 0);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public static Timestamp ofEpochSecond(long epochSecond, long nanoAdjustment)
|
|
34
|
+
{
|
|
35
|
+
return new Timestamp(epochSecond + nanoAdjustment / 1000000000, (int) (nanoAdjustment % 1000000000));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public static Timestamp ofEpochMilli(long epochMilli)
|
|
39
|
+
{
|
|
40
|
+
return new Timestamp(epochMilli / 1000, (int) (epochMilli % 1000 * 1000000));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public long getEpochSecond()
|
|
44
|
+
{
|
|
45
|
+
return seconds;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public int getNano()
|
|
49
|
+
{
|
|
50
|
+
return nano;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public long toEpochMilli()
|
|
54
|
+
{
|
|
55
|
+
return seconds * 1000 + nano / 1000000;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@Override
|
|
59
|
+
public boolean equals(Object other)
|
|
60
|
+
{
|
|
61
|
+
if (this == other) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
if (!(other instanceof Timestamp)) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
Timestamp o = (Timestamp) other;
|
|
68
|
+
return this.seconds == o.seconds && this.nano == o.nano;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@Override
|
|
72
|
+
public int hashCode()
|
|
73
|
+
{
|
|
74
|
+
int h = (int) (seconds ^ (seconds >>> 32));
|
|
75
|
+
h += 17 * nano;
|
|
76
|
+
return h;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@Override
|
|
80
|
+
public int compareTo(Timestamp t)
|
|
81
|
+
{
|
|
82
|
+
if (seconds < t.seconds) {
|
|
83
|
+
return -1;
|
|
84
|
+
} else if (seconds == t.seconds) {
|
|
85
|
+
return nano == t.nano ? 0 : (nano < t.nano ? -1 : 1);
|
|
86
|
+
} else {
|
|
87
|
+
return 1;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public RubyTime getRubyTime(Ruby runtime)
|
|
92
|
+
{
|
|
93
|
+
RubyTime time = new RubyTime(runtime, runtime.getClass("Time"), new DateTime(toEpochMilli())).gmtime();
|
|
94
|
+
time.setNSec(nano % 1000000);
|
|
95
|
+
return time;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public static Timestamp fromRubyTime(RubyTime time)
|
|
99
|
+
{
|
|
100
|
+
long msec = time.getDateTime().getMillis();
|
|
101
|
+
long sec = msec / 1000;
|
|
102
|
+
long nsec = time.getNSec() + (msec % 1000) * 1000000;
|
|
103
|
+
return Timestamp.ofEpochSecond(sec, nsec);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
@Override
|
|
107
|
+
public String toString()
|
|
108
|
+
{
|
|
109
|
+
if (nano == 0) {
|
|
110
|
+
return TO_STRING_FORMATTER_SECONDS.print(getEpochSecond() * 1000);
|
|
111
|
+
|
|
112
|
+
} else if (nano % 1000000 == 0) {
|
|
113
|
+
return TO_STRING_FORMATTER_MILLIS.print(toEpochMilli());
|
|
114
|
+
|
|
115
|
+
} else {
|
|
116
|
+
StringBuffer sb = new StringBuffer();
|
|
117
|
+
TO_STRING_FORMATTER_CUSTOM.printTo(sb, getEpochSecond() * 1000);
|
|
118
|
+
sb.append(".");
|
|
119
|
+
|
|
120
|
+
String digits;
|
|
121
|
+
int zeroDigits;
|
|
122
|
+
if (nano % 1000 == 0) {
|
|
123
|
+
digits = Integer.toString(nano / 1000);
|
|
124
|
+
zeroDigits = 6 - digits.length();
|
|
125
|
+
} else {
|
|
126
|
+
digits = Integer.toString(nano);
|
|
127
|
+
zeroDigits = 9 - digits.length();
|
|
128
|
+
}
|
|
129
|
+
sb.append(digits);
|
|
130
|
+
for (; zeroDigits > 0; zeroDigits--) {
|
|
131
|
+
sb.append('0');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
sb.append(" UTC");
|
|
135
|
+
return sb.toString();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
static Timestamp fromString(String text)
|
|
140
|
+
{
|
|
141
|
+
// TODO exception handling
|
|
142
|
+
Matcher m = FROM_STRING_PATTERN.matcher(text);
|
|
143
|
+
if (!m.matches()) {
|
|
144
|
+
throw new IllegalArgumentException(String.format("Invalid timestamp format '%s'", text));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
long seconds = TO_STRING_FORMATTER_CUSTOM.parseDateTime(m.group(1)).getMillis() / 1000;
|
|
148
|
+
|
|
149
|
+
int nano;
|
|
150
|
+
String frac = m.group(2);
|
|
151
|
+
if (frac == null) {
|
|
152
|
+
nano = 0;
|
|
153
|
+
} else {
|
|
154
|
+
nano = Integer.parseInt(frac) * (int) Math.pow(10, 9 - frac.length());
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return new Timestamp(seconds, nano);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
package org.embulk.spi.time;
|
|
2
|
+
|
|
3
|
+
import java.util.Set;
|
|
4
|
+
import com.google.common.collect.ImmutableSet;
|
|
5
|
+
import com.fasterxml.jackson.annotation.JsonValue;
|
|
6
|
+
import com.fasterxml.jackson.annotation.JsonCreator;
|
|
7
|
+
import org.joda.time.DateTimeZone;
|
|
8
|
+
import org.joda.time.format.DateTimeFormat;
|
|
9
|
+
|
|
10
|
+
public class TimestampFormat
|
|
11
|
+
{
|
|
12
|
+
private final String format;
|
|
13
|
+
|
|
14
|
+
@JsonCreator
|
|
15
|
+
public TimestampFormat(String format)
|
|
16
|
+
{
|
|
17
|
+
this.format = format;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@JsonValue
|
|
21
|
+
public String getFormat()
|
|
22
|
+
{
|
|
23
|
+
return format;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@Deprecated
|
|
27
|
+
public TimestampFormatter newFormatter(TimestampFormatter.FormatterTask task)
|
|
28
|
+
{
|
|
29
|
+
return new TimestampFormatter(format, task);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@Deprecated
|
|
33
|
+
public TimestampParser newParser(TimestampParser.ParserTask task)
|
|
34
|
+
{
|
|
35
|
+
return new TimestampParser(format, task);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private static Set<String> availableTimeZoneNames = ImmutableSet.copyOf(DateTimeZone.getAvailableIDs());
|
|
39
|
+
|
|
40
|
+
public static DateTimeZone parseDateTimeZone(String s)
|
|
41
|
+
{
|
|
42
|
+
if(s.startsWith("+") || s.startsWith("-")) {
|
|
43
|
+
return DateTimeZone.forID(s);
|
|
44
|
+
|
|
45
|
+
} else if (s.equals("Z")) {
|
|
46
|
+
return DateTimeZone.UTC;
|
|
47
|
+
|
|
48
|
+
} else {
|
|
49
|
+
try {
|
|
50
|
+
int rawOffset = (int) DateTimeFormat.forPattern("z").parseMillis(s);
|
|
51
|
+
if(rawOffset == 0) {
|
|
52
|
+
return DateTimeZone.UTC;
|
|
53
|
+
}
|
|
54
|
+
int offset = rawOffset / -1000;
|
|
55
|
+
int h = offset / 3600;
|
|
56
|
+
int m = offset % 3600;
|
|
57
|
+
return DateTimeZone.forOffsetHoursMinutes(h, m);
|
|
58
|
+
} catch (IllegalArgumentException ex) {
|
|
59
|
+
// parseMillis failed
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// TimeZone.getTimeZone returns GMT zone if given timezone id is not found
|
|
63
|
+
// we want to only return timezone if exact match, otherwise exception
|
|
64
|
+
if (availableTimeZoneNames.contains(s)) {
|
|
65
|
+
//return TimeZone.getTimeZone(s);
|
|
66
|
+
return DateTimeZone.forID(s);
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
//// Java standard TimeZone
|
|
73
|
+
//static TimeZone parseDateTimeZone(String s)
|
|
74
|
+
//{
|
|
75
|
+
// if(s.startsWith("+") || s.startsWith("-")) {
|
|
76
|
+
// return TimeZone.getTimeZone("GMT"+s);
|
|
77
|
+
//
|
|
78
|
+
// } else {
|
|
79
|
+
// ParsePosition pp = new ParsePosition(0);
|
|
80
|
+
// Date off = new SimpleDateFormat("z").parse(s, pp);
|
|
81
|
+
// if(off != null && pp.getErrorIndex() == -1) {
|
|
82
|
+
// int rawOffset = (int) off.getTime();
|
|
83
|
+
// if(rawOffset == 0) {
|
|
84
|
+
// return TimeZone.UTC;
|
|
85
|
+
// }
|
|
86
|
+
// int offset = rawOffset / -1000;
|
|
87
|
+
// int h = offset / 3600;
|
|
88
|
+
// int m = offset % 3600;
|
|
89
|
+
// return DateTimeZone.getTimeZone(String.format("GMT%+02d%02d", h, m));
|
|
90
|
+
// }
|
|
91
|
+
//
|
|
92
|
+
// // TimeZone.getTimeZone returns GMT zone if given timezone id is not found
|
|
93
|
+
// // we want to only return timezone if exact match, otherwise exception
|
|
94
|
+
// if (availableTimeZoneNames.contains(s)) {
|
|
95
|
+
// return TimeZone.getTimeZone(s);
|
|
96
|
+
// }
|
|
97
|
+
// return null;
|
|
98
|
+
// }
|
|
99
|
+
//}
|
|
100
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
package org.embulk.spi.time;
|
|
2
|
+
|
|
3
|
+
import java.util.Locale;
|
|
4
|
+
import org.joda.time.DateTime;
|
|
5
|
+
import org.joda.time.DateTimeZone;
|
|
6
|
+
import com.google.common.base.Optional;
|
|
7
|
+
import org.jruby.embed.ScriptingContainer;
|
|
8
|
+
import org.jruby.util.RubyDateFormat;
|
|
9
|
+
import org.embulk.config.Config;
|
|
10
|
+
import org.embulk.config.ConfigInject;
|
|
11
|
+
import org.embulk.config.ConfigDefault;
|
|
12
|
+
import org.embulk.spi.util.LineEncoder;
|
|
13
|
+
|
|
14
|
+
public class TimestampFormatter
|
|
15
|
+
{
|
|
16
|
+
@Deprecated
|
|
17
|
+
public interface FormatterTask
|
|
18
|
+
extends org.embulk.config.Task
|
|
19
|
+
{
|
|
20
|
+
@Config("timezone")
|
|
21
|
+
@ConfigDefault("\"UTC\"")
|
|
22
|
+
public DateTimeZone getTimeZone();
|
|
23
|
+
|
|
24
|
+
@ConfigInject
|
|
25
|
+
public ScriptingContainer getJRuby();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public interface Task
|
|
29
|
+
{
|
|
30
|
+
@Config("default_timezone")
|
|
31
|
+
@ConfigDefault("\"UTC\"")
|
|
32
|
+
public DateTimeZone getDefaultTimeZone();
|
|
33
|
+
|
|
34
|
+
@Config("default_timestamp_format")
|
|
35
|
+
@ConfigDefault("\"%Y-%m-%d %H:%M:%S.%6N %z\"")
|
|
36
|
+
public String getDefaultTimestampFormat();
|
|
37
|
+
|
|
38
|
+
@ConfigInject
|
|
39
|
+
public ScriptingContainer getJRuby();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public interface TimestampColumnOption
|
|
43
|
+
{
|
|
44
|
+
@Config("timezone")
|
|
45
|
+
@ConfigDefault("null")
|
|
46
|
+
public Optional<DateTimeZone> getTimeZone();
|
|
47
|
+
|
|
48
|
+
@Config("format")
|
|
49
|
+
@ConfigDefault("null")
|
|
50
|
+
public Optional<String> getFormat();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private final RubyDateFormat dateFormat;
|
|
54
|
+
private final DateTimeZone timeZone;
|
|
55
|
+
|
|
56
|
+
@Deprecated
|
|
57
|
+
public TimestampFormatter(String format, FormatterTask task)
|
|
58
|
+
{
|
|
59
|
+
this(task.getJRuby(), format, task.getTimeZone());
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public TimestampFormatter(Task task, Optional<? extends TimestampColumnOption> columnOption)
|
|
63
|
+
{
|
|
64
|
+
this(task.getJRuby(),
|
|
65
|
+
columnOption.isPresent() ?
|
|
66
|
+
columnOption.get().getFormat().or(task.getDefaultTimestampFormat())
|
|
67
|
+
: task.getDefaultTimestampFormat(),
|
|
68
|
+
columnOption.isPresent() ?
|
|
69
|
+
columnOption.get().getTimeZone().or(task.getDefaultTimeZone())
|
|
70
|
+
: task.getDefaultTimeZone());
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public TimestampFormatter(ScriptingContainer jruby, String format, DateTimeZone timeZone)
|
|
74
|
+
{
|
|
75
|
+
this.timeZone = timeZone;
|
|
76
|
+
this.dateFormat = new RubyDateFormat(format, Locale.ENGLISH, true);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public DateTimeZone getTimeZone()
|
|
80
|
+
{
|
|
81
|
+
return timeZone;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public void format(Timestamp value, LineEncoder encoder)
|
|
85
|
+
{
|
|
86
|
+
// TODO optimize by directly appending to internal buffer
|
|
87
|
+
encoder.addText(format(value));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public String format(Timestamp value)
|
|
91
|
+
{
|
|
92
|
+
// TODO optimize by using reused StringBuilder
|
|
93
|
+
dateFormat.setDateTime(new DateTime(value.getEpochSecond()*1000, timeZone));
|
|
94
|
+
dateFormat.setNSec(value.getNano());
|
|
95
|
+
return dateFormat.format(null);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
package org.embulk.spi.time;
|
|
2
|
+
|
|
3
|
+
import org.joda.time.DateTimeZone;
|
|
4
|
+
import com.google.common.base.Optional;
|
|
5
|
+
import org.jruby.embed.ScriptingContainer;
|
|
6
|
+
import org.embulk.config.Config;
|
|
7
|
+
import org.embulk.config.ConfigInject;
|
|
8
|
+
import org.embulk.config.ConfigDefault;
|
|
9
|
+
import static org.embulk.spi.time.TimestampFormat.parseDateTimeZone;
|
|
10
|
+
|
|
11
|
+
public class TimestampParser
|
|
12
|
+
{
|
|
13
|
+
@Deprecated
|
|
14
|
+
public interface ParserTask
|
|
15
|
+
extends org.embulk.config.Task
|
|
16
|
+
{
|
|
17
|
+
@Config("default_timezone")
|
|
18
|
+
@ConfigDefault("\"UTC\"")
|
|
19
|
+
public DateTimeZone getDefaultTimeZone();
|
|
20
|
+
|
|
21
|
+
@ConfigInject
|
|
22
|
+
public ScriptingContainer getJRuby();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public interface Task
|
|
26
|
+
{
|
|
27
|
+
@Config("default_timezone")
|
|
28
|
+
@ConfigDefault("\"UTC\"")
|
|
29
|
+
public DateTimeZone getDefaultTimeZone();
|
|
30
|
+
|
|
31
|
+
@Config("default_timestamp_format")
|
|
32
|
+
@ConfigDefault("\"%Y-%m-%d %H:%M:%S.%N %z\"")
|
|
33
|
+
public String getDefaultTimestampFormat();
|
|
34
|
+
|
|
35
|
+
@ConfigInject
|
|
36
|
+
public ScriptingContainer getJRuby();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public interface TimestampColumnOption
|
|
40
|
+
{
|
|
41
|
+
@Config("timezone")
|
|
42
|
+
@ConfigDefault("null")
|
|
43
|
+
public Optional<DateTimeZone> getTimeZone();
|
|
44
|
+
|
|
45
|
+
@Config("format")
|
|
46
|
+
@ConfigDefault("null")
|
|
47
|
+
public Optional<String> getFormat();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private final JRubyTimeParserHelper helper;
|
|
51
|
+
private final DateTimeZone defaultTimeZone;
|
|
52
|
+
|
|
53
|
+
@Deprecated
|
|
54
|
+
public TimestampParser(String format, ParserTask task)
|
|
55
|
+
{
|
|
56
|
+
this(task.getJRuby(), format, task.getDefaultTimeZone());
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
TimestampParser(Task task)
|
|
60
|
+
{
|
|
61
|
+
this(task.getJRuby(), task.getDefaultTimestampFormat(), task.getDefaultTimeZone());
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public TimestampParser(Task task, TimestampColumnOption columnOption)
|
|
65
|
+
{
|
|
66
|
+
this(task.getJRuby(),
|
|
67
|
+
columnOption.getFormat().or(task.getDefaultTimestampFormat()),
|
|
68
|
+
columnOption.getTimeZone().or(task.getDefaultTimeZone()));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public TimestampParser(ScriptingContainer jruby, String format, DateTimeZone defaultTimeZone)
|
|
72
|
+
{
|
|
73
|
+
JRubyTimeParserHelperFactory helperFactory = (JRubyTimeParserHelperFactory) jruby.runScriptlet("Embulk::Java::TimeParserHelper::Factory.new");
|
|
74
|
+
// TODO get default current time from ExecTask.getExecTimestamp
|
|
75
|
+
this.helper = (JRubyTimeParserHelper) helperFactory.newInstance(format, 1970, 1, 1, 0, 0, 0, 0); // TODO default time zone
|
|
76
|
+
this.defaultTimeZone = defaultTimeZone;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public DateTimeZone getDefaultTimeZone()
|
|
80
|
+
{
|
|
81
|
+
return defaultTimeZone;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public Timestamp parse(String text) throws TimestampParseException
|
|
85
|
+
{
|
|
86
|
+
long localUsec = helper.strptimeUsec(text);
|
|
87
|
+
String zone = helper.getZone();
|
|
88
|
+
|
|
89
|
+
DateTimeZone timeZone = defaultTimeZone;
|
|
90
|
+
if (zone != null) {
|
|
91
|
+
// TODO cache parsed zone?
|
|
92
|
+
timeZone = parseDateTimeZone(zone);
|
|
93
|
+
if (timeZone == null) {
|
|
94
|
+
throw new TimestampParseException("Invalid time zone name '" + text + "'");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
long localSec = localUsec / 1000000;
|
|
99
|
+
long usec = localUsec % 1000000;
|
|
100
|
+
long sec = timeZone.convertLocalToUTC(localSec*1000, false) / 1000;
|
|
101
|
+
|
|
102
|
+
return Timestamp.ofEpochSecond(sec, usec * 1000);
|
|
103
|
+
}
|
|
104
|
+
}
|