embulk 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -13
- data/.travis.yml +16 -0
- data/Gemfile +0 -1
- data/README.md +37 -19
- data/Rakefile +5 -37
- data/bin/embulk +1 -1
- data/build.gradle +178 -95
- data/embulk-core/build.gradle +1 -1
- data/embulk-core/src/main/java/org/embulk/command/Runner.java +11 -10
- data/embulk-core/src/main/java/org/embulk/config/ConfigDiff.java +26 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigInject.java +14 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +2 -2
- data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +4 -3
- data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +5 -3
- data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +1 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecutionResult.java +6 -6
- data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +19 -19
- data/embulk-core/src/main/java/org/embulk/exec/LocalExecutor.java +61 -36
- data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +4 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +16 -1
- data/embulk-core/src/main/java/org/embulk/spi/Column.java +1 -1
- data/embulk-core/src/main/java/org/embulk/spi/{SchemaVisitor.java → ColumnVisitor.java} +1 -1
- data/embulk-core/src/main/java/org/embulk/spi/Exec.java +3 -3
- data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +2 -2
- data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +3 -3
- data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +3 -3
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +3 -3
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +3 -3
- data/embulk-core/src/main/java/org/embulk/spi/FilterPlugin.java +1 -1
- data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +2 -2
- data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +3 -3
- data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +3 -3
- data/embulk-core/src/main/java/org/embulk/spi/PluginClassLoader.java +80 -0
- data/embulk-core/src/main/java/org/embulk/spi/Schema.java +1 -1
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +2 -2
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +2 -2
- data/embulk-core/src/main/java/org/embulk/spi/util/Filters.java +1 -1
- data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +2 -2
- data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +6 -6
- data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +6 -6
- data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +1 -1
- data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +1 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +2 -2
- data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +1 -1
- data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +3 -3
- data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +4 -4
- data/embulk-docs/Makefile +178 -0
- data/embulk-docs/build.gradle +20 -0
- data/embulk-docs/make.bat +243 -0
- data/embulk-docs/push-gh-pages.sh +29 -0
- data/embulk-docs/src/conf.py +260 -0
- data/embulk-docs/src/index.rst +19 -0
- data/embulk-docs/src/release.rst +14 -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-standards/build.gradle +0 -1
- data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +2 -2
- data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +12 -3
- data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +2 -2
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +49 -26
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +16 -17
- data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +4 -4
- data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +0 -1
- data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +5 -5
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +2 -2
- data/lib/embulk/buffer.rb +2 -2
- data/lib/embulk/column.rb +6 -6
- data/lib/embulk/command/embulk_example.rb +1 -1
- data/lib/embulk/command/embulk_new_plugin.rb +87 -0
- data/lib/embulk/command/embulk_run.rb +84 -26
- data/lib/embulk/data/bundle/Gemfile +12 -20
- data/lib/embulk/data/bundle/embulk/{filter_example.rb → filter/example.rb} +3 -3
- data/lib/embulk/data/bundle/embulk/{input_example.rb → input/example.rb} +3 -3
- data/lib/embulk/data/bundle/embulk/{output_example.rb → output/example.rb} +3 -3
- data/lib/embulk/data/new/LICENSE.txt +21 -0
- data/lib/embulk/data/new/README.md.erb +75 -0
- data/lib/embulk/data/new/gitignore.erb +12 -0
- data/lib/embulk/data/new/java/build.gradle.erb +57 -0
- data/lib/embulk/data/new/java/decoder.java.erb +40 -0
- data/lib/embulk/data/new/java/encoder.java.erb +40 -0
- data/lib/embulk/data/new/java/file_input.java.erb +64 -0
- data/lib/embulk/data/new/java/file_output.java.erb +66 -0
- data/lib/embulk/data/new/java/filter.java.erb +47 -0
- data/lib/embulk/data/new/java/formatter.java.erb +45 -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 +69 -0
- data/lib/embulk/data/new/java/output.java.erb +65 -0
- data/lib/embulk/data/new/java/parser.java.erb +51 -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/Gemfile +2 -0
- data/lib/embulk/data/new/ruby/Rakefile +1 -0
- data/lib/embulk/data/new/ruby/filter.rb.erb +39 -0
- data/lib/embulk/data/new/ruby/gemspec.erb +19 -0
- data/lib/embulk/data/new/ruby/input.rb.erb +47 -0
- data/lib/embulk/data/new/ruby/output.rb.erb +59 -0
- data/lib/embulk/data/package_data.rb +64 -0
- data/lib/embulk/data_source.rb +2 -2
- data/lib/embulk/decoder_plugin.rb +27 -0
- data/lib/embulk/encoder_plugin.rb +27 -0
- data/lib/embulk/error.rb +3 -0
- data/lib/embulk/file_input_plugin.rb +27 -0
- data/lib/embulk/file_output_plugin.rb +27 -0
- data/lib/embulk/filter_plugin.rb +28 -9
- data/lib/embulk/formatter_plugin.rb +105 -0
- data/lib/embulk/guess_csv.rb +10 -1
- data/lib/embulk/guess_plugin.rb +22 -27
- data/lib/embulk/input_plugin.rb +34 -20
- data/lib/embulk/java/bootstrap.rb +5 -0
- data/lib/embulk/java/imports.rb +7 -0
- data/lib/embulk/java_plugin.rb +84 -0
- data/lib/embulk/output_plugin.rb +35 -19
- data/lib/embulk/page.rb +1 -1
- data/lib/embulk/page_builder.rb +1 -1
- data/lib/embulk/parser_plugin.rb +76 -0
- data/lib/embulk/plugin.rb +130 -65
- data/lib/embulk/plugin_registry.rb +19 -8
- data/lib/embulk/schema.rb +4 -4
- data/lib/embulk/version.rb +1 -1
- data/settings.gradle +1 -0
- metadata +123 -90
- data/ChangeLog +0 -46
- data/embulk-cli/pom.xml +0 -94
- data/embulk-core/pom.xml +0 -148
- data/embulk-core/src/main/java/org/embulk/config/NextConfig.java +0 -26
- data/embulk-standards/pom.xml +0 -68
- data/embulk-standards/src/main/java/org/embulk/standards/S3FileInputPlugin.java +0 -250
- data/embulk-standards/src/test/java/org/embulk/standards/TestS3FileInputPlugin.java +0 -43
- data/pom.xml +0 -541
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
module Embulk
|
|
2
|
+
def self.new_plugin(name, language, category)
|
|
3
|
+
require 'embulk/data/package_data'
|
|
4
|
+
require 'embulk/version'
|
|
5
|
+
require 'fileutils'
|
|
6
|
+
|
|
7
|
+
embulk_category = category
|
|
8
|
+
embulk_category = :input if category == :file_input
|
|
9
|
+
embulk_category = :output if category == :file_output
|
|
10
|
+
|
|
11
|
+
project_name = "embulk-#{embulk_category}-#{name}"
|
|
12
|
+
plugin_path = "lib/embulk/#{embulk_category}/#{name}.rb"
|
|
13
|
+
|
|
14
|
+
if File.exist?(project_name)
|
|
15
|
+
raise "./#{project_name} already exists. Please delete it first."
|
|
16
|
+
end
|
|
17
|
+
FileUtils.mkdir_p(project_name)
|
|
18
|
+
|
|
19
|
+
puts "Creating #{project_name}/"
|
|
20
|
+
|
|
21
|
+
success = false
|
|
22
|
+
begin
|
|
23
|
+
author = `git config user.name`.strip
|
|
24
|
+
author = "YOUR_NAME" if author.empty?
|
|
25
|
+
email = `git config user.email`.strip
|
|
26
|
+
email = "YOUR_NAME" if email.empty?
|
|
27
|
+
|
|
28
|
+
ruby_class_name = name.split('-').map {|a| a.capitalize }.join + category.to_s.split('_').map {|a| a.capitalize }.join + "Plugin"
|
|
29
|
+
java_iface = category.to_s.split('_').map {|a| a.capitalize }.join
|
|
30
|
+
java_class_name = name.split('-').map {|a| a.capitalize }.join + java_iface + "Plugin"
|
|
31
|
+
display_name = name.split('-').map {|a| a.capitalize }.join(' ')
|
|
32
|
+
display_category = category.to_s.gsub('_', ' ')
|
|
33
|
+
|
|
34
|
+
description =
|
|
35
|
+
case category
|
|
36
|
+
when :input
|
|
37
|
+
%[that loads records from #{display_name} so that any output plugins can receive the records. Search the output plugins by "embulk-output" keyword.]
|
|
38
|
+
when :file_input
|
|
39
|
+
%[that reads files from #{display_name} and parses the file using any parser plugins. Search the parser plugins by "embulk-parser" keyword.]
|
|
40
|
+
when :parser
|
|
41
|
+
%[that parses #{display_name} file format read by any file input plugins. Search the file input plugins by "embulk-input file" keywords.]
|
|
42
|
+
when :decoder
|
|
43
|
+
%[that decodes files encoded by #{display_name} read by any file input plugins. Search the file input plugins by "embulk-input file" keywords.]
|
|
44
|
+
when :output
|
|
45
|
+
%[that loads records to #{display_name} read by any input plugins. Search the input plugins by "embulk-input" keyword.]
|
|
46
|
+
when :file_output
|
|
47
|
+
%[that stores files to #{display_name} formatted by any formatter plugins. Search the formatter plugins by "embulk-formatter" keyword.]
|
|
48
|
+
when :formtter
|
|
49
|
+
%[that formats records using #{display_name} file format and so that any file output plugins can store the files. Search the file output plugins by "embulk-output file" keywords.]
|
|
50
|
+
when :encoder
|
|
51
|
+
%[that encodes files using #{display_name} so that any file output plugins can store the files. Search the file output plugins by "embulk-output file" keywords.]
|
|
52
|
+
when :filter
|
|
53
|
+
%[that converts records read by an input plugin before passing it to an output plugins. Search the input and plugins by "embulk-input" and "embulk-output" plugins.]
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
pkg = Embulk::PackageData.new("new", project_name, binding())
|
|
57
|
+
|
|
58
|
+
pkg.cp_erb("README.md.erb", "README.md")
|
|
59
|
+
pkg.cp("LICENSE.txt", "LICENSE.txt")
|
|
60
|
+
pkg.cp_erb("gitignore.erb", ".gitignore")
|
|
61
|
+
|
|
62
|
+
case language
|
|
63
|
+
when :ruby
|
|
64
|
+
pkg.cp("ruby/Rakefile", "Rakefile")
|
|
65
|
+
pkg.cp("ruby/Gemfile", "Gemfile")
|
|
66
|
+
pkg.cp_erb("ruby/gemspec.erb", "#{project_name}.gemspec")
|
|
67
|
+
pkg.cp_erb("ruby/#{category}.rb.erb", plugin_path)
|
|
68
|
+
|
|
69
|
+
when :java
|
|
70
|
+
pkg.cp("java/gradle/wrapper/gradle-wrapper.jar", "gradle/wrapper/gradle-wrapper.jar")
|
|
71
|
+
pkg.cp("java/gradle/wrapper/gradle-wrapper.properties", "gradle/wrapper/gradle-wrapper.properties")
|
|
72
|
+
pkg.cp("java/gradlew.bat", "gradlew.bat")
|
|
73
|
+
pkg.cp("java/gradlew", "gradlew")
|
|
74
|
+
pkg.set_executable("gradlew")
|
|
75
|
+
pkg.cp_erb("java/build.gradle.erb", "build.gradle")
|
|
76
|
+
pkg.cp_erb("java/plugin_loader.rb.erb", plugin_path)
|
|
77
|
+
pkg.cp_erb("java/#{category}.java.erb", "src/main/java/org/embulk/#{embulk_category}/#{java_class_name}.java")
|
|
78
|
+
pkg.cp_erb("java/test.java.erb", "src/test/java/org/embulk/#{embulk_category}/Test#{java_class_name}.java")
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
success = true
|
|
82
|
+
puts ""
|
|
83
|
+
ensure
|
|
84
|
+
FileUtils.rm_rf project_name unless success
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -14,13 +14,19 @@ module Embulk
|
|
|
14
14
|
Gem.clear_paths # force rubygems to reload GEM_HOME
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
+
# to make sure org.embulk.jruby.JRubyScriptingModule can require 'embulk/java/bootstrap'
|
|
18
|
+
$LOAD_PATH << Embulk.home('lib')
|
|
19
|
+
|
|
20
|
+
if argv.include?('--version')
|
|
21
|
+
require 'embulk/version'
|
|
22
|
+
puts "embulk #{Embulk::VERSION}"
|
|
23
|
+
exit 1
|
|
24
|
+
end
|
|
25
|
+
|
|
17
26
|
i = argv.find_index {|arg| arg !~ /^\-/ }
|
|
18
27
|
usage nil unless i
|
|
19
28
|
subcmd = argv.slice!(i)
|
|
20
29
|
|
|
21
|
-
# to make sure org.embulk.jruby.JRubyScriptingModule can require 'embulk/java/bootstrap'
|
|
22
|
-
$LOAD_PATH << Embulk.home('lib')
|
|
23
|
-
|
|
24
30
|
require 'java'
|
|
25
31
|
require 'optparse'
|
|
26
32
|
op = OptionParser.new
|
|
@@ -36,6 +42,7 @@ module Embulk
|
|
|
36
42
|
|
|
37
43
|
case subcmd.to_sym
|
|
38
44
|
when :bundle
|
|
45
|
+
op.remove # remove --bundle
|
|
39
46
|
if default_bundle_path
|
|
40
47
|
op.banner = "Usage: bundle [directory=#{default_bundle_path}]"
|
|
41
48
|
args = 0..1
|
|
@@ -46,8 +53,6 @@ module Embulk
|
|
|
46
53
|
|
|
47
54
|
when :run
|
|
48
55
|
op.banner = "Usage: run <config.yml>"
|
|
49
|
-
op.on('-b', '--bundle BUNDLE_DIR', 'Path to a Gemfile directory') do |path|
|
|
50
|
-
end
|
|
51
56
|
op.on('-I', '--load-path PATH', 'Add ruby script directory path ($LOAD_PATH)') do |load_path|
|
|
52
57
|
load_paths << load_path
|
|
53
58
|
end
|
|
@@ -64,8 +69,6 @@ module Embulk
|
|
|
64
69
|
|
|
65
70
|
when :cleanup
|
|
66
71
|
op.banner = "Usage: run <config.yml>"
|
|
67
|
-
op.on('-b', '--bundle BUNDLE_DIR', 'Path to a Gemfile directory') do |path|
|
|
68
|
-
end
|
|
69
72
|
op.on('-I', '--load-path PATH', 'Add ruby script directory path ($LOAD_PATH)') do |load_path|
|
|
70
73
|
load_paths << load_path
|
|
71
74
|
end
|
|
@@ -79,8 +82,6 @@ module Embulk
|
|
|
79
82
|
|
|
80
83
|
when :preview
|
|
81
84
|
op.banner = "Usage: preview <config.yml>"
|
|
82
|
-
op.on('-b', '--bundle BUNDLE_DIR', 'Path to a Gemfile directory') do |path|
|
|
83
|
-
end
|
|
84
85
|
op.on('-I', '--load-path PATH', 'Add ruby script directory path ($LOAD_PATH)') do |load_path|
|
|
85
86
|
load_paths << load_path
|
|
86
87
|
end
|
|
@@ -102,8 +103,34 @@ module Embulk
|
|
|
102
103
|
end
|
|
103
104
|
args = 1..1
|
|
104
105
|
|
|
105
|
-
|
|
106
|
-
#
|
|
106
|
+
when :new
|
|
107
|
+
op.remove # remove --bundle
|
|
108
|
+
op.banner = "Usage: new <category> <name>" + %[
|
|
109
|
+
categories:
|
|
110
|
+
ruby-input Ruby record input plugin (like "mysql")
|
|
111
|
+
ruby-output Ruby record output plugin (like "mysql")
|
|
112
|
+
ruby-filter Ruby record filter plugin (like "add-hostname")
|
|
113
|
+
#ruby-file-input Ruby file input plugin (like "ftp") # not implemented yet [#21]
|
|
114
|
+
#ruby-file-output Ruby file output plugin (like "ftp") # not implemented yet [#22]
|
|
115
|
+
#ruby-parser Ruby file parser plugin (like "csv") # not implemented yet [#33]
|
|
116
|
+
#ruby-formatter Ruby file formatter plugin (like "csv") # not implemented yet [#34]
|
|
117
|
+
#ruby-decoder Ruby file decoder plugin (like "gzip") # not implemented yet [#31]
|
|
118
|
+
#ruby-encoder Ruby file encoder plugin (like "gzip") # not implemented yet [#32]
|
|
119
|
+
java-input Java record input plugin (like "mysql")
|
|
120
|
+
java-output Java record output plugin (like "mysql")
|
|
121
|
+
java-filter Java record filter plugin (like "add-hostname")
|
|
122
|
+
java-file-input Java file input plugin (like "ftp")
|
|
123
|
+
java-file-output Java file output plugin (like "ftp")
|
|
124
|
+
java-parser Java file parser plugin (like "csv")
|
|
125
|
+
java-formatter Java file formatter plugin (like "csv")
|
|
126
|
+
java-decoder Java file decoder plugin (like "gzip")
|
|
127
|
+
java-encoder Java file encoder plugin (like "gzip")
|
|
128
|
+
|
|
129
|
+
examples:
|
|
130
|
+
new ruby-output hbase
|
|
131
|
+
new ruby-filter int-to-string
|
|
132
|
+
]
|
|
133
|
+
args = 2..2
|
|
107
134
|
|
|
108
135
|
when :gem
|
|
109
136
|
require 'rubygems/gem_runner'
|
|
@@ -124,10 +151,10 @@ module Embulk
|
|
|
124
151
|
begin
|
|
125
152
|
op.parse!(argv)
|
|
126
153
|
unless args.include?(argv.length)
|
|
127
|
-
|
|
154
|
+
usage_op op, nil
|
|
128
155
|
end
|
|
129
156
|
rescue => e
|
|
130
|
-
|
|
157
|
+
usage_op op, e.to_s
|
|
131
158
|
end
|
|
132
159
|
|
|
133
160
|
case subcmd.to_sym
|
|
@@ -146,19 +173,10 @@ module Embulk
|
|
|
146
173
|
success = false
|
|
147
174
|
|
|
148
175
|
# copy embulk/data/bundle/ directory
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
url = resource_class.resource("/embulk/data/bundle/#{file}").to_s
|
|
154
|
-
dst = File.join(path, file)
|
|
155
|
-
FileUtils.mkdir_p File.dirname(dst)
|
|
156
|
-
FileUtils.cp(url, dst)
|
|
157
|
-
end
|
|
158
|
-
else
|
|
159
|
-
#tmpl = File.join(File.dirname(__FILE__), '../data/bundle')
|
|
160
|
-
tmpl = File.join(Embulk.home('lib'), 'embulk', 'data', 'bundle')
|
|
161
|
-
FileUtils.cp_r tmpl, path
|
|
176
|
+
require 'embulk/data/package_data'
|
|
177
|
+
pkg = PackageData.new("bundle", path)
|
|
178
|
+
%w[.bundle/config embulk/input/example.rb embulk/output/example.rb embulk/filter/example.rb Gemfile].each do |file|
|
|
179
|
+
pkg.cp(file, file)
|
|
162
180
|
end
|
|
163
181
|
|
|
164
182
|
## TODO this is disabled for now. enable this if you want to use
|
|
@@ -207,6 +225,36 @@ module Embulk
|
|
|
207
225
|
puts " 3. run config.yml"
|
|
208
226
|
puts ""
|
|
209
227
|
|
|
228
|
+
when :new
|
|
229
|
+
lang_cate = ARGV[0]
|
|
230
|
+
name = ARGV[1]
|
|
231
|
+
|
|
232
|
+
language, category = case lang_cate
|
|
233
|
+
when "java-input" then [:java, :input]
|
|
234
|
+
when "java-output" then [:java, :output]
|
|
235
|
+
when "java-filter" then [:java, :filter]
|
|
236
|
+
when "java-file-input" then [:java, :file_input]
|
|
237
|
+
when "java-file-output" then [:java, :file_output]
|
|
238
|
+
when "java-parser" then [:java, :parser]
|
|
239
|
+
when "java-formatter" then [:java, :formatter]
|
|
240
|
+
when "java-decoder" then [:java, :decoder]
|
|
241
|
+
when "java-encoder" then [:java, :encoder]
|
|
242
|
+
when "ruby-input" then [:ruby, :input]
|
|
243
|
+
when "ruby-output" then [:ruby, :output]
|
|
244
|
+
when "ruby-filter" then [:ruby, :filter]
|
|
245
|
+
when "ruby-file-input" then raise "ruby-file-input is not implemented yet. See #21 on github." #[:ruby, :file_input]
|
|
246
|
+
when "ruby-file-output" then raise "ruby-file-output is not implemented yet. See #22 on github." #[:ruby, :file_output]
|
|
247
|
+
when "ruby-parser" then raise "ruby-parser is not implemented yet. See #33 on github." #[:ruby, :parser]
|
|
248
|
+
when "ruby-formatter" then raise "ruby-formatter is not implemented yet. See #34 on github." #[:ruby, :formatter]
|
|
249
|
+
when "ruby-decoder" then raise "ruby-decoder is not implemented yet. See #31 on github." #[:ruby, :decoder]
|
|
250
|
+
when "ruby-encoder" then raise "ruby-decoder is not implemented yet. See #32 on github." #[:ruby, :encoder]
|
|
251
|
+
else
|
|
252
|
+
usage_op op, "Unknown category '#{lang_cate}'"
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
require 'embulk/command/embulk_new_plugin'
|
|
256
|
+
Embulk.new_plugin(name, language, category)
|
|
257
|
+
|
|
210
258
|
else
|
|
211
259
|
require 'json'
|
|
212
260
|
|
|
@@ -265,6 +313,7 @@ module Embulk
|
|
|
265
313
|
STDERR.puts " guess <partial-config.yml> -o <output.yml> # guess missing parameters to create a complete configuration file."
|
|
266
314
|
STDERR.puts " gem <install | list | help> # install a plugin or show installed plugins."
|
|
267
315
|
STDERR.puts " # plugin path is #{ENV['GEM_HOME']}"
|
|
316
|
+
STDERR.puts " new <category> <name> # generates new plugin template"
|
|
268
317
|
STDERR.puts " example [path] # creates an example config file and csv file to try embulk."
|
|
269
318
|
STDERR.puts ""
|
|
270
319
|
if message
|
|
@@ -274,4 +323,13 @@ module Embulk
|
|
|
274
323
|
end
|
|
275
324
|
exit 1
|
|
276
325
|
end
|
|
326
|
+
|
|
327
|
+
def self.usage_op(op, message)
|
|
328
|
+
STDERR.puts op.help
|
|
329
|
+
STDERR.puts
|
|
330
|
+
if message
|
|
331
|
+
STDERR.puts message
|
|
332
|
+
end
|
|
333
|
+
exit 1
|
|
334
|
+
end
|
|
277
335
|
end
|
|
@@ -1,31 +1,23 @@
|
|
|
1
1
|
source 'https://rubygems.org/'
|
|
2
|
-
|
|
3
|
-
# Plugin bundle:
|
|
4
2
|
#
|
|
5
|
-
#
|
|
6
|
-
# You can write plugin names (and versions) to this file to include
|
|
7
|
-
# the plugins released on RubyGems. To use those plugins,
|
|
3
|
+
# Note: After updating this file, run this command to update Gemfile.lock:
|
|
8
4
|
#
|
|
9
|
-
#
|
|
10
|
-
# 2. update Gemfile.lock using: embulk bundle <this dir>
|
|
11
|
-
# 3. run embulk with -b option: embulk run -b <this dir> example.yml
|
|
5
|
+
# embulk bundle <this_dir>
|
|
12
6
|
#
|
|
13
|
-
|
|
14
|
-
# You can put a simple ruby plugins to <this dir>/embulk directory.
|
|
15
|
-
# When you run embulk with -b <this dir> option, embulk loads them:
|
|
7
|
+
|
|
16
8
|
#
|
|
17
|
-
#
|
|
9
|
+
# RubyGems Plugins
|
|
18
10
|
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
11
|
+
#gem 'embulk-output-mysql'
|
|
12
|
+
#gem 'embulk-output-postgresql', '>= 0.1.0'
|
|
13
|
+
#gem 'embulk-input-baz', '= 0.2.0'
|
|
14
|
+
#gem 'embulk-input-xyz', '~> 0.3.0'
|
|
22
15
|
#
|
|
23
16
|
|
|
24
|
-
# Plugins
|
|
25
17
|
#
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
#gem 'embulk-
|
|
29
|
-
#gem 'embulk-
|
|
18
|
+
# Private plugins
|
|
19
|
+
#
|
|
20
|
+
#gem 'embulk-inupt-awesome', path: '/path/to/your/embulk-input-awesome'
|
|
21
|
+
#gem 'embulk-output-awesome', git: 'https://github.com/you/embulk-output-awesome.git', branch: 'master'
|
|
30
22
|
#
|
|
31
23
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
module Embulk
|
|
2
|
-
module
|
|
2
|
+
module Filter
|
|
3
3
|
|
|
4
|
-
class
|
|
5
|
-
# filter plugin file name must be: embulk/
|
|
4
|
+
class ExampleFilterPlugin < FilterPlugin
|
|
5
|
+
# filter plugin file name must be: embulk/filter/<name>.rb
|
|
6
6
|
Plugin.register_filter('example', self)
|
|
7
7
|
|
|
8
8
|
def self.transaction(config, in_schema, &control)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
module Embulk
|
|
2
|
-
module
|
|
2
|
+
module Input
|
|
3
3
|
|
|
4
|
-
class
|
|
5
|
-
# input plugin file name must be: embulk/
|
|
4
|
+
class ExampleInputPlugin < InputPlugin
|
|
5
|
+
# input plugin file name must be: embulk/input/<name>.rb
|
|
6
6
|
Plugin.register_input('example', self)
|
|
7
7
|
|
|
8
8
|
def self.transaction(config, &control)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
module Embulk
|
|
2
|
-
module
|
|
2
|
+
module Output
|
|
3
3
|
|
|
4
|
-
class
|
|
5
|
-
# output plugin file name must be: embulk/
|
|
4
|
+
class ExampleOutputPlugin < OutputPlugin
|
|
5
|
+
# output plugin file name must be: embulk/output/<name>.rb
|
|
6
6
|
Plugin.register_output('example', self)
|
|
7
7
|
|
|
8
8
|
def self.transaction(config, schema, count, &control)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
|
|
2
|
+
MIT License
|
|
3
|
+
|
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
a copy of this software and associated documentation files (the
|
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be
|
|
13
|
+
included in all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# <%= display_name %> <%= display_category %> plugin for Embulk
|
|
2
|
+
|
|
3
|
+
TODO: Write short description here
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
* **Plugin type**: <%= embulk_category %>
|
|
8
|
+
* **Load all or nothing**: yes
|
|
9
|
+
* **Resume supported**: no
|
|
10
|
+
|
|
11
|
+
## Configuration
|
|
12
|
+
|
|
13
|
+
- **property1**: description (string, required)
|
|
14
|
+
- **property2**: description (integer, default: default-value)
|
|
15
|
+
|
|
16
|
+
## Example
|
|
17
|
+
|
|
18
|
+
```yaml
|
|
19
|
+
%case category
|
|
20
|
+
%when :input, :file_input
|
|
21
|
+
in:
|
|
22
|
+
type: <%= name %>
|
|
23
|
+
property1: example1
|
|
24
|
+
property2: example2
|
|
25
|
+
%when :output, :file_output
|
|
26
|
+
out:
|
|
27
|
+
type: <%= name %>
|
|
28
|
+
property1: example1
|
|
29
|
+
property2: example2
|
|
30
|
+
%when :filter
|
|
31
|
+
filters:
|
|
32
|
+
- type: <%= name %>
|
|
33
|
+
property1: example1
|
|
34
|
+
property2: example2
|
|
35
|
+
%when :parser
|
|
36
|
+
in:
|
|
37
|
+
type: any file input plugin type
|
|
38
|
+
parser:
|
|
39
|
+
type: <%= name %>
|
|
40
|
+
property1: example1
|
|
41
|
+
property2: example2
|
|
42
|
+
%when :formatter
|
|
43
|
+
out:
|
|
44
|
+
type: any output input plugin type
|
|
45
|
+
formatter:
|
|
46
|
+
type: <%= name %>
|
|
47
|
+
property1: example1
|
|
48
|
+
property2: example2
|
|
49
|
+
%when :decoder
|
|
50
|
+
in:
|
|
51
|
+
type: any output input plugin type
|
|
52
|
+
decoders:
|
|
53
|
+
- type: <%= name %>
|
|
54
|
+
property1: example1
|
|
55
|
+
property2: example2
|
|
56
|
+
%when :encoder
|
|
57
|
+
out:
|
|
58
|
+
type: any output input plugin type
|
|
59
|
+
encoders:
|
|
60
|
+
- type: <%= name %>
|
|
61
|
+
property1: example1
|
|
62
|
+
property2: example2
|
|
63
|
+
%end
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Build
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
%case language
|
|
70
|
+
%when :ruby
|
|
71
|
+
$ rake
|
|
72
|
+
%when :java
|
|
73
|
+
$ ./gradlew gem
|
|
74
|
+
% end
|
|
75
|
+
```
|