liquid-diagrams 0.3.0 → 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 +4 -4
- data/README.md +15 -16
- data/features/diagrams/bitfield.feature +48 -0
- data/features/diagrams/blockdiag.feature +19 -0
- data/features/diagrams/erd.feature +19 -0
- data/features/diagrams/graphviz.feature +19 -0
- data/features/diagrams/mermaid.feature +20 -0
- data/features/diagrams/netlistsvg.feature +27 -0
- data/features/diagrams/nomnoml.feature +19 -0
- data/features/diagrams/plantuml.feature +17 -0
- data/features/diagrams/smcat.feature +23 -0
- data/features/diagrams/svgbob.feature +19 -0
- data/features/diagrams/syntrax.feature +20 -0
- data/features/diagrams/vega.feature +23 -0
- data/features/diagrams/vegalite.feature +23 -0
- data/features/diagrams/wavedrom.feature +24 -0
- data/features/step_definitions/diagrams.rb +21 -0
- data/features/support/env.rb +15 -0
- data/lib/liquid_diagrams.rb +9 -17
- data/lib/liquid_diagrams/basic_block.rb +12 -42
- data/lib/liquid_diagrams/basic_renderer.rb +43 -1
- data/lib/liquid_diagrams/blocks.rb +14 -0
- data/lib/liquid_diagrams/renderers.rb +10 -0
- data/lib/liquid_diagrams/renderers/bitfield_renderer.rb +9 -13
- data/lib/liquid_diagrams/renderers/blockdiag_renderer.rb +7 -15
- data/lib/liquid_diagrams/renderers/erd_renderer.rb +7 -15
- data/lib/liquid_diagrams/renderers/graphviz_renderer.rb +10 -10
- data/lib/liquid_diagrams/renderers/mermaid_renderer.rb +2 -9
- data/lib/liquid_diagrams/renderers/netlistsvg_renderer.rb +13 -0
- data/lib/liquid_diagrams/renderers/nomnoml_renderer.rb +0 -4
- data/lib/liquid_diagrams/renderers/plantuml_renderer.rb +5 -5
- data/lib/liquid_diagrams/renderers/smcat_renderer.rb +0 -10
- data/lib/liquid_diagrams/renderers/svgbob_renderer.rb +0 -10
- data/lib/liquid_diagrams/renderers/syntrax_renderer.rb +0 -10
- data/lib/liquid_diagrams/renderers/vega_renderer.rb +9 -23
- data/lib/liquid_diagrams/renderers/vegalite_renderer.rb +19 -0
- data/lib/liquid_diagrams/renderers/wavedrom_renderer.rb +1 -1
- data/lib/liquid_diagrams/rendering.rb +8 -6
- data/lib/liquid_diagrams/utils.rb +21 -14
- data/lib/liquid_diagrams/version.rb +1 -1
- data/spec/liquid_diagrams/basic_block_spec.rb +25 -62
- data/spec/liquid_diagrams/basic_renderer_spec.rb +27 -5
- data/spec/liquid_diagrams/blocks_spec.rb +0 -0
- data/spec/liquid_diagrams/renderers/bitfield_renderer_spec.rb +1 -19
- data/spec/liquid_diagrams/renderers/blockdiag_renderer_spec.rb +3 -31
- data/spec/liquid_diagrams/renderers/erd_renderer_spec.rb +3 -37
- data/spec/liquid_diagrams/renderers/graphviz_renderer_spec.rb +11 -21
- data/spec/liquid_diagrams/renderers/mermaid_renderer_spec.rb +3 -19
- data/spec/liquid_diagrams/renderers/netlistsvg_renderer_spec.rb +9 -0
- data/spec/liquid_diagrams/renderers/nomnoml_renderer_spec.rb +1 -7
- data/spec/liquid_diagrams/renderers/plantuml_renderer_spec.rb +4 -14
- data/spec/liquid_diagrams/renderers/smcat_renderer_spec.rb +1 -25
- data/spec/liquid_diagrams/renderers/svgbob_renderer_spec.rb +1 -23
- data/spec/liquid_diagrams/renderers/syntrax_renderer_spec.rb +1 -23
- data/spec/liquid_diagrams/renderers/vega_renderer_spec.rb +3 -21
- data/spec/liquid_diagrams/renderers/vegalite_renderer_spec.rb +15 -0
- data/spec/liquid_diagrams/renderers/wavedrom_renderer_spec.rb +3 -3
- data/spec/liquid_diagrams/utils_spec.rb +20 -8
- data/spec/liquid_diagrams_spec.rb +52 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/support/shared_examples.rb +8 -19
- data/vendor/{mermaid_puppeteer_config.json → puppeteer.json} +0 -0
- metadata +70 -19
@@ -16,16 +16,6 @@ module LiquidDiagrams
|
|
16
16
|
"#{input} --output-to #{output}"
|
17
17
|
end.sub(XML_REGEX, '')
|
18
18
|
end
|
19
|
-
|
20
|
-
def build_command
|
21
|
-
command = +'smcat'
|
22
|
-
|
23
|
-
@config.slice(*OPTIONS).each do |opt, value|
|
24
|
-
command << " --#{opt} #{value}"
|
25
|
-
end
|
26
|
-
|
27
|
-
command
|
28
|
-
end
|
29
19
|
end
|
30
20
|
end
|
31
21
|
end
|
@@ -13,16 +13,6 @@ module LiquidDiagrams
|
|
13
13
|
def render
|
14
14
|
Rendering.render_with_stdin_stdout(build_command, @content)
|
15
15
|
end
|
16
|
-
|
17
|
-
def build_command
|
18
|
-
command = +'svgbob'
|
19
|
-
|
20
|
-
@config.slice(*OPTIONS).each do |opt, value|
|
21
|
-
command << " --#{opt} #{value}"
|
22
|
-
end
|
23
|
-
|
24
|
-
command
|
25
|
-
end
|
26
16
|
end
|
27
17
|
end
|
28
18
|
end
|
@@ -13,16 +13,6 @@ module LiquidDiagrams
|
|
13
13
|
"--input #{input} --output #{output}"
|
14
14
|
end
|
15
15
|
end
|
16
|
-
|
17
|
-
def build_command
|
18
|
-
command = +'syntrax'
|
19
|
-
|
20
|
-
@config.slice(*OPTIONS).each do |opt, value|
|
21
|
-
command << " --#{opt} #{value}"
|
22
|
-
end
|
23
|
-
|
24
|
-
command
|
25
|
-
end
|
26
16
|
end
|
27
17
|
end
|
28
18
|
end
|
@@ -2,32 +2,18 @@
|
|
2
2
|
|
3
3
|
module LiquidDiagrams
|
4
4
|
module Renderers
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
].freeze
|
5
|
+
class VegaRenderer < BasicRenderer
|
6
|
+
OPTIONS = %w[
|
7
|
+
scale
|
8
|
+
].freeze
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
@content = Rendering.render_with_stdin_stdout('vl2vg', @content)
|
14
|
-
end
|
15
|
-
|
16
|
-
Rendering.render_with_stdin_stdout(build_command, @content)
|
17
|
-
end
|
18
|
-
|
19
|
-
def build_command
|
20
|
-
command = +'vg2svg'
|
21
|
-
|
22
|
-
@config.slice(*self.class.const_get(:OPTIONS)).each do |opt, value|
|
23
|
-
command << " --#{opt} #{value}"
|
24
|
-
end
|
25
|
-
|
26
|
-
command
|
27
|
-
end
|
10
|
+
def render
|
11
|
+
Rendering.render_with_stdin_stdout(build_command, @content)
|
28
12
|
end
|
29
13
|
|
30
|
-
|
14
|
+
def executable
|
15
|
+
'vg2svg'
|
16
|
+
end
|
31
17
|
end
|
32
18
|
end
|
33
19
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LiquidDiagrams
|
4
|
+
module Renderers
|
5
|
+
class VegaliteRenderer < BasicRenderer
|
6
|
+
OPTIONS = %w[
|
7
|
+
scale
|
8
|
+
].freeze
|
9
|
+
|
10
|
+
def render
|
11
|
+
Rendering.render_with_stdin_stdout(build_command, @content)
|
12
|
+
end
|
13
|
+
|
14
|
+
def executable
|
15
|
+
'vl2svg'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -9,6 +9,9 @@ module LiquidDiagrams
|
|
9
9
|
module_function
|
10
10
|
|
11
11
|
def render_with_stdin_stdout(command, content)
|
12
|
+
options = yield command if block_given?
|
13
|
+
command = "#{command} #{options}".strip
|
14
|
+
|
12
15
|
render_with_command(command, :stdout, stdin_data: content)
|
13
16
|
end
|
14
17
|
|
@@ -18,11 +21,10 @@ module LiquidDiagrams
|
|
18
21
|
|
19
22
|
File.write(input.path, content)
|
20
23
|
|
21
|
-
|
22
|
-
command = "#{command} #{
|
24
|
+
options = yield input.path, output.path
|
25
|
+
command = "#{command} #{options}".strip
|
23
26
|
|
24
27
|
render_with_command(command, output.path)
|
25
|
-
# TODO: recue Tempfile.new and File.write error
|
26
28
|
ensure
|
27
29
|
input.close!
|
28
30
|
output.close!
|
@@ -36,9 +38,9 @@ module LiquidDiagrams
|
|
36
38
|
end
|
37
39
|
|
38
40
|
unless status.success?
|
39
|
-
|
40
|
-
|
41
|
-
|
41
|
+
msg = "#{command}: #{stderr.empty? ? stdout : stderr}"
|
42
|
+
|
43
|
+
raise Errors::RenderingFailedError, msg
|
42
44
|
end
|
43
45
|
|
44
46
|
output == :stdout ? stdout : File.read(output)
|
@@ -6,38 +6,45 @@ module LiquidDiagrams
|
|
6
6
|
|
7
7
|
# Join the args with prefix
|
8
8
|
#
|
9
|
-
# @param args
|
9
|
+
# @param args [String, Array, Hash]
|
10
10
|
# @param with [String]
|
11
11
|
#
|
12
|
+
# @yield When `args` is a Hash, you must provide a block
|
13
|
+
# @yieldreturn [String] The result string to join
|
14
|
+
#
|
12
15
|
# @return [String]
|
13
16
|
#
|
14
17
|
# @example join on string
|
15
|
-
# join('path', with: ' -I') # => '
|
18
|
+
# join('path', with: ' -I') # => '-Ipath'
|
16
19
|
#
|
17
20
|
# @example join on array
|
18
|
-
# join([
|
21
|
+
# join(%w[path1 path2], with: ' -I') # => '-Ipath1 -Ipath2'
|
19
22
|
#
|
20
23
|
# @example join on hash
|
21
24
|
# join({ color: 'red', size: '10' }, with: ' --') do |k, v|
|
22
25
|
# "#{k} #{v}"
|
23
|
-
# end # => '
|
26
|
+
# end # => '--color red --size 10'
|
24
27
|
def join(args, with:)
|
25
28
|
args = Array(args)
|
26
29
|
args = args.map { |arg| yield arg } if block_given?
|
27
30
|
|
28
|
-
"#{with}#{args.join(with)}"
|
31
|
+
"#{with}#{args.join(with)}".strip
|
29
32
|
end
|
30
33
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
def build_options(config, keys, prefix: '--', sep: ' ')
|
35
|
+
config.slice(*keys).map do |opt, val|
|
36
|
+
"#{prefix}#{opt}#{sep}#{val}"
|
37
|
+
end.join(' ').strip
|
38
|
+
end
|
39
|
+
|
40
|
+
def build_flags(config, keys, prefix: '--')
|
41
|
+
config.slice(*keys).map do |flag, val|
|
42
|
+
"#{prefix}#{flag}" if val
|
43
|
+
end.join(' ').strip
|
37
44
|
end
|
38
45
|
|
39
46
|
def run_jar(jar)
|
40
|
-
|
47
|
+
"java -Djava.awt.headless=true -jar #{jar}"
|
41
48
|
end
|
42
49
|
|
43
50
|
def vendor_path(file = '')
|
@@ -51,9 +58,9 @@ module LiquidDiagrams
|
|
51
58
|
options = {}
|
52
59
|
|
53
60
|
input.scan(INLINE_OPTIONS_REGEXP) do |key, value|
|
54
|
-
value.delete!('"') if value
|
61
|
+
value.delete!('"') if value.include?('"')
|
55
62
|
|
56
|
-
options[key.
|
63
|
+
options[key.to_s] = value
|
57
64
|
end
|
58
65
|
|
59
66
|
options
|
@@ -5,7 +5,7 @@ require 'spec_helper'
|
|
5
5
|
RSpec.describe LiquidDiagrams::BasicBlock do
|
6
6
|
let(:block) do
|
7
7
|
TestBlock.parse(
|
8
|
-
'test', '', Liquid::Tokenizer.new('{% endtest %}'),
|
8
|
+
'test', 'markup', Liquid::Tokenizer.new('{% endtest %}'),
|
9
9
|
Liquid::ParseContext.new
|
10
10
|
)
|
11
11
|
end
|
@@ -22,83 +22,46 @@ RSpec.describe LiquidDiagrams::BasicBlock do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
describe '#render' do
|
25
|
-
it 'call #
|
26
|
-
allow(block).to receive(:
|
25
|
+
it 'call #render_content to render' do
|
26
|
+
allow(block).to receive(:read_config)
|
27
|
+
allow(block).to receive(:render_content).and_return 'svg ok!'
|
27
28
|
|
28
|
-
expect(block.render(Liquid::Context.new)).to eq '
|
29
|
+
expect(block.render(Liquid::Context.new)).to eq 'svg ok!'
|
30
|
+
expect(block).to have_received(:read_config)
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
32
|
-
describe '#
|
33
|
-
it 'call
|
34
|
-
|
34
|
+
describe '#render_content' do
|
35
|
+
it 'call handle error if error rescued' do
|
36
|
+
error = LiquidDiagrams::Errors::BasicError.new
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
it 'rescue and handle the error' do
|
40
|
-
allow(block).to receive(:render_without_rescue).and_raise(
|
41
|
-
LiquidDiagrams::Errors::BasicError.new
|
42
|
-
)
|
43
|
-
allow(block).to receive(:handle_error).and_return 'ok'
|
44
|
-
|
45
|
-
expect(block.render(Liquid::Context.new)).to eq 'ok'
|
46
|
-
end
|
47
|
-
end
|
38
|
+
allow(TestRenderer).to receive(:render).and_raise(error)
|
39
|
+
allow(block).to receive(:handle_error)
|
48
40
|
|
49
|
-
|
50
|
-
it 'render with renderer' do
|
51
|
-
allow(TestRenderer).to receive(:render).and_return 'success'
|
41
|
+
block.render_content
|
52
42
|
|
53
|
-
expect(block.
|
43
|
+
expect(block).to have_received(:handle_error).with(error)
|
54
44
|
end
|
55
45
|
end
|
56
46
|
|
57
|
-
describe '#
|
58
|
-
it '
|
59
|
-
|
60
|
-
allow(block).to receive(:inline_options).and_return({ k1: :v2, k2: :v2 })
|
61
|
-
|
62
|
-
expect(block.config).to eq({ k1: :v2, k2: :v2 })
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe '#template_options' do
|
67
|
-
let(:key) { LiquidDiagrams::OPTIONS_KEY }
|
68
|
-
|
69
|
-
it 'accept symbol key' do
|
70
|
-
allow(block).to receive(:parse_context).and_return({ key => { test: '1' } })
|
71
|
-
|
72
|
-
expect(block.template_options).to eq '1'
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'accept string key' do
|
76
|
-
allow(block).to receive(:parse_context).and_return({ key => { 'test' => '2' } })
|
77
|
-
|
78
|
-
expect(block.template_options).to eq '2'
|
47
|
+
describe '#handle_error' do
|
48
|
+
it 'simply return the error' do
|
49
|
+
expect(block.handle_error('some error')).to eq 'some error'
|
79
50
|
end
|
80
51
|
end
|
81
52
|
|
82
|
-
describe '#
|
83
|
-
let(:markup) { 'a1=v1 a2="v2" a3="k3 v3"' }
|
84
|
-
|
85
|
-
let :block do
|
86
|
-
TestBlock.parse(
|
87
|
-
'test', markup, Liquid::Tokenizer.new('{% endtest %}'),
|
88
|
-
Liquid::ParseContext.new
|
89
|
-
)
|
90
|
-
end
|
91
|
-
|
53
|
+
describe '#read_config' do
|
92
54
|
before do
|
93
|
-
allow(LiquidDiagrams
|
55
|
+
allow(LiquidDiagrams).to receive(
|
56
|
+
:configuration
|
57
|
+
).and_return({ k1: :v1, k2: :v2 })
|
58
|
+
allow(LiquidDiagrams::Utils).to receive(
|
59
|
+
:parse_inline_options
|
60
|
+
).and_return({ k1: :v3 })
|
94
61
|
end
|
95
62
|
|
96
|
-
it '
|
97
|
-
block.
|
98
|
-
|
99
|
-
expect(LiquidDiagrams::Utils).to have_received(
|
100
|
-
:parse_inline_options
|
101
|
-
).with(markup)
|
63
|
+
it 'merge options with inline options' do
|
64
|
+
expect(block.read_config).to eq({ k1: :v3, k2: :v2 })
|
102
65
|
end
|
103
66
|
end
|
104
67
|
end
|
@@ -3,26 +3,48 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
RSpec.describe LiquidDiagrams::BasicRenderer do
|
6
|
-
|
7
|
-
let(:renderer) { Object.new }
|
6
|
+
let(:renderer) { described_class.new('') }
|
8
7
|
|
8
|
+
describe '.render' do
|
9
9
|
before do
|
10
10
|
allow(renderer).to receive(:render).and_return 'yay'
|
11
11
|
allow(described_class).to receive(:new).and_return(renderer)
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'create an instance and render with it' do
|
15
|
-
expect(described_class.render('content', { k:
|
15
|
+
expect(described_class.render('content', { k: :v })).to eq 'yay'
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
describe '#render' do
|
20
|
-
let(:renderer) { described_class.new('') }
|
21
|
-
|
22
20
|
it 'raise not implemented error' do
|
23
21
|
expect { renderer.render }.to raise_error(
|
24
22
|
LiquidDiagrams::Errors::NotImplementedError
|
25
23
|
)
|
26
24
|
end
|
27
25
|
end
|
26
|
+
|
27
|
+
describe '#build_command' do
|
28
|
+
it 'combine #executable and #arguments' do
|
29
|
+
allow(renderer).to receive(:executable).and_return 'cmd'
|
30
|
+
allow(renderer).to receive(:arguments).and_return '--flag --opt val'
|
31
|
+
|
32
|
+
expect(renderer.build_command).to eq 'cmd --flag --opt val'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#executable' do
|
37
|
+
it 'provide a default executable' do
|
38
|
+
expect(renderer.executable).to eq 'basic'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#arguments' do
|
43
|
+
it 'combine options and flags' do
|
44
|
+
allow(LiquidDiagrams::Utils).to receive(:build_flags).and_return '--flag'
|
45
|
+
allow(LiquidDiagrams::Utils).to receive(:build_options).and_return '--opt val'
|
46
|
+
|
47
|
+
expect(renderer.arguments).to eq '--flag --opt val'
|
48
|
+
end
|
49
|
+
end
|
28
50
|
end
|
File without changes
|
@@ -2,26 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
RSpec.describe LiquidDiagrams::Renderers::BitfieldRenderer do
|
6
|
-
subject(:renderer) { described_class.new('content') }
|
7
|
-
|
5
|
+
RSpec.describe LiquidDiagrams::Renderers::BitfieldRenderer, :renderers do
|
8
6
|
describe '#render' do
|
9
7
|
include_examples 'render with tempfile', described_class
|
10
8
|
end
|
11
|
-
|
12
|
-
describe '#build_command' do
|
13
|
-
context 'when config is empty' do
|
14
|
-
it { expect(renderer.build_command).to match 'bitfield' }
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'when config is not empty' do
|
18
|
-
before do
|
19
|
-
renderer.instance_variable_set(:@config, { 'fontsize' => 10 })
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'build command with config' do
|
23
|
-
expect(renderer.build_command).to match '--fontsize 10'
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
9
|
end
|
@@ -2,42 +2,14 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
RSpec.describe LiquidDiagrams::Renderers::BlockdiagRenderer do
|
5
|
+
RSpec.describe LiquidDiagrams::Renderers::BlockdiagRenderer, :renderers do
|
6
6
|
subject(:renderer) { described_class.new('content') }
|
7
7
|
|
8
8
|
describe '#render' do
|
9
9
|
include_examples 'render with tempfile', described_class
|
10
10
|
end
|
11
11
|
|
12
|
-
describe '#
|
13
|
-
|
14
|
-
it { expect(renderer.build_command).to eq 'blockdiag -T svg --nodoctype' }
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'when config is not empty' do
|
18
|
-
before do
|
19
|
-
renderer.instance_variable_set(:@config, { 'size' => 10 })
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'build command with config' do
|
23
|
-
expect(renderer.build_command).to match '--size=10'
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
context 'when switch is true' do
|
28
|
-
it 'build command' do
|
29
|
-
renderer.instance_variable_set(:@config, { 'antialias' => true })
|
30
|
-
|
31
|
-
expect(renderer.build_command).to match '--antialias'
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context 'when switch is false' do
|
36
|
-
it 'build command' do
|
37
|
-
renderer.instance_variable_set(:@config, { 'antialias' => false })
|
38
|
-
|
39
|
-
expect(renderer.build_command).not_to match '--antialias'
|
40
|
-
end
|
41
|
-
end
|
12
|
+
describe '#executable' do
|
13
|
+
it { expect(renderer.executable).to eq 'blockdiag -Tsvg --nodoctype' }
|
42
14
|
end
|
43
15
|
end
|