/plantuml_builder

Gem to build text diagrams with PlantUML

Primary LanguageRubyMIT LicenseMIT

PlantumlBuilder

Gem Version Build Status

Gem to convet PlantUML diagrams using plantuml.com or local PlantUML server

Installation

Add this line to your application's Gemfile:

gem 'plantuml_builder'

And then execute:

$ bundle

Or install it yourself as:

$ gem install plantuml_builder

Usage

PlantUML allows to describe UML (and some other) diagrams in it's own text format.

For example, sequence diagram:

@startuml
  actor User
  
  User -> MyService : perform
  activate MyService
    return true
  deactivate MyService
@enduml

The diagram above will be rendered to:

PlantUML web service expects compression of such diagrams into it's own format. The diagram above should be converted to

~1DfJK70eBaaiAYdDpU5I08B4v9By8eNGujGYC1S8G6m5NJi5tyhWrAAopEHK1Ik5WjIYjFoYN9YEpBB4abI40gZEejIIqg8yXPAYKeX8IYfMfGwfUIaWsm5R-2hl

Using plantuml_builder you can fetch rendered diagrams from specified server.

Diagrams could be fetched as SVG, PNG, and TXT (ASCII-art) format.

Using as standalone app

To build one diagram in SVG format from plantuml.com run:

$ plantuml_build png source_file.wsd destination_file.svg

If you need build whole directory, specify -R flag before source. To build it into PNG diagrams:

$ plantuml_build png -R src dest

If you want to use local server as endpoint, specify it with --endpoint:

$ plantuml_build txt source_file.wsd destination_file.txt --endpoint=http://localhost:8080

Using as library

First, receive diagram text (from WSD or other file format).

wsd = <<-WSD
    @startuml
      actor User
      
      User -> MyService : perform
      activate MyService
        return true
      deactivate MyService
    @enduml
WSD

SVG

Fetch diagram as SVG:

PlantumlBuilder::Formats::SVG.new(wsd).load
=> "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" contentScriptType=\"application/ecmascript\" contentStyleType=\"text/css\" height=\"251px\" preserveAspectRatio=\"none\" style=\"width:152px;height:251px;\" version=\"1.1\" viewBox=\"0 0 152 251\" width=\"152px\" zoomAndPan=\"magnify\">\n<defs>\n<filter height=\"300%\" id=\"fz1m93rvif4fb\" width=\"300%\" x=\"-1\" y=\"-1\">\n<feGaussianBlur result=\"blurOut\" stdDeviation=\"2.0\"/>\n<feColorMatrix in=\"blurOut\" result=\"blurOut2\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0\"/>\n<feOffset dx=\"4.0\" dy=\"4.0\" in=\"blurOut2\" result=\"blurOut3\"/>\n<feBlend in=\"SourceGraphic\" in2=\"blurOut3\" mode=\"normal\"/>\n</filter>\n</defs>\n<g>\n<rect fill=\"#FFFFFF\" filter=\"url(#fz1m93rvif4fb)\" height=\"29.1328\" style=\"stroke: #A80036; stroke-width: 1.0;\" width=\"10\" x=\"97\" y=\"117.4297\"/>\n<line style=\"stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;\" x1=\"27\" x2=\"27\" y1=\"86.2969\" y2=\"164.5625\"/>\n<line style=\"stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 5.0,5.0;\" x1=\"101.5\" x2=\"101.5\" y1=\"86.2969\" y2=\"164.5625\"/>\n<text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacingAndGlyphs\" textLength=\"32\" x=\"8\" y=\"82.9951\">\nUser</text>\n<ellipse cx=\"27\" cy=\"13\" fill=\"#FEFECE\" filter=\"url(#fz1m93rvif4fb)\" rx=\"8\" ry=\"8\" style=\"stroke: #A80036; stroke-width: 2.0;\"/>\n<path d=\"M27,21 L27,48 M14,29 L40,29 M27,48 L14,63 M27,48 L40,63 \" fill=\"none\" filter=\"url(#fz1m93rvif4fb)\" style=\"stroke: #A80036; stroke-width: 2.0;\"/>\n<text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacingAndGlyphs\" textLength=\"32\" x=\"8\" y=\"176.5576\">\nUser</text>\n<ellipse cx=\"27\" cy=\"189.8594\" fill=\"#FEFECE\" filter=\"url(#fz1m93rvif4fb)\" rx=\"8\" ry=\"8\" style=\"stroke: #A80036; stroke-width: 2.0;\"/>\n<path d=\"M27,197.8594 L27,224.8594 M14,205.8594 L40,205.8594 M27,224.8594 L14,239.8594 M27,224.8594 L40,239.8594 \" fill=\"none\" filter=\"url(#fz1m93rvif4fb)\" style=\"stroke: #A80036; stroke-width: 2.0;\"/>\n<rect fill=\"#FEFECE\" filter=\"url(#fz1m93rvif4fb)\" height=\"30.2969\" style=\"stroke: #A80036; stroke-width: 1.5;\" width=\"83\" x=\"58.5\" y=\"51\"/>\n<text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacingAndGlyphs\" textLength=\"69\" x=\"65.5\" y=\"70.9951\">\nMyService</text>\n<rect fill=\"#FEFECE\" filter=\"url(#fz1m93rvif4fb)\" height=\"30.2969\" style=\"stroke: #A80036; stroke-width: 1.5;\" width=\"83\" x=\"58.5\" y=\"163.5625\"/>\n<text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"14\" lengthAdjust=\"spacingAndGlyphs\" textLength=\"69\" x=\"65.5\" y=\"183.5576\">\nMyService</text>\n<rect fill=\"#FFFFFF\" filter=\"url(#fz1m93rvif4fb)\" height=\"29.1328\" style=\"stroke: #A80036; stroke-width: 1.0;\" width=\"10\" x=\"97\" y=\"117.4297\"/>\n<polygon fill=\"#A80036\" points=\"85,113.4297,95,117.4297,85,121.4297,89,117.4297\" style=\"stroke: #A80036; stroke-width: 1.0;\"/>\n<line style=\"stroke: #A80036; stroke-width: 1.0;\" x1=\"27\" x2=\"91\" y1=\"117.4297\" y2=\"117.4297\"/>\n<text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"13\" lengthAdjust=\"spacingAndGlyphs\" textLength=\"51\" x=\"34\" y=\"112.3638\">\nperform</text>\n<polygon fill=\"#A80036\" points=\"38,142.5625,28,146.5625,38,150.5625,34,146.5625\" style=\"stroke: #A80036; stroke-width: 1.0;\"/>\n<line style=\"stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;\" x1=\"32\" x2=\"101\" y1=\"146.5625\" y2=\"146.5625\"/>\n<text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"13\" lengthAdjust=\"spacingAndGlyphs\" textLength=\"26\" x=\"44\" y=\"141.4966\">\ntrue</text>\n\n</g>\n</svg"

PlantUML renders SVG as single line of XML code. It is not comfortable because it is impossible to store it in version control system. So, plantuml_builder fixes it. Also, XML comment with description would be removed.

PNG

Fetch diagram as PNG:

PlantumlBuilder::Formats::PNG.new(wsd).load
=> # diagram in PNG

TXT (ASCII-art)

PlantumlBuilder::Formats::TXT.new(wsd).load

Result could be outputed as:

       ┌─┐                      
       ║"│                      
       └┬┘                      
       ┌┼┐                      
        │            ┌─────────┐
       ┌┴┐           │MyService│
      User           └────┬────┘
       │     perform     ┌┴┐    
       │ ───────────────>│ │    
       │                 │ │    
       │      true       │ │    
       │ <─ ─ ─ ─ ─ ─ ─ ─│ │    
      User           ┌───└┬┘───┐
       ┌─┐           │MyService│
       ║"│           └─────────┘
       └┬┘                      
       ┌┼┐                      
        │                       
       ┌┴┐

Using your own server

You can also use PlantUML on your local computer, installed, or using docker image. You need to specify endpoint:

PlantumlBuilder::Formats::TXT.new(wsd, 'http://localhost:8080').load

Default endpoint is: http://www.plantuml.com/plantuml.

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/svernidub/plantuml_builder.

License

The gem is available as open source under the terms of the MIT License.