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.
Files changed (393) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +18 -0
  5. data/COPYING +14 -0
  6. data/Gemfile +2 -0
  7. data/Gemfile.lock +31 -0
  8. data/README.md +206 -0
  9. data/Rakefile +26 -0
  10. data/appveyor.yml +20 -0
  11. data/bin/embulk +106 -0
  12. data/build.gradle +338 -0
  13. data/embulk-cli/build.gradle +6 -0
  14. data/embulk-cli/src/main/java/org/embulk/cli/Main.java +22 -0
  15. data/embulk-cli/src/main/sh/selfrun.sh +158 -0
  16. data/embulk-cli/src/test/java/org/embulk/cli/DummyMain.java +23 -0
  17. data/embulk-cli/src/test/java/org/embulk/cli/SelfrunTest.java +281 -0
  18. data/embulk-core/build.gradle +59 -0
  19. data/embulk-core/src/main/java/org/embulk/EmbulkEmbed.java +315 -0
  20. data/embulk-core/src/main/java/org/embulk/EmbulkService.java +76 -0
  21. data/embulk-core/src/main/java/org/embulk/command/PreviewPrinter.java +84 -0
  22. data/embulk-core/src/main/java/org/embulk/command/TablePreviewPrinter.java +107 -0
  23. data/embulk-core/src/main/java/org/embulk/command/VerticalPreviewPrinter.java +47 -0
  24. data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +33 -0
  25. data/embulk-core/src/main/java/org/embulk/config/Config.java +15 -0
  26. data/embulk-core/src/main/java/org/embulk/config/ConfigDefault.java +15 -0
  27. data/embulk-core/src/main/java/org/embulk/config/ConfigDiff.java +29 -0
  28. data/embulk-core/src/main/java/org/embulk/config/ConfigException.java +20 -0
  29. data/embulk-core/src/main/java/org/embulk/config/ConfigInject.java +14 -0
  30. data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +141 -0
  31. data/embulk-core/src/main/java/org/embulk/config/ConfigSource.java +31 -0
  32. data/embulk-core/src/main/java/org/embulk/config/DataSource.java +39 -0
  33. data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +231 -0
  34. data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +84 -0
  35. data/embulk-core/src/main/java/org/embulk/config/GenericTypeReference.java +20 -0
  36. data/embulk-core/src/main/java/org/embulk/config/ModelManager.java +123 -0
  37. data/embulk-core/src/main/java/org/embulk/config/Task.java +10 -0
  38. data/embulk-core/src/main/java/org/embulk/config/TaskInvocationHandler.java +180 -0
  39. data/embulk-core/src/main/java/org/embulk/config/TaskReport.java +29 -0
  40. data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +345 -0
  41. data/embulk-core/src/main/java/org/embulk/config/TaskSource.java +31 -0
  42. data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +38 -0
  43. data/embulk-core/src/main/java/org/embulk/config/TaskValidator.java +24 -0
  44. data/embulk-core/src/main/java/org/embulk/exec/BulkLoader.java +652 -0
  45. data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +52 -0
  46. data/embulk-core/src/main/java/org/embulk/exec/ExecutionInterruptedException.java +10 -0
  47. data/embulk-core/src/main/java/org/embulk/exec/ExecutionResult.java +26 -0
  48. data/embulk-core/src/main/java/org/embulk/exec/ExtensionServiceLoaderModule.java +43 -0
  49. data/embulk-core/src/main/java/org/embulk/exec/ForGuess.java +16 -0
  50. data/embulk-core/src/main/java/org/embulk/exec/ForSystemConfig.java +16 -0
  51. data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +373 -0
  52. data/embulk-core/src/main/java/org/embulk/exec/LocalExecutorPlugin.java +129 -0
  53. data/embulk-core/src/main/java/org/embulk/exec/LocalThreadExecutor.java +34 -0
  54. data/embulk-core/src/main/java/org/embulk/exec/LoggerProvider.java +60 -0
  55. data/embulk-core/src/main/java/org/embulk/exec/NoSampleException.java +10 -0
  56. data/embulk-core/src/main/java/org/embulk/exec/PartialExecutionException.java +18 -0
  57. data/embulk-core/src/main/java/org/embulk/exec/PooledBufferAllocator.java +77 -0
  58. data/embulk-core/src/main/java/org/embulk/exec/PreviewExecutor.java +183 -0
  59. data/embulk-core/src/main/java/org/embulk/exec/PreviewResult.java +27 -0
  60. data/embulk-core/src/main/java/org/embulk/exec/PreviewedNoticeError.java +17 -0
  61. data/embulk-core/src/main/java/org/embulk/exec/ResumeState.java +100 -0
  62. data/embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java +136 -0
  63. data/embulk-core/src/main/java/org/embulk/exec/SetCurrentThreadName.java +19 -0
  64. data/embulk-core/src/main/java/org/embulk/exec/SystemConfigModule.java +24 -0
  65. data/embulk-core/src/main/java/org/embulk/exec/TempFileAllocator.java +35 -0
  66. data/embulk-core/src/main/java/org/embulk/guice/Bootstrap.java +157 -0
  67. data/embulk-core/src/main/java/org/embulk/guice/CloseableInjector.java +22 -0
  68. data/embulk-core/src/main/java/org/embulk/guice/InjectorProxy.java +145 -0
  69. data/embulk-core/src/main/java/org/embulk/guice/LifeCycleInjector.java +26 -0
  70. data/embulk-core/src/main/java/org/embulk/guice/LifeCycleInjectorProxy.java +61 -0
  71. data/embulk-core/src/main/java/org/embulk/guice/LifeCycleManager.java +187 -0
  72. data/embulk-core/src/main/java/org/embulk/guice/LifeCycleMethods.java +89 -0
  73. data/embulk-core/src/main/java/org/embulk/guice/LifeCycleMethodsMap.java +38 -0
  74. data/embulk-core/src/main/java/org/embulk/guice/LifeCycleModule.java +97 -0
  75. data/embulk-core/src/main/java/org/embulk/jruby/JRubyPluginSource.java +72 -0
  76. data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +119 -0
  77. data/embulk-core/src/main/java/org/embulk/plugin/BuiltinPluginSourceModule.java +17 -0
  78. data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +96 -0
  79. data/embulk-core/src/main/java/org/embulk/plugin/PluginClassLoader.java +168 -0
  80. data/embulk-core/src/main/java/org/embulk/plugin/PluginClassLoaderFactory.java +9 -0
  81. data/embulk-core/src/main/java/org/embulk/plugin/PluginClassLoaderModule.java +71 -0
  82. data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +78 -0
  83. data/embulk-core/src/main/java/org/embulk/plugin/PluginSource.java +6 -0
  84. data/embulk-core/src/main/java/org/embulk/plugin/PluginSourceNotMatchException.java +19 -0
  85. data/embulk-core/src/main/java/org/embulk/plugin/PluginType.java +47 -0
  86. data/embulk-core/src/main/java/org/embulk/plugin/compat/InputPluginWrapper.java +102 -0
  87. data/embulk-core/src/main/java/org/embulk/plugin/compat/PluginWrappers.java +30 -0
  88. data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalFileInputWrapper.java +96 -0
  89. data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalFileOutputWrapper.java +102 -0
  90. data/embulk-core/src/main/java/org/embulk/plugin/compat/TransactionalPageOutputWrapper.java +95 -0
  91. data/embulk-core/src/main/java/org/embulk/spi/Buffer.java +148 -0
  92. data/embulk-core/src/main/java/org/embulk/spi/BufferAllocator.java +8 -0
  93. data/embulk-core/src/main/java/org/embulk/spi/Column.java +92 -0
  94. data/embulk-core/src/main/java/org/embulk/spi/ColumnConfig.java +112 -0
  95. data/embulk-core/src/main/java/org/embulk/spi/ColumnVisitor.java +14 -0
  96. data/embulk-core/src/main/java/org/embulk/spi/DecoderPlugin.java +16 -0
  97. data/embulk-core/src/main/java/org/embulk/spi/EncoderPlugin.java +16 -0
  98. data/embulk-core/src/main/java/org/embulk/spi/Exec.java +113 -0
  99. data/embulk-core/src/main/java/org/embulk/spi/ExecAction.java +6 -0
  100. data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +217 -0
  101. data/embulk-core/src/main/java/org/embulk/spi/ExecutorPlugin.java +19 -0
  102. data/embulk-core/src/main/java/org/embulk/spi/Extension.java +44 -0
  103. data/embulk-core/src/main/java/org/embulk/spi/FileInput.java +11 -0
  104. data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +30 -0
  105. data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +162 -0
  106. data/embulk-core/src/main/java/org/embulk/spi/FileOutput.java +13 -0
  107. data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +28 -0
  108. data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +202 -0
  109. data/embulk-core/src/main/java/org/embulk/spi/FilterPlugin.java +18 -0
  110. data/embulk-core/src/main/java/org/embulk/spi/FormatterPlugin.java +18 -0
  111. data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +9 -0
  112. data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +33 -0
  113. data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +29 -0
  114. data/embulk-core/src/main/java/org/embulk/spi/Page.java +51 -0
  115. data/embulk-core/src/main/java/org/embulk/spi/PageBuilder.java +338 -0
  116. data/embulk-core/src/main/java/org/embulk/spi/PageFormat.java +47 -0
  117. data/embulk-core/src/main/java/org/embulk/spi/PageOutput.java +11 -0
  118. data/embulk-core/src/main/java/org/embulk/spi/PageReader.java +226 -0
  119. data/embulk-core/src/main/java/org/embulk/spi/ParserPlugin.java +17 -0
  120. data/embulk-core/src/main/java/org/embulk/spi/ProcessState.java +10 -0
  121. data/embulk-core/src/main/java/org/embulk/spi/ProcessTask.java +117 -0
  122. data/embulk-core/src/main/java/org/embulk/spi/Schema.java +134 -0
  123. data/embulk-core/src/main/java/org/embulk/spi/SchemaConfig.java +93 -0
  124. data/embulk-core/src/main/java/org/embulk/spi/SchemaConfigException.java +22 -0
  125. data/embulk-core/src/main/java/org/embulk/spi/TaskState.java +81 -0
  126. data/embulk-core/src/main/java/org/embulk/spi/TempFileException.java +19 -0
  127. data/embulk-core/src/main/java/org/embulk/spi/TempFileSpace.java +87 -0
  128. data/embulk-core/src/main/java/org/embulk/spi/Transactional.java +10 -0
  129. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileInput.java +17 -0
  130. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileOutput.java +19 -0
  131. data/embulk-core/src/main/java/org/embulk/spi/TransactionalPageOutput.java +17 -0
  132. data/embulk-core/src/main/java/org/embulk/spi/time/DateTimeZoneSerDe.java +55 -0
  133. data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelper.java +8 -0
  134. data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelperFactory.java +6 -0
  135. data/embulk-core/src/main/java/org/embulk/spi/time/Timestamp.java +159 -0
  136. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java +100 -0
  137. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +97 -0
  138. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParseException.java +10 -0
  139. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +104 -0
  140. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampSerDe.java +49 -0
  141. data/embulk-core/src/main/java/org/embulk/spi/type/AbstractType.java +58 -0
  142. data/embulk-core/src/main/java/org/embulk/spi/type/BooleanType.java +12 -0
  143. data/embulk-core/src/main/java/org/embulk/spi/type/DoubleType.java +12 -0
  144. data/embulk-core/src/main/java/org/embulk/spi/type/LongType.java +12 -0
  145. data/embulk-core/src/main/java/org/embulk/spi/type/StringType.java +12 -0
  146. data/embulk-core/src/main/java/org/embulk/spi/type/TimestampType.java +41 -0
  147. data/embulk-core/src/main/java/org/embulk/spi/type/Type.java +15 -0
  148. data/embulk-core/src/main/java/org/embulk/spi/type/TypeDeserializer.java +44 -0
  149. data/embulk-core/src/main/java/org/embulk/spi/type/Types.java +14 -0
  150. data/embulk-core/src/main/java/org/embulk/spi/unit/ByteSize.java +156 -0
  151. data/embulk-core/src/main/java/org/embulk/spi/unit/LocalFile.java +106 -0
  152. data/embulk-core/src/main/java/org/embulk/spi/unit/LocalFileSerDe.java +113 -0
  153. data/embulk-core/src/main/java/org/embulk/spi/unit/ToString.java +54 -0
  154. data/embulk-core/src/main/java/org/embulk/spi/unit/ToStringMap.java +34 -0
  155. data/embulk-core/src/main/java/org/embulk/spi/util/CharsetSerDe.java +55 -0
  156. data/embulk-core/src/main/java/org/embulk/spi/util/Decoders.java +81 -0
  157. data/embulk-core/src/main/java/org/embulk/spi/util/DynamicColumnNotFoundException.java +10 -0
  158. data/embulk-core/src/main/java/org/embulk/spi/util/DynamicColumnSetter.java +18 -0
  159. data/embulk-core/src/main/java/org/embulk/spi/util/DynamicColumnSetterFactory.java +94 -0
  160. data/embulk-core/src/main/java/org/embulk/spi/util/DynamicPageBuilder.java +161 -0
  161. data/embulk-core/src/main/java/org/embulk/spi/util/Encoders.java +81 -0
  162. data/embulk-core/src/main/java/org/embulk/spi/util/Executors.java +95 -0
  163. data/embulk-core/src/main/java/org/embulk/spi/util/FileInputInputStream.java +111 -0
  164. data/embulk-core/src/main/java/org/embulk/spi/util/FileOutputOutputStream.java +119 -0
  165. data/embulk-core/src/main/java/org/embulk/spi/util/Filters.java +100 -0
  166. data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamFileInput.java +190 -0
  167. data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamTransactionalFileInput.java +25 -0
  168. data/embulk-core/src/main/java/org/embulk/spi/util/Inputs.java +65 -0
  169. data/embulk-core/src/main/java/org/embulk/spi/util/LineDecoder.java +118 -0
  170. data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +123 -0
  171. data/embulk-core/src/main/java/org/embulk/spi/util/ListFileInput.java +52 -0
  172. data/embulk-core/src/main/java/org/embulk/spi/util/Newline.java +38 -0
  173. data/embulk-core/src/main/java/org/embulk/spi/util/OutputStreamFileOutput.java +88 -0
  174. data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +102 -0
  175. data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +139 -0
  176. data/embulk-core/src/main/java/org/embulk/spi/util/ResumableInputStream.java +128 -0
  177. data/embulk-core/src/main/java/org/embulk/spi/util/RetryExecutor.java +130 -0
  178. data/embulk-core/src/main/java/org/embulk/spi/util/Timestamps.java +53 -0
  179. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/AbstractDynamicColumnSetter.java +79 -0
  180. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/BooleanColumnSetter.java +64 -0
  181. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/DefaultValueSetter.java +18 -0
  182. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/DoubleColumnSetter.java +61 -0
  183. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/LongColumnSetter.java +69 -0
  184. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/NullDefaultValueSetter.java +34 -0
  185. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/SkipColumnSetter.java +52 -0
  186. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/StringColumnSetter.java +56 -0
  187. data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/TimestampColumnSetter.java +64 -0
  188. data/embulk-core/src/main/resources/embulk/logback-color.xml +72 -0
  189. data/embulk-core/src/main/resources/embulk/logback-console.xml +14 -0
  190. data/embulk-core/src/main/resources/embulk/logback-file.xml +25 -0
  191. data/embulk-core/src/main/resources/embulk/parent_first_packages.properties +70 -0
  192. data/embulk-core/src/main/resources/embulk/parent_first_resources.properties +28 -0
  193. data/embulk-core/src/test/java/org/embulk/EmbulkTestRuntime.java +114 -0
  194. data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +72 -0
  195. data/embulk-core/src/test/java/org/embulk/RandomManager.java +53 -0
  196. data/embulk-core/src/test/java/org/embulk/TestPluginSourceModule.java +23 -0
  197. data/embulk-core/src/test/java/org/embulk/TestUtilityModule.java +17 -0
  198. data/embulk-core/src/test/java/org/embulk/config/TestConfigLoader.java +66 -0
  199. data/embulk-core/src/test/java/org/embulk/config/TestConfigSource.java +114 -0
  200. data/embulk-core/src/test/java/org/embulk/config/TestTaskSource.java +70 -0
  201. data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +58 -0
  202. data/embulk-core/src/test/java/org/embulk/plugin/TestPluginType.java +18 -0
  203. data/embulk-core/src/test/java/org/embulk/spi/MockFileOutput.java +63 -0
  204. data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +101 -0
  205. data/embulk-core/src/test/java/org/embulk/spi/MockParserPlugin.java +73 -0
  206. data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +57 -0
  207. data/embulk-core/src/test/java/org/embulk/spi/TestBuffer.java +24 -0
  208. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputInputStream.java +89 -0
  209. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +196 -0
  210. data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +207 -0
  211. data/embulk-core/src/test/java/org/embulk/spi/TestInputStreamFileInput.java +188 -0
  212. data/embulk-core/src/test/java/org/embulk/spi/TestPageBuilderReader.java +319 -0
  213. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestamp.java +116 -0
  214. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParser.java +63 -0
  215. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParserDeprecated.java +67 -0
  216. data/embulk-core/src/test/java/org/embulk/spi/type/TestTypeSerDe.java +45 -0
  217. data/embulk-core/src/test/java/org/embulk/spi/unit/TestByteSize.java +79 -0
  218. data/embulk-core/src/test/java/org/embulk/spi/util/TestLineDecoder.java +132 -0
  219. data/embulk-core/src/test/java/org/embulk/spi/util/TestLineEncoder.java +123 -0
  220. data/embulk-docs/Makefile +178 -0
  221. data/embulk-docs/build.gradle +32 -0
  222. data/embulk-docs/make.bat +243 -0
  223. data/embulk-docs/push-gh-pages.sh +49 -0
  224. data/embulk-docs/src/_static/embulk-architecture.png +0 -0
  225. data/embulk-docs/src/_static/embulk-logo.png +0 -0
  226. data/embulk-docs/src/_static/embulk-logo.svg +133 -0
  227. data/embulk-docs/src/built-in.rst +440 -0
  228. data/embulk-docs/src/conf.py +260 -0
  229. data/embulk-docs/src/customization.rst +184 -0
  230. data/embulk-docs/src/index.rst +84 -0
  231. data/embulk-docs/src/recipe.rst +8 -0
  232. data/embulk-docs/src/recipe/scheduled-csv-load-to-elasticsearch-kibana4.rst +153 -0
  233. data/embulk-docs/src/release.rst +57 -0
  234. data/embulk-docs/src/release/release-0.1.0.rst +8 -0
  235. data/embulk-docs/src/release/release-0.2.0.rst +16 -0
  236. data/embulk-docs/src/release/release-0.2.1.rst +19 -0
  237. data/embulk-docs/src/release/release-0.3.0.rst +34 -0
  238. data/embulk-docs/src/release/release-0.3.1.rst +11 -0
  239. data/embulk-docs/src/release/release-0.3.2.rst +15 -0
  240. data/embulk-docs/src/release/release-0.4.0.rst +74 -0
  241. data/embulk-docs/src/release/release-0.4.1.rst +18 -0
  242. data/embulk-docs/src/release/release-0.4.10.rst +17 -0
  243. data/embulk-docs/src/release/release-0.4.2.rst +18 -0
  244. data/embulk-docs/src/release/release-0.4.3.rst +34 -0
  245. data/embulk-docs/src/release/release-0.4.4.rst +39 -0
  246. data/embulk-docs/src/release/release-0.4.5.rst +24 -0
  247. data/embulk-docs/src/release/release-0.4.6.rst +30 -0
  248. data/embulk-docs/src/release/release-0.4.7.rst +16 -0
  249. data/embulk-docs/src/release/release-0.4.8.rst +15 -0
  250. data/embulk-docs/src/release/release-0.4.9.rst +23 -0
  251. data/embulk-docs/src/release/release-0.5.0.rst +89 -0
  252. data/embulk-docs/src/release/release-0.5.1.rst +13 -0
  253. data/embulk-docs/src/release/release-0.5.2.rst +30 -0
  254. data/embulk-docs/src/release/release-0.5.3.rst +22 -0
  255. data/embulk-docs/src/release/release-0.5.4.rst +24 -0
  256. data/embulk-docs/src/release/release-0.5.5.rst +18 -0
  257. data/embulk-docs/src/release/release-0.6.0.rst +34 -0
  258. data/embulk-docs/src/release/release-0.6.1.rst +11 -0
  259. data/embulk-docs/src/release/release-0.6.10.rst +15 -0
  260. data/embulk-docs/src/release/release-0.6.11.rst +19 -0
  261. data/embulk-docs/src/release/release-0.6.12.rst +31 -0
  262. data/embulk-docs/src/release/release-0.6.13.rst +23 -0
  263. data/embulk-docs/src/release/release-0.6.14.rst +47 -0
  264. data/embulk-docs/src/release/release-0.6.15.rst +26 -0
  265. data/embulk-docs/src/release/release-0.6.16.rst +26 -0
  266. data/embulk-docs/src/release/release-0.6.17.rst +39 -0
  267. data/embulk-docs/src/release/release-0.6.18.rst +14 -0
  268. data/embulk-docs/src/release/release-0.6.19.rst +18 -0
  269. data/embulk-docs/src/release/release-0.6.2.rst +17 -0
  270. data/embulk-docs/src/release/release-0.6.20.rst +19 -0
  271. data/embulk-docs/src/release/release-0.6.21.rst +20 -0
  272. data/embulk-docs/src/release/release-0.6.22.rst +26 -0
  273. data/embulk-docs/src/release/release-0.6.23.rst +17 -0
  274. data/embulk-docs/src/release/release-0.6.24.rst +13 -0
  275. data/embulk-docs/src/release/release-0.6.25.rst +12 -0
  276. data/embulk-docs/src/release/release-0.6.3.rst +23 -0
  277. data/embulk-docs/src/release/release-0.6.4.rst +13 -0
  278. data/embulk-docs/src/release/release-0.6.5.rst +17 -0
  279. data/embulk-docs/src/release/release-0.6.6.rst +17 -0
  280. data/embulk-docs/src/release/release-0.6.7.rst +17 -0
  281. data/embulk-docs/src/release/release-0.6.8.rst +24 -0
  282. data/embulk-docs/src/release/release-0.6.9.rst +24 -0
  283. data/embulk-docs/src/release/release-0.7.0.rst +96 -0
  284. data/embulk-standards/build.gradle +5 -0
  285. data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +284 -0
  286. data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +379 -0
  287. data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +411 -0
  288. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +55 -0
  289. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileEncoderPlugin.java +71 -0
  290. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +203 -0
  291. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +148 -0
  292. data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +59 -0
  293. data/embulk-standards/src/main/java/org/embulk/standards/RenameFilterPlugin.java +56 -0
  294. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginExtension.java +16 -0
  295. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +53 -0
  296. data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +85 -0
  297. data/embulk-standards/src/main/resources/META-INF/services/org.embulk.spi.Extension +1 -0
  298. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvFormatterPlugin.java +312 -0
  299. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvParserPlugin.java +75 -0
  300. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java +360 -0
  301. data/embulk-standards/src/test/java/org/embulk/standards/TestRenameFilterPlugin.java +88 -0
  302. data/embulk.gemspec +39 -0
  303. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  304. data/gradle/wrapper/gradle-wrapper.properties +6 -0
  305. data/gradlew +164 -0
  306. data/gradlew.bat +90 -0
  307. data/lib/embulk.rb +72 -0
  308. data/lib/embulk/buffer.rb +22 -0
  309. data/lib/embulk/column.rb +70 -0
  310. data/lib/embulk/command/embulk_bundle.rb +56 -0
  311. data/lib/embulk/command/embulk_example.rb +32 -0
  312. data/lib/embulk/command/embulk_generate_bin.rb +62 -0
  313. data/lib/embulk/command/embulk_main.rb +2 -0
  314. data/lib/embulk/command/embulk_migrate_plugin.rb +170 -0
  315. data/lib/embulk/command/embulk_new_plugin.rb +124 -0
  316. data/lib/embulk/command/embulk_run.rb +470 -0
  317. data/lib/embulk/command/embulk_selfupdate.rb +84 -0
  318. data/lib/embulk/data/bundle/.bundle/config +3 -0
  319. data/lib/embulk/data/bundle/.ruby-version +1 -0
  320. data/lib/embulk/data/bundle/Gemfile +26 -0
  321. data/lib/embulk/data/bundle/embulk/filter/example.rb +42 -0
  322. data/lib/embulk/data/bundle/embulk/input/example.rb +54 -0
  323. data/lib/embulk/data/bundle/embulk/output/example.rb +58 -0
  324. data/lib/embulk/data/new/LICENSE.txt +21 -0
  325. data/lib/embulk/data/new/README.md.erb +111 -0
  326. data/lib/embulk/data/new/gitignore.erb +13 -0
  327. data/lib/embulk/data/new/java/build.gradle.erb +73 -0
  328. data/lib/embulk/data/new/java/decoder.java.erb +84 -0
  329. data/lib/embulk/data/new/java/encoder.java.erb +86 -0
  330. data/lib/embulk/data/new/java/file_input.java.erb +143 -0
  331. data/lib/embulk/data/new/java/file_output.java.erb +93 -0
  332. data/lib/embulk/data/new/java/filter.java.erb +56 -0
  333. data/lib/embulk/data/new/java/formatter.java.erb +54 -0
  334. data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.jar +0 -0
  335. data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.properties +6 -0
  336. data/lib/embulk/data/new/java/gradlew +164 -0
  337. data/lib/embulk/data/new/java/gradlew.bat +90 -0
  338. data/lib/embulk/data/new/java/input.java.erb +87 -0
  339. data/lib/embulk/data/new/java/output.java.erb +77 -0
  340. data/lib/embulk/data/new/java/parser.java.erb +60 -0
  341. data/lib/embulk/data/new/java/plugin_loader.rb.erb +3 -0
  342. data/lib/embulk/data/new/java/test.java.erb +5 -0
  343. data/lib/embulk/data/new/ruby/.ruby-version +1 -0
  344. data/lib/embulk/data/new/ruby/Gemfile +2 -0
  345. data/lib/embulk/data/new/ruby/Rakefile +3 -0
  346. data/lib/embulk/data/new/ruby/decoder_guess.rb.erb +25 -0
  347. data/lib/embulk/data/new/ruby/filter.rb.erb +41 -0
  348. data/lib/embulk/data/new/ruby/formatter.rb.erb +49 -0
  349. data/lib/embulk/data/new/ruby/gemspec.erb +20 -0
  350. data/lib/embulk/data/new/ruby/input.rb.erb +59 -0
  351. data/lib/embulk/data/new/ruby/output.rb.erb +61 -0
  352. data/lib/embulk/data/new/ruby/parser.rb.erb +44 -0
  353. data/lib/embulk/data/new/ruby/parser_guess.rb.erb +65 -0
  354. data/lib/embulk/data/package_data.rb +50 -0
  355. data/lib/embulk/data_source.rb +220 -0
  356. data/lib/embulk/decoder_plugin.rb +27 -0
  357. data/lib/embulk/encoder_plugin.rb +27 -0
  358. data/lib/embulk/error.rb +8 -0
  359. data/lib/embulk/executor_plugin.rb +23 -0
  360. data/lib/embulk/file_input.rb +87 -0
  361. data/lib/embulk/file_input_plugin.rb +27 -0
  362. data/lib/embulk/file_output.rb +56 -0
  363. data/lib/embulk/file_output_plugin.rb +27 -0
  364. data/lib/embulk/filter_plugin.rb +105 -0
  365. data/lib/embulk/formatter_plugin.rb +105 -0
  366. data/lib/embulk/guess/charset.rb +44 -0
  367. data/lib/embulk/guess/csv.rb +327 -0
  368. data/lib/embulk/guess/gzip.rb +18 -0
  369. data/lib/embulk/guess/newline.rb +22 -0
  370. data/lib/embulk/guess/schema_guess.rb +118 -0
  371. data/lib/embulk/guess/time_format_guess.rb +394 -0
  372. data/lib/embulk/guess_plugin.rb +129 -0
  373. data/lib/embulk/input_plugin.rb +121 -0
  374. data/lib/embulk/java/bootstrap.rb +24 -0
  375. data/lib/embulk/java/imports.rb +69 -0
  376. data/lib/embulk/java/time_helper.rb +79 -0
  377. data/lib/embulk/java_plugin.rb +90 -0
  378. data/lib/embulk/logger.rb +154 -0
  379. data/lib/embulk/output_plugin.rb +150 -0
  380. data/lib/embulk/page.rb +30 -0
  381. data/lib/embulk/page_builder.rb +76 -0
  382. data/lib/embulk/parser_plugin.rb +78 -0
  383. data/lib/embulk/plugin.rb +239 -0
  384. data/lib/embulk/plugin_registry.rb +96 -0
  385. data/lib/embulk/runner.rb +184 -0
  386. data/lib/embulk/schema.rb +103 -0
  387. data/lib/embulk/version.rb +3 -0
  388. data/settings.gradle +6 -0
  389. data/test/guess/test_schema_guess.rb +11 -0
  390. data/test/guess/test_time_format_guess.rb +133 -0
  391. data/test/helper.rb +21 -0
  392. data/test/run-test.rb +14 -0
  393. metadata +566 -0
@@ -0,0 +1,73 @@
1
+ package org.embulk.spi;
2
+
3
+ import org.embulk.config.Config;
4
+ import org.embulk.config.ConfigSource;
5
+ import org.embulk.config.Task;
6
+ import org.embulk.config.TaskSource;
7
+ import org.embulk.spi.time.Timestamp;
8
+ import org.embulk.spi.type.Type;
9
+ import org.embulk.spi.Column;
10
+ import org.embulk.spi.Schema;
11
+ import org.embulk.spi.SchemaConfig;
12
+ import org.embulk.spi.PageOutput;
13
+
14
+ public class MockParserPlugin implements ParserPlugin
15
+ {
16
+ public static boolean raiseException = false;
17
+
18
+ public interface PluginTask extends Task
19
+ {
20
+ @Config("columns")
21
+ public SchemaConfig getSchemaConfig();
22
+ }
23
+
24
+ @Override
25
+ public void transaction(ConfigSource config, Control control)
26
+ {
27
+ PluginTask task = config.loadConfig(PluginTask.class);
28
+ control.run(task.dump(), task.getSchemaConfig().toSchema());
29
+ }
30
+
31
+ @Override
32
+ public void run(TaskSource taskSource, Schema schema,
33
+ FileInput input, PageOutput output)
34
+ {
35
+ try (final PageBuilder pageBuilder = new PageBuilder(
36
+ Exec.getBufferAllocator(), schema, output)) {
37
+ while (input.nextFile()) {
38
+ Buffer buffer = input.poll();
39
+ if (buffer != null) {
40
+ for (Column column : schema.getColumns()) {
41
+ Type type = column.getType();
42
+ switch (type.getName()) {
43
+ case "boolean":
44
+ pageBuilder.setBoolean(column, true);
45
+ break;
46
+ case "long":
47
+ pageBuilder.setLong(column, 2L);
48
+ break;
49
+ case "double":
50
+ pageBuilder.setDouble(column, 3.0D);
51
+ break;
52
+ case "string":
53
+ pageBuilder.setString(column, "45");
54
+ break;
55
+ case "timestamp":
56
+ pageBuilder.setTimestamp(column,
57
+ Timestamp.ofEpochMilli(678L));
58
+ break;
59
+ default:
60
+ throw new IllegalStateException("Unknown type: "
61
+ + type.getName());
62
+ }
63
+ }
64
+ pageBuilder.addRecord();
65
+ if (raiseException) {
66
+ throw new RuntimeException("emulated exception");
67
+ }
68
+ }
69
+ }
70
+ pageBuilder.finish();
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,57 @@
1
+ package org.embulk.spi;
2
+
3
+ import java.util.ArrayList;
4
+ import java.util.List;
5
+
6
+ import org.embulk.spi.TestPageBuilderReader.MockPageOutput;
7
+ import org.embulk.spi.time.Timestamp;
8
+ import org.embulk.spi.Column;
9
+ import org.embulk.spi.ColumnConfig;
10
+ import org.embulk.spi.Schema;
11
+ import org.embulk.spi.SchemaConfig;
12
+ import org.embulk.spi.ColumnVisitor;
13
+ import org.embulk.spi.type.Type;
14
+
15
+ import com.google.common.collect.ImmutableList;
16
+
17
+ public class PageTestUtils
18
+ {
19
+ private PageTestUtils()
20
+ { }
21
+
22
+ public static List<Page> buildPage(BufferAllocator bufferAllocator,
23
+ Schema schema, Object... values)
24
+ {
25
+ MockPageOutput output = new MockPageOutput();
26
+ try (PageBuilder builder = new PageBuilder(bufferAllocator, schema,
27
+ output)) {
28
+ int idx = 0;
29
+ while (idx < values.length) {
30
+ for (int column = 0; column < builder.getSchema()
31
+ .getColumnCount(); ++column) {
32
+ Object value = values[idx++];
33
+ if (value == null) {
34
+ builder.setNull(column);
35
+ } else if (value instanceof Boolean) {
36
+ builder.setBoolean(column, (Boolean) value);
37
+ } else if (value instanceof Double) {
38
+ builder.setDouble(column, (Double) value);
39
+ } else if (value instanceof Long) {
40
+ builder.setLong(column, (Long) value);
41
+ } else if (value instanceof String) {
42
+ builder.setString(column, (String) value);
43
+ } else if (value instanceof Timestamp) {
44
+ builder.setTimestamp(column, (Timestamp) value);
45
+ } else {
46
+ throw new IllegalStateException(
47
+ "Unsupported type in test utils: "
48
+ + value.toString());
49
+ }
50
+ }
51
+ builder.addRecord();
52
+ }
53
+ builder.finish();
54
+ }
55
+ return output.pages;
56
+ }
57
+ }
@@ -0,0 +1,24 @@
1
+ package org.embulk.spi;
2
+
3
+ import static org.junit.Assert.assertEquals;
4
+ import static org.junit.Assert.assertTrue;
5
+ import static org.junit.Assert.assertFalse;
6
+ import org.junit.Test;
7
+
8
+ public class TestBuffer
9
+ {
10
+ @Test
11
+ public void testEquals() throws Exception
12
+ {
13
+ byte[] bytes = new byte[] { 1, 2, 3, 2, 3 };
14
+ Buffer b1 = Buffer.wrap(bytes, 0, 2); // [1, 2]
15
+ Buffer b2 = Buffer.wrap(bytes, 1, 2); // [2, 3]
16
+ Buffer b3 = Buffer.wrap(bytes, 3, 2); // [2, 3]
17
+
18
+ assertFalse(b1.equals(b2));
19
+ assertTrue(b2.equals(b3));
20
+
21
+ assertFalse(b1.hashCode() == b2.hashCode());
22
+ assertTrue(b2.hashCode() == b3.hashCode());
23
+ }
24
+ }
@@ -0,0 +1,89 @@
1
+ package org.embulk.spi;
2
+
3
+ import static org.junit.Assert.assertArrayEquals;
4
+ import static org.junit.Assert.assertEquals;
5
+ import java.io.ByteArrayOutputStream;
6
+ import java.util.Random;
7
+ import org.junit.Rule;
8
+ import org.junit.Test;
9
+ import org.embulk.spi.util.ListFileInput;
10
+ import org.embulk.spi.util.FileInputInputStream;
11
+ import org.embulk.spi.util.FileOutputOutputStream;
12
+ import org.embulk.EmbulkTestRuntime;
13
+
14
+ public class TestFileInputInputStream
15
+ {
16
+ @Rule
17
+ public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
18
+
19
+ private ListFileInput fileInput;
20
+ private MockFileOutput fileOutput;
21
+
22
+ private FileInputInputStream in;
23
+ private FileOutputOutputStream out;
24
+
25
+ private void newOutputStream()
26
+ {
27
+ fileOutput = new MockFileOutput();
28
+ out = new FileOutputOutputStream(fileOutput, runtime.getBufferAllocator(), FileOutputOutputStream.CloseMode.CLOSE);
29
+ }
30
+
31
+ private void newInputStream()
32
+ {
33
+ fileInput = new ListFileInput(fileOutput.getFiles());
34
+ in = new FileInputInputStream(fileInput);
35
+ }
36
+
37
+ @Test
38
+ public void testRandomReadWrite() throws Exception
39
+ {
40
+ newOutputStream();
41
+ out.nextFile();
42
+ ByteArrayOutputStream expectedOut = new ByteArrayOutputStream();
43
+ Random rand = runtime.getRandom();
44
+ byte[] buffer = new byte[rand.nextInt() % 1024 + 1024];
45
+ for (int i = 0; i < 256; i++) {
46
+ rand.nextBytes(buffer);
47
+ expectedOut.write(buffer);
48
+ out.write(buffer);
49
+ }
50
+ out.finish();
51
+ byte[] expected = expectedOut.toByteArray();
52
+ byte[] actual = new byte[expected.length];
53
+
54
+ newInputStream();
55
+ in.nextFile();
56
+ int pos = 0;
57
+ while (pos < actual.length) {
58
+ int n = in.read(actual, pos, actual.length - pos);
59
+ if (n < 0) {
60
+ break;
61
+ }
62
+ pos += n;
63
+ }
64
+ assertEquals(expected.length, pos);
65
+ assertArrayEquals(expected, actual);
66
+ }
67
+
68
+ @Test
69
+ public void testSkipReturnsZeroForNoData() {
70
+ FileInputInputStream in = new FileInputInputStream(new MockFileInput());
71
+ assertEquals("Verify skip() returns 0 when there is no data.", 0L, in.skip(1));
72
+ }
73
+
74
+ private static class MockFileInput implements FileInput {
75
+ @Override
76
+ public boolean nextFile() {
77
+ return false;
78
+ }
79
+
80
+ @Override
81
+ public Buffer poll() {
82
+ return null;
83
+ }
84
+
85
+ @Override
86
+ public void close() {
87
+ }
88
+ }
89
+ }
@@ -0,0 +1,196 @@
1
+ package org.embulk.spi;
2
+
3
+ import static org.junit.Assert.assertEquals;
4
+
5
+ import java.util.ArrayList;
6
+ import java.util.Arrays;
7
+ import java.util.LinkedList;
8
+ import java.util.List;
9
+ import java.util.Queue;
10
+ import org.junit.Before;
11
+ import org.junit.Rule;
12
+ import org.junit.Test;
13
+ import com.google.common.collect.ImmutableList;
14
+ import com.google.common.collect.ImmutableMap;
15
+ import org.embulk.EmbulkTestRuntime;
16
+ import org.embulk.config.TaskReport;
17
+ import org.embulk.config.ConfigSource;
18
+ import org.embulk.config.ConfigDiff;
19
+ import org.embulk.config.TaskSource;
20
+ import org.embulk.spi.time.Timestamp;
21
+ import org.embulk.spi.TestPageBuilderReader.MockPageOutput;
22
+ import org.embulk.spi.Schema;
23
+ import org.embulk.spi.util.Pages;
24
+
25
+ public class TestFileInputRunner
26
+ {
27
+ @Rule
28
+ public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
29
+
30
+ @Before
31
+ public void tearDown()
32
+ {
33
+ MockParserPlugin.raiseException = false;
34
+ }
35
+
36
+ private static class MockFileInputPlugin implements FileInputPlugin
37
+ {
38
+ Boolean transactionCompleted = null;
39
+ Queue<Buffer> buffers;
40
+
41
+ public MockFileInputPlugin(Queue<Buffer> buffers)
42
+ {
43
+ this.buffers = buffers;
44
+ }
45
+
46
+ @Override
47
+ public ConfigDiff transaction(ConfigSource config,
48
+ FileInputPlugin.Control control)
49
+ {
50
+ control.run(Exec.newTaskSource(), 1);
51
+ return null;
52
+ }
53
+
54
+ @Override
55
+ public ConfigDiff resume(TaskSource taskSource,
56
+ int taskCount,
57
+ FileInputPlugin.Control control)
58
+ {
59
+ throw new UnsupportedOperationException();
60
+ }
61
+
62
+ @Override
63
+ public void cleanup(TaskSource taskSource,
64
+ int taskCount,
65
+ List<TaskReport> successTaskReports)
66
+ {
67
+ }
68
+
69
+ public TransactionalFileInput open(TaskSource taskSource,
70
+ int taskIndex)
71
+ {
72
+ return new TransactionalFileInput()
73
+ {
74
+ @Override
75
+ public Buffer poll()
76
+ {
77
+ return buffers.poll();
78
+ }
79
+
80
+ @Override
81
+ public boolean nextFile()
82
+ {
83
+ return !buffers.isEmpty();
84
+ }
85
+
86
+ @Override
87
+ public void close()
88
+ {
89
+ }
90
+
91
+ @Override
92
+ public void abort()
93
+ {
94
+ transactionCompleted = false;
95
+ }
96
+
97
+ @Override
98
+ public TaskReport commit()
99
+ {
100
+ transactionCompleted = true;
101
+ return null;
102
+ }
103
+ };
104
+ }
105
+ }
106
+
107
+ @Test
108
+ public void testMockParserIteration()
109
+ {
110
+ Buffer[] buffers = new Buffer[] {
111
+ runtime.getBufferAllocator().allocate(),
112
+ runtime.getBufferAllocator().allocate() };
113
+ MockFileInputPlugin fileInputPlugin = new MockFileInputPlugin(
114
+ new LinkedList<Buffer>(Arrays.asList(buffers)));
115
+ final FileInputRunner runner = new FileInputRunner(fileInputPlugin);
116
+
117
+ ConfigSource config = Exec.newConfigSource().set(
118
+ "parser",
119
+ ImmutableMap.of("type", "mock", "columns", ImmutableList.of(
120
+ ImmutableMap.of("name", "col1", "type", "boolean", "option", ImmutableMap.of()),
121
+ ImmutableMap.of("name", "col2", "type", "long", "option", ImmutableMap.of()),
122
+ ImmutableMap.of("name", "col3", "type", "double", "option", ImmutableMap.of()),
123
+ ImmutableMap.of("name", "col4", "type", "string", "option", ImmutableMap.of()),
124
+ ImmutableMap.of("name", "col5", "type", "timestamp", "option", ImmutableMap.of()))));
125
+
126
+ final MockPageOutput output = new MockPageOutput();
127
+ runner.transaction(config, new InputPlugin.Control()
128
+ {
129
+ public List<TaskReport> run(TaskSource inputTaskSource,
130
+ Schema schema, int taskCount)
131
+ {
132
+ List<TaskReport> reports = new ArrayList<>();
133
+ reports.add(runner.run(inputTaskSource, schema, 0, output));
134
+ return reports;
135
+ }
136
+ });
137
+
138
+ assertEquals(true, fileInputPlugin.transactionCompleted);
139
+ assertEquals(1, output.pages.size());
140
+
141
+ Schema schema = config.getNested("parser")
142
+ .loadConfig(MockParserPlugin.PluginTask.class)
143
+ .getSchemaConfig().toSchema();
144
+
145
+ List<Object[]> records = Pages.toObjects(schema, output.pages);
146
+ assertEquals(2, records.size());
147
+ for (Object[] record : records) {
148
+ assertEquals(5, record.length);
149
+ assertEquals(true, record[0]);
150
+ assertEquals(2L, record[1]);
151
+ assertEquals(3.0D, (Double) record[2], 0.01D);
152
+ assertEquals("45", record[3]);
153
+ assertEquals(678L, ((Timestamp) record[4]).toEpochMilli());
154
+ }
155
+ }
156
+
157
+ @Test
158
+ public void testTransactionAborted()
159
+ {
160
+ Buffer[] buffers = new Buffer[] {
161
+ runtime.getBufferAllocator().allocate(),
162
+ runtime.getBufferAllocator().allocate() };
163
+ MockFileInputPlugin fileInputPlugin = new MockFileInputPlugin(
164
+ new LinkedList<Buffer>(Arrays.asList(buffers)));
165
+ final FileInputRunner runner = new FileInputRunner(fileInputPlugin);
166
+
167
+ ConfigSource config = Exec.newConfigSource().set(
168
+ "parser",
169
+ ImmutableMap.of("type", "mock", "columns", ImmutableList.of(
170
+ ImmutableMap.of("name", "col1", "type", "boolean", "option", ImmutableMap.of()),
171
+ ImmutableMap.of("name", "col2", "type", "long", "option", ImmutableMap.of()),
172
+ ImmutableMap.of("name", "col3", "type", "double", "option", ImmutableMap.of()),
173
+ ImmutableMap.of("name", "col4", "type", "string", "option", ImmutableMap.of()),
174
+ ImmutableMap.of("name", "col5", "type", "timestamp", "option", ImmutableMap.of()))));
175
+
176
+ final MockPageOutput output = new MockPageOutput();
177
+
178
+ MockParserPlugin.raiseException = true;
179
+
180
+ try {
181
+ runner.transaction(config, new InputPlugin.Control()
182
+ {
183
+ public List<TaskReport> run(TaskSource inputTaskSource,
184
+ Schema schema, int taskCount)
185
+ {
186
+ List<TaskReport> reports = new ArrayList<>();
187
+ reports.add(runner.run(inputTaskSource, schema, 0, output));
188
+ return reports;
189
+ }
190
+ });
191
+ } catch (RuntimeException re) {
192
+ }
193
+ assertEquals(false, fileInputPlugin.transactionCompleted);
194
+ assertEquals(0, output.pages.size());
195
+ }
196
+ }
@@ -0,0 +1,207 @@
1
+ package org.embulk.spi;
2
+
3
+ import static org.junit.Assert.assertEquals;
4
+
5
+ import java.util.ArrayList;
6
+ import java.util.List;
7
+
8
+ import org.embulk.EmbulkTestRuntime;
9
+ import org.embulk.config.TaskReport;
10
+ import org.embulk.config.ConfigSource;
11
+ import org.embulk.config.ConfigDiff;
12
+ import org.embulk.config.Task;
13
+ import org.embulk.config.TaskSource;
14
+ import org.embulk.spi.time.Timestamp;
15
+ import org.embulk.spi.Schema;
16
+ import org.junit.Rule;
17
+ import org.junit.Test;
18
+
19
+ import com.google.common.collect.ImmutableList;
20
+ import com.google.common.collect.ImmutableMap;
21
+
22
+ public class TestFileOutputRunner
23
+ {
24
+ @Rule
25
+ public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
26
+
27
+ public interface PluginTask extends Task
28
+ {
29
+ }
30
+
31
+ private static class MockFileOutputPlugin implements FileOutputPlugin
32
+ {
33
+ Boolean transactionCompleted = null;
34
+
35
+ @Override
36
+ public ConfigDiff transaction(ConfigSource config, int taskCount,
37
+ FileOutputPlugin.Control control)
38
+ {
39
+ PluginTask task = config.loadConfig(PluginTask.class);
40
+ control.run(task.dump());
41
+ return Exec.newConfigDiff();
42
+ }
43
+
44
+ @Override
45
+ public ConfigDiff resume(TaskSource taskSource,
46
+ int taskCount,
47
+ FileOutputPlugin.Control control)
48
+ {
49
+ throw new UnsupportedOperationException();
50
+ }
51
+
52
+ @Override
53
+ public void cleanup(TaskSource taskSource,
54
+ int taskCount,
55
+ List<TaskReport> successTaskReports)
56
+ {
57
+ }
58
+
59
+ @Override
60
+ public TransactionalFileOutput open(TaskSource taskSource,
61
+ final int taskIndex)
62
+ {
63
+ return new TransactionalFileOutput()
64
+ {
65
+
66
+ @Override
67
+ public void nextFile()
68
+ {
69
+ }
70
+
71
+ @Override
72
+ public void add(Buffer buffer)
73
+ {
74
+ }
75
+
76
+ @Override
77
+ public void finish()
78
+ {
79
+ }
80
+
81
+ @Override
82
+ public void close()
83
+ {
84
+ }
85
+
86
+ @Override
87
+ public void abort()
88
+ {
89
+ transactionCompleted = false;
90
+ }
91
+
92
+ @Override
93
+ public TaskReport commit()
94
+ {
95
+ transactionCompleted = true;
96
+ return Exec.newTaskReport();
97
+ }
98
+ };
99
+ }
100
+ }
101
+
102
+ @Test
103
+ public void testMockFormatterIteration()
104
+ {
105
+ MockFileOutputPlugin fileOutputPlugin = new MockFileOutputPlugin();
106
+ final FileOutputRunner runner = new FileOutputRunner(fileOutputPlugin);
107
+
108
+ ImmutableList<ImmutableMap<String, Object>> columns = ImmutableList.of(
109
+ ImmutableMap.<String,Object>of("name", "col1", "type", "boolean", "option", ImmutableMap.of()),
110
+ ImmutableMap.<String,Object>of("name", "col2", "type", "long", "option", ImmutableMap.of()),
111
+ ImmutableMap.<String,Object>of("name", "col3", "type", "double", "option", ImmutableMap.of()),
112
+ ImmutableMap.<String,Object>of("name", "col4", "type", "string", "option", ImmutableMap.of()),
113
+ ImmutableMap.<String,Object>of("name", "col5", "type", "timestamp", "option", ImmutableMap.of()));
114
+ ConfigSource config = Exec
115
+ .newConfigSource()
116
+ .set("type", "unused?")
117
+ .set("formatter",
118
+ ImmutableMap.of("type", "mock", "columns", columns));
119
+ final Schema schema = config.getNested("formatter")
120
+ .loadConfig(MockParserPlugin.PluginTask.class)
121
+ .getSchemaConfig().toSchema();
122
+
123
+ runner.transaction(config, schema, 1, new OutputPlugin.Control()
124
+ {
125
+ public List<TaskReport> run(final TaskSource outputTask)
126
+ {
127
+ TransactionalPageOutput tran = runner.open(outputTask, schema,
128
+ 1);
129
+ boolean committed = false;
130
+ try {
131
+ for (Page page : PageTestUtils.buildPage(
132
+ runtime.getBufferAllocator(), schema, true, 2L,
133
+ 3.0D, "45", Timestamp.ofEpochMilli(678L), true, 2L,
134
+ 3.0D, "45", Timestamp.ofEpochMilli(678L))) {
135
+ tran.add(page);
136
+ }
137
+ tran.commit();
138
+ committed = true;
139
+ } finally {
140
+ if (!committed) {
141
+ tran.abort();
142
+ }
143
+ tran.close();
144
+ }
145
+ return new ArrayList<TaskReport>();
146
+ }
147
+ });
148
+
149
+ assertEquals(true, fileOutputPlugin.transactionCompleted);
150
+ assertEquals(2, MockFormatterPlugin.records.size());
151
+ for (List<Object> record : MockFormatterPlugin.records) {
152
+ assertEquals(Boolean.TRUE, record.get(0));
153
+ assertEquals(2L, record.get(1));
154
+ assertEquals(3.0D, (Double) record.get(2), 0.1D);
155
+ assertEquals("45", record.get(3));
156
+ assertEquals(678L, ((Timestamp) record.get(4)).toEpochMilli());
157
+ }
158
+ }
159
+
160
+ @Test
161
+ public void testTransactionAborted()
162
+ {
163
+ MockFileOutputPlugin fileOutputPlugin = new MockFileOutputPlugin();
164
+ final FileOutputRunner runner = new FileOutputRunner(fileOutputPlugin);
165
+
166
+ ImmutableList<ImmutableMap<String, Object>> columns = ImmutableList.of(
167
+ ImmutableMap.<String,Object>of("name", "col1", "type", "boolean", "option", ImmutableMap.of()),
168
+ ImmutableMap.<String,Object>of("name", "col2", "type", "long", "option", ImmutableMap.of()),
169
+ ImmutableMap.<String,Object>of("name", "col3", "type", "double", "option", ImmutableMap.of()),
170
+ ImmutableMap.<String,Object>of("name", "col4", "type", "string", "option", ImmutableMap.of()),
171
+ ImmutableMap.<String,Object>of("name", "col5", "type", "timestamp", "option", ImmutableMap.of()));
172
+ ConfigSource config = Exec
173
+ .newConfigSource()
174
+ .set("type", "unused?")
175
+ .set("formatter",
176
+ ImmutableMap.of("type", "mock", "columns", columns));
177
+ final Schema schema = config.getNested("formatter")
178
+ .loadConfig(MockParserPlugin.PluginTask.class)
179
+ .getSchemaConfig().toSchema();
180
+
181
+ try {
182
+ runner.transaction(config, schema, 1, new OutputPlugin.Control()
183
+ {
184
+ public List<TaskReport> run(final TaskSource outputTask)
185
+ {
186
+ TransactionalPageOutput tran = runner.open(outputTask,
187
+ schema, 1);
188
+ boolean committed = false;
189
+ try {
190
+ tran.add(null);
191
+ tran.commit();
192
+ committed = true;
193
+ } finally {
194
+ if (!committed) {
195
+ tran.abort();
196
+ }
197
+ tran.close();
198
+ }
199
+ return new ArrayList<TaskReport>();
200
+ }
201
+ });
202
+ } catch (NullPointerException npe) {
203
+ }
204
+
205
+ assertEquals(false, fileOutputPlugin.transactionCompleted);
206
+ }
207
+ }