railroady 1.5.3 → 1.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d565533ee7d711876ffa48fa7fb5eb5d97f3fb28
4
- data.tar.gz: a1414c8accaa8c52e40b85aaaf115ee12899104b
2
+ SHA256:
3
+ metadata.gz: e60172ea20b64daead4e5a040e50c92e411a0ea0824d4bb6836978d16ce7cf82
4
+ data.tar.gz: d1fb29719573215458dfb3cacf01d0d96a5b98a479accd0688ddd4cab231f5ca
5
5
  SHA512:
6
- metadata.gz: 47b51fc682b68870f96deace84cfb46a3e3cd4c206fd6cdb26067d50073dc8fb99e02391af130e3593905ff586bbddd695dc2e66d17ac43defe4b9927fbf1519
7
- data.tar.gz: f8addb9684490a38fa1378f576c5853ac393982e91e5a73348aecffa1bd30cfc8956c4848f1f24687465ce73106e663d73374acaaede6c247d6611dafbf2e813
6
+ metadata.gz: 458f52b7f8f07b1abae06ee141a4a098f67e8882b1087383d4cfee6d642d2f766cb2937037ee39e87a1c68aadce9321c9c208470423fa8982d17b8bbd0a15f48
7
+ data.tar.gz: 9d8e33334f7727d5f7049446416328f91f2221d3d8ee261300e44c7507174b4610bab7c447d3511c773bc962dcc73661711493a069a2132bbbd67e06783417f0
data/.travis.yml CHANGED
@@ -1,3 +1,3 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.4.1
3
+ - 3.0.2
data/AUTHORS.rdoc CHANGED
@@ -16,6 +16,6 @@ http://railroady.prestonlee.com
16
16
  * Tim Harvey
17
17
  * Atli Christiansen
18
18
  * John Bintz (http://www.coswellproductions.com/)
19
-
19
+ * Stefan Wrobel
20
20
 
21
21
  And of course, many thanks to the many patch submitters and testers that make this possible!
data/Gemfile CHANGED
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
  gemspec
data/Gemfile.lock CHANGED
@@ -1,26 +1,28 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- railroady (1.5.3)
4
+ railroady (1.6.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- activesupport (5.1.1)
9
+ activesupport (6.1.4)
10
10
  concurrent-ruby (~> 1.0, >= 1.0.2)
11
- i18n (~> 0.7)
12
- minitest (~> 5.1)
13
- tzinfo (~> 1.1)
14
- concurrent-ruby (1.0.5)
15
- i18n (0.8.4)
16
- minitest (5.10.2)
17
- rake (12.0.0)
18
- thread_safe (0.3.6)
19
- tzinfo (1.2.3)
20
- thread_safe (~> 0.1)
11
+ i18n (>= 1.6, < 2)
12
+ minitest (>= 5.1)
13
+ tzinfo (~> 2.0)
14
+ zeitwerk (~> 2.3)
15
+ concurrent-ruby (1.1.9)
16
+ i18n (1.8.10)
17
+ concurrent-ruby (~> 1.0)
18
+ minitest (5.14.4)
19
+ rake (13.0.6)
20
+ tzinfo (2.0.4)
21
+ concurrent-ruby (~> 1.0)
22
+ zeitwerk (2.4.2)
21
23
 
22
24
  PLATFORMS
23
- ruby
25
+ x86_64-darwin-20
24
26
 
25
27
  DEPENDENCIES
26
28
  activesupport
@@ -30,4 +32,4 @@ DEPENDENCIES
30
32
  rake
31
33
 
32
34
  BUNDLED WITH
33
- 1.15.1
35
+ 2.2.22
data/bin/railroady CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  # RailRoady - RoR diagrams generator
4
5
  # http://github.com/preston/railroady
@@ -25,7 +26,8 @@ APP_HUMAN_NAME = 'RailRoady'
25
26
  APP_VERSION = RailRoady::VERSION
26
27
  COPYRIGHT = 'Copyright (C) 2007-2008 Javier Smaldone, 2009 Peter Hoeg, 2010-2015 Preston Lee'
27
28
 
28
- options = OptionsStruct.new(app_name: APP_NAME, app_human_name: APP_HUMAN_NAME, app_version: APP_VERSION, copyright: COPYRIGHT)
29
+ options = OptionsStruct.new(app_name: APP_NAME, app_human_name: APP_HUMAN_NAME, app_version: APP_VERSION,
30
+ copyright: COPYRIGHT)
29
31
 
30
32
  options.parse ARGV
31
33
 
@@ -44,7 +46,7 @@ when 'controllers'
44
46
  when 'aasm'
45
47
  diagram = AasmDiagram.new(options)
46
48
  else
47
- STDERR.print "#{APP_HUMAN_NAME} v#{APP_VERSION}\n" \
49
+ $stderr.print "#{APP_HUMAN_NAME} v#{APP_VERSION}\n" \
48
50
  "Error: You must supply a command\n" \
49
51
  " (try #{APP_NAME} -h)\n\n"
50
52
  exit 1
data/lib/railroady.rb CHANGED
@@ -1,5 +1,13 @@
1
- %w(version options_struct models_diagram controllers_diagram aasm_diagram).each { |f| require "railroady/#{f}" }
1
+ # frozen_string_literal: true
2
2
 
3
+ require 'railroady/version'
4
+ require 'railroady/options_struct'
5
+ require 'railroady/models_diagram'
6
+ require 'railroady/controllers_diagram'
7
+ require 'railroady/aasm_diagram'
8
+
9
+ # This is the RailRoady module
10
+ # TODO: documentation
3
11
  module RailRoady
4
12
  require 'railroady/railtie' if defined?(Rails)
5
13
  end
@@ -1,10 +1,4 @@
1
- # RailRoady - RoR diagrams generator
2
- # http://railroad.rubyforge.org
3
- #
4
- # Copyright 2007-2008 - Javier Smaldone (http://www.smaldone.com.ar)
5
- # See COPYING for more details
6
-
7
- # AASM code provided by Ana Nelson (http://ananelson.com/)
1
+ # frozen_string_literal: true
8
2
 
9
3
  require 'railroady/app_diagram'
10
4
 
@@ -20,18 +14,17 @@ class AasmDiagram < AppDiagram
20
14
 
21
15
  # Process model files
22
16
  def generate
23
- STDERR.print "Generating AASM diagram\n" if @options.verbose
17
+ $stderr.print "Generating AASM diagram\n" if @options.verbose
24
18
  get_files.each do |f|
25
19
  process_class extract_class_name(f).constantize
26
20
  end
27
21
  end
28
22
 
29
23
  def get_files(prefix = '')
30
- files = !@options.specify.empty? ? Dir.glob(@options.specify) : Dir.glob(prefix + 'app/models/**/*.rb')
24
+ files = !@options.specify.empty? ? Dir.glob(@options.specify) : Dir.glob("#{prefix}app/models/**/*.rb")
31
25
  files += Dir.glob('vendor/plugins/**/app/models/*.rb') if @options.plugins_models
32
- files -= Dir.glob(prefix + 'app/models/concerns/**/*.rb') unless @options.include_concerns
33
- files -= Dir.glob(@options.exclude)
34
- files
26
+ files - Dir.glob("#{prefix}app/models/concerns/**/*.rb") unless @options.include_concerns
27
+ Dir.glob(@options.exclude)
35
28
  end
36
29
 
37
30
  private
@@ -45,49 +38,25 @@ class AasmDiagram < AppDiagram
45
38
  enable_stdout
46
39
  print_error 'model classes'
47
40
  raise
48
- end # load_classes
41
+ end
49
42
 
50
43
  # Process a model class
51
44
  def process_class(current_class)
52
- STDERR.print "\tProcessing #{current_class}\n" if @options.verbose
45
+ $stderr.print "\tProcessing #{current_class}\n" if @options.verbose
53
46
 
54
- # Only interested in acts_as_state_machine models.
55
- process_acts_as_state_machine_class(current_class) if current_class.respond_to?(:states)
47
+ # Only interested in aasm models.
56
48
  process_aasm_class(current_class) if current_class.respond_to?(:aasm_states) || current_class.respond_to?(:aasm)
57
- end # process_class
58
-
59
- def process_acts_as_state_machine_class(current_class)
60
- node_attribs = []
61
- node_type = 'aasm'
62
-
63
- STDERR.print "\t\tprocessing as acts_as_state_machine\n" if @options.verbose
64
- current_class.aasm.states.each do |state_name|
65
- node_shape = (current_class.aasm.initial_state == state_name) ? ', peripheries = 2' : ''
66
- node_attribs << "#{current_class.name.downcase}_#{state_name} [label=#{state_name} #{node_shape}];"
67
- end
68
- @graph.add_node [node_type, current_class.name, node_attribs]
69
-
70
- current_class.aasm.events.each do |event|
71
- event_name = event.name
72
- event.transitions.each do |transition|
73
- @graph.add_edge [
74
- 'event',
75
- current_class.name.downcase + '_' + transition.from.to_s,
76
- current_class.name.downcase + '_' + transition.to.to_s,
77
- event_name.to_s
78
- ]
79
- end
80
- end
81
49
  end
82
50
 
83
51
  def process_aasm_class(current_class)
84
52
  node_attribs = []
85
53
  node_type = 'aasm'
54
+ diagram_friendly_class_name = current_class.name.downcase.gsub(/[^a-z0-9\-_]+/i, '_')
86
55
 
87
- STDERR.print "\t\tprocessing as aasm\n" if @options.verbose
56
+ $stderr.print "\t\tprocessing as aasm\n" if @options.verbose
88
57
  current_class.aasm.states.each do |state|
89
- node_shape = (current_class.aasm.initial_state == state.name) ? ', peripheries = 2' : ''
90
- node_attribs << "#{current_class.name.downcase}_#{state.name} [label=#{state.name} #{node_shape}];"
58
+ node_shape = current_class.aasm.initial_state == state.name ? ', peripheries = 2' : ''
59
+ node_attribs << "#{diagram_friendly_class_name}_#{state.name} [label=#{state.name} #{node_shape}];"
91
60
  end
92
61
  @graph.add_node [node_type, current_class.name, node_attribs]
93
62
 
@@ -95,11 +64,11 @@ class AasmDiagram < AppDiagram
95
64
  event.transitions.each do |transition|
96
65
  @graph.add_edge [
97
66
  'event',
98
- current_class.name.downcase + '_' + transition.from.to_s,
99
- current_class.name.downcase + '_' + transition.to.to_s,
67
+ "#{diagram_friendly_class_name}_#{transition.from}",
68
+ "#{diagram_friendly_class_name}_#{transition.to}",
100
69
  event.name.to_s
101
70
  ]
102
71
  end
103
72
  end
104
73
  end
105
- end # class AasmDiagram
74
+ end
@@ -1,9 +1,3 @@
1
- # RailRoady - RoR diagrams generator
2
- # http://railroad.rubyforge.org
3
- #
4
- # Copyright 2007-2008 - Javier Smaldone (http://www.smaldone.com.ar)
5
- # See COPYING for more details
6
-
7
1
  require 'railroady/diagram_graph'
8
2
 
9
3
  # Root class for RailRoady diagrams
@@ -18,25 +12,25 @@ class AppDiagram
18
12
  # Print diagram
19
13
  def print
20
14
  if @options.output
21
- old_stdout = STDOUT.dup
15
+ old_stdout = $stdout.dup
22
16
  begin
23
- STDOUT.reopen(@options.output)
17
+ $stdout.reopen(@options.output)
24
18
  rescue
25
- STDERR.print "Error: Cannot write diagram to #{@options.output}\n\n"
19
+ $stderr.print "Error: Cannot write diagram to #{@options.output}\n\n"
26
20
  exit 2
27
21
  end
28
22
  end
29
23
 
30
24
  if @options.xmi
31
- STDERR.print "Generating XMI diagram\n" if @options.verbose
32
- STDOUT.print @graph.to_xmi
25
+ $stderr.print "Generating XMI diagram\n" if @options.verbose
26
+ $stdout.print @graph.to_xmi
33
27
  else
34
- STDERR.print "Generating DOT graph\n" if @options.verbose
35
- STDOUT.print @graph.to_dot
28
+ $stderr.print "Generating DOT graph\n" if @options.verbose
29
+ $stdout.print @graph.to_dot
36
30
  end
37
31
 
38
- STDOUT.reopen(old_stdout) if @options.output
39
- end # print
32
+ $stdout.reopen(old_stdout) if @options.output
33
+ end
40
34
 
41
35
  def process
42
36
  load_environment
@@ -61,7 +55,7 @@ class AppDiagram
61
55
 
62
56
  # Load Rails application's environment
63
57
  def load_environment
64
- STDERR.print "Loading application environment\n" if @options.verbose
58
+ $stderr.print "Loading application environment\n" if @options.verbose
65
59
  begin
66
60
  disable_stdout
67
61
  l = File.join(Dir.pwd.to_s, @options.config_file)
@@ -72,24 +66,24 @@ class AppDiagram
72
66
  print_error 'application environment'
73
67
  raise
74
68
  end
75
- STDERR.print "Loading application classes as we go\n" if @options.verbose
69
+ $stderr.print "Loading application classes as we go\n" if @options.verbose
76
70
  end
77
71
 
78
72
  # Prevents Rails application from writing to STDOUT
79
73
  def disable_stdout
80
- @old_stdout = STDOUT.dup
74
+ @old_stdout = $stdout.dup
81
75
  # via Tomas Matousek, http://www.ruby-forum.com/topic/205887
82
- STDOUT.reopen(::RUBY_PLATFORM =~ /djgpp|(cyg|ms|bcc)win|mingw/ ? 'NUL' : '/dev/null')
76
+ $stdout.reopen(::RUBY_PLATFORM =~ /djgpp|(cyg|ms|bcc)win|mingw/ ? 'NUL' : '/dev/null')
83
77
  end
84
78
 
85
79
  # Restore STDOUT
86
80
  def enable_stdout
87
- STDOUT.reopen(@old_stdout)
81
+ $stdout.reopen(@old_stdout)
88
82
  end
89
83
 
90
84
  # Print error when loading Rails application
91
85
  def print_error(type)
92
- STDERR.print "Error loading #{type}.\n (Are you running " \
86
+ $stderr.print "Error loading #{type}.\n (Are you running " \
93
87
  "#{@options.app_name} on the application's root directory?)\n\n"
94
88
  end
95
89
 
@@ -100,4 +94,4 @@ class AppDiagram
100
94
  # File.basename(filename).chomp(".rb").camelize
101
95
  filename.split('/')[2..-1].collect(&:camelize).join('::').chomp('.rb')
102
96
  end
103
- end # class AppDiagram
97
+ end
@@ -1,9 +1,3 @@
1
- # RailRoady - RoR diagrams generator
2
- # http://railroad.rubyforge.org
3
- #
4
- # Copyright 2007-2008 - Javier Smaldone (http://www.smaldone.com.ar)
5
- # See COPYING for more details
6
-
7
1
  require 'railroady/app_diagram'
8
2
 
9
3
  # RailRoady controllers diagram
@@ -20,7 +14,7 @@ class ControllersDiagram < AppDiagram
20
14
 
21
15
  # Process controller files
22
16
  def generate
23
- STDERR.print "Generating controllers diagram\n" if @options.verbose
17
+ $stderr.print "Generating controllers diagram\n" if @options.verbose
24
18
  files = get_files
25
19
  # only add APP_CONTROLLER if it isn't already included from the glob above
26
20
  files << APP_CONTROLLER unless files.include? APP_CONTROLLER
@@ -31,10 +25,10 @@ class ControllersDiagram < AppDiagram
31
25
  begin
32
26
  process_class class_name.constantize
33
27
  rescue Exception
34
- STDERR.print "Warning: exception #{$ERROR_INFO} raised while trying to load controller class #{f}"
28
+ $stderr.print "Warning: exception #{$ERROR_INFO} raised while trying to load controller class #{f}"
35
29
  end
36
30
  end
37
- end # generate
31
+ end
38
32
 
39
33
  def get_files(prefix = '')
40
34
  files = !@options.specify.empty? ? Dir.glob(@options.specify) : Dir.glob(prefix << 'app/controllers/**/*_controller.rb')
@@ -48,7 +42,7 @@ class ControllersDiagram < AppDiagram
48
42
  end
49
43
 
50
44
  def extract_class_name(filename)
51
- filename.match(/.*\/controllers\/(.*).rb$/)[1].camelize
45
+ filename.match(%r{.*/controllers/(.*).rb$})[1].camelize
52
46
  end
53
47
 
54
48
  private
@@ -64,11 +58,11 @@ class ControllersDiagram < AppDiagram
64
58
  enable_stdout
65
59
  print_error 'controller classes'
66
60
  raise
67
- end # load_classes
61
+ end
68
62
 
69
63
  # Proccess a controller class
70
64
  def process_class(current_class)
71
- STDERR.print "\tProcessing #{current_class}\n" if @options.verbose
65
+ $stderr.print "\tProcessing #{current_class}\n" if @options.verbose
72
66
 
73
67
  if @options.brief
74
68
  @graph.add_node ['controller-brief', current_class.name]
@@ -77,15 +71,21 @@ class ControllersDiagram < AppDiagram
77
71
  node_attribs = { public: [],
78
72
  protected: [],
79
73
  private: [] }
80
- current_class.public_instance_methods(false).sort.each do |m|
81
- node_attribs[:public] << m
82
- end unless @options.hide_public
83
- current_class.protected_instance_methods(false).sort.each do |m|
84
- node_attribs[:protected] << m
85
- end unless @options.hide_protected
86
- current_class.private_instance_methods(false).sort.each do |m|
87
- node_attribs[:private] << m
88
- end unless @options.hide_private
74
+ unless @options.hide_public
75
+ current_class.public_instance_methods(false).sort.each do |m|
76
+ node_attribs[:public] << m
77
+ end
78
+ end
79
+ unless @options.hide_protected
80
+ current_class.protected_instance_methods(false).sort.each do |m|
81
+ node_attribs[:protected] << m
82
+ end
83
+ end
84
+ unless @options.hide_private
85
+ current_class.private_instance_methods(false).sort.each do |m|
86
+ node_attribs[:private] << m
87
+ end
88
+ end
89
89
  @graph.add_node ['controller', current_class.name, node_attribs]
90
90
  elsif @options.modules && current_class.is_a?(Module)
91
91
  @graph.add_node ['module', current_class.name]
@@ -95,9 +95,9 @@ class ControllersDiagram < AppDiagram
95
95
  if @options.inheritance && (transitive_subclasses_of(ApplicationController).include? current_class)
96
96
  @graph.add_edge ['is-a', current_class.superclass.name, current_class.name]
97
97
  end
98
- end # process_class
98
+ end
99
99
 
100
100
  def transitive_subclasses_of(klass)
101
101
  klass.subclasses | klass.subclasses.map { |subklass| transitive_subclasses_of(subklass) }.flatten
102
102
  end
103
- end # class ControllersDiagram
103
+ end
@@ -1,11 +1,8 @@
1
- # RailRoady - RoR diagrams generator
2
- # http://railroad.rubyforge.org
3
- #
4
- # Copyright 2007-2008 - Javier Smaldone (http://www.smaldone.com.ar)
5
- # See COPYING for more details
1
+ # frozen_string_literal: true
6
2
 
7
- # RailRoady diagram structure
8
3
  class DiagramGraph
4
+ attr_writer :diagram_type, :show_label, :alphabetize
5
+
9
6
  def initialize
10
7
  @diagram_type = ''
11
8
  @show_label = false
@@ -22,12 +19,6 @@ class DiagramGraph
22
19
  @edges << edge
23
20
  end
24
21
 
25
- attr_writer :diagram_type
26
-
27
- attr_writer :show_label
28
-
29
- attr_writer :alphabetize
30
-
31
22
  # Generate DOT graph
32
23
  def to_dot
33
24
  dot_header +
@@ -38,7 +29,7 @@ class DiagramGraph
38
29
 
39
30
  # Generate XMI diagram (not yet implemented)
40
31
  def to_xmi
41
- STDERR.print "Sorry. XMI output not yet implemented.\n\n"
32
+ $stderr.print "Sorry. XMI output not yet implemented.\n\n"
42
33
  ''
43
34
  end
44
35
 
@@ -62,8 +53,12 @@ class DiagramGraph
62
53
  "\t_diagram_info [shape=\"plaintext\", " \
63
54
  "label=\"#{@diagram_type} diagram\\l" \
64
55
  "Date: #{Time.now.strftime '%b %d %Y - %H:%M'}\\l" +
65
- (defined?(ActiveRecord::Migrator) ? 'Migration version: ' \
66
- "#{Rails.logger.silence { ActiveRecord::Migrator.current_version } }\\l" : '') +
56
+ (if defined?(ActiveRecord::Migrator)
57
+ 'Migration version: ' \
58
+ "#{Rails.logger.silence { ActiveRecord::Migrator.current_version }}\\l"
59
+ else
60
+ ''
61
+ end) +
67
62
  "Generated by #{APP_HUMAN_NAME} #{APP_VERSION}\\l" + 'http://railroady.prestonlee.com' \
68
63
  "\\l\", fontsize=13]\n"
69
64
  end
@@ -71,35 +66,34 @@ class DiagramGraph
71
66
  # Build a DOT graph node
72
67
  def dot_node(type, name, attributes = nil, custom_options = '')
73
68
  case type
74
- when 'model'
75
- options = 'shape=Mrecord, label="{' + name + '|'
76
- options += attributes.sort_by { |s| @alphabetize ? s : nil }.join('\l')
77
- options += '\l}"'
78
- when 'model-brief'
79
- options = ''
80
- when 'class'
81
- options = 'shape=record, label="{' + name + '|}"'
82
- when 'class-brief'
83
- options = 'shape=box'
84
- when 'controller'
85
- options = 'shape=Mrecord, label="{' + name + '|'
86
- public_methods = attributes[:public].sort_by { |s| @alphabetize ? s : nil }.join('\l')
87
- protected_methods = attributes[:protected].sort_by { |s| @alphabetize ? s : nil }.join('\l')
88
- private_methods = attributes[:private].sort_by { |s| @alphabetize ? s : nil }.join('\l')
89
- options += public_methods + '\l|' + protected_methods + '\l|' +
90
- private_methods + '\l'
91
- options += '}"'
92
- when 'controller-brief'
93
- options = ''
94
- when 'module'
95
- options = 'shape=box, style=dotted, label="' + name + '"'
96
- when 'aasm'
97
- # Return subgraph format
98
- return "subgraph cluster_#{name.downcase} {\n\tlabel = #{quote(name)}\n\t#{attributes.join("\n ")}}"
99
- end # case
100
- options = [options, custom_options].compact.reject{|o| o.empty?}.join(', ')
101
- return "\t#{quote(name)} [#{options}]\n"
102
- end # dot_node
69
+ when 'model'
70
+ options = "shape=Mrecord, label=\"{#{name}|"
71
+ options += attributes.sort_by { |s| @alphabetize ? s : nil }.join('\l')
72
+ options += '\l}"'
73
+ when 'model-brief'
74
+ options = ''
75
+ when 'class'
76
+ options = "shape=record, label=\"{#{name}|}\""
77
+ when 'class-brief'
78
+ options = 'shape=box'
79
+ when 'controller'
80
+ options = "shape=Mrecord, label=\"{#{name}|"
81
+ public_methods = attributes[:public].sort_by { |s| @alphabetize ? s : nil }.join('\l')
82
+ protected_methods = attributes[:protected].sort_by { |s| @alphabetize ? s : nil }.join('\l')
83
+ private_methods = attributes[:private].sort_by { |s| @alphabetize ? s : nil }.join('\l')
84
+ options += "#{public_methods}\\l|#{protected_methods}\\l|#{private_methods}\\l"
85
+ options += '}"'
86
+ when 'controller-brief'
87
+ options = ''
88
+ when 'module'
89
+ options = "shape=box, style=dotted, label=\"#{name}\""
90
+ when 'aasm'
91
+ # Return subgraph format
92
+ return "subgraph cluster_#{name.downcase.gsub(/[^a-z0-9\-_]+/i, '_')} {\n\tlabel = #{quote(name)}\n\t#{attributes.join("\n ")}}"
93
+ end
94
+ options = [options, custom_options].compact.reject(&:empty?).join(', ')
95
+ "\t#{quote(name)} [#{options}]\n"
96
+ end
103
97
 
104
98
  # Build a DOT graph edge
105
99
  def dot_edge(type, from, to, name = '')
@@ -107,25 +101,25 @@ class DiagramGraph
107
101
  edge_color = '"#%02X%02X%02X"' % [rand(255), rand(255), rand(255)]
108
102
  suffix = ", dir=both color=#{edge_color}"
109
103
  case type
110
- when 'one-one'
111
- options += 'arrowtail=odot, arrowhead=dot' + suffix
112
- when 'one-many'
113
- options += 'arrowtail=odot, arrowhead=crow' + suffix
114
- when 'many-many'
115
- options += "arrowtail=crow, arrowhead=crow" + suffix
116
- when 'belongs-to'
117
- # following http://guides.rubyonrails.org/association_basics.html#the-belongs-to-association
118
- options += "arrowtail=none, arrowhead=normal" + suffix
119
- when 'is-a'
120
- options += 'arrowhead="none", arrowtail="onormal"'
121
- when 'event'
122
- options += 'fontsize=10'
104
+ when 'one-one'
105
+ options += "arrowtail=odot, arrowhead=dot#{suffix}"
106
+ when 'one-many'
107
+ options += "arrowtail=odot, arrowhead=crow#{suffix}"
108
+ when 'many-many'
109
+ options += "arrowtail=crow, arrowhead=crow#{suffix}"
110
+ when 'belongs-to'
111
+ # following http://guides.rubyonrails.org/association_basics.html#the-belongs-to-association
112
+ options += "arrowtail=none, arrowhead=normal#{suffix}"
113
+ when 'is-a'
114
+ options += 'arrowhead="none", arrowtail="onormal"'
115
+ when 'event'
116
+ options += 'fontsize=10'
123
117
  end
124
118
  "\t#{quote(from)} -> #{quote(to)} [#{options}]\n"
125
- end # dot_edge
119
+ end
126
120
 
127
121
  # Quotes a class name
128
122
  def quote(name)
129
- '"' + name.to_s + '"'
123
+ "\"#{name}\""
130
124
  end
131
- end # class DiagramGraph
125
+ end
@@ -1,9 +1,3 @@
1
- # RailRoady - RoR diagrams generator
2
- # http://railroad.rubyforge.org
3
- #
4
- # Copyright 2007-2008 - Javier Smaldone (http://www.smaldone.com.ar)
5
- # See COPYING for more details
6
-
7
1
  require 'railroady/app_diagram'
8
2
 
9
3
  # RailRoady models diagram
@@ -17,20 +11,20 @@ class ModelsDiagram < AppDiagram
17
11
 
18
12
  # Process model files
19
13
  def generate
20
- STDERR.puts 'Generating models diagram' if @options.verbose
14
+ warn 'Generating models diagram' if @options.verbose
21
15
  get_files.each do |f|
22
16
  begin
23
17
  process_class extract_class_name(f).constantize
24
- rescue Exception
25
- STDERR.puts "Warning: exception #{$ERROR_INFO} raised while trying to load model class #{f}"
18
+ rescue NoMethodError
19
+ warn "Warning: exception #{$ERROR_INFO} raised while trying to load model class #{f}"
26
20
  end
27
21
  end
28
22
  end
29
23
 
30
24
  def get_files(prefix = '')
31
- files = !@options.specify.empty? ? Dir.glob(@options.specify) : Dir.glob(prefix + 'app/models/**/*.rb')
25
+ files = !@options.specify.empty? ? Dir.glob(@options.specify) : Dir.glob("#{prefix}app/models/**/*.rb")
32
26
  files += Dir.glob('vendor/plugins/**/app/models/*.rb') if @options.plugins_models
33
- files -= Dir.glob(prefix + 'app/models/concerns/**/*.rb') unless @options.include_concerns
27
+ files -= Dir.glob("#{prefix}app/models/concerns/**/*.rb") unless @options.include_concerns
34
28
  files += engine_files if @options.engine_models
35
29
  files -= Dir.glob(@options.exclude)
36
30
  files
@@ -41,17 +35,19 @@ class ModelsDiagram < AppDiagram
41
35
  end
42
36
 
43
37
  def extract_class_name(filename)
44
- filename_was, class_name = filename, nil
38
+ filename_was = filename
39
+ class_name = nil
45
40
 
46
41
  filename = "app/models/#{filename.split('app/models')[1]}"
47
42
 
48
43
  while filename.split('/').length > 2
49
44
  begin
50
- class_name = filename.match(/.*\/models\/(.*).rb$/)[1].camelize
45
+ class_name = filename.match(%r{.*/models/(.*).rb$})[1]
46
+ class_name = class_name.camelize
47
+ # class_name = class_name.from 2 if class_name.start_with? '::'
51
48
  class_name.constantize
52
-
53
49
  break
54
- rescue Exception
50
+ rescue NoMethodError
55
51
  class_name = nil
56
52
  filename_end = filename.split('/')[2..-1]
57
53
  filename_end.shift
@@ -60,15 +56,16 @@ class ModelsDiagram < AppDiagram
60
56
  end
61
57
 
62
58
  if class_name.nil?
63
- filename_was.match(/.*\/models\/(.*).rb$/)[1].camelize
59
+ filename_was.match(%r{.*/models/(.*).rb$})[1].camelize
64
60
  else
61
+ warn class_name
65
62
  class_name
66
63
  end
67
64
  end
68
65
 
69
66
  # Process a model class
70
67
  def process_class(current_class)
71
- STDERR.puts "Processing #{current_class}" if @options.verbose
68
+ warn "Processing #{current_class}" if @options.verbose
72
69
 
73
70
  generated =
74
71
  if defined?(CouchRest::Model::Base) && current_class.new.is_a?(CouchRest::Model::Base)
@@ -85,13 +82,14 @@ class ModelsDiagram < AppDiagram
85
82
  process_basic_module(current_class)
86
83
  end
87
84
 
85
+ warn generated
88
86
  if @options.inheritance && generated && include_inheritance?(current_class)
89
87
  @graph.add_edge ['is-a', current_class.superclass.name, current_class.name]
90
88
  end
91
- end # process_class
89
+ end
92
90
 
93
91
  def include_inheritance?(current_class)
94
- STDERR.puts current_class.superclass if @options.verbose
92
+ warn current_class.superclass if @options.verbose
95
93
  (defined?(ActiveRecord::Base) ? current_class.superclass != ActiveRecord::Base : true) &&
96
94
  (defined?(CouchRest::Model::Base) ? current_class.superclass != CouchRest::Model::Base : true) &&
97
95
  (current_class.superclass != Object)
@@ -121,16 +119,16 @@ class ModelsDiagram < AppDiagram
121
119
  if @options.hide_magic
122
120
  # From patch #13351
123
121
  # http://wiki.rubyonrails.org/rails/pages/MagicFieldNames
124
- magic_fields = %w(created_at created_on updated_at updated_on lock_version type id position parent_id lft rgt quote template)
125
- magic_fields << current_class.table_name + '_count' if current_class.respond_to? 'table_name'
126
- content_columns = current_class.content_columns.select { |c| !magic_fields.include? c.name }
122
+ magic_fields = %w[created_at created_on updated_at updated_on lock_version type id position parent_id lft rgt quote template]
123
+ magic_fields << "#{current_class.table_name}_count" if current_class.respond_to? 'table_name'
124
+ content_columns = current_class.content_columns.reject { |c| magic_fields.include? c.name }
127
125
  else
128
126
  content_columns = current_class.columns
129
127
  end
130
128
 
131
129
  content_columns.each do |a|
132
130
  content_column = a.name
133
- content_column += ' :' + a.sql_type.to_s unless @options.hide_types
131
+ content_column += " :#{a.sql_type.to_s}" unless @options.hide_types
134
132
  node_attribs << content_column
135
133
  end
136
134
  end
@@ -141,7 +139,7 @@ class ModelsDiagram < AppDiagram
141
139
  if @options.inheritance && ! @options.transitive
142
140
  superclass_associations = current_class.superclass.reflect_on_all_associations
143
141
 
144
- associations = associations.select { |a| !superclass_associations.include? a }
142
+ associations = associations.reject { |a| superclass_associations.include? a }
145
143
  # This doesn't works!
146
144
  # associations -= current_class.superclass.reflect_on_all_associations
147
145
  end
@@ -167,13 +165,13 @@ class ModelsDiagram < AppDiagram
167
165
  # From patch #13351
168
166
  # http://wiki.rubyonrails.org/rails/pages/MagicFieldNames
169
167
  magic_fields =
170
- %w(created_at created_on updated_at updated_on lock_version _type _id position parent_id lft rgt quote template)
171
- props = props.select { |c| !magic_fields.include?(c.name.to_s) }
168
+ %w[created_at created_on updated_at updated_on lock_version _type _id position parent_id lft rgt quote template]
169
+ props = props.reject { |c| magic_fields.include?(c.name.to_s) }
172
170
  end
173
171
 
174
172
  props.each do |a|
175
173
  prop = a.name.to_s
176
- prop += ' :' + a.class.name.split('::').last unless @options.hide_types
174
+ prop += " :#{a.class.name.split('::').last}" unless @options.hide_types
177
175
  node_attribs << prop
178
176
  end
179
177
  end
@@ -205,8 +203,8 @@ class ModelsDiagram < AppDiagram
205
203
  if @options.hide_magic
206
204
  # From patch #13351
207
205
  # http://wiki.rubyonrails.org/rails/pages/MagicFieldNames
208
- magic_fields = %w(created_at created_on updated_at updated_on lock_version _type _id position parent_id lft rgt quote template)
209
- content_columns = content_columns.select { |c| !magic_fields.include?(c.name) }
206
+ magic_fields = %w[created_at created_on updated_at updated_on lock_version _type _id position parent_id lft rgt quote template]
207
+ content_columns = content_columns.reject { |c| magic_fields.include?(c.name) }
210
208
  end
211
209
 
212
210
  content_columns.each do |a|
@@ -251,8 +249,8 @@ class ModelsDiagram < AppDiagram
251
249
  content_columns = current_class.properties
252
250
 
253
251
  if @options.hide_magic
254
- magic_fields = %w(created_at updated_at type _id _rev)
255
- content_columns = content_columns.select { |c| !magic_fields.include?(c.name) }
252
+ magic_fields = %w[created_at updated_at type _id _rev]
253
+ content_columns = content_columns.reject { |c| magic_fields.include?(c.name) }
256
254
  end
257
255
 
258
256
  content_columns.each do |a|
@@ -269,11 +267,10 @@ class ModelsDiagram < AppDiagram
269
267
 
270
268
  # Process a model association
271
269
  def process_association(class_name, assoc)
272
- STDERR.puts "- Processing model association #{assoc.name}" if @options.verbose
273
-
270
+ warn "- Processing model association #{assoc.name}" if @options.verbose
274
271
  # Skip "belongs_to" associations
275
- macro = assoc.macro.to_s
276
- return if %w(belongs_to referenced_in).include?(macro) && !@options.show_belongs_to
272
+ macro = assoc.methods.to_s
273
+ return if %w[belongs_to referenced_in].include?(macro) && !@options.show_belongs_to
277
274
 
278
275
  # Skip "through" associations
279
276
  through = assoc.options.include?(:through)
@@ -299,29 +296,30 @@ class ModelsDiagram < AppDiagram
299
296
  if class_name.include?('::') && !assoc_class_name.include?('::')
300
297
  assoc_class_name = class_name.split('::')[0..-2].push(assoc_class_name).join('::')
301
298
  end
302
- assoc_class_name.gsub!(/^::/, '')
299
+ assoc_class_name = assoc_class_name.gsub(/^::/, '')
303
300
 
304
- if %w(has_one references_one embeds_one).include?(macro)
301
+ if %w[has_one references_one embeds_one].include?(macro)
305
302
  assoc_type = 'one-one'
306
303
  elsif macro == 'has_many' && (!assoc.options[:through]) ||
307
- %w(references_many embeds_many).include?(macro)
304
+ %w[references_many embeds_many].include?(macro)
308
305
  assoc_type = 'one-many'
309
306
  elsif macro == 'belongs_to'
310
307
  assoc_type = 'belongs-to'
311
308
  else # habtm or has_many, :through
312
309
  # Add FAKE associations too in order to understand mistakes
313
310
  return if @habtm.include? [assoc_class_name, class_name, assoc_name]
311
+
314
312
  assoc_type = 'many-many'
315
313
  @habtm << [class_name, assoc_class_name, assoc_name]
316
314
  end
317
315
  # from patch #12384
318
316
  # @graph.add_edge [assoc_type, class_name, assoc.class_name, assoc_name]
319
317
  @graph.add_edge [assoc_type, class_name, assoc_class_name, assoc_name]
320
- end # process_association
318
+ end
321
319
 
322
320
  # Process a DataMapper relationship
323
321
  def process_datamapper_relationship(class_name, relation)
324
- STDERR.puts "- Processing DataMapper model relationship #{relation.name}" if @options.verbose
322
+ warn "- Processing DataMapper model relationship #{relation.name}" if @options.verbose
325
323
 
326
324
  # Skip "belongs_to" relationships
327
325
  dm_type = relation.class.to_s.split('::')[-2]
@@ -354,4 +352,4 @@ class ModelsDiagram < AppDiagram
354
352
 
355
353
  @graph.add_edge [rel_type, class_name, assoc_class_name, assoc_name]
356
354
  end
357
- end # class ModelsDiagram
355
+ end
@@ -1,8 +1,4 @@
1
- # RailRoady - RoR diagrams generator
2
- # http://railroad.rubyforge.org
3
- #
4
- # Copyright 2007-2008 - Javier Smaldone (http://www.smaldone.com.ar)
5
- # See COPYING for more details
1
+ # frozen_string_literal: true
6
2
 
7
3
  require 'ostruct'
8
4
 
@@ -40,7 +36,7 @@ class OptionsStruct < OpenStruct
40
36
  config_file: 'config/environment',
41
37
  app_name: 'railroady', app_human_name: 'Railroady', app_version: '', copyright: '' }
42
38
  super(init_options.merge(args))
43
- end # initialize
39
+ end
44
40
 
45
41
  def parse(args)
46
42
  @opt_parser = OptionParser.new do |opts|
@@ -138,11 +134,11 @@ class OptionsStruct < OpenStruct
138
134
  opts.separator ''
139
135
  opts.separator 'Other options:'
140
136
  opts.on('-h', '--help', 'Show this message') do
141
- STDOUT.print "#{opts}\n"
137
+ $stdout.print "#{opts}\n"
142
138
  exit
143
139
  end
144
140
  opts.on('--version', 'Show version and copyright') do
145
- STDOUT.print "#{app_human_name} version #{app_version}\n\n" \
141
+ $stdout.print "#{app_human_name} version #{app_version}\n\n" \
146
142
  "#{copyright}\nThis is free software; see the source " \
147
143
  "for copying conditions.\n\n"
148
144
  exit
@@ -154,7 +150,7 @@ class OptionsStruct < OpenStruct
154
150
  opts.separator 'Commands (you must supply one of these):'
155
151
  opts.on('-M', '--models', 'Generate models diagram') do |_c|
156
152
  if command != ''
157
- STDERR.print "Error: Can only generate one diagram type\n\n"
153
+ $stderr.print "Error: Can only generate one diagram type\n\n"
158
154
  exit 1
159
155
  else
160
156
  self.command = 'models'
@@ -162,16 +158,16 @@ class OptionsStruct < OpenStruct
162
158
  end
163
159
  opts.on('-C', '--controllers', 'Generate controllers diagram') do |_c|
164
160
  if command != ''
165
- STDERR.print "Error: Can only generate one diagram type\n\n"
161
+ $stderr.print "Error: Can only generate one diagram type\n\n"
166
162
  exit 1
167
163
  else
168
164
  self.command = 'controllers'
169
165
  end
170
166
  end
171
167
  # From Ana Nelson's patch
172
- opts.on('-A', '--aasm', "Generate \"acts as state machine\" diagram") do |_c|
168
+ opts.on('-A', '--aasm', 'Generate "acts as state machine" diagram') do |_c|
173
169
  if command == 'controllers'
174
- STDERR.print "Error: Can only generate one diagram type\n\n"
170
+ $stderr.print "Error: Can only generate one diagram type\n\n"
175
171
  exit 1
176
172
  else
177
173
  self.command = 'aasm'
@@ -180,7 +176,7 @@ class OptionsStruct < OpenStruct
180
176
  opts.separator ''
181
177
  opts.separator 'For bug reporting and additional information, please see:'
182
178
  opts.separator 'http://railroad.rubyforge.org/'
183
- end # do
179
+ end
184
180
 
185
181
  begin
186
182
  @opt_parser.parse!(args)
@@ -193,12 +189,12 @@ class OptionsStruct < OpenStruct
193
189
  rescue OptionParser::MissingArgument
194
190
  option_error 'Missing argument'
195
191
  end
196
- end # parse
192
+ end
197
193
 
198
194
  private
199
195
 
200
196
  def option_error(msg)
201
- STDERR.print "Error: #{msg}\n\n #{@opt_parser}\n"
197
+ $stderr.print "Error: #{msg}\n\n #{@opt_parser}\n"
202
198
  exit 1
203
199
  end
204
- end # class OptionsStruct
200
+ end
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'railroady'
2
4
  require 'rails'
5
+
3
6
  module RailRoady
4
7
  class Railtie < Rails::Railtie
5
8
  rake_tasks do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailRoady
2
- VERSION = '1.5.3'
4
+ VERSION = '1.6.0'
3
5
  end
data/railroady.gemspec CHANGED
@@ -1,5 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'railroady/version'
5
6
 
@@ -7,9 +8,9 @@ Gem::Specification.new do |spec|
7
8
  spec.name = 'railroady'
8
9
  spec.version = RailRoady::VERSION
9
10
  spec.authors = ['Preston Lee', 'Tobias Crawley', 'Peter Hoeg', 'Javier Smaldone']
10
- spec.description = "Ruby on Rails 3/4/5 model and controller UML class diagram generator. Originally based on the 'railroad' plugin and contributions of many others. (`brew install graphviz` before use!)"
11
- spec.email = ['preston.lee@prestonlee.com', 'tcrawley@gmail.com', 'peter@hoeg.com', 'p.hoeg@northwind.sg', 'javier@smaldone.com.ar']
12
- spec.summary = 'Ruby on Rails 3/4 model and controller UML class diagram generator.'
11
+ spec.description = "Ruby on Rails model and controller UML class diagram generator. Originally based on the 'railroad' plugin and contributions of many others. (`brew install graphviz` before use!)"
12
+ spec.email = %w[preston.lee@prestonlee.com tcrawley@gmail.com peter@hoeg.com p.hoeg@northwind.sg javier@smaldone.com.ar]
13
+ spec.summary = 'Ruby on Rails model and controller UML class diagram generator.'
13
14
  spec.homepage = 'http://github.com/preston/railroady'
14
15
  spec.license = 'GPLv2'
15
16
 
@@ -18,8 +19,8 @@ Gem::Specification.new do |spec|
18
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
20
  spec.require_paths = ['lib']
20
21
 
22
+ spec.add_development_dependency 'activesupport'
21
23
  spec.add_development_dependency 'bundler'
22
- spec.add_development_dependency 'rake'
23
24
  spec.add_development_dependency 'minitest'
24
- spec.add_development_dependency 'activesupport'
25
+ spec.add_development_dependency 'rake'
25
26
  end
data/tasks/railroady.rake CHANGED
@@ -54,7 +54,7 @@ namespace :diagram do
54
54
  end
55
55
 
56
56
  namespace :models do
57
- desc 'Generated brief and complete class diagrams for all models.'
57
+ desc 'Generates brief and complete class diagrams for all models.'
58
58
  task all: ['diagram:setup:create_new_doc_folder_if_needed', 'diagram:models:complete', 'diagram:models:brief']
59
59
 
60
60
  desc 'Generates a class diagram for all models.'
@@ -87,7 +87,7 @@ namespace :diagram do
87
87
  end
88
88
 
89
89
  namespace :controllers do
90
- desc 'Generated brief and complete class diagrams for all controllers.'
90
+ desc 'Generates brief and complete class diagrams for all controllers.'
91
91
  task all: ['diagram:setup:create_new_doc_folder_if_needed', 'diagram:controllers:complete', 'diagram:controllers:brief']
92
92
 
93
93
  desc 'Generates a class diagram for all controllers.'
metadata CHANGED
@@ -1,20 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: railroady
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.3
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Preston Lee
8
8
  - Tobias Crawley
9
9
  - Peter Hoeg
10
10
  - Javier Smaldone
11
- autorequire:
11
+ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2017-06-06 00:00:00.000000000 Z
14
+ date: 2021-07-30 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
- name: bundler
17
+ name: activesupport
18
18
  requirement: !ruby/object:Gem::Requirement
19
19
  requirements:
20
20
  - - ">="
@@ -28,7 +28,7 @@ dependencies:
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
30
  - !ruby/object:Gem::Dependency
31
- name: rake
31
+ name: bundler
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
34
  - - ">="
@@ -56,7 +56,7 @@ dependencies:
56
56
  - !ruby/object:Gem::Version
57
57
  version: '0'
58
58
  - !ruby/object:Gem::Dependency
59
- name: activesupport
59
+ name: rake
60
60
  requirement: !ruby/object:Gem::Requirement
61
61
  requirements:
62
62
  - - ">="
@@ -69,9 +69,9 @@ dependencies:
69
69
  - - ">="
70
70
  - !ruby/object:Gem::Version
71
71
  version: '0'
72
- description: Ruby on Rails 3/4/5 model and controller UML class diagram generator.
73
- Originally based on the 'railroad' plugin and contributions of many others. (`brew
74
- install graphviz` before use!)
72
+ description: Ruby on Rails model and controller UML class diagram generator. Originally
73
+ based on the 'railroad' plugin and contributions of many others. (`brew install
74
+ graphviz` before use!)
75
75
  email:
76
76
  - preston.lee@prestonlee.com
77
77
  - tcrawley@gmail.com
@@ -126,7 +126,7 @@ homepage: http://github.com/preston/railroady
126
126
  licenses:
127
127
  - GPLv2
128
128
  metadata: {}
129
- post_install_message:
129
+ post_install_message:
130
130
  rdoc_options: []
131
131
  require_paths:
132
132
  - lib
@@ -141,11 +141,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
141
  - !ruby/object:Gem::Version
142
142
  version: '0'
143
143
  requirements: []
144
- rubyforge_project:
145
- rubygems_version: 2.6.12
146
- signing_key:
144
+ rubygems_version: 3.2.25
145
+ signing_key:
147
146
  specification_version: 4
148
- summary: Ruby on Rails 3/4 model and controller UML class diagram generator.
147
+ summary: Ruby on Rails model and controller UML class diagram generator.
149
148
  test_files:
150
149
  - test/file_fixture/app/controllers/application_controller.rb
151
150
  - test/file_fixture/app/controllers/dummy1_controller.rb