rails-erd: Error: in routesplines, cannot find NORMAL edge

Howdy!

I’m trying to generate a graph in Rails 4. I can generate erd.dot, but I cannot generate a PDF. This is the output I get from rake erd

Loading application environment...
Loading code in search of Active Record models...
Generating Entity-Relationship Diagram for 24 models...
Warning: Ignoring invalid association :resource on Role (polymorphic interface Resource does not exist)
Warning: Ignoring invalid association :service on InvoiceItem (polymorphic interface Service does not exist)
rake aborted!
Saving diagram failed!
Graphviz produced errors. Verify it has support for filetype=pdf, or use filetype=dot.
Original error: Error: in routesplines, cannot find NORMAL edge
/Users/apfritts/.rvm/gems/ruby-2.0.0-p353@registrar/gems/rails-erd-1.1.0/lib/rails_erd/diagram/graphviz.rb:195:in `rescue in block in <class:Graphviz>'
/Users/apfritts/.rvm/gems/ruby-2.0.0-p353@registrar/gems/rails-erd-1.1.0/lib/rails_erd/diagram/graphviz.rb:190:in `block in <class:Graphviz>'
/Users/apfritts/.rvm/gems/ruby-2.0.0-p353@registrar/gems/rails-erd-1.1.0/lib/rails_erd/diagram.rb:142:in `instance_eval'
/Users/apfritts/.rvm/gems/ruby-2.0.0-p353@registrar/gems/rails-erd-1.1.0/lib/rails_erd/diagram.rb:142:in `save'
/Users/apfritts/.rvm/gems/ruby-2.0.0-p353@registrar/gems/rails-erd-1.1.0/lib/rails_erd/diagram.rb:120:in `create'
/Users/apfritts/.rvm/gems/ruby-2.0.0-p353@registrar/gems/rails-erd-1.1.0/lib/rails_erd/diagram.rb:74:in `create'
/Users/apfritts/.rvm/gems/ruby-2.0.0-p353@registrar/gems/rails-erd-1.1.0/lib/rails_erd/tasks.rake:41:in `block (2 levels) in <top (required)>'
/Users/apfritts/.rvm/gems/ruby-2.0.0-p353@registrar/bin/ruby_executable_hooks:15:in `eval'
/Users/apfritts/.rvm/gems/ruby-2.0.0-p353@registrar/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => erd => erd:generate
(See full trace by running task with --trace)

The CoreText performance warning is repeated many times, but I’m not concerned about it (or maybe I should be?).

This is what I get when I run it verbosely dot -Tpdf -oERD.pdf -v erd.dot:

dot - graphviz version 2.36.0 (20140111.2315)
Using render: quartz:quartz
Using device: pdf:quartz:quartz
libdir = "/usr/local/Cellar/graphviz/2.36.0/lib/graphviz"
Activated plugin library: libgvplugin_dot_layout.6.dylib
Using layout: dot:dot_layout
The plugin configuration file:
    /usr/local/Cellar/graphviz/2.36.0/lib/graphviz/config6
        was successfully loaded.
    render  :  dot fig map pic pov ps quartz svg tk vml xdot
    layout  :  circo dot fdp neato nop nop1 nop2 osage patchwork sfdp twopi
    textlayout  :  textlayout
    device  :  bmp canon cgimage cmap cmapx cmapx_np dot eps exr fig gif gv icns ico imap imap_np ismap jp2 jpe jpeg jpg pct pdf pic pict plain plain-ext png pov ps ps2 psd sgi svg svgz tga tif tiff tk vml vmlz xdot xdot1.2 xdot1.4
    loadimage   :  (lib) bmp eps gif jpe jpeg jpg pdf png ps svg

[ LOTS OF PERFORMANCE WARNINGS ]

network simplex:  1 nodes 0 edges maxiter=2147483647 balance=1
network simplex: 1 nodes 0 edges 0 iter 0.00 sec
network simplex:  16 nodes 24 edges maxiter=2147483647 balance=1
network simplex: 16 nodes 24 edges 0 iter 0.00 sec
network simplex:  1 nodes 0 edges maxiter=2147483647 balance=1
network simplex: 1 nodes 0 edges 0 iter 0.00 sec
network simplex:  1 nodes 0 edges maxiter=2147483647 balance=1
network simplex: 1 nodes 0 edges 0 iter 0.00 sec
network simplex:  1 nodes 0 edges maxiter=2147483647 balance=1
network simplex: 1 nodes 0 edges 0 iter 0.00 sec
network simplex:  1 nodes 0 edges maxiter=2147483647 balance=1
network simplex: 1 nodes 0 edges 0 iter 0.00 sec
Maxrank = 4, minrank = 0
mincross: pass 0 iter 0 trying 0 cur_cross 0 best_cross 0
mincross: pass 0 iter 0 trying 0 cur_cross 7 best_cross 7
mincross: pass 0 iter 1 trying 1 cur_cross 9 best_cross 7
mincross: pass 0 iter 2 trying 0 cur_cross 4 best_cross 4
mincross: pass 0 iter 3 trying 0 cur_cross 3 best_cross 3
mincross: pass 1 iter 0 trying 0 cur_cross 6 best_cross 3
mincross: pass 1 iter 1 trying 1 cur_cross 8 best_cross 3
mincross: pass 1 iter 2 trying 2 cur_cross 11 best_cross 3
mincross: pass 1 iter 3 trying 3 cur_cross 8 best_cross 3
mincross: pass 2 iter 0 trying 0 cur_cross 3 best_cross 3
mincross: pass 2 iter 1 trying 1 cur_cross 6 best_cross 3
mincross: pass 2 iter 2 trying 2 cur_cross 3 best_cross 3
mincross: pass 2 iter 3 trying 3 cur_cross 3 best_cross 3
mincross: pass 2 iter 4 trying 4 cur_cross 3 best_cross 3
mincross: pass 2 iter 5 trying 5 cur_cross 10 best_cross 3
mincross: pass 2 iter 6 trying 6 cur_cross 4 best_cross 3
mincross: pass 2 iter 7 trying 7 cur_cross 4 best_cross 3
mincross: pass 2 iter 8 trying 8 cur_cross 3 best_cross 3
mincross: pass 0 iter 0 trying 0 cur_cross 0 best_cross 0
mincross: pass 0 iter 0 trying 0 cur_cross 0 best_cross 0
mincross: pass 0 iter 0 trying 0 cur_cross 0 best_cross 0
mincross: pass 0 iter 0 trying 0 cur_cross 0 best_cross 0
merge2: graph BaseApp, rank 1 has only 3 < 11 nodes
merge2: graph BaseApp, rank 2 has only 10 < 14 nodes
mincross BaseApp: 3 crossings, 0.00 secs.
network simplex:  64 nodes 93 edges maxiter=2147483647 balance=2
network simplex: 64 nodes 93 edges 11 iter 0.00 sec
Error: in routesplines, cannot find NORMAL edge
Segmentation fault: 11

Any help is appreciated!

About this issue

  • Original URL
  • State: closed
  • Created 10 years ago
  • Reactions: 1
  • Comments: 23

Commits related to this issue

Most upvoted comments

I had a look at the generated DOT. My graphviz version (2.36.0 (20140111.2315)) seg faults when there are multiple edges (=associations) between the same two nodes (=models). This may occur for example when a model tracks the modifying user with creator, updater and deleter associations.

Because rails-erd does not include any labels on the edges, I did not see the point in having multiple edges and removed them with the following patch:

require 'rails_erd/domain/relationship'

module RailsERD
  class Domain
    class Relationship
      class << self
        private

        def association_identity(association)
          Set[association_owner(association), association_target(association)]
        end
      end
    end
  end
end

This made the seg faults disappear, diagrams are generated fine again.

The patch fixed it for me too but now I get this error whenever I run my specs:

/Users/simon/.rubies/ruby-2.2.1/bin/ruby -I/Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/lib:/Users/simon/.gem/ruby/2.2.1/gems/rspec-support-3.1.2/lib /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
/Users/simon/.gem/ruby/2.2.1/gems/rails-erd-1.3.1/lib/rails_erd/domain/relationship/cardinality.rb:5:in `<class:Cardinality>': uninitialized constant RailsERD::Domain::Relationship::Cardinality::Inspectable (NameError)
    from /Users/simon/.gem/ruby/2.2.1/gems/rails-erd-1.3.1/lib/rails_erd/domain/relationship/cardinality.rb:4:in `<class:Relationship>'
    from /Users/simon/.gem/ruby/2.2.1/gems/rails-erd-1.3.1/lib/rails_erd/domain/relationship/cardinality.rb:3:in `<class:Domain>'
    from /Users/simon/.gem/ruby/2.2.1/gems/rails-erd-1.3.1/lib/rails_erd/domain/relationship/cardinality.rb:2:in `<module:RailsERD>'
    from /Users/simon/.gem/ruby/2.2.1/gems/rails-erd-1.3.1/lib/rails_erd/domain/relationship/cardinality.rb:1:in `<top (required)>'
    from /Users/simon/.gem/ruby/2.2.1/gems/rails-erd-1.3.1/lib/rails_erd/domain/relationship.rb:3:in `<top (required)>'
    from /Users/simon/Code/cahootify/config/initializers/rails_erd.rb:1:in `<top (required)>'
    from /Users/simon/.gem/ruby/2.2.1/gems/railties-4.2.1/lib/rails/engine.rb:652:in `block in load_config_initializer'
    from /Users/simon/.gem/ruby/2.2.1/gems/activesupport-4.2.1/lib/active_support/notifications.rb:166:in `instrument'
    from /Users/simon/.gem/ruby/2.2.1/gems/railties-4.2.1/lib/rails/engine.rb:651:in `load_config_initializer'
    from /Users/simon/.gem/ruby/2.2.1/gems/railties-4.2.1/lib/rails/engine.rb:616:in `block (2 levels) in <class:Engine>'
    from /Users/simon/.gem/ruby/2.2.1/gems/railties-4.2.1/lib/rails/engine.rb:615:in `each'
    from /Users/simon/.gem/ruby/2.2.1/gems/railties-4.2.1/lib/rails/engine.rb:615:in `block in <class:Engine>'
    from /Users/simon/.gem/ruby/2.2.1/gems/railties-4.2.1/lib/rails/initializable.rb:30:in `instance_exec'
    from /Users/simon/.gem/ruby/2.2.1/gems/railties-4.2.1/lib/rails/initializable.rb:30:in `run'
    from /Users/simon/.gem/ruby/2.2.1/gems/railties-4.2.1/lib/rails/initializable.rb:55:in `block in run_initializers'
    from /Users/simon/.rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:226:in `block in tsort_each'
    from /Users/simon/.rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:348:in `block (2 levels) in each_strongly_connected_component'
    from /Users/simon/.rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:420:in `block (2 levels) in each_strongly_connected_component_from'
    from /Users/simon/.rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:429:in `each_strongly_connected_component_from'
    from /Users/simon/.rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:419:in `block in each_strongly_connected_component_from'
    from /Users/simon/.gem/ruby/2.2.1/gems/railties-4.2.1/lib/rails/initializable.rb:44:in `each'
    from /Users/simon/.gem/ruby/2.2.1/gems/railties-4.2.1/lib/rails/initializable.rb:44:in `tsort_each_child'
    from /Users/simon/.rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:413:in `call'
    from /Users/simon/.rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:413:in `each_strongly_connected_component_from'
    from /Users/simon/.rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:347:in `block in each_strongly_connected_component'
    from /Users/simon/.rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:345:in `each'
    from /Users/simon/.rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:345:in `call'
    from /Users/simon/.rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:345:in `each_strongly_connected_component'
    from /Users/simon/.rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:224:in `tsort_each'
    from /Users/simon/.rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:203:in `tsort_each'
    from /Users/simon/.gem/ruby/2.2.1/gems/railties-4.2.1/lib/rails/initializable.rb:54:in `run_initializers'
    from /Users/simon/.gem/ruby/2.2.1/gems/railties-4.2.1/lib/rails/application.rb:352:in `initialize!'
    from /Users/simon/Code/cahootify/config/environment.rb:5:in `<top (required)>'
    from /Users/simon/Code/cahootify/spec/rails_helper.rb:4:in `require'
    from /Users/simon/Code/cahootify/spec/rails_helper.rb:4:in `<top (required)>'
    from /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1072:in `require'
    from /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1072:in `block in requires='
    from /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1072:in `each'
    from /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1072:in `requires='
    from /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/lib/rspec/core/configuration_options.rb:103:in `block in process_options_into'
    from /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/lib/rspec/core/configuration_options.rb:102:in `each'
    from /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/lib/rspec/core/configuration_options.rb:102:in `process_options_into'
    from /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/lib/rspec/core/configuration_options.rb:22:in `configure'
    from /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:95:in `setup'
    from /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:84:in `run'
    from /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:69:in `run'
    from /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:37:in `invoke'
    from /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/exe/rspec:4:in `<main>'
/Users/simon/.rubies/ruby-2.2.1/bin/ruby -I/Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/lib:/Users/simon/.gem/ruby/2.2.1/gems/rspec-support-3.1.2/lib /Users/simon/.gem/ruby/2.2.1/gems/rspec-core-3.1.7/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb failed

I’ve fixed it by scoping it to the development environment but it’s pretty clunky:

if Rails.env.development?
  require 'rails_erd/domain/relationship'

  module RailsERD
    class Domain
      class Relationship
        class << self
          private

          def association_identity(association)
            Set[association_owner(association), association_target(association)]
          end
        end
      end
    end
  end
end

If anyone has a better solution I’d love to hear it 😃

Should be fixed by #296 and in the v.1.6.0 release

@sstarr’s fix worked for me - ruby 2.4.2 rails 5.1.4 ubuntu 18.04

rails-erd 1.5.2 dot 2.38.0

Still needed to apply this patch to make it work for User with invoice_address and correspondence_address as two links to the same model Address