asciidoctor-diagram 2.0.2 → 2.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.adoc +25 -0
  3. data/README.adoc +13 -4
  4. data/lib/asciidoctor-diagram.rb +3 -0
  5. data/lib/asciidoctor-diagram/a2s/converter.rb +10 -6
  6. data/lib/asciidoctor-diagram/blockdiag/converter.rb +1 -1
  7. data/lib/asciidoctor-diagram/bpmn/converter.rb +3 -3
  8. data/lib/asciidoctor-diagram/diagram_converter.rb +5 -1
  9. data/lib/asciidoctor-diagram/diagram_processor.rb +64 -38
  10. data/lib/asciidoctor-diagram/diagram_source.rb +64 -17
  11. data/lib/asciidoctor-diagram/ditaa/converter.rb +6 -2
  12. data/lib/asciidoctor-diagram/dpic.rb +7 -0
  13. data/lib/asciidoctor-diagram/dpic/converter.rb +30 -0
  14. data/lib/asciidoctor-diagram/dpic/extension.rb +14 -0
  15. data/lib/asciidoctor-diagram/gnuplot/converter.rb +8 -8
  16. data/lib/asciidoctor-diagram/graphviz/converter.rb +2 -2
  17. data/lib/asciidoctor-diagram/http/converter.rb +25 -5
  18. data/lib/asciidoctor-diagram/http/server.rb +10 -5
  19. data/lib/asciidoctor-diagram/lilypond/converter.rb +2 -2
  20. data/lib/asciidoctor-diagram/meme/converter.rb +7 -7
  21. data/lib/asciidoctor-diagram/mermaid/converter.rb +16 -15
  22. data/lib/asciidoctor-diagram/msc/converter.rb +2 -2
  23. data/lib/asciidoctor-diagram/pikchr.rb +7 -0
  24. data/lib/asciidoctor-diagram/pikchr/converter.rb +26 -0
  25. data/lib/asciidoctor-diagram/pikchr/extension.rb +14 -0
  26. data/lib/asciidoctor-diagram/plantuml/converter.rb +3 -3
  27. data/lib/asciidoctor-diagram/smcat/converter.rb +3 -3
  28. data/lib/asciidoctor-diagram/svgbob/converter.rb +2 -2
  29. data/lib/asciidoctor-diagram/symbolator.rb +7 -0
  30. data/lib/asciidoctor-diagram/symbolator/converter.rb +23 -0
  31. data/lib/asciidoctor-diagram/symbolator/extension.rb +14 -0
  32. data/lib/asciidoctor-diagram/syntrax/converter.rb +9 -6
  33. data/lib/asciidoctor-diagram/util/cli_generator.rb +18 -0
  34. data/lib/asciidoctor-diagram/util/gif.rb +2 -2
  35. data/lib/asciidoctor-diagram/util/pdf.rb +2 -2
  36. data/lib/asciidoctor-diagram/util/png.rb +2 -2
  37. data/lib/asciidoctor-diagram/util/svg.rb +46 -19
  38. data/lib/asciidoctor-diagram/vega/converter.rb +2 -2
  39. data/lib/asciidoctor-diagram/version.rb +1 -1
  40. data/spec/a2s_spec.rb +2 -140
  41. data/spec/blockdiag_spec.rb +2 -200
  42. data/spec/bpmn_spec.rb +52 -92
  43. data/spec/bytefield_spec.rb +2 -140
  44. data/spec/ditaa_spec.rb +5 -143
  45. data/spec/dpic_spec.rb +19 -0
  46. data/spec/erd_spec.rb +2 -199
  47. data/spec/gnuplot_spec.rb +2 -255
  48. data/spec/graphviz_spec.rb +6 -145
  49. data/spec/lilypond_spec.rb +2 -140
  50. data/spec/mermaid_spec.rb +2 -199
  51. data/spec/msc_spec.rb +2 -199
  52. data/spec/nomnoml_spec.rb +4 -142
  53. data/spec/pikchr_spec.rb +51 -0
  54. data/spec/plantuml_spec.rb +6 -578
  55. data/spec/shaape_spec.rb +9 -221
  56. data/spec/shared_examples.rb +552 -0
  57. data/spec/smcat_spec.rb +2 -140
  58. data/spec/svgbob_spec.rb +2 -140
  59. data/spec/symbolator_spec.rb +23 -0
  60. data/spec/syntrax_spec.rb +5 -215
  61. data/spec/test_helper.rb +1 -22
  62. data/spec/tikz_spec.rb +4 -24
  63. data/spec/umlet_spec.rb +2 -58
  64. data/spec/vega_spec.rb +4 -117
  65. data/spec/wavedrom_spec.rb +2 -199
  66. metadata +20 -6
  67. data/spec/bpmn-example.xml +0 -44
@@ -0,0 +1,14 @@
1
+ require_relative '../diagram_processor'
2
+ require_relative 'converter'
3
+
4
+ module Asciidoctor
5
+ module Diagram
6
+ class SymbolatorBlockProcessor < DiagramBlockProcessor
7
+ use_converter SymbolatorConverter
8
+ end
9
+
10
+ class SymbolatorBlockMacroProcessor < DiagramBlockMacroProcessor
11
+ use_converter SymbolatorConverter
12
+ end
13
+ end
14
+ end
@@ -14,16 +14,15 @@ module Asciidoctor
14
14
  [:png, :svg]
15
15
  end
16
16
 
17
- def collect_options(source, name)
17
+ def collect_options(source)
18
18
  {
19
- :heading => source.attr('heading', nil, name),
20
- :scale => source.attr('scale', nil, name),
21
- :transparent => source.attr('transparent', nil, name),
22
- :style => source.attr('style', nil, name)
19
+ :heading => source.attr('heading'),
20
+ :scale => source.attr('scale'),
21
+ :transparent => source.attr('transparent'),
22
+ :style => source.attr('style')
23
23
  }
24
24
  end
25
25
 
26
-
27
26
  def convert(source, format, options)
28
27
  generate_file(source.find_command('syntrax'), 'spec', format.to_s, source.to_s) do |tool_path, input_path, output_path|
29
28
  args = [tool_path, '-i', Platform.native_path(input_path), '-o', Platform.native_path(output_path)]
@@ -50,6 +49,10 @@ module Asciidoctor
50
49
  args
51
50
  end
52
51
  end
52
+
53
+ def native_scaling?
54
+ true
55
+ end
53
56
  end
54
57
  end
55
58
  end
@@ -1,3 +1,4 @@
1
+ require 'asciidoctor/logging'
1
2
  require 'tempfile'
2
3
  require_relative 'cli'
3
4
 
@@ -5,6 +6,8 @@ module Asciidoctor
5
6
  module Diagram
6
7
  # @private
7
8
  module CliGenerator
9
+ include Asciidoctor::Logging
10
+
8
11
  def generate_stdin(tool, format, code)
9
12
  tool_name = File.basename(tool)
10
13
 
@@ -51,6 +54,20 @@ module Asciidoctor
51
54
  end
52
55
  end
53
56
 
57
+ def generate_file_stdout(tool, input_ext, code)
58
+ tool_name = File.basename(tool)
59
+
60
+ source_file = Tempfile.new([tool_name, ".#{input_ext}"])
61
+ begin
62
+ File.write(source_file.path, code)
63
+
64
+ opts = yield tool, source_file.path
65
+ generate(opts, :stdout)
66
+ ensure
67
+ source_file.unlink
68
+ end
69
+ end
70
+
54
71
  private
55
72
  def generate(opts, target_file, open3_opts = {})
56
73
  case opts
@@ -64,6 +81,7 @@ module Asciidoctor
64
81
  raise "Block passed to generate_file should return an Array or a Hash"
65
82
  end
66
83
 
84
+ logger.debug "Executing #{args} with options #{open3_opts}"
67
85
  result = ::Asciidoctor::Diagram::Cli.run(*args, open3_opts)
68
86
 
69
87
  data = target_file == :stdout ? result[:out] : read_result(target_file, out_file)
@@ -7,14 +7,14 @@ module Asciidoctor
7
7
  GIF87A_SIGNATURE = 'GIF87a'.force_encoding(Encoding::ASCII_8BIT)
8
8
  GIF89A_SIGNATURE = 'GIF89a'.force_encoding(Encoding::ASCII_8BIT)
9
9
 
10
- def self.get_image_size(data)
10
+ def self.post_process_image(data)
11
11
  bio = BinaryIO.new(data)
12
12
  gif_signature = bio.read_string(6)
13
13
  raise "Invalid GIF signature" unless gif_signature == GIF87A_SIGNATURE || gif_signature == GIF89A_SIGNATURE
14
14
 
15
15
  width = bio.read_uint16_le
16
16
  height = bio.read_uint16_le
17
- [width, height]
17
+ [data, width, height]
18
18
  end
19
19
  end
20
20
  end
@@ -2,8 +2,8 @@ module Asciidoctor
2
2
  module Diagram
3
3
  # @private
4
4
  module PDF
5
- def self.get_image_size(_)
6
- nil
5
+ def self.post_process_image(data)
6
+ [data, nil, nil]
7
7
  end
8
8
  end
9
9
  end
@@ -6,7 +6,7 @@ module Asciidoctor
6
6
  module PNG
7
7
  PNG_SIGNATURE = [137, 80, 78, 71, 13, 10, 26, 10].pack('CCCCCCCC')
8
8
 
9
- def self.get_image_size(data)
9
+ def self.post_process_image(data)
10
10
  bio = BinaryIO.new(data)
11
11
  png_signature = bio.read_string(8)
12
12
  raise "Invalid PNG signature" unless png_signature == PNG_SIGNATURE
@@ -18,7 +18,7 @@ module Asciidoctor
18
18
 
19
19
  width = bio.read_uint32_be
20
20
  height = bio.read_uint32_be
21
- [width, height]
21
+ [data, width, height]
22
22
  end
23
23
  end
24
24
  end
@@ -1,34 +1,61 @@
1
1
  require_relative 'binaryio'
2
+ require 'rexml/document'
3
+ require 'bigdecimal'
4
+ require 'bigdecimal/util'
2
5
 
3
6
  module Asciidoctor
4
7
  module Diagram
5
8
  # @private
6
9
  module SVG
7
- def self.get_image_size(data)
8
- if m = START_TAG_REGEX.match(data)
9
- start_tag = m[0]
10
- if (w = WIDTH_REGEX.match(start_tag)) && (h = HEIGHT_REGEX.match(start_tag))
11
- width = w[:value].to_i * to_px_factor(w[:unit])
12
- height = h[:value].to_i * to_px_factor(h[:unit])
13
- return [width.to_i, height.to_i]
14
- end
15
-
16
- if v = VIEWBOX_REGEX.match(start_tag)
17
- width = v[:width]
18
- height = v[:height]
19
- return [width.to_i, height.to_i]
20
- end
10
+ def self.post_process_image(data)
11
+ svg = REXML::Document.new(data)
12
+
13
+ root = svg.root
14
+
15
+ unless root.attributes['xmlns']
16
+ root.add_attribute('xmlns', 'http://www.w3.org/2000/svg')
17
+ end
18
+
19
+ unless root.attributes['preserveAspectRatio']
20
+ root.add_attribute('preserveAspectRatio', 'xMidYMid meet')
21
21
  end
22
22
 
23
- nil
23
+ width = nil
24
+ height = nil
25
+
26
+ if (w = WIDTH_HEIGHT_REGEX.match(root.attributes['width'])) && (h = WIDTH_HEIGHT_REGEX.match(root.attributes['height']))
27
+ width = to_numeric(w[:value]) * to_px_factor(w[:unit])
28
+ height = to_numeric(h[:value]) * to_px_factor(h[:unit])
29
+ end
30
+
31
+ viewbox = root.attributes['viewBox']
32
+ if (v = VIEWBOX_REGEX.match(viewbox)) && width.nil? && height.nil?
33
+ width = to_numeric(v[:width])
34
+ height = to_numeric(v[:height])
35
+ end
36
+
37
+ if viewbox.nil? && width && height
38
+ root.add_attribute('viewBox', "0 0 #{width.to_s} #{height.to_s}")
39
+ end
40
+
41
+ patched_svg = ""
42
+ svg.write(:output => patched_svg, :indent => 2)
43
+
44
+ [patched_svg, width, height]
24
45
  end
25
46
 
26
47
  private
27
48
 
28
- START_TAG_REGEX = /<svg[^>]*>/
29
- WIDTH_REGEX = /width="(?<value>\d+(?:\.\d+)?)(?<unit>[a-zA-Z]+)?"/
30
- HEIGHT_REGEX = /height="(?<value>\d+(?:\.\d+)?)(?<unit>[a-zA-Z]+)?"/
31
- VIEWBOX_REGEX = /viewBox="\d+(?:\.\d+)? \d+(?:\.\d+)? (?<width>\d+(?:\.\d+)?) (?<height>\d+(?:\.\d+)?)"/
49
+ def self.to_numeric(text)
50
+ if text.include? '.'
51
+ text.to_f
52
+ else
53
+ text.to_i
54
+ end
55
+ end
56
+
57
+ WIDTH_HEIGHT_REGEX = /^\s*(?<value>\d+(?:\.\d+)?)\s*(?<unit>[a-zA-Z]+)?\s*$/
58
+ VIEWBOX_REGEX = /^\s*\d+(?:\.\d+)?\s*\d+(?:\.\d+)?\s*(?<width>\d+(?:\.\d+)?)\s*(?<height>\d+(?:\.\d+)?)\s*$/
32
59
 
33
60
  def self.to_px_factor(unit)
34
61
  case unit
@@ -15,9 +15,9 @@ module Asciidoctor
15
15
  end
16
16
 
17
17
 
18
- def collect_options(source, name)
18
+ def collect_options(source)
19
19
  {
20
- :vegalite => name.to_s.include?('lite') || source.attr('vegalite')
20
+ :vegalite => source.diagram_type.to_s.include?('lite') || source.attr('vegalite')
21
21
  }
22
22
  end
23
23
 
@@ -1,5 +1,5 @@
1
1
  module Asciidoctor
2
2
  module Diagram
3
- VERSION = "2.0.2"
3
+ VERSION = "2.0.4"
4
4
  end
5
5
  end
@@ -21,147 +21,9 @@ code = <<-eos
21
21
  eos
22
22
 
23
23
  describe Asciidoctor::Diagram::AsciiToSvgBlockMacroProcessor, :broken_on_travis, :broken_on_windows do
24
- it "should generate SVG images when format is set to 'svg'" do
25
- File.write('a2s.txt', code)
26
-
27
- doc = <<-eos
28
- = Hello, a2s!
29
- Doc Writer <doc@example.com>
30
-
31
- == First Section
32
-
33
- a2s::a2s.txt[format="svg"]
34
- eos
35
-
36
- d = load_asciidoc doc
37
- expect(d).to_not be_nil
38
-
39
- b = d.find { |bl| bl.context == :image }
40
- expect(b).to_not be_nil
41
-
42
- expect(b.content_model).to eq :empty
43
-
44
- target = b.attributes['target']
45
- expect(target).to_not be_nil
46
- expect(target).to match(/\.svg/)
47
- expect(File.exist?(target)).to be true
48
-
49
- expect(b.attributes['width']).to_not be_nil
50
- expect(b.attributes['height']).to_not be_nil
51
- end
24
+ include_examples "block_macro", :a2s, code, [:svg]
52
25
  end
53
26
 
54
27
  describe Asciidoctor::Diagram::AsciiToSvgBlockProcessor, :broken_on_travis, :broken_on_windows do
55
- it "should generate SVG images when format is set to 'svg'" do
56
- doc = <<-eos
57
- = Hello, a2s!
58
- Doc Writer <doc@example.com>
59
-
60
- == First Section
61
-
62
- [a2s, format="svg"]
63
- ----
64
- #{code}
65
- ----
66
- eos
67
-
68
- d = load_asciidoc doc
69
- expect(d).to_not be_nil
70
-
71
- b = d.find { |bl| bl.context == :image }
72
- expect(b).to_not be_nil
73
-
74
- expect(b.content_model).to eq :empty
75
-
76
- target = b.attributes['target']
77
- expect(target).to_not be_nil
78
- expect(target).to match(/\.svg/)
79
- expect(File.exist?(target)).to be true
80
-
81
- expect(b.attributes['width']).to_not be_nil
82
- expect(b.attributes['height']).to_not be_nil
83
- end
84
-
85
- it "should raise an error when when format is set to an invalid value" do
86
- doc = <<-eos
87
- = Hello, a2s!
88
- Doc Writer <doc@example.com>
89
-
90
- == First Section
91
-
92
- [a2s, format="foobar"]
93
- ----
94
- ----
95
- eos
96
-
97
- expect { load_asciidoc doc }.to raise_error(/support.*format/i)
98
- end
99
-
100
- it "should not regenerate images when source has not changed" do
101
- File.write('a2s.txt', code)
102
-
103
- doc = <<-eos
104
- = Hello, a2s!
105
- Doc Writer <doc@example.com>
106
-
107
- == First Section
108
-
109
- a2s::a2s.txt
110
-
111
- [a2s]
112
- ----
113
- #{code}
114
- ----
115
- eos
116
-
117
- d = load_asciidoc doc
118
- b = d.find { |bl| bl.context == :image }
119
- expect(b).to_not be_nil
120
- target = b.attributes['target']
121
- mtime1 = File.mtime(target)
122
-
123
- sleep 1
124
-
125
- d = load_asciidoc doc
126
-
127
- mtime2 = File.mtime(target)
128
-
129
- expect(mtime2).to eq mtime1
130
- end
131
-
132
- it "should handle two block macros with the same source" do
133
- File.write('a2s.txt', code)
134
-
135
- doc = <<-eos
136
- = Hello, a2s!
137
- Doc Writer <doc@example.com>
138
-
139
- == First Section
140
-
141
- a2s::a2s.txt[]
142
- a2s::a2s.txt[]
143
- eos
144
-
145
- load_asciidoc doc
146
- expect(File.exist?('a2s.svg')).to be true
147
- end
148
-
149
- it "should respect target attribute in block macros" do
150
- File.write('a2s.txt', code)
151
-
152
- doc = <<-eos
153
- = Hello, a2s!
154
- Doc Writer <doc@example.com>
155
-
156
- == First Section
157
-
158
- a2s::a2s.txt["foobar"]
159
- a2s::a2s.txt["foobaz"]
160
- eos
161
-
162
- load_asciidoc doc
163
- expect(File.exist?('foobar.svg')).to be true
164
- expect(File.exist?('foobaz.svg')).to be true
165
- expect(File.exist?('a2s.svg')).to be false
166
- end
28
+ include_examples "block", :svgbob, code, [:svg]
167
29
  end
@@ -8,207 +8,9 @@ blockdiag {
8
8
  eos
9
9
 
10
10
  describe Asciidoctor::Diagram::BlockDiagBlockMacroProcessor, :broken_on_appveyor do
11
- it "should generate PNG images when format is set to 'png'" do
12
- File.write('blockdiag.txt', code)
13
-
14
- doc = <<-eos
15
- = Hello, BlockDiag!
16
- Doc Writer <doc@example.com>
17
-
18
- == First Section
19
-
20
- blockdiag::blockdiag.txt[format="png"]
21
- eos
22
-
23
- d = load_asciidoc doc
24
- expect(d).to_not be_nil
25
-
26
- b = d.find { |bl| bl.context == :image }
27
- expect(b).to_not be_nil
28
-
29
- expect(b.content_model).to eq :empty
30
-
31
- target = b.attributes['target']
32
- expect(target).to_not be_nil
33
- expect(target).to match(/\.png$/)
34
- expect(File.exist?(target)).to be true
35
-
36
- expect(b.attributes['width']).to_not be_nil
37
- expect(b.attributes['height']).to_not be_nil
38
- end
11
+ include_examples "block_macro", :blockdiag, code, [:png, :svg, :pdf]
39
12
  end
40
13
 
41
14
  describe Asciidoctor::Diagram::BlockDiagBlockProcessor, :broken_on_appveyor do
42
- it "should generate PNG images when format is set to 'png'" do
43
- doc = <<-eos
44
- = Hello, BlockDiag!
45
- Doc Writer <doc@example.com>
46
-
47
- == First Section
48
-
49
- [blockdiag, format="png"]
50
- ----
51
- #{code}
52
- ----
53
- eos
54
-
55
- d = load_asciidoc doc
56
- expect(d).to_not be_nil
57
-
58
- b = d.find { |bl| bl.context == :image }
59
- expect(b).to_not be_nil
60
-
61
- expect(b.content_model).to eq :empty
62
-
63
- target = b.attributes['target']
64
- expect(target).to_not be_nil
65
- expect(target).to match(/\.png$/)
66
- expect(File.exist?(target)).to be true
67
-
68
- expect(b.attributes['width']).to_not be_nil
69
- expect(b.attributes['height']).to_not be_nil
70
- end
71
-
72
- it "should generate SVG images when format is set to 'svg'" do
73
- doc = <<-eos
74
- = Hello, BlockDiag!
75
- Doc Writer <doc@example.com>
76
-
77
- == First Section
78
-
79
- [blockdiag, format="svg"]
80
- ----
81
- #{code}
82
- ----
83
- eos
84
-
85
- d = load_asciidoc doc
86
- expect(d).to_not be_nil
87
-
88
- b = d.find { |bl| bl.context == :image }
89
- expect(b).to_not be_nil
90
-
91
- expect(b.content_model).to eq :empty
92
-
93
- target = b.attributes['target']
94
- expect(target).to_not be_nil
95
- expect(target).to match(/\.svg/)
96
- expect(File.exist?(target)).to be true
97
-
98
- expect(b.attributes['width']).to_not be_nil
99
- expect(b.attributes['height']).to_not be_nil
100
- end
101
-
102
- it "should generate PDF files when format is set to 'pdf'" do
103
- doc = <<-eos
104
- = Hello, BlockDiag!
105
- Doc Writer <doc@example.com>
106
-
107
- == First Section
108
-
109
- [blockdiag, format="pdf"]
110
- ----
111
- #{code}
112
- ----
113
- eos
114
-
115
- d = load_asciidoc doc
116
- expect(d).to_not be_nil
117
-
118
- b = d.find { |bl| bl.context == :image }
119
- expect(b).to_not be_nil
120
-
121
- expect(b.content_model).to eq :empty
122
-
123
- target = b.attributes['target']
124
- expect(target).to_not be_nil
125
- expect(target).to match(/\.pdf/)
126
- expect(File.exist?(target)).to be true
127
-
128
- expect(b.attributes['width']).to be_nil
129
- expect(b.attributes['height']).to be_nil
130
- end
131
-
132
- it "should raise an error when when format is set to an invalid value" do
133
- doc = <<-eos
134
- = Hello, BlockDiag!
135
- Doc Writer <doc@example.com>
136
-
137
- == First Section
138
-
139
- [blockdiag, format="foobar"]
140
- ----
141
- ----
142
- eos
143
-
144
- expect { load_asciidoc doc }.to raise_error(/support.*format/i)
145
- end
146
-
147
- it "should not regenerate images when source has not changed" do
148
- File.write('blockdiag.txt', code)
149
-
150
- doc = <<-eos
151
- = Hello, BlockDiag!
152
- Doc Writer <doc@example.com>
153
-
154
- == First Section
155
-
156
- blockdiag::blockdiag.txt
157
-
158
- [blockdiag, format="png"]
159
- ----
160
- #{code}
161
- ----
162
- eos
163
-
164
- d = load_asciidoc doc
165
- b = d.find { |bl| bl.context == :image }
166
- expect(b).to_not be_nil
167
- target = b.attributes['target']
168
- mtime1 = File.mtime(target)
169
-
170
- sleep 1
171
-
172
- d = load_asciidoc doc
173
-
174
- mtime2 = File.mtime(target)
175
-
176
- expect(mtime2).to eq mtime1
177
- end
178
-
179
- it "should handle two block macros with the same source" do
180
- File.write('blockdiag.txt', code)
181
-
182
- doc = <<-eos
183
- = Hello, BlockDiag!
184
- Doc Writer <doc@example.com>
185
-
186
- == First Section
187
-
188
- blockdiag::blockdiag.txt[]
189
- blockdiag::blockdiag.txt[]
190
- eos
191
-
192
- load_asciidoc doc
193
- expect(File.exist?('blockdiag.png')).to be true
194
- end
195
-
196
- it "should respect target attribute in block macros" do
197
- File.write('blockdiag.txt', code)
198
-
199
- doc = <<-eos
200
- = Hello, BlockDiag!
201
- Doc Writer <doc@example.com>
202
-
203
- == First Section
204
-
205
- blockdiag::blockdiag.txt["foobar"]
206
- blockdiag::blockdiag.txt["foobaz"]
207
- eos
208
-
209
- load_asciidoc doc
210
- expect(File.exist?('foobar.png')).to be true
211
- expect(File.exist?('foobaz.png')).to be true
212
- expect(File.exist?('blockdiag.png')).to be false
213
- end
15
+ include_examples "block", :blockdiag, code, [:png, :svg, :pdf]
214
16
  end