kramdown-plantuml 1.1.3 → 1.1.4

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
  SHA256:
3
- metadata.gz: 51cbb0be0b06278afe3b3d1eb572190a9f7a04fc869454b023854d5d8012e596
4
- data.tar.gz: 0e7cb4345aeab6972d3b0009b71ddc714f046f5b558ae1d37b334697af39575b
3
+ metadata.gz: beba25f229338deced9900f7a611c9040846e562c966de164e88dbb040acadde
4
+ data.tar.gz: 8c2aa7aa04a1a6e59a98032e1cc325544a2be7c3bc3cd407cbb3af09babe390c
5
5
  SHA512:
6
- metadata.gz: c18e9c35a4fef278f506106c1365839e7f58b0b45c8b352912187cd324df373b342400e56f51b9c13278ab199fd5fb6101c63cd02aa25ce9efef07722d7c517a
7
- data.tar.gz: d822db2c31c38db0f7ce0a5b92221ebf30a55be1f5d011141199d07d94a01b5ddba99a1ba127d13b88219f6135a384d90741315b6e00b88d0e72c20fa1220d2f
6
+ metadata.gz: fcdfa9c61a9b2c751aeae743edfb58d81c3602e1eb62f6b8993fd11b2372dd6ee271f77737f655967a093c03a90d0ebf3b4865c703b7a5ed2d7b806c5a4d19d5
7
+ data.tar.gz: d35a3daea2ab515d0fd788d8b2fb0575c4993e4f25ba3c7ebda02631b8ae8d397dc88917b3809cf732e9b9a5d16bbbfa52cdfa2095a682c68de8d6ed8fba3377
@@ -101,8 +101,6 @@ test_gem() {
101
101
 
102
102
  cd "${workdir}"
103
103
 
104
- gem install bundler
105
-
106
104
  if [[ -n "${token}" ]]; then
107
105
  # A non-empty $token means we should install the Gem from GPR
108
106
  repository="https://rubygems.pkg.github.com/swedbankpay"
@@ -91,14 +91,20 @@ jobs:
91
91
  - name: rubocop
92
92
  run: bundle exec rubocop --fail-level warning --display-only-fail-level-offenses
93
93
 
94
- - name: Test with Rake
95
- run: bundle exec rake
96
-
97
94
  - name: RSPec (debug)
98
95
  env:
99
96
  DEBUG: 1
100
97
  run: bundle exec rspec --tag debug
101
98
 
99
+ - name: Test with Rake
100
+ run: bundle exec rake
101
+
102
+ - name: Upload code coverage
103
+ uses: actions/upload-artifact@v2
104
+ with:
105
+ name: coverage
106
+ path: ./coverage
107
+
102
108
  - name: Codecov upload
103
109
  run: bundle exec rake codecov:upload || echo 'Codecov upload failed'
104
110
 
@@ -1,40 +1,45 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'version'
4
- require_relative 'themer'
4
+ require_relative 'theme'
5
5
  require_relative 'plantuml_error'
6
6
  require_relative 'logger'
7
7
  require_relative 'executor'
8
8
 
9
9
  module Kramdown
10
10
  module PlantUml
11
- # Converts PlantUML markup to SVG
12
- class Converter
13
- def initialize(options = {})
14
- @themer = Themer.new(options)
11
+ # Represents a PlantUML diagram that can be converted to SVG.
12
+ class Diagram
13
+ attr_reader :theme, :plantuml, :result
14
+
15
+ def initialize(plantuml, options = {})
16
+ @plantuml = plantuml
17
+ @theme = Theme.new(options || {})
15
18
  @logger = Logger.init
16
19
  @executor = Executor.new
17
20
  end
18
21
 
19
- def convert_plantuml_to_svg(plantuml)
20
- if plantuml.nil? || plantuml.empty?
22
+ def convert_to_svg
23
+ return @svg unless @svg.nil?
24
+
25
+ if @plantuml.nil? || @plantuml.empty?
21
26
  @logger.warn ' kramdown-plantuml: PlantUML diagram is empty'
22
- return plantuml
27
+ return @plantuml
23
28
  end
24
29
 
25
- plantuml = @themer.apply_theme(plantuml)
26
- plantuml = plantuml.strip
30
+ @plantuml = @theme.apply(@plantuml)
31
+ @plantuml = plantuml.strip
27
32
  log(plantuml)
28
- result = @executor.execute(plantuml)
29
- result.validate(plantuml)
30
- svg = result.without_xml_prologue
31
- wrap(svg)
33
+ @result = @executor.execute(self)
34
+ @result.validate
35
+ @svg = wrap(@result.without_xml_prologue)
36
+ @svg
32
37
  end
33
38
 
34
39
  private
35
40
 
36
41
  def wrap(svg)
37
- theme_class = @themer.theme_name ? "theme-#{@themer.theme_name}" : ''
42
+ theme_class = @theme.name ? "theme-#{@theme.name}" : ''
38
43
  class_name = "plantuml #{theme_class}".strip
39
44
 
40
45
  wrapper_element_start = "<div class=\"#{class_name}\">"
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
 
3
3
  require 'open3'
4
4
  require_relative '../which'
@@ -18,21 +18,19 @@ module Kramdown
18
18
  raise IOError, "'#{@plantuml_jar_file}' does not exist" unless File.exist? @plantuml_jar_file
19
19
  end
20
20
 
21
- def execute(stdin)
22
- cmd = "java -Djava.awt.headless=true -jar #{@plantuml_jar_file} -tsvg -failfast -pipe"
23
- cmd << if @logger.debug?
24
- ' -verbose'
25
- else
26
- ' -nometadata'
27
- end
21
+ def execute(diagram)
22
+ raise ArgumentError, 'diagram cannot be nil' if diagram.nil?
23
+ raise ArgumentError, "diagram must be a #{Diagram}" unless diagram.is_a?(Diagram)
24
+
25
+ cmd = "java -Djava.awt.headless=true -jar #{@plantuml_jar_file} -tsvg -failfast -pipe #{debug_args}"
28
26
 
29
27
  @logger.debug " kramdown-plantuml: Executing '#{cmd}'."
30
28
 
31
- stdout, stderr, status = Open3.capture3 cmd, stdin_data: stdin
29
+ stdout, stderr, status = Open3.capture3 cmd, stdin_data: diagram.plantuml
32
30
 
33
31
  @logger.debug " kramdown-plantuml: PlantUML exit code '#{status.exitstatus}'."
34
32
 
35
- PlantUmlResult.new(stdout, stderr, status)
33
+ PlantUmlResult.new(diagram, stdout, stderr, status.exitstatus)
36
34
  end
37
35
 
38
36
  private
@@ -43,6 +41,12 @@ module Kramdown
43
41
  first_jar = Dir[jar_glob].first
44
42
  File.expand_path first_jar unless first_jar.nil?
45
43
  end
44
+
45
+ def debug_args
46
+ return ' -verbose' if @logger.debug?
47
+
48
+ ' -nometadata'
49
+ end
46
50
  end
47
51
  end
48
52
  end
@@ -20,10 +20,10 @@ module Kramdown
20
20
  @logger.debug message
21
21
  end
22
22
 
23
- def debug_with_prefix(prefix, string)
24
- return if string.nil? || string.empty?
23
+ def debug_with_prefix(prefix, multiline_string)
24
+ return if multiline_string.nil? || multiline_string.empty?
25
25
 
26
- lines = string.lines
26
+ lines = multiline_string.lines
27
27
  lines.each do |line|
28
28
  @logger.debug "#{prefix}#{line.rstrip}"
29
29
  end
@@ -1,32 +1,69 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'plantuml_result'
4
+
3
5
  module Kramdown
4
6
  module PlantUml
5
7
  # PlantUML Error
6
8
  class PlantUmlError < StandardError
7
- def initialize(plantuml, stderr, exitcode)
9
+ def initialize(result)
10
+ raise ArgumentError, 'result cannot be nil' if result.nil?
11
+ raise ArgumentError, "result must be a #{PlantUmlResult}" unless result.is_a?(PlantUmlResult)
12
+
13
+ super create_message(result)
14
+ end
15
+
16
+ private
17
+
18
+ def create_message(result)
19
+ header = header(result).gsub("\n", ' ').strip
20
+ plantuml = plantuml(result)
21
+ result = result(result)
8
22
  message = <<~MESSAGE
9
- Conversion of the following PlantUML diagram failed:
23
+ #{header}
10
24
 
11
25
  #{plantuml}
12
26
 
13
- The error received from PlantUML was:
14
-
15
- Exit code: #{exitcode}
16
- #{stderr}
27
+ #{result}
17
28
  MESSAGE
18
29
 
19
- super message
30
+ message.strip
20
31
  end
21
32
 
22
- def self.should_raise?(exitcode, stderr)
23
- return false if exitcode.zero?
33
+ def header(result)
34
+ if theme_not_found?(result) && !result.diagram.nil? && !result.diagram.theme.nil?
35
+ return <<~HEADER
36
+ Conversion of the following PlantUML result failed because the
37
+ theme '#{result.diagram.theme.name}' can't be found in the directory
38
+ '#{result.diagram.theme.directory}':
39
+ HEADER
40
+ end
41
+
42
+ 'Conversion of the following PlantUML result failed:'
43
+ end
44
+
45
+ def theme_not_found?(result)
46
+ !result.nil? \
47
+ && !result.stderr.nil? \
48
+ && result.stderr.include?('NullPointerException') \
49
+ && result.stderr.include?('getTheme')
50
+ end
51
+
52
+ def plantuml(result)
53
+ return nil if result.nil? || result.diagram.nil?
54
+
55
+ result.diagram.plantuml
56
+ end
57
+
58
+ def result(result)
59
+ return nil if result.nil?
60
+
61
+ <<~RESULT
62
+ The error received from PlantUML was:
24
63
 
25
- !stderr.nil? && !stderr.empty? && \
26
- # If stderr is not empty, but contains the string 'CoreText note:',
27
- # the error is caused by a bug in Java, and should be ignored.
28
- # Circumvents https://bugs.openjdk.java.net/browse/JDK-8244621
29
- !stderr.include?('CoreText note:')
64
+ Exit code: #{result.exitcode}
65
+ #{result.stderr}
66
+ RESULT
30
67
  end
31
68
  end
32
69
  end
@@ -2,17 +2,24 @@
2
2
 
3
3
  require_relative 'logger'
4
4
  require_relative 'plantuml_error'
5
+ require_relative 'diagram'
5
6
 
6
7
  module Kramdown
7
8
  module PlantUml
8
9
  # Executes the PlantUML Java application.
9
10
  class PlantUmlResult
10
- attr_reader :stdout, :stderr, :exitcode
11
+ attr_reader :diagram, :stdout, :stderr, :exitcode
11
12
 
12
- def initialize(stdout, stderr, status)
13
+ def initialize(diagram, stdout, stderr, exitcode)
14
+ raise ArgumentError, 'diagram cannot be nil' if diagram.nil?
15
+ raise ArgumentError, "diagram must be a #{Diagram}" unless diagram.is_a?(Diagram)
16
+ raise ArgumentError, 'exitcode cannot be nil' if exitcode.nil?
17
+ raise ArgumentError, "exitcode must be a #{Integer}" unless exitcode.is_a?(Integer)
18
+
19
+ @diagram = diagram
13
20
  @stdout = stdout
14
21
  @stderr = stderr
15
- @exitcode = status.exitstatus
22
+ @exitcode = exitcode
16
23
  @logger = Logger.init
17
24
  end
18
25
 
@@ -37,8 +44,17 @@ module Kramdown
37
44
  @stdout
38
45
  end
39
46
 
40
- def validate(plantuml)
41
- raise PlantUmlError.new(plantuml, @stderr, @exitcode) if PlantUmlError.should_raise?(@exitcode, @stderr)
47
+ def valid?
48
+ return true if @exitcode.zero? || @stderr.nil? || @stderr.empty?
49
+
50
+ # If stderr is not empty, but contains the string 'CoreText note:',
51
+ # the error is caused by a bug in Java, and should be ignored.
52
+ # Circumvents https://bugs.openjdk.java.net/browse/JDK-8244621
53
+ @stderr.include?('CoreText note:')
54
+ end
55
+
56
+ def validate
57
+ raise PlantUmlError, self unless valid?
42
58
 
43
59
  return if @stderr.nil? || @stderr.empty?
44
60
 
@@ -5,21 +5,21 @@ require_relative 'logger'
5
5
  module Kramdown
6
6
  module PlantUml
7
7
  # Provides theming support for PlantUML
8
- class Themer
9
- attr_reader :theme_name, :theme_directory
8
+ class Theme
9
+ attr_reader :name, :directory
10
10
 
11
11
  def initialize(options = {})
12
12
  @logger = Logger.init
13
- @theme_name, @theme_directory = theme_options(options)
13
+ @name, @directory = theme_options(options)
14
14
  end
15
15
 
16
- def apply_theme(plantuml)
17
- if plantuml.nil? || plantuml.empty?
18
- @logger.debug ' kramdown-plantuml: Empty diagram.'
16
+ def apply(plantuml)
17
+ if plantuml.nil? || !plantuml.is_a?(String) || plantuml.empty?
18
+ @logger.debug ' kramdown-plantuml: Empty diagram or not a String.'
19
19
  return plantuml
20
20
  end
21
21
 
22
- if @theme_name.nil? || @theme_name.empty?
22
+ if @name.nil? || @name.empty?
23
23
  @logger.debug ' kramdown-plantuml: No theme to apply.'
24
24
  return plantuml
25
25
  end
@@ -37,10 +37,10 @@ module Kramdown
37
37
  return nil if options.nil? || !options.key?(:theme)
38
38
 
39
39
  theme = options[:theme] || {}
40
- theme_name = theme.key?(:name) ? theme[:name] : nil
41
- theme_directory = theme.key?(:directory) ? theme[:directory] : nil
40
+ name = theme.key?(:name) ? theme[:name] : nil
41
+ directory = theme.key?(:directory) ? theme[:directory] : nil
42
42
 
43
- [theme_name, theme_directory]
43
+ [name, directory]
44
44
  end
45
45
 
46
46
  def symbolize_keys(options)
@@ -60,8 +60,8 @@ module Kramdown
60
60
 
61
61
  return plantuml if startuml_index.nil?
62
62
 
63
- theme_string = "\n!theme #{@theme_name}"
64
- theme_string << " from #{@theme_directory}" unless @theme_directory.nil?
63
+ theme_string = "\n!theme #{@name}"
64
+ theme_string << " from #{@directory}" unless @directory.nil?
65
65
 
66
66
  @logger.debug " kramdown-plantuml: Applying #{theme_string.strip}"
67
67
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Kramdown
4
4
  module PlantUml
5
- VERSION = '1.1.3'
5
+ VERSION = '1.1.4'
6
6
  end
7
7
  end
@@ -1,5 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'kramdown-plantuml/version'
4
- require_relative 'kramdown-plantuml/converter'
5
3
  require_relative 'kramdown_html'
data/lib/kramdown_html.rb CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  require 'kramdown'
4
4
  require 'kramdown-parser-gfm'
5
- require_relative 'kramdown-plantuml/converter'
6
5
  require_relative 'kramdown-plantuml/logger'
7
6
  require_relative 'kramdown-plantuml/plantuml_error'
7
+ require_relative 'kramdown-plantuml/diagram'
8
8
 
9
9
  module Kramdown
10
10
  module Converter
@@ -18,9 +18,8 @@ module Kramdown
18
18
 
19
19
  plantuml = element.value
20
20
  plantuml_options = @options.key?(:plantuml) ? @options[:plantuml] : {}
21
- converter = ::Kramdown::PlantUml::Converter.new(plantuml_options || {})
22
-
23
- converter.convert_plantuml_to_svg(plantuml)
21
+ diagram = ::Kramdown::PlantUml::Diagram.new(plantuml, plantuml_options)
22
+ diagram.convert_to_svg
24
23
  end
25
24
  end
26
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kramdown-plantuml
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Swedbank Pay
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-08-04 00:00:00.000000000 Z
11
+ date: 2021-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kramdown
@@ -166,17 +166,17 @@ files:
166
166
  - LICENSE
167
167
  - README.md
168
168
  - Rakefile
169
- - bin/net/sourceforge/plantuml/plantuml/1.2021.8/plantuml-1.2021.8.jar
169
+ - bin/net/sourceforge/plantuml/plantuml/1.2021.9/plantuml-1.2021.9.jar
170
170
  - kramdown-plantuml.gemspec
171
171
  - lib/kramdown-plantuml.rb
172
172
  - lib/kramdown-plantuml/bool_env.rb
173
173
  - lib/kramdown-plantuml/console_logger.rb
174
- - lib/kramdown-plantuml/converter.rb
174
+ - lib/kramdown-plantuml/diagram.rb
175
175
  - lib/kramdown-plantuml/executor.rb
176
176
  - lib/kramdown-plantuml/logger.rb
177
177
  - lib/kramdown-plantuml/plantuml_error.rb
178
178
  - lib/kramdown-plantuml/plantuml_result.rb
179
- - lib/kramdown-plantuml/themer.rb
179
+ - lib/kramdown-plantuml/theme.rb
180
180
  - lib/kramdown-plantuml/version.rb
181
181
  - lib/kramdown_html.rb
182
182
  - lib/which.rb