embulk 0.8.28-java → 0.8.29-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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fb3a3ad55003d5d87e050680472c891f8fef9de9
4
- data.tar.gz: d9a164a0112947615e837dcf42a260eaaff716f0
3
+ metadata.gz: 455af0eb268193a9c0a81f20a6823da090ec8714
4
+ data.tar.gz: 5881f11ed75bbd8a0d7798635298db475be835e7
5
5
  SHA512:
6
- metadata.gz: 9e6dfbcea73023ac911cc6260176a681d632e6a3023daa2cd9236504c91a30a9b00a121f633974b8ad7637a872da9be9c467b9bdc46182af06c7c09a4b715a0d
7
- data.tar.gz: c4b28535cb4c54d2427f2b86a13f62e83c73dc89436b913ae8b6d2ac917dbc7e075f746c8eb6494a092bf615949b3989d39e6ec5a65342c3700d2cfc3e812b45
6
+ metadata.gz: c580a2b6e69a90b60c4b3ba61a2eafccaba9edee05c9b2dcb47567a3dadcafc2bece12753bfb6d1ba2c229cd9ab01a661b0a847cb0b1aa11087507095f051ea4
7
+ data.tar.gz: 7aa021e2a4f55fce2894c5bf3b394c1756a2d02e068a4517e032df24506f869d66f5ecb8ca73e85f1999f98301ad387cb980f7bf542812a6ee7e59d207f1acbd
@@ -16,7 +16,7 @@ def release_projects = [project(":embulk-core"), project(":embulk-standards"), p
16
16
 
17
17
  allprojects {
18
18
  group = 'org.embulk'
19
- version = '0.8.28'
19
+ version = '0.8.29'
20
20
 
21
21
  ext {
22
22
  jrubyVersion = '9.1.5.0'
@@ -178,7 +178,7 @@ public class EmbulkGlobalJRubyScriptingContainer
178
178
 
179
179
  final Path locationPath;
180
180
  try {
181
- locationPath = Paths.get(locationUrl.toURI().getPath());
181
+ locationPath = Paths.get(locationUrl.toURI());
182
182
  }
183
183
  catch (URISyntaxException ex) {
184
184
  throw new EmbulkCommandLineException("Invalid location: " + locationUrl.toString(), ex);
@@ -24,6 +24,8 @@ import org.embulk.cli.parse.OptionDefinition;
24
24
  import org.joda.time.DateTime;
25
25
  import org.joda.time.format.DateTimeFormat;
26
26
  import org.joda.time.format.DateTimeFormatter;
27
+ import org.jruby.embed.LocalContextScope;
28
+ import org.jruby.embed.LocalVariableBehavior;
27
29
  import org.jruby.embed.ScriptingContainer;
28
30
 
29
31
  public class EmbulkRun
@@ -398,14 +400,14 @@ public class EmbulkRun
398
400
  }
399
401
  return 0;
400
402
  case BUNDLE:
401
- if (!commandLine.getArguments().isEmpty() && commandLine.getArguments().get(0).equals("new")) {
402
- if (commandLine.getArguments().size() != 2) {
403
+ if (!subcommandArguments.isEmpty() && subcommandArguments.get(0).equals("new")) {
404
+ if (subcommandArguments.size() != 2) {
403
405
  printGeneralUsage(System.err);
404
406
  System.err.println("");
405
407
  System.err.println("Use `<command> --help` to see description of the commands.");
406
408
  return 1;
407
409
  }
408
- newBundle(commandLine.getArguments().get(1), null);
410
+ newBundle(subcommandArguments.get(1), null);
409
411
  System.err.println("'embulk bundle new' is deprecated. This will be removed in future release. Please use 'embulk mkbundle' instead.");
410
412
  }
411
413
  else {
@@ -413,24 +415,16 @@ public class EmbulkRun
413
415
  }
414
416
  return 0;
415
417
  case GEM:
416
- this.jrubyContainer.runScriptlet("require 'rubygems/gem_runner'");
417
- this.jrubyContainer.put("__internal_argv_java__", subcommandArguments);
418
- this.jrubyContainer.runScriptlet("__internal_argv__ = Array.new(__internal_argv_java__)");
419
- this.jrubyContainer.runScriptlet("Gem::GemRunner.new.run __internal_argv__");
420
- this.jrubyContainer.remove("__internal_argv_java__");
418
+ callJRubyGem(subcommandArguments);
421
419
  return 0;
422
420
  case MKBUNDLE:
423
421
  newBundle(commandLine.getArguments().get(0), commandLine.getBundlePath());
424
422
  break;
425
423
  case EXEC:
426
- this.jrubyContainer.put("__internal_argv_java__", subcommandArguments);
427
- this.jrubyContainer.runScriptlet("__internal_argv__ = Array.new(__internal_argv_java__)");
428
- this.jrubyContainer.runScriptlet("exec(*__internal_argv__)");
429
- this.jrubyContainer.remove("__internal_argv_java__");
424
+ callJRubyExec(subcommandArguments);
430
425
  return 127;
431
426
  case IRB:
432
- this.jrubyContainer.runScriptlet("require 'irb'");
433
- this.jrubyContainer.runScriptlet("IRB.start");
427
+ callJRubyIRB();
434
428
  return 0;
435
429
  case RUN:
436
430
  case CLEANUP:
@@ -446,14 +440,18 @@ public class EmbulkRun
446
440
 
447
441
  // NOTE: When it was in Ruby ""require 'json'" was required.
448
442
 
449
- setupLoadPaths(commandLine.getLoadPath(), commandLine.getLoad());
450
- setupClasspaths(commandLine.getClasspath());
443
+ // NOTE: $LOAD_PATH and $CLASSPATH are set in |EmbulkSetup|.
451
444
 
452
445
  // call |EmbulkSetup.setup| after setup_classpaths to allow users to overwrite
453
446
  // embulk classes
454
447
  // NOTE: |EmbulkSetup.setup| returns |EmbulkEmbed| while it stores Ruby |Embulk::EmbulkRunner(EmbulkEmbed)|
455
448
  // into Ruby |Embulk::Runner|.
456
- final EmbulkRunner runner = EmbulkSetup.setup(commandLine.getSystemConfig(), this.jrubyContainer);
449
+ final EmbulkRunner runner = EmbulkSetup.setup(
450
+ commandLine.getSystemConfig(),
451
+ commandLine.getLoadPath(),
452
+ commandLine.getLoad(),
453
+ commandLine.getClasspath(),
454
+ this.jrubyContainer);
457
455
 
458
456
  final Path configDiffPath =
459
457
  (commandLine.getConfigDiff() == null ? null : Paths.get(commandLine.getConfigDiff()));
@@ -490,12 +488,7 @@ public class EmbulkRun
490
488
 
491
489
  private int newBundle(final String pathString, final String bundlePath)
492
490
  {
493
- this.jrubyContainer.runScriptlet("require 'embulk'");
494
-
495
491
  final Path path = Paths.get(pathString);
496
- this.jrubyContainer.runScriptlet("require 'fileutils'");
497
- this.jrubyContainer.runScriptlet("require 'rubygems/gem_runner'");
498
-
499
492
  if (Files.exists(path)) {
500
493
  System.err.println("'" + pathString + "' already exists.");
501
494
  return 1;
@@ -511,16 +504,19 @@ public class EmbulkRun
511
504
  }
512
505
  boolean success = false;
513
506
  try {
507
+ // TODO: Rewrite this part in Java.
508
+ final ScriptingContainer localJRubyContainer = createLocalJRubyScriptingContainer();
509
+ localJRubyContainer.runScriptlet("require 'embulk'");
510
+ localJRubyContainer.runScriptlet("require 'fileutils'");
511
+ localJRubyContainer.runScriptlet("require 'rubygems/gem_runner'");
512
+
514
513
  // copy embulk/data/bundle/ contents
515
- this.jrubyContainer.runScriptlet("require 'embulk/data/package_data'");
516
- this.jrubyContainer.put("__internal_path__", pathString);
517
- this.jrubyContainer.runScriptlet("pkg = Embulk::PackageData.new('bundle', __internal_path__)");
518
- this.jrubyContainer.remove("__internal_path__");
519
- this.jrubyContainer.runScriptlet("%w[Gemfile .ruby-version .bundle/config embulk/input/example.rb embulk/output/example.rb embulk/filter/example.rb].each { |file| pkg.cp(file, file) }");
514
+ localJRubyContainer.runScriptlet("require 'embulk/data/package_data'");
515
+ localJRubyContainer.put("__internal_path__", pathString);
516
+ localJRubyContainer.runScriptlet("pkg = Embulk::PackageData.new('bundle', __internal_path__)");
517
+ localJRubyContainer.remove("__internal_path__");
518
+ localJRubyContainer.runScriptlet("%w[Gemfile .ruby-version .bundle/config embulk/input/example.rb embulk/output/example.rb embulk/filter/example.rb].each { |file| pkg.cp(file, file) }");
520
519
  // run the first bundle-install
521
- final ArrayList<String> bundlerArguments = new ArrayList<String>();
522
- bundlerArguments.add("install");
523
- bundlerArguments.add("--path");
524
520
  runBundler(Arrays.asList("install", "--path", bundlePath != null ? bundlePath : "."), path);
525
521
  success = true;
526
522
  }
@@ -570,26 +566,26 @@ public class EmbulkRun
570
566
 
571
567
  private void runBundler(final List<String> arguments, final Path path)
572
568
  {
573
- this.jrubyContainer.runScriptlet("require 'bundler'"); // bundler is included in embulk-core.jar
569
+ final ScriptingContainer localJRubyContainer = createLocalJRubyScriptingContainer();
570
+ localJRubyContainer.runScriptlet("require 'bundler'"); // bundler is included in embulk-core.jar
574
571
 
575
572
  // this hack is necessary to make --help working
576
- this.jrubyContainer.runScriptlet("Bundler.define_singleton_method(:which_orig, Bundler.method(:which))");
577
- this.jrubyContainer.runScriptlet("Bundler.define_singleton_method(:which) { |executable| (executable == 'man' ? false : which_orig(executable)) }");
573
+ localJRubyContainer.runScriptlet("Bundler.define_singleton_method(:which_orig, Bundler.method(:which))");
574
+ localJRubyContainer.runScriptlet("Bundler.define_singleton_method(:which) { |executable| (executable == 'man' ? false : which_orig(executable)) }");
578
575
 
579
- this.jrubyContainer.runScriptlet("require 'bundler/friendly_errors'");
580
- this.jrubyContainer.runScriptlet("require 'bundler/cli'");
576
+ localJRubyContainer.runScriptlet("require 'bundler/friendly_errors'");
577
+ localJRubyContainer.runScriptlet("require 'bundler/cli'");
581
578
 
582
- this.jrubyContainer.put("__internal_argv_java__", arguments);
583
- this.jrubyContainer.runScriptlet("__internal_argv__ = Array.new(__internal_argv_java__)");
579
+ localJRubyContainer.put("__internal_argv_java__", arguments);
584
580
  if (path == null) {
585
- this.jrubyContainer.runScriptlet("Bundler.with_friendly_errors { Bundler::CLI.start(__internal_argv__, debug: true) }");
581
+ localJRubyContainer.runScriptlet("Bundler.with_friendly_errors { Bundler::CLI.start(Array.new(__internal_argv_java__), debug: true) }");
586
582
  }
587
583
  else {
588
- this.jrubyContainer.put("__internal_working_dir__", path.toString());
589
- this.jrubyContainer.runScriptlet("Dir.chdir(__internal_working_dir__) { Bundler.with_friendly_errors { Bundler::CLI.start(__internal_argv__, debug: true) } }");
590
- this.jrubyContainer.remove("__internal_working_dir__");
584
+ localJRubyContainer.put("__internal_working_dir__", path.toString());
585
+ localJRubyContainer.runScriptlet("Dir.chdir(__internal_working_dir__) { Bundler.with_friendly_errors { Bundler::CLI.start(__internal_argv__, debug: true) } }");
586
+ localJRubyContainer.remove("__internal_working_dir__");
591
587
  }
592
- this.jrubyContainer.remove("__internal_argv_java__");
588
+ localJRubyContainer.remove("__internal_argv_java__");
593
589
  }
594
590
 
595
591
  private void addPluginLoadOptionDefinitions(final EmbulkCommandLineParser.Builder parserBuilder)
@@ -700,37 +696,6 @@ public class EmbulkRun
700
696
  }));
701
697
  }
702
698
 
703
- private void setupLoadPaths(final List<String> loadPaths, final List<String> pluginPaths)
704
- {
705
- // first $LOAD_PATH has highet priority. later load_paths should have highest priority.
706
- for (final String loadPath : loadPaths) {
707
- // ruby script directory (use unshift to make it highest priority)
708
- this.jrubyContainer.put("__internal_load_path__", loadPath);
709
- this.jrubyContainer.runScriptlet("$LOAD_PATH.unshift File.expand_path(__internal_load_path__)");
710
- this.jrubyContainer.remove("__internal_load_path__");
711
- }
712
-
713
- // # Gem::StubSpecification is an internal API that seems chainging often.
714
- // # Gem::Specification.add_spec is deprecated also. Therefore, here makes
715
- // # -L <path> option alias of -I <path>/lib by assuming that *.gemspec file
716
- // # always has require_paths = ["lib"].
717
- for (final String pluginPath : pluginPaths) {
718
- this.jrubyContainer.put("__internal_plugin_path__", pluginPath);
719
- this.jrubyContainer.runScriptlet("$LOAD_PATH.unshift File.expand_path(File.join(__internal_plugin_path__, 'lib')");
720
- this.jrubyContainer.remove("__internal_plugin_path__");
721
- }
722
- }
723
-
724
- private void setupClasspaths(final List<String> classpaths)
725
- {
726
- for (final String classpath : classpaths) {
727
- this.jrubyContainer.put("__internal_classpath__", classpath);
728
- // $CLASSPATH object doesn't have concat method
729
- this.jrubyContainer.runScriptlet("$CLASSPATH << __internal_classpath__");
730
- this.jrubyContainer.remove("__internal_classpath__");
731
- }
732
- }
733
-
734
699
  private void printGeneralUsage(final PrintStream out)
735
700
  {
736
701
  final String gemHomeEnv = System.getenv("GEM_HOME");
@@ -764,6 +729,39 @@ public class EmbulkRun
764
729
  out.println(now + ": Embulk v" + this.embulkVersion);
765
730
  }
766
731
 
732
+ // TODO: Check if it is required to process JRuby options.
733
+ private ScriptingContainer createLocalJRubyScriptingContainer()
734
+ {
735
+ // Not |LocalContextScope.SINGLETON| to narrow down considerations.
736
+ final ScriptingContainer localJRubyContainer =
737
+ new ScriptingContainer(LocalContextScope.SINGLETHREAD, LocalVariableBehavior.PERSISTENT);
738
+ return localJRubyContainer;
739
+ }
740
+
741
+ private void callJRubyGem(final List<String> subcommandArguments)
742
+ {
743
+ final ScriptingContainer localJRubyContainer = createLocalJRubyScriptingContainer();
744
+ localJRubyContainer.runScriptlet("require 'rubygems/gem_runner'");
745
+ localJRubyContainer.put("__internal_argv_java__", subcommandArguments);
746
+ localJRubyContainer.runScriptlet("Gem::GemRunner.new.run Array.new(__internal_argv_java__)");
747
+ localJRubyContainer.remove("__internal_argv_java__");
748
+ }
749
+
750
+ private void callJRubyExec(final List<String> subcommandArguments)
751
+ {
752
+ final ScriptingContainer localJRubyContainer = createLocalJRubyScriptingContainer();
753
+ localJRubyContainer.put("__internal_argv_java__", subcommandArguments);
754
+ localJRubyContainer.runScriptlet("exec(*Array.new(__internal_argv_java__))");
755
+ localJRubyContainer.remove("__internal_argv_java__");
756
+ }
757
+
758
+ private void callJRubyIRB()
759
+ {
760
+ final ScriptingContainer localJRubyContainer = createLocalJRubyScriptingContainer();
761
+ localJRubyContainer.runScriptlet("require 'irb'");
762
+ localJRubyContainer.runScriptlet("IRB.start");
763
+ }
764
+
767
765
  private final String embulkVersion;
768
766
  private final ScriptingContainer jrubyContainer;
769
767
  }
@@ -7,6 +7,7 @@ import java.nio.file.Files;
7
7
  import java.nio.file.Path;
8
8
  import java.nio.file.Paths;
9
9
  import java.nio.file.StandardOpenOption;
10
+ import java.util.Collections;
10
11
  import java.util.Map;
11
12
  import java.util.regex.Pattern;
12
13
  import org.embulk.command.PreviewPrinter;
@@ -21,7 +22,8 @@ import org.embulk.exec.ExecutionResult;
21
22
  import org.embulk.exec.PreviewResult;
22
23
  import org.embulk.exec.ResumeState;
23
24
  import org.embulk.exec.TransactionStage;
24
- import org.jruby.RubyHash;
25
+ import org.jruby.embed.LocalContextScope;
26
+ import org.jruby.embed.LocalVariableBehavior;
25
27
  import org.jruby.embed.ScriptingContainer;
26
28
  import org.slf4j.Logger;
27
29
  import org.slf4j.LoggerFactory;
@@ -35,11 +37,10 @@ import org.slf4j.LoggerFactory;
35
37
  public class EmbulkRunner
36
38
  {
37
39
  // |EmbulkSetup.setup| initializes:
38
- // new EmbulkRunner(embed, globalJRubyContainer)
39
- public EmbulkRunner(final EmbulkEmbed embed, final ScriptingContainer globalJRubyContainer)
40
+ // new EmbulkRunner(embed)
41
+ public EmbulkRunner(final EmbulkEmbed embed)
40
42
  {
41
43
  this.embed = embed; // org.embulk.EmbulkEmbed
42
- this.globalJRubyContainer = globalJRubyContainer;
43
44
  }
44
45
 
45
46
  /**
@@ -54,8 +55,7 @@ public class EmbulkRunner
54
55
  // in Ruby Embulk::EmbulkRunner.
55
56
  final ConfigSource configSource;
56
57
  try {
57
- configSource = readConfig(
58
- configFilePath, new RubyHash(this.globalJRubyContainer.getProvider().getRuntime()), null);
58
+ configSource = readConfig(configFilePath, Collections.<String, Object>emptyMap(), null);
59
59
  }
60
60
  catch (IOException ex) {
61
61
  throw new RuntimeException(ex);
@@ -108,8 +108,7 @@ public class EmbulkRunner
108
108
  // in Ruby Embulk::EmbulkRunner.
109
109
  final ConfigSource configSource;
110
110
  try {
111
- configSource = readConfig(
112
- configFilePath, new RubyHash(this.globalJRubyContainer.getProvider().getRuntime()), null);
111
+ configSource = readConfig(configFilePath, Collections.<String, Object>emptyMap(), null);
113
112
  }
114
113
  catch (IOException ex) {
115
114
  throw new RuntimeException(ex);
@@ -164,8 +163,7 @@ public class EmbulkRunner
164
163
  // in Ruby Embulk::EmbulkRunner.
165
164
  final ConfigSource configSource;
166
165
  try {
167
- configSource = readConfig(
168
- configFilePath, new RubyHash(this.globalJRubyContainer.getProvider().getRuntime()), null);
166
+ configSource = readConfig(configFilePath, Collections.<String, Object>emptyMap(), null);
169
167
  }
170
168
  catch (IOException ex) {
171
169
  throw new RuntimeException(ex);
@@ -289,9 +287,8 @@ public class EmbulkRunner
289
287
 
290
288
  final ConfigSource configSource;
291
289
  if (configDiffPath != null && Files.size(configDiffPath) > 0L) {
292
- final ConfigSource lastConfigDiff =
293
- readConfig(configDiffPath, new RubyHash(this.globalJRubyContainer.getProvider().getRuntime()), null);
294
- configSource = originalConfigSource.merge(lastConfigDiff);
290
+ configSource = originalConfigSource.merge(
291
+ readConfig(configDiffPath, Collections.<String, Object>emptyMap(), null));
295
292
  }
296
293
  else {
297
294
  configSource = originalConfigSource;
@@ -391,7 +388,7 @@ public class EmbulkRunner
391
388
 
392
389
  private ConfigSource readConfig(
393
390
  final Path configFilePath,
394
- final RubyHash templateParams,
391
+ final Map<String, Object> templateParams,
395
392
  final String templateIncludePath)
396
393
  throws IOException
397
394
  {
@@ -422,28 +419,34 @@ public class EmbulkRunner
422
419
 
423
420
  private String runLiquid(
424
421
  final String templateSource,
425
- final RubyHash templateParams,
422
+ final Map<String, Object> templateParams,
426
423
  final String templateIncludePath)
427
424
  {
428
- this.globalJRubyContainer.runScriptlet("require 'liquid'");
425
+ // TODO: Check if it is required to process JRuby options.
426
+ // Not |LocalContextScope.SINGLETON| to narrow down considerations.
427
+ final ScriptingContainer localJRubyContainer =
428
+ new ScriptingContainer(LocalContextScope.SINGLETHREAD, LocalVariableBehavior.PERSISTENT);
429
429
 
430
- this.globalJRubyContainer.put("__internal_liquid_template_source__", templateSource);
431
- this.globalJRubyContainer.runScriptlet("template = Liquid::Template.parse(__internal_liquid_template_source__, :error_mode => :strict)");
432
- this.globalJRubyContainer.remove("__internal_liquid_template_source__");
430
+ localJRubyContainer.runScriptlet("require 'liquid'");
431
+
432
+ localJRubyContainer.put("__internal_liquid_template_source__", templateSource);
433
+ localJRubyContainer.runScriptlet("template = Liquid::Template.parse(__internal_liquid_template_source__, :error_mode => :strict)");
434
+ localJRubyContainer.remove("__internal_liquid_template_source__");
433
435
 
434
436
  if (templateIncludePath != null) {
435
- this.globalJRubyContainer.put("__internal_liquid_template_include_path_java__", templateIncludePath);
436
- this.globalJRubyContainer.runScriptlet("__internal_liquid_template_include_path__ = File.expand_path(__internal_liquid_template_include_path_java__ || File.dirname(config)) unless __internal_liquid_template_include_path_java__ == false");
437
- this.globalJRubyContainer.runScriptlet("template.registers[:file_system] = Liquid::LocalFileSystem.new(__internal_liquid_template_include_path__, \"_%s.yml.liquid\")");
438
- this.globalJRubyContainer.remove("__internal_liquid_template_include_path__");
437
+ localJRubyContainer.put("__internal_liquid_template_include_path_java__", templateIncludePath);
438
+ localJRubyContainer.runScriptlet("__internal_liquid_template_include_path__ = File.expand_path(__internal_liquid_template_include_path_java__ || File.dirname(config)) unless __internal_liquid_template_include_path_java__ == false");
439
+ localJRubyContainer.runScriptlet("template.registers[:file_system] = Liquid::LocalFileSystem.new(__internal_liquid_template_include_path__, \"_%s.yml.liquid\")");
440
+ localJRubyContainer.remove("__internal_liquid_template_include_path__");
439
441
  }
440
442
 
441
- this.globalJRubyContainer.put("__internal_liquid_template_params__", templateParams);
442
- this.globalJRubyContainer.runScriptlet("__internal_liquid_template_data__ = { 'env' => ENV.to_h }.merge(__internal_liquid_template_params__)");
443
- this.globalJRubyContainer.remove("__internal_liquid_template_params__");
443
+ // TODO: Convert |templateParams| recursively to Ruby's Hash.
444
+ localJRubyContainer.put("__internal_liquid_template_params__", templateParams);
445
+ localJRubyContainer.runScriptlet("__internal_liquid_template_data__ = { 'env' => ENV.to_h }.merge(__internal_liquid_template_params__)");
446
+ localJRubyContainer.remove("__internal_liquid_template_params__");
444
447
 
445
448
  final Object renderedObject =
446
- this.globalJRubyContainer.runScriptlet("template.render(__internal_liquid_template_data__)");
449
+ localJRubyContainer.runScriptlet("template.render(__internal_liquid_template_data__)");
447
450
  return renderedObject.toString();
448
451
  }
449
452
 
@@ -522,5 +525,4 @@ public class EmbulkRunner
522
525
  private final Pattern EXT_YAML_LIQUID = Pattern.compile(".*\\.ya?ml\\.liquid$");
523
526
 
524
527
  private final EmbulkEmbed embed;
525
- private final ScriptingContainer globalJRubyContainer;
526
528
  }
@@ -2,7 +2,9 @@ package org.embulk;
2
2
 
3
3
  import com.fasterxml.jackson.core.JsonProcessingException;
4
4
  import com.fasterxml.jackson.databind.ObjectMapper;
5
+ import java.util.Collections;
5
6
  import java.util.HashMap;
7
+ import java.util.List;
6
8
  import java.util.Map;
7
9
  import org.embulk.config.ConfigSource;
8
10
  import org.jruby.embed.LocalContextScope;
@@ -24,11 +26,18 @@ public class EmbulkSetup
24
26
  // The local variable should be persistent so that local variables are set through ScriptingContainer.put.
25
27
  final ScriptingContainer globalJRubyContainer =
26
28
  new ScriptingContainer(LocalContextScope.SINGLETON, LocalVariableBehavior.PERSISTENT);
27
- return setup(systemConfigGiven, globalJRubyContainer);
29
+ return setup(systemConfigGiven,
30
+ Collections.<String>emptyList(),
31
+ Collections.<String>emptyList(),
32
+ Collections.<String>emptyList(),
33
+ globalJRubyContainer);
28
34
  }
29
35
 
30
36
  public static EmbulkRunner setup(
31
37
  final Map<String, Object> systemConfigGiven,
38
+ final List<String> loadPaths,
39
+ final List<String> pluginPaths,
40
+ final List<String> classpaths,
32
41
  final ScriptingContainer globalJRubyContainer)
33
42
  {
34
43
  // NOTE: When it was in Ruby "require 'json'" was required to format the system config into a JSON string.
@@ -57,14 +66,49 @@ public class EmbulkSetup
57
66
  bootstrap.setSystemConfig(systemConfig);
58
67
  final EmbulkEmbed embed = bootstrap.initialize(); // see embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.
59
68
 
69
+ setupLoadPaths(loadPaths, pluginPaths, globalJRubyContainer);
70
+ setupClasspaths(classpaths, globalJRubyContainer);
71
+
60
72
  // see also embulk/java/bootstrap.rb loaded by JRubyScriptingModule
61
73
  globalJRubyContainer.runScriptlet("module Embulk; end");
62
74
  globalJRubyContainer.put("__internal_embulk_setup_embed__", embed);
63
- globalJRubyContainer.put("__internal_embulk_setup_global_jruby_container__", globalJRubyContainer);
64
75
  globalJRubyContainer.runScriptlet("Embulk.const_set :Runner, Embulk::EmbulkRunner.new(__internal_embulk_setup_embed__)");
65
- globalJRubyContainer.remove("__internal_embulk_setup_global_jruby_container__");
66
76
  globalJRubyContainer.remove("__internal_embulk_setup_embed__");
67
77
 
68
- return new EmbulkRunner(embed, globalJRubyContainer);
78
+ return new EmbulkRunner(embed);
79
+ }
80
+
81
+ private static void setupLoadPaths(
82
+ final List<String> loadPaths,
83
+ final List<String> pluginPaths,
84
+ final ScriptingContainer globalJRubyContainer)
85
+ {
86
+ // first $LOAD_PATH has highet priority. later load_paths should have highest priority.
87
+ for (final String loadPath : loadPaths) {
88
+ // ruby script directory (use unshift to make it highest priority)
89
+ globalJRubyContainer.put("__internal_load_path__", loadPath);
90
+ globalJRubyContainer.runScriptlet("$LOAD_PATH.unshift File.expand_path(__internal_load_path__)");
91
+ globalJRubyContainer.remove("__internal_load_path__");
92
+ }
93
+
94
+ // # Gem::StubSpecification is an internal API that seems chainging often.
95
+ // # Gem::Specification.add_spec is deprecated also. Therefore, here makes
96
+ // # -L <path> option alias of -I <path>/lib by assuming that *.gemspec file
97
+ // # always has require_paths = ["lib"].
98
+ for (final String pluginPath : pluginPaths) {
99
+ globalJRubyContainer.put("__internal_plugin_path__", pluginPath);
100
+ globalJRubyContainer.runScriptlet("$LOAD_PATH.unshift File.expand_path(File.join(__internal_plugin_path__, 'lib')");
101
+ globalJRubyContainer.remove("__internal_plugin_path__");
102
+ }
103
+ }
104
+
105
+ private static void setupClasspaths(final List<String> classpaths, final ScriptingContainer globalJRubyContainer)
106
+ {
107
+ for (final String classpath : classpaths) {
108
+ globalJRubyContainer.put("__internal_classpath__", classpath);
109
+ // $CLASSPATH object doesn't have concat method
110
+ globalJRubyContainer.runScriptlet("$CLASSPATH << __internal_classpath__");
111
+ globalJRubyContainer.remove("__internal_classpath__");
112
+ }
69
113
  }
70
114
  }
@@ -22,6 +22,7 @@ public class TimestampFormatter
22
22
  public DateTimeZone getTimeZone();
23
23
 
24
24
  @ConfigInject
25
+ @Deprecated
25
26
  public ScriptingContainer getJRuby();
26
27
  }
27
28
 
@@ -36,6 +37,7 @@ public class TimestampFormatter
36
37
  public String getDefaultTimestampFormat();
37
38
 
38
39
  @ConfigInject
40
+ @Deprecated
39
41
  public ScriptingContainer getJRuby();
40
42
  }
41
43
 
@@ -56,12 +58,20 @@ public class TimestampFormatter
56
58
  @Deprecated
57
59
  public TimestampFormatter(String format, FormatterTask task)
58
60
  {
59
- this(task.getJRuby(), format, task.getTimeZone());
61
+ this(format, task.getTimeZone());
62
+ // NOTE: Its deprecation is not actually from ScriptingContainer, though.
63
+ // TODO: Notify users about deprecated calls through the notification reporter.
64
+ System.err.println("[WARN] A plugin uses a deprecated constructor of org.embulk.spi.time.TimestampFormatter.");
65
+ System.err.println("[WARN] Please tell the plugin developer to stop using the constructor, or report this to:");
66
+ System.err.println("[WARN] https://github.com/embulk/embulk/issues/745");
67
+ for (final StackTraceElement stackTrace : Thread.currentThread().getStackTrace()) {
68
+ System.err.println("[WARN] " + stackTrace.toString());
69
+ }
60
70
  }
61
71
 
62
72
  public TimestampFormatter(Task task, Optional<? extends TimestampColumnOption> columnOption)
63
73
  {
64
- this(task.getJRuby(),
74
+ this(
65
75
  columnOption.isPresent() ?
66
76
  columnOption.get().getFormat().or(task.getDefaultTimestampFormat())
67
77
  : task.getDefaultTimestampFormat(),
@@ -70,7 +80,20 @@ public class TimestampFormatter
70
80
  : task.getDefaultTimeZone());
71
81
  }
72
82
 
83
+ @Deprecated
73
84
  public TimestampFormatter(ScriptingContainer jruby, String format, DateTimeZone timeZone)
85
+ {
86
+ this(format, timeZone);
87
+ // TODO: Notify users about deprecated calls through the notification reporter.
88
+ System.err.println("[WARN] A plugin uses a deprecated constructor of org.embulk.spi.time.TimestampFormatter.");
89
+ System.err.println("[WARN] Please tell the plugin developer to stop using the constructor, or report this to:");
90
+ System.err.println("[WARN] https://github.com/embulk/embulk/issues/745");
91
+ for (final StackTraceElement stackTrace : Thread.currentThread().getStackTrace()) {
92
+ System.err.println("[WARN] " + stackTrace.toString());
93
+ }
94
+ }
95
+
96
+ public TimestampFormatter(final String format, final DateTimeZone timeZone)
74
97
  {
75
98
  this.timeZone = timeZone;
76
99
  this.dateFormat = new RubyDateFormat(format, Locale.ENGLISH, true);
@@ -32,6 +32,7 @@ public class TimestampParser
32
32
  public DateTimeZone getDefaultTimeZone();
33
33
 
34
34
  @ConfigInject
35
+ @Deprecated
35
36
  public ScriptingContainer getJRuby();
36
37
  }
37
38
 
@@ -50,6 +51,7 @@ public class TimestampParser
50
51
  public String getDefaultDate();
51
52
 
52
53
  @ConfigInject
54
+ @Deprecated
53
55
  public ScriptingContainer getJRuby();
54
56
  }
55
57
 
@@ -77,30 +79,64 @@ public class TimestampParser
77
79
  @Deprecated
78
80
  public TimestampParser(String format, ParserTask task)
79
81
  {
80
- this(task.getJRuby(), format, task.getDefaultTimeZone());
82
+ this(format, task.getDefaultTimeZone());
83
+ // NOTE: Its deprecation is not actually from ScriptingContainer, though.
84
+ // TODO: Notify users about deprecated calls through the notification reporter.
85
+ System.err.println("[WARN] A plugin uses a deprecated constructor of org.embulk.spi.time.TimestampFormatter.");
86
+ System.err.println("[WARN] Please tell the plugin developer to stop using the constructor, or report this to:");
87
+ System.err.println("[WARN] https://github.com/embulk/embulk/issues/745");
88
+ for (final StackTraceElement stackTrace : Thread.currentThread().getStackTrace()) {
89
+ System.err.println("[WARN] " + stackTrace.toString());
90
+ }
81
91
  }
82
92
 
83
93
  @VisibleForTesting
84
94
  static TimestampParser createTimestampParserForTesting(Task task)
85
95
 
86
96
  {
87
- return new TimestampParser(task.getJRuby(), task.getDefaultTimestampFormat(), task.getDefaultTimeZone(), task.getDefaultDate());
97
+ return new TimestampParser(task.getDefaultTimestampFormat(), task.getDefaultTimeZone(), task.getDefaultDate());
88
98
  }
89
99
 
90
100
  public TimestampParser(Task task, TimestampColumnOption columnOption)
91
101
  {
92
- this(task.getJRuby(),
102
+ this(
93
103
  columnOption.getFormat().or(task.getDefaultTimestampFormat()),
94
104
  columnOption.getTimeZone().or(task.getDefaultTimeZone()),
95
105
  columnOption.getDate().or(task.getDefaultDate()));
96
106
  }
97
107
 
108
+ @Deprecated
98
109
  public TimestampParser(ScriptingContainer jruby, String format, DateTimeZone defaultTimeZone)
99
110
  {
100
- this(jruby, format, defaultTimeZone, "1970-01-01");
111
+ this(format, defaultTimeZone);
112
+ // TODO: Notify users about deprecated calls through the notification reporter.
113
+ System.err.println("[WARN] A plugin uses a deprecated constructor of org.embulk.spi.time.TimestampFormatter.");
114
+ System.err.println("[WARN] Please tell the plugin developer to stop using the constructor, or report this to:");
115
+ System.err.println("[WARN] https://github.com/embulk/embulk/issues/745");
116
+ for (final StackTraceElement stackTrace : Thread.currentThread().getStackTrace()) {
117
+ System.err.println("[WARN] " + stackTrace.toString());
118
+ }
119
+ }
120
+
121
+ public TimestampParser(String format, DateTimeZone defaultTimeZone)
122
+ {
123
+ this(format, defaultTimeZone, "1970-01-01");
101
124
  }
102
125
 
126
+ @Deprecated
103
127
  public TimestampParser(ScriptingContainer jruby, String format, DateTimeZone defaultTimeZone, String defaultDate)
128
+ {
129
+ this(format, defaultTimeZone, defaultDate);
130
+ // TODO: Notify users about deprecated calls through the notification reporter.
131
+ System.err.println("[WARN] A plugin uses a deprecated constructor of org.embulk.spi.time.TimestampFormatter.");
132
+ System.err.println("[WARN] Please tell the plugin developer to stop using the constructor, or report this to:");
133
+ System.err.println("[WARN] https://github.com/embulk/embulk/issues/745");
134
+ for (final StackTraceElement stackTrace : Thread.currentThread().getStackTrace()) {
135
+ System.err.println("[WARN] " + stackTrace.toString());
136
+ }
137
+ }
138
+
139
+ public TimestampParser(final String format, final DateTimeZone defaultTimeZone, final String defaultDate)
104
140
  {
105
141
  // TODO get default current time from ExecTask.getExecTimestamp
106
142
  this.format = format;
@@ -52,16 +52,16 @@ public class DynamicColumnSetterFactory
52
52
  } else if (type instanceof DoubleType) {
53
53
  return new DoubleColumnSetter(pageBuilder, column, defaultValue);
54
54
  } else if (type instanceof StringType) {
55
- TimestampFormatter formatter = new TimestampFormatter(task.getJRuby(),
55
+ TimestampFormatter formatter = new TimestampFormatter(
56
56
  getTimestampFormat(column).getFormat(), getTimeZone(column));
57
57
  return new StringColumnSetter(pageBuilder, column, defaultValue, formatter);
58
58
  } else if (type instanceof TimestampType) {
59
59
  // TODO use flexible time format like Ruby's Time.parse
60
- TimestampParser parser = new TimestampParser(task.getJRuby(),
60
+ TimestampParser parser = new TimestampParser(
61
61
  getTimestampFormat(column).getFormat(), getTimeZone(column));
62
62
  return new TimestampColumnSetter(pageBuilder, column, defaultValue, parser);
63
63
  } else if (type instanceof JsonType) {
64
- TimestampFormatter formatter = new TimestampFormatter(task.getJRuby(),
64
+ TimestampFormatter formatter = new TimestampFormatter(
65
65
  getTimestampFormat(column).getFormat(), getTimeZone(column));
66
66
  return new JsonColumnSetter(pageBuilder, column, defaultValue, formatter);
67
67
  }
@@ -43,6 +43,7 @@ public class DynamicPageBuilder
43
43
 
44
44
  // required by TimestampFormatter
45
45
  @ConfigInject
46
+ @Deprecated
46
47
  public ScriptingContainer getJRuby();
47
48
  }
48
49
 
@@ -4,6 +4,7 @@ Release Notes
4
4
  .. toctree::
5
5
  :maxdepth: 1
6
6
 
7
+ release/release-0.8.29
7
8
  release/release-0.8.28
8
9
  release/release-0.8.27
9
10
  release/release-0.8.26
@@ -0,0 +1,14 @@
1
+ Release 0.8.29
2
+ ==================================
3
+
4
+ General Changes
5
+ ------------------
6
+
7
+ * Deprecate Timestamp-related methods using JRuby ScriptingContainer. [#744]
8
+ * Reduce usage of the global (Singleton) JRuby instance [#747]
9
+ * Fix how to get the CodeSource location on Windows. [#751]
10
+ * Fix the broken "bundle" subcommand rewritten in Java. [#752]
11
+
12
+ Release Date
13
+ ------------------
14
+ 2017-08-02
@@ -4,22 +4,14 @@ module Embulk
4
4
  # Runner = EmbulkRunner.new
5
5
 
6
6
  class EmbulkRunner
7
- def initialize(embed, jruby_container=nil)
7
+ def initialize(embed)
8
8
  @embed = embed # org.embulk.EmbulkEmbed
9
- if jruby_container
10
- @jruby_container = jruby_container
11
- else
12
- # The ScriptingContainer instance below is the same JRuby instance with the one running this runner.rb itself
13
- # as it's LocalContextScope.SINGLETON.
14
- @jruby_container = Java::org.jruby.embed.ScriptingContainer.new(
15
- Java::org.jruby.embed.LocalContextScope::SINGLETON, Java::org.jruby.embed.LocalVariableBehavior::PERSISTENT)
16
- end
17
9
  end
18
10
 
19
11
  def guess(config, options={})
20
12
  output_path =
21
13
  (options[:next_config_output_path] ? Java::java.lang.String.new(options[:next_config_output_path]) : nil)
22
- embulk_runner_java = Java::org.embulk.EmbulkRunner.new(@embed, @jruby_container)
14
+ embulk_runner_java = Java::org.embulk.EmbulkRunner.new(@embed)
23
15
 
24
16
  case config
25
17
  when String
@@ -33,7 +25,7 @@ module Embulk
33
25
 
34
26
  def preview(config, options={})
35
27
  format = (options[:format] ? Java::java.lang.String.new(options[:format]) : nil)
36
- embulk_runner_java = Java::org.embulk.EmbulkRunner.new(@embed, @jruby_container)
28
+ embulk_runner_java = Java::org.embulk.EmbulkRunner.new(@embed)
37
29
 
38
30
  case config
39
31
  when String
@@ -52,7 +44,7 @@ module Embulk
52
44
  (options[:next_config_output_path] ? Java::java.lang.String.new(options[:next_config_output_path]) : nil)
53
45
  resume_state_path =
54
46
  (options[:resume_state_path] ? Java::java.lang.String.new(options[:resume_state_path]) : nil)
55
- embulk_runner_java = Java::org.embulk.EmbulkRunner.new(@embed, @jruby_container)
47
+ embulk_runner_java = Java::org.embulk.EmbulkRunner.new(@embed)
56
48
 
57
49
  case config
58
50
  when String
@@ -3,7 +3,7 @@
3
3
  module Embulk
4
4
  @@warned = false
5
5
 
6
- VERSION_INTERNAL = '0.8.28'
6
+ VERSION_INTERNAL = '0.8.29'
7
7
 
8
8
  DEPRECATED_MESSAGE = 'Embulk::VERSION in (J)Ruby is deprecated. Use org.embulk.EmbulkVersion::VERSION instead. If this message is from a plugin, please tell this to the author of the plugin!'
9
9
  def self.const_missing(name)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.28
4
+ version: 0.8.29
5
5
  platform: java
6
6
  authors:
7
7
  - Sadayuki Furuhashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-27 00:00:00.000000000 Z
11
+ date: 2017-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -155,10 +155,10 @@ files:
155
155
  - classpath/commons-compress-1.10.jar
156
156
  - classpath/commons-lang-2.4.jar
157
157
  - classpath/commons-lang3-3.4.jar
158
- - classpath/embulk-cli-0.8.28.jar
159
- - classpath/embulk-core-0.8.28.jar
160
- - classpath/embulk-jruby-strptime-0.8.28.jar
161
- - classpath/embulk-standards-0.8.28.jar
158
+ - classpath/embulk-cli-0.8.29.jar
159
+ - classpath/embulk-core-0.8.29.jar
160
+ - classpath/embulk-jruby-strptime-0.8.29.jar
161
+ - classpath/embulk-standards-0.8.29.jar
162
162
  - classpath/guava-18.0.jar
163
163
  - classpath/guice-4.0.jar
164
164
  - classpath/guice-bootstrap-0.1.1.jar
@@ -558,6 +558,7 @@ files:
558
558
  - embulk-docs/src/release/release-0.8.26.rst
559
559
  - embulk-docs/src/release/release-0.8.27.rst
560
560
  - embulk-docs/src/release/release-0.8.28.rst
561
+ - embulk-docs/src/release/release-0.8.29.rst
561
562
  - embulk-docs/src/release/release-0.8.3.rst
562
563
  - embulk-docs/src/release/release-0.8.4.rst
563
564
  - embulk-docs/src/release/release-0.8.5.rst