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.
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