asciidoctor-diagram 1.5.1 → 1.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 20f26c9e257f9041fae90a6f1ce31a8cd363c903
4
- data.tar.gz: e249114bfa2333f2acce3dc32646d0f3dec578f0
3
+ metadata.gz: c7c8a0442a43c4f2b062c9a2875db9bfe487ebfe
4
+ data.tar.gz: e5ed8001a95d21ff5461ab9adf71b679dcdeb8c5
5
5
  SHA512:
6
- metadata.gz: 05a5da2d13c1e7ae0bb3292209b13770c46be24bce41d87a54d62e33fb85b82802db2291b2d34bf46ebdb319fab9664079a49d7deb7b48dc81c2bc366ecebb65
7
- data.tar.gz: dd4fdc2bd64db018cf83c6dce02a17540f8baaf4872febe09b77c58729adfc2854d55bbaf1518a364bae8f077a381bb82a62646211a5aff0f3cfb50a502431d1
6
+ metadata.gz: 9261c02e0ce34b5b532352d5c8816f682c4cea2e352e90c7a8ac51909ed1295da58f4b337e41a852a63469bf9280596b8d11e321d8a7587f2a8e77e38274967e
7
+ data.tar.gz: 3540b311b595776f6bac442827a077fcfeefbd24e50ee8fbe58d9a756633213bd4a02336847fcda91647dd6feb2c113d701506859ec6c61dc3660b3e073d4762
@@ -2,6 +2,18 @@
2
2
 
3
3
  == Development
4
4
 
5
+ == 1.5.2
6
+
7
+ Enhancements::
8
+
9
+ * Apply anti-aliasing to blockdiag generated images
10
+ * Issue #118: Add support for Erd.
11
+
12
+ Bug Fixes::
13
+
14
+ * Issue #125: Use correct path separator when running under Cygwin.
15
+ * Issue #127: Resolved Ruby warnings when running in verbose mode.
16
+
5
17
  == 1.5.1
6
18
 
7
19
  Bug Fixes::
@@ -19,6 +19,7 @@ ifndef::env-site[:status:]
19
19
  :uri-blockdiag: http://blockdiag.com
20
20
  :uri-ditaa: http://ditaa.sourceforge.net/
21
21
  :uri-dot: http://www.graphviz.org/content/dot-language
22
+ :uri-erd: https://github.com/BurntSushi/erd
22
23
  :uri-graphviz: http://www.graphviz.org
23
24
  :uri-imagemagick: http://www.imagemagick.org
24
25
  :uri-java: http://java.sun.com
@@ -108,6 +109,7 @@ The following diagram types and output formats are available:
108
109
  |{uri-actdiag}[actdiag] | |{check}|{check}|
109
110
  |{uri-blockdiag}[blockdiag] | |{check}|{check}|
110
111
  |{uri-ditaa}[ditaa] | |{check}| |
112
+ |{uri-erd}[erd] | |{check}|{check}|
111
113
  |{uri-dot}[graphviz] | |{check}|{check}|
112
114
  |<<meme,meme>> |{check}|{check}| |
113
115
  |{uri-mermaid}[mermaid] | |{check}|{check}|
@@ -229,7 +231,7 @@ or load and register each extension individually.
229
231
  require 'asciidoctor-diagram/<extension_name>'
230
232
  ----
231
233
 
232
- `<extension_name>` can be one of `blockdiag`, `ditaa`, `graphviz`, `meme`, `mermaid`, `plantuml`, `shaape`, or `wavedrom`.
234
+ `<extension_name>` can be one of `blockdiag`, `ditaa`, `erd`, `graphviz`, `meme`, `mermaid`, `plantuml`, `shaape`, or `wavedrom`.
233
235
 
234
236
  Requiring one or more of these files will automatically register the extensions for all processed documents.
235
237
 
@@ -275,6 +277,7 @@ The following table lists the tools that are required for each diagram type, the
275
277
  |actdiag |{uri-actdiag}[ActDiag] |`actdiag`
276
278
  |blockdiag |{uri-blockdiag}[BlockDiag] |`blockdiag`
277
279
  |ditaa |{uri-java}[Java] |`java`
280
+ |erd |{uri-erd}[Erd] |`erd`
278
281
  |graphviz |{uri-graphviz}[GraphViz] |`dot` or `graphvizdot`
279
282
  |meme |{uri-imagemagick}[ImageMagick] |`convert` and `identify`
280
283
  |mermaid |{uri-mermaid}[Mermaid] |`mermaid`
@@ -1,5 +1,6 @@
1
1
  require_relative 'asciidoctor-diagram/blockdiag'
2
2
  require_relative 'asciidoctor-diagram/ditaa'
3
+ require_relative 'asciidoctor-diagram/erd'
3
4
  require_relative 'asciidoctor-diagram/graphviz'
4
5
  require_relative 'asciidoctor-diagram/meme'
5
6
  require_relative 'asciidoctor-diagram/mermaid'
@@ -85,17 +85,18 @@ module Asciidoctor
85
85
  end
86
86
 
87
87
  block = Class.new(Extensions::DiagramBlockProcessor) do
88
- self.instance_eval &init
88
+ self.instance_eval(&init)
89
89
  end
90
90
  ::Asciidoctor::Diagram.const_set("#{name}BlockProcessor", block)
91
91
 
92
92
  block_macro = Class.new(Extensions::DiagramBlockMacroProcessor) do
93
- self.instance_eval &init
93
+ self.instance_eval(&init)
94
94
  end
95
95
 
96
96
  ::Asciidoctor::Diagram.const_set("#{name}BlockMacroProcessor", block_macro)
97
97
  end
98
98
 
99
+ include CliGenerator
99
100
  include Which
100
101
 
101
102
  def blockdiag(tool, parent, source, format)
@@ -105,8 +106,8 @@ module Asciidoctor
105
106
  # a '3' suffix.
106
107
  alt_cmd_name = "#{tool.downcase}3"
107
108
 
108
- CliGenerator.generate_stdin(which(parent, cmd_name, :alt_cmds => [alt_cmd_name]), format.to_s, source.to_s) do |tool_path, output_path|
109
- [tool_path, '-o', Platform.native_path(output_path), "-T#{format.to_s}", '-']
109
+ generate_stdin(which(parent, cmd_name, :alt_cmds => [alt_cmd_name]), format.to_s, source.to_s) do |tool_path, output_path|
110
+ [tool_path, '-a', '-o', Platform.native_path(output_path), "-T#{format.to_s}", '-']
110
111
  end
111
112
  end
112
113
  end
@@ -0,0 +1,7 @@
1
+ require_relative 'extensions'
2
+
3
+ Asciidoctor::Extensions.register do
4
+ require_relative 'erd/extension'
5
+ block Asciidoctor::Diagram::ErdBlockProcessor, :erd
6
+ block_macro Asciidoctor::Diagram::ErdBlockMacroProcessor, :erd
7
+ end
@@ -0,0 +1,43 @@
1
+ require_relative '../extensions'
2
+ require_relative '../util/cli_generator'
3
+ require_relative '../util/platform'
4
+ require_relative '../util/which'
5
+
6
+ module Asciidoctor
7
+ module Diagram
8
+ # @private
9
+ module Erd
10
+ include CliGenerator
11
+ include Which
12
+
13
+ def self.included(mod)
14
+ [:png, :svg].each do |f|
15
+ mod.register_format(f, :image) do |parent, source|
16
+ erd(parent, source, f)
17
+ end
18
+ end
19
+ end
20
+
21
+ def erd(parent, source, format)
22
+ erd_path = which(parent, 'erd')
23
+ dot_path = which(parent, 'dot', :alt_attrs => ['graphvizdot'])
24
+
25
+ dot_code = generate_stdin(erd_path, format.to_s, source.to_s) do |tool_path, output_path|
26
+ [tool_path, '-o', Platform.native_path(output_path), '-f', 'dot']
27
+ end
28
+
29
+ generate_stdin(dot_path, format.to_s, dot_code) do |tool_path, output_path|
30
+ [tool_path, "-o#{Platform.native_path(output_path)}", "-T#{format.to_s}"]
31
+ end
32
+ end
33
+ end
34
+
35
+ class ErdBlockProcessor < Extensions::DiagramBlockProcessor
36
+ include Erd
37
+ end
38
+
39
+ class ErdBlockMacroProcessor < Extensions::DiagramBlockMacroProcessor
40
+ include Erd
41
+ end
42
+ end
43
+ end
@@ -32,7 +32,7 @@ module Asciidoctor
32
32
  def register_format(format, type, &block)
33
33
  raise "Unsupported output type: #{type}" unless type == :image || type == :literal
34
34
 
35
- unless @default_format
35
+ unless defined?(@default_format)
36
36
  @default_format = format
37
37
  end
38
38
 
@@ -40,7 +40,7 @@ module Asciidoctor
40
40
  :type => type,
41
41
  :generator => block
42
42
  }
43
- end
43
+ end
44
44
 
45
45
  # Returns the registered formats
46
46
  #
@@ -115,7 +115,11 @@ module Asciidoctor
115
115
  raise e
116
116
  else
117
117
  text = "Failed to generate image: #{e.message}"
118
- warn %(asciidoctor-diagram: ERROR: #{text})
118
+ warn_msg = text.dup
119
+ if $VERBOSE
120
+ warn_msg << "\n" << e.backtrace.join("\n")
121
+ end
122
+ warn %(asciidoctor-diagram: ERROR: #{warn_msg})
119
123
  text << "\n"
120
124
  text << source.code
121
125
  Asciidoctor::Block.new parent, :listing, :source => text, :attributes => attributes
@@ -149,7 +153,7 @@ module Asciidoctor
149
153
  image_file = parent.normalize_system_path image_name, image_dir
150
154
  metadata_file = parent.normalize_system_path "#{image_name}.cache", cache_dir
151
155
 
152
- if File.exists? metadata_file
156
+ if File.exist? metadata_file
153
157
  metadata = File.open(metadata_file, 'r') { |f| JSON.load f }
154
158
  else
155
159
  metadata = {}
@@ -157,7 +161,7 @@ module Asciidoctor
157
161
 
158
162
  image_attributes = source.attributes
159
163
 
160
- if !File.exists?(image_file) || source.should_process?(image_file, metadata)
164
+ if !File.exist?(image_file) || source.should_process?(image_file, metadata)
161
165
  params = IMAGE_PARAMS[format]
162
166
 
163
167
  result = instance_exec(parent, source, &generator_info[:generator])
@@ -7,6 +7,7 @@ module Asciidoctor
7
7
  module Diagram
8
8
  # @private
9
9
  module Graphviz
10
+ include CliGenerator
10
11
  include Which
11
12
 
12
13
  def self.included(mod)
@@ -18,7 +19,7 @@ module Asciidoctor
18
19
  end
19
20
 
20
21
  def graphviz(parent, source, format)
21
- CliGenerator.generate_stdin(which(parent, 'dot', :alt_attrs => ['graphvizdot']), format.to_s, source.to_s) do |tool_path, output_path|
22
+ generate_stdin(which(parent, 'dot', :alt_attrs => ['graphvizdot']), format.to_s, source.to_s) do |tool_path, output_path|
22
23
  args = [tool_path, "-o#{Platform.native_path(output_path)}", "-T#{format.to_s}"]
23
24
 
24
25
  layout = source.attr('layout')
@@ -36,7 +36,7 @@ module Asciidoctor
36
36
  options = c.attr('options', '').split(',')
37
37
  noupcase = options.include?('noupcase')
38
38
 
39
- dimensions = CliGenerator.run_cli(identify, '-format', '%w %h', bg_img).match /(?<w>\d+) (?<h>\d+)/
39
+ dimensions = Cli.run(identify, '-format', '%w %h', bg_img).match(/(?<w>\d+) (?<h>\d+)/)
40
40
  bg_width = dimensions['w'].to_i
41
41
  bg_height = dimensions['h'].to_i
42
42
  label_width = bg_width
@@ -44,7 +44,7 @@ module Asciidoctor
44
44
 
45
45
  if top_label
46
46
  top_img = Tempfile.new(['meme', '.png'])
47
- CliGenerator.run_cli(
47
+ Cli.run(
48
48
  convert,
49
49
  '-background', 'none',
50
50
  '-fill', fill_color,
@@ -62,7 +62,7 @@ module Asciidoctor
62
62
 
63
63
  if bottom_label
64
64
  bottom_img = Tempfile.new(['meme', '.png'])
65
- CliGenerator.run_cli(
65
+ Cli.run(
66
66
  convert,
67
67
  '-background', 'none',
68
68
  '-fill', fill_color,
@@ -91,7 +91,7 @@ module Asciidoctor
91
91
 
92
92
  args << final_img.path
93
93
 
94
- CliGenerator.run_cli(*args)
94
+ Cli.run(*args)
95
95
 
96
96
  File.binread(final_img)
97
97
  end
@@ -1,4 +1,5 @@
1
1
  require_relative '../extensions'
2
+ require_relative '../util/cli'
2
3
  require_relative '../util/cli_generator'
3
4
  require_relative '../util/platform'
4
5
  require_relative '../util/which'
@@ -7,6 +8,7 @@ module Asciidoctor
7
8
  module Diagram
8
9
  # @private
9
10
  module Mermaid
11
+ include CliGenerator
10
12
  include Which
11
13
 
12
14
  def self.included(mod)
@@ -19,7 +21,7 @@ module Asciidoctor
19
21
 
20
22
  def mermaid(parent, source, format)
21
23
  mermaid = which(parent, 'mermaid')
22
- @is_mermaid_v6 ||= `#{mermaid} --version`.split('.')[0].to_i >= 6
24
+ @is_mermaid_v6 ||= ::Asciidoctor::Diagram::Cli.run(mermaid, '--version').split('.')[0].to_i >= 6
23
25
  # Mermaid >= 6.0.0 requires PhantomJS 2.1; older version required 1.9
24
26
  phantomjs = which(parent, 'phantomjs', :alt_attrs => [@is_mermaid_v6 ? 'phantomjs_2' : 'phantomjs_19'])
25
27
 
@@ -30,7 +32,7 @@ module Asciidoctor
30
32
 
31
33
  width = source.attr('width')
32
34
 
33
- CliGenerator.generate_file(mermaid, 'mmd', format.to_s, source.to_s) do |tool_path, input_path, output_path|
35
+ generate_file(mermaid, 'mmd', format.to_s, source.to_s) do |tool_path, input_path, output_path|
34
36
  output_dir = File.dirname(output_path)
35
37
  output_file = File.expand_path(File.basename(input_path) + ".#{format.to_s}", output_dir)
36
38
 
@@ -65,7 +65,7 @@ module Asciidoctor
65
65
  end
66
66
 
67
67
  def resolve_path(path, parent, base_dir)
68
- if path =~ ::URI.regexp
68
+ if path =~ ::URI::ABS_URI
69
69
  uri = ::URI.parse(path)
70
70
  if uri.scheme == 'file'
71
71
  parent.normalize_system_path(uri.path, base_dir)
@@ -7,6 +7,7 @@ module Asciidoctor
7
7
  module Diagram
8
8
  # @private
9
9
  module Shaape
10
+ include CliGenerator
10
11
  include Which
11
12
 
12
13
  def self.included(mod)
@@ -18,7 +19,7 @@ module Asciidoctor
18
19
  end
19
20
 
20
21
  def shaape(parent, source, format)
21
- CliGenerator.generate_stdin(which(parent, 'shaape'), format.to_s, source.to_s) do |tool_path, output_path|
22
+ generate_stdin(which(parent, 'shaape'), format.to_s, source.to_s) do |tool_path, output_path|
22
23
  [tool_path, '-o', Platform.native_path(output_path), '-t', format.to_s, '-']
23
24
  end
24
25
  end
@@ -0,0 +1,19 @@
1
+ require 'tempfile'
2
+ require 'open3'
3
+
4
+ module Asciidoctor
5
+ module Diagram
6
+ # @private
7
+ module Cli
8
+ def self.run(*args)
9
+ stdout, stderr, status = Open3.capture3(*args)
10
+
11
+ if status != 0
12
+ raise "#{File.basename(args[0])} failed: #{stdout.empty? ? stderr : stdout}"
13
+ end
14
+
15
+ stdout.empty? ? stderr : stdout
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,11 +1,11 @@
1
1
  require 'tempfile'
2
- require 'open3'
2
+ require_relative 'cli'
3
3
 
4
4
  module Asciidoctor
5
5
  module Diagram
6
6
  # @private
7
7
  module CliGenerator
8
- def self.generate_stdin(tool, format, code)
8
+ def generate_stdin(tool, format, code)
9
9
  tool_name = File.basename(tool)
10
10
 
11
11
  target_file = Tempfile.new([tool_name, ".#{format}"])
@@ -20,7 +20,7 @@ module Asciidoctor
20
20
  end
21
21
  end
22
22
 
23
- def self.generate_file(tool, input_ext, output_ext, code)
23
+ def generate_file(tool, input_ext, output_ext, code)
24
24
  tool_name = File.basename(tool)
25
25
 
26
26
  source_file = Tempfile.new([tool_name, ".#{input_ext}"])
@@ -42,7 +42,7 @@ module Asciidoctor
42
42
  end
43
43
  end
44
44
 
45
- def self.generate(opts, target_file, open3_opts = {})
45
+ def generate(opts, target_file, open3_opts = {})
46
46
  case opts
47
47
  when Array
48
48
  args = opts
@@ -54,7 +54,7 @@ module Asciidoctor
54
54
  raise "Block passed to generate_file should return an Array or a Hash"
55
55
  end
56
56
 
57
- output = run_cli(*args, open3_opts)
57
+ output = ::Asciidoctor::Diagram::Cli.run(*args, open3_opts)
58
58
 
59
59
  raise "#{args[0]} failed: #{output}" unless File.exist?(out_file || target_file.path)
60
60
 
@@ -64,16 +64,6 @@ module Asciidoctor
64
64
 
65
65
  File.binread(target_file.path)
66
66
  end
67
-
68
- def self.run_cli(*args)
69
- stdout, stderr, status = Open3.capture3(*args)
70
-
71
- if status != 0
72
- raise "#{File.basename(args[0])} failed: #{stdout.empty? ? stderr : stdout}"
73
- end
74
-
75
- stdout.empty? ? stderr : stdout
76
- end
77
67
  end
78
68
  end
79
69
  end
@@ -78,7 +78,7 @@ module Asciidoctor
78
78
  if content_type.start_with? 'application/json'
79
79
  json = JSON.parse(response[:body].force_encoding(Encoding::UTF_8))
80
80
  ruby_bt = Kernel.caller(2)
81
- java_bt = json['stk'].map { |java_line| "#{java_line[0]}:#{java_line[3]}: in `#{java_line[2]}'" }
81
+ java_bt = json['stk'].map { |java_line| "#{java_line[0]}:#{java_line[3]}: in '#{java_line[2]}'" }
82
82
  error = RuntimeError.new("#{prefix_msg}: #{json['msg']}")
83
83
  error.set_backtrace java_bt + ruby_bt
84
84
  raise error
@@ -1,6 +1,7 @@
1
1
  require 'socket'
2
- require 'rbconfig'
3
2
 
3
+ require_relative 'cli'
4
+ require_relative 'platform'
4
5
  require_relative 'which'
5
6
 
6
7
  module Asciidoctor
@@ -15,10 +16,10 @@ module Asciidoctor
15
16
  args << '-Djava.awt.headless=true'
16
17
  args << '-cp'
17
18
  # special case for cygwin, it requires path translation for java to work
18
- if RbConfig::CONFIG['host_os'] =~ /cygwin/i
19
+ if ::Asciidoctor::Diagram::Platform.os_variant == :cygwin
19
20
  cygpath = ::Asciidoctor::Diagram::Which.which('cygpath')
20
- if(cygpath != nil)
21
- args << classpath.flatten.map { |jar| `cygpath -w "#{jar}"`.strip }.join(";")
21
+ if cygpath != nil
22
+ args << classpath.flatten.map { |jar| ::Asciidoctor::Diagram::Cli.run(cygpath, '-w', jar).strip }.join(";")
22
23
  else
23
24
  puts 'cygwin warning: cygpath not found'
24
25
  args << classpath.flatten.join(File::PATH_SEPARATOR)
@@ -44,7 +45,7 @@ module Asciidoctor
44
45
  end
45
46
 
46
47
  def self.load
47
- if @loaded
48
+ if defined?(@loaded) && @loaded
48
49
  return
49
50
  end
50
51
 
@@ -56,7 +57,7 @@ module Asciidoctor
56
57
  @java_exe ||= find_java
57
58
  raise "Could not find Java executable" unless @java_exe
58
59
 
59
- unless @command_server
60
+ unless defined?(@command_server) && @command_server
60
61
  server = CommandServer.new(@java_exe, classpath)
61
62
  @command_server = server
62
63
  at_exit do
@@ -77,15 +78,13 @@ module Asciidoctor
77
78
 
78
79
  private
79
80
  def self.find_java
80
- if /cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM
81
- # Windows
82
- path_to(ENV['JAVA_HOME'], 'bin/java.exe') || registry_lookup || ::Asciidoctor::Diagram::Which.which('java')
83
- elsif /darwin/ =~ RUBY_PLATFORM
84
- # Mac
85
- path_to(ENV['JAVA_HOME'], 'bin/java') || path_to(`/usr/libexec/java_home`.strip, 'bin/java') || ::Asciidoctor::Diagram::Which.which('java')
86
- else
87
- # Other unix-like system
88
- path_to(ENV['JAVA_HOME'], 'bin/java') || ::Asciidoctor::Diagram::Which.which('java')
81
+ case ::Asciidoctor::Diagram::Platform.os
82
+ when :windows
83
+ path_to(ENV['JAVA_HOME'], 'bin/java.exe') || registry_lookup || ::Asciidoctor::Diagram::Which.which('java')
84
+ when :macosx
85
+ path_to(ENV['JAVA_HOME'], 'bin/java') || path_to(::Asciidoctor::Diagram::Cli.run('/usr/libexec/java_home').strip, 'bin/java') || ::Asciidoctor::Diagram::Which.which('java')
86
+ else
87
+ path_to(ENV['JAVA_HOME'], 'bin/java') || ::Asciidoctor::Diagram::Which.which('java')
89
88
  end
90
89
  end
91
90
 
@@ -98,21 +97,90 @@ module Asciidoctor
98
97
  end
99
98
  end
100
99
 
100
+ JDK_KEY = 'HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit'
101
+ JRE_KEY = 'HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment'
102
+
101
103
  def self.registry_lookup
102
- key_re = /^HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\.*\\([0-9\.]+)/
103
- value_re = /\s*JavaHome\s*REG_SZ\s*(.*)/
104
- result = `reg query "HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft" /s /v JavaHome`.lines.map { |l| l.strip }
105
- vms = result.each_slice(3).map do |_, key, value|
106
- key_match = key_re.match(key)
107
- value_match = value_re.match(value)
108
- if key_match && value_match
109
- [key_match[1].split('.').map { |v| v.to_i }, value_match[1]]
110
- else
111
- nil
104
+ registry_current(JRE_KEY) || registry_current(JDK_KEY) || registry_any()
105
+ end
106
+
107
+ def self.registry_current(key)
108
+ current_version = registry_query(key, 'CurrentVersion')
109
+ if current_version
110
+ java_home = registry_query("#{key}\\#{current_version}", 'JavaHome')
111
+ java_exe(java_home)
112
+ else
113
+ nil
114
+ end
115
+ end
116
+
117
+ def self.registry_any()
118
+ java_homes = registry_query('HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft', 'JavaHome', :recursive => true).values
119
+ java_homes.map { |path| java_exe(path) }.find { |exe| !exe.nil? }
120
+ end
121
+
122
+ def self.java_exe(java_home)
123
+ java = File.expand_path('bin/java.exe', java_home)
124
+
125
+ if File.executable?(java)
126
+ java
127
+ else
128
+ nil
129
+ end
130
+ end
131
+
132
+ def self.registry_query(key, value = nil, opts = {})
133
+ args = ['reg', 'query']
134
+ args << key
135
+ args << '/v' << value unless value.nil?
136
+ args << '/s' if opts[:recursive]
137
+
138
+ begin
139
+ lines = ::Asciidoctor::Diagram::Cli.run(*args).lines.reject { |l| l.strip.empty? }.each
140
+ rescue
141
+ lines = [].each
142
+ end
143
+
144
+ result = {}
145
+
146
+ while true
147
+ begin
148
+ begin
149
+ k = lines.next
150
+ rescue StopIteration
151
+ break
152
+ end
153
+
154
+ unless k.start_with? key
155
+ next
156
+ end
157
+
158
+ v = nil
159
+ begin
160
+ v = lines.next.strip if lines.peek.start_with?(' ')
161
+ rescue StopIteration
162
+ break
163
+ end
164
+
165
+ if !k.valid_encoding? || (v && !v.valid_encoding?)
166
+ next
167
+ end
168
+
169
+ if v && (md = /([^\s]+)\s+(REG_[^\s]+)\s+(.+)/.match(v))
170
+ v_name = md[1]
171
+ v_value = md[3]
172
+ result["#{k}\\#{v_name}"] = v_value
173
+ else
174
+ result[k] = v
175
+ end
112
176
  end
113
- end.reject { |v| v.nil? }.sort_by { |v| v[0] }
114
- java_exes = vms.map { |version, path| File.expand_path('bin/java.exe', path) }.select { |exe| File.executable?(exe) }
115
- java_exes && java_exes[0]
177
+ end
178
+
179
+ if value && !opts[:recursive]
180
+ result.values[0]
181
+ else
182
+ result
183
+ end
116
184
  end
117
185
  end
118
186
  end