liquid-diagrams 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +15 -16
  3. data/features/diagrams/bitfield.feature +48 -0
  4. data/features/diagrams/blockdiag.feature +19 -0
  5. data/features/diagrams/erd.feature +19 -0
  6. data/features/diagrams/graphviz.feature +19 -0
  7. data/features/diagrams/mermaid.feature +20 -0
  8. data/features/diagrams/netlistsvg.feature +27 -0
  9. data/features/diagrams/nomnoml.feature +19 -0
  10. data/features/diagrams/plantuml.feature +17 -0
  11. data/features/diagrams/smcat.feature +23 -0
  12. data/features/diagrams/svgbob.feature +19 -0
  13. data/features/diagrams/syntrax.feature +20 -0
  14. data/features/diagrams/vega.feature +23 -0
  15. data/features/diagrams/vegalite.feature +23 -0
  16. data/features/diagrams/wavedrom.feature +24 -0
  17. data/features/step_definitions/diagrams.rb +21 -0
  18. data/features/support/env.rb +15 -0
  19. data/lib/liquid_diagrams.rb +9 -17
  20. data/lib/liquid_diagrams/basic_block.rb +12 -42
  21. data/lib/liquid_diagrams/basic_renderer.rb +43 -1
  22. data/lib/liquid_diagrams/blocks.rb +14 -0
  23. data/lib/liquid_diagrams/renderers.rb +10 -0
  24. data/lib/liquid_diagrams/renderers/bitfield_renderer.rb +9 -13
  25. data/lib/liquid_diagrams/renderers/blockdiag_renderer.rb +7 -15
  26. data/lib/liquid_diagrams/renderers/erd_renderer.rb +7 -15
  27. data/lib/liquid_diagrams/renderers/graphviz_renderer.rb +10 -10
  28. data/lib/liquid_diagrams/renderers/mermaid_renderer.rb +2 -9
  29. data/lib/liquid_diagrams/renderers/netlistsvg_renderer.rb +13 -0
  30. data/lib/liquid_diagrams/renderers/nomnoml_renderer.rb +0 -4
  31. data/lib/liquid_diagrams/renderers/plantuml_renderer.rb +5 -5
  32. data/lib/liquid_diagrams/renderers/smcat_renderer.rb +0 -10
  33. data/lib/liquid_diagrams/renderers/svgbob_renderer.rb +0 -10
  34. data/lib/liquid_diagrams/renderers/syntrax_renderer.rb +0 -10
  35. data/lib/liquid_diagrams/renderers/vega_renderer.rb +9 -23
  36. data/lib/liquid_diagrams/renderers/vegalite_renderer.rb +19 -0
  37. data/lib/liquid_diagrams/renderers/wavedrom_renderer.rb +1 -1
  38. data/lib/liquid_diagrams/rendering.rb +8 -6
  39. data/lib/liquid_diagrams/utils.rb +21 -14
  40. data/lib/liquid_diagrams/version.rb +1 -1
  41. data/spec/liquid_diagrams/basic_block_spec.rb +25 -62
  42. data/spec/liquid_diagrams/basic_renderer_spec.rb +27 -5
  43. data/spec/liquid_diagrams/blocks_spec.rb +0 -0
  44. data/spec/liquid_diagrams/renderers/bitfield_renderer_spec.rb +1 -19
  45. data/spec/liquid_diagrams/renderers/blockdiag_renderer_spec.rb +3 -31
  46. data/spec/liquid_diagrams/renderers/erd_renderer_spec.rb +3 -37
  47. data/spec/liquid_diagrams/renderers/graphviz_renderer_spec.rb +11 -21
  48. data/spec/liquid_diagrams/renderers/mermaid_renderer_spec.rb +3 -19
  49. data/spec/liquid_diagrams/renderers/netlistsvg_renderer_spec.rb +9 -0
  50. data/spec/liquid_diagrams/renderers/nomnoml_renderer_spec.rb +1 -7
  51. data/spec/liquid_diagrams/renderers/plantuml_renderer_spec.rb +4 -14
  52. data/spec/liquid_diagrams/renderers/smcat_renderer_spec.rb +1 -25
  53. data/spec/liquid_diagrams/renderers/svgbob_renderer_spec.rb +1 -23
  54. data/spec/liquid_diagrams/renderers/syntrax_renderer_spec.rb +1 -23
  55. data/spec/liquid_diagrams/renderers/vega_renderer_spec.rb +3 -21
  56. data/spec/liquid_diagrams/renderers/vegalite_renderer_spec.rb +15 -0
  57. data/spec/liquid_diagrams/renderers/wavedrom_renderer_spec.rb +3 -3
  58. data/spec/liquid_diagrams/utils_spec.rb +20 -8
  59. data/spec/liquid_diagrams_spec.rb +52 -0
  60. data/spec/spec_helper.rb +5 -0
  61. data/spec/support/shared_examples.rb +8 -19
  62. data/vendor/{mermaid_puppeteer_config.json → puppeteer.json} +0 -0
  63. 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
- %i[Vega Vegalite].each do |diagram|
6
- renderer = Class.new(BasicRenderer) do
7
- const_set :OPTIONS, %w[
8
- scale
9
- ].freeze
5
+ class VegaRenderer < BasicRenderer
6
+ OPTIONS = %w[
7
+ scale
8
+ ].freeze
10
9
 
11
- define_method :render do
12
- if diagram.downcase == 'vegalite'
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
- const_set("#{diagram}Renderer", renderer)
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,7 +9,7 @@ module LiquidDiagrams
9
9
  end
10
10
  end
11
11
 
12
- def build_command
12
+ def executable
13
13
  'wavedrom-cli'
14
14
  end
15
15
  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
- extra = yield input.path, output.path
22
- command = "#{command} #{extra}"
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
- raise Errors::RenderingFailedError, <<~MSG
40
- #{command}: #{stderr.empty? ? stdout : stderr}
41
- MSG
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') # => ' -Ipath'
18
+ # join('path', with: ' -I') # => '-Ipath'
16
19
  #
17
20
  # @example join on array
18
- # join(['path1', 'path2'], with: ' -I') # => ' -Ipath1 -Ipath2'
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 # => ' --color red --size 10'
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
- # Merge from the hash with only those keys exists
32
- #
33
- # @example
34
- # merge({ k1: 1, k2: 2}, { k1: 11, k3: 13}) # => { k1: 11, k2: 2 }
35
- def merge(first, second)
36
- first.merge(second.slice(*first.keys))
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
- +"java -Djava.awt.headless=true -jar #{jar}"
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&.include?('"')
61
+ value.delete!('"') if value.include?('"')
55
62
 
56
- options[key.to_sym] = value
63
+ options[key.to_s] = value
57
64
  end
58
65
 
59
66
  options
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LiquidDiagrams
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
@@ -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 #render_with_rescue' do
26
- allow(block).to receive(:render_with_rescue).and_return 'success'
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 'success'
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 '#render_with_rescue' do
33
- it 'call #render_without_rescue' do
34
- allow(block).to receive(:render_without_rescue).and_return 'success'
34
+ describe '#render_content' do
35
+ it 'call handle error if error rescued' do
36
+ error = LiquidDiagrams::Errors::BasicError.new
35
37
 
36
- expect(block.render(Liquid::Context.new)).to eq 'success'
37
- end
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
- describe '#render_without_rescue' do
50
- it 'render with renderer' do
51
- allow(TestRenderer).to receive(:render).and_return 'success'
41
+ block.render_content
52
42
 
53
- expect(block.render(Liquid::Context.new)).to eq 'success'
43
+ expect(block).to have_received(:handle_error).with(error)
54
44
  end
55
45
  end
56
46
 
57
- describe '#config' do
58
- it 'merge template options with inline options' do
59
- allow(block).to receive(:template_options).and_return({ k1: :v1 })
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 '#inline_options' do
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::Utils).to receive :parse_inline_options
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 'call Utils.parse_inline_options' do
97
- block.inline_options
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
- describe '.render' do
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: 'v' })).to eq 'yay'
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 '#build_command' do
13
- context 'when config is empty' do
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