cs_sln_graph 0.0.4 → 0.0.5

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.
data/README.rdoc CHANGED
@@ -1,6 +1,8 @@
1
1
  = cs_sln_graph
2
2
 
3
- cs_sln_graph is a small utility gem I wrote to generate dependency graphs for C# solution files using GraphViz.
3
+ cs_sln_graph is a small utility gem I wrote to generate dependency graphs for
4
+ C# solution and project files using GraphViz. It's not extremely robust, I just whipped it up real quick
5
+ for some research at work.
4
6
 
5
7
  You will need to install GraphViz before using this gem.
6
8
 
@@ -10,13 +12,15 @@ To install, use gem
10
12
 
11
13
  % gem install cs_sln_graph
12
14
 
13
- The -i argument specifies the path to your solution.
15
+ The -i argument specifies the path to your solution or project.
14
16
 
15
17
  The -o argument specifies the path to your output file (it will default to the directory your solution is in).
16
18
 
17
19
  -f specifies the format the output file should be in (default is png).
18
20
 
19
21
  == History
22
+ * 0.0.5 - Now can take project files as input.
23
+ * 0.0.4 - OK, really fix it now
20
24
  * 0.0.3 - Fix dependencies on ruby-graphviz
21
25
  * 0.0.2 - Don't display System libraries, color external dependencies as green.
22
26
  * 0.0.1 - Initial version
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.4
1
+ 0.0.5
data/bin/cs_sln_graph CHANGED
@@ -6,13 +6,13 @@ options = { :format => "png" }
6
6
  op = OptionParser.new do |x|
7
7
  x.banner = "cs_sln_graph <options>"
8
8
  x.separator ""
9
- x.on("-i <sln_path>", String, "Solution file to generate a graph for.") do |i|
10
- options[:sln_path] = i
9
+ x.on("-i <input>", String, "Solution or project file to generate a graph for.") do |i|
10
+ options[:input] = i
11
11
  end
12
12
  x.on("-o <output_path>", String, "Output path.") do |o|
13
13
  options[:output] = o
14
14
  end
15
- x.on("-f <format>", String, "Format to output") do |f|
15
+ x.on("-f <format>", String, "Format to output (defaults to png)") do |f|
16
16
  options[:format] = f
17
17
  end
18
18
  x.on("-h", "Show this message") do
@@ -32,15 +32,22 @@ end
32
32
  # exit
33
33
  #end
34
34
 
35
- if not options.has_key?(:sln_path)
36
- puts "No solution file given."
35
+ if not options.has_key?(:input)
36
+ puts "No input file given."
37
37
  exit
38
38
  end
39
39
 
40
40
  if not options.has_key?(:output)
41
- puts "No output file given. Defaulting to 'graph' in the solution path."
42
- options[:output] = File.join(File.dirname(options[:sln_path]), "graph")
41
+ puts "No output file given. Defaulting to 'graph' in the input path."
42
+ options[:output] = File.join(File.dirname(options[:input]), "graph." + options[:format])
43
43
  end
44
44
 
45
- g = Cs_Sln_Graph.new(options[:sln_path], options[:output], options[:format])
46
- g.graph
45
+ g = Cs_Sln_Graph.new(options[:input], options[:output], options[:format])
46
+
47
+ if options[:input].end_with?(".sln")
48
+ g.graph_sln
49
+ elsif options[:input].end_with?("proj")
50
+ g.graph_proj
51
+ else
52
+ puts "Invalid input file."
53
+ end
data/cs_sln_graph.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{cs_sln_graph}
8
- s.version = "0.0.4"
8
+ s.version = "0.0.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Chris ONeal"]
12
- s.date = %q{2011-06-23}
12
+ s.date = %q{2011-06-24}
13
13
  s.default_executable = %q{cs_sln_graph}
14
14
  s.description = %q{Generates dependency graphs using GraphViz from C# solution files}
15
15
  s.email = %q{ctoneal@gmail.com}
data/lib/cs_sln_graph.rb CHANGED
@@ -4,6 +4,7 @@ require 'rubygems'
4
4
  require 'graphviz'
5
5
 
6
6
  class Cs_Sln_Graph
7
+ # initialize the graph class
7
8
  def initialize(input, output, format)
8
9
  @input_path = input
9
10
  @output_path = output
@@ -11,10 +12,9 @@ class Cs_Sln_Graph
11
12
  @graph = GraphViz.new("G")
12
13
  format_graph
13
14
  end
14
-
15
- def format_graph
16
- #@graph[:rankdir] = "LR"
17
15
 
16
+ # set up the default format for the graph
17
+ def format_graph
18
18
  # set global node options
19
19
  @graph.node[:color] = "#ddaa66"
20
20
  @graph.node[:style] = "filled"
@@ -36,12 +36,49 @@ class Cs_Sln_Graph
36
36
  @graph.edge[:arrowsize]= "0.5"
37
37
  end
38
38
 
39
- def graph
39
+ # graph a solution file
40
+ def graph_sln
40
41
  projects = VSFile_Reader.read_sln(@input_path)
41
42
  projects.each do |project|
42
43
  p_node = @graph.add_node(project.name)
43
- path = File.join(File.dirname(@input_path), project.path)
44
- dependencies = VSFile_Reader.read_proj(path)
44
+ dependencies = VSFile_Reader.read_proj(project.path)
45
+ dependencies.each do |dep|
46
+ if dep.class == Project
47
+ d_node = @graph.get_node(dep.name)
48
+ if d_node.nil?
49
+ d_node = @graph.add_node(dep.name)
50
+ end
51
+ @graph.add_edge(d_node, p_node)
52
+ else
53
+ if dep.start_with?("System.") || dep == "System"
54
+ next
55
+ end
56
+ d_node = @graph.get_node(dep)
57
+ if d_node.nil?
58
+ d_node = @graph.add_node(dep)
59
+ d_node[:color] = "#66ddaa"
60
+ d_node[:fillcolor] = "#ccffee"
61
+ end
62
+ @graph.add_edge(d_node, p_node)
63
+ end
64
+ end
65
+ end
66
+ @graph.output(@format => @output_path)
67
+ end
68
+
69
+ # graph a project file
70
+ def graph_proj
71
+ projects = []
72
+ projects << Project.new(nil, File.basename(@input_path, File.extname(@input_path)), @input_path)
73
+ dependencies = VSFile_Reader.read_proj(@input_path)
74
+ dependencies.each do |dep|
75
+ if dep.class == Project
76
+ projects << dep
77
+ end
78
+ end
79
+ projects.each do |proj|
80
+ p_node = @graph.add_node(proj.name)
81
+ dependencies = VSFile_Reader.read_proj(proj.path)
45
82
  dependencies.each do |dep|
46
83
  if dep.class == Project
47
84
  d_node = @graph.get_node(dep.name)
data/lib/vsfile_reader.rb CHANGED
@@ -2,6 +2,7 @@ require File.expand_path(File.join(File.dirname(__FILE__), "project.rb"))
2
2
  require 'rexml/document'
3
3
 
4
4
  class VSFile_Reader
5
+ # get a list of projects from the solution file
5
6
  def self.read_sln(path)
6
7
  lines = []
7
8
  projects = []
@@ -9,7 +10,7 @@ class VSFile_Reader
9
10
  file.each_line do |line|
10
11
  match_data = line.match(/^\s*Project\s*\(\s*\"\{[A-F0-9\-]{36}\}\"\s*\)\s*=\s*\"(\S+)\"\s*,\s*\"(.*\.(vcproj|csproj))\"\s*,\s*\"\{([A-F0-9\-]{36})\}\"\s*$/i)
11
12
  if not match_data.nil?
12
- proj = Project.new(match_data[4], match_data[1], match_data[2])
13
+ proj = Project.new(match_data[4], match_data[1], File.join(File.dirname(path), match_data[2]))
13
14
  projects << proj
14
15
  end
15
16
  end
@@ -19,6 +20,7 @@ class VSFile_Reader
19
20
  return projects
20
21
  end
21
22
 
23
+ # get a list of dependencies for the given project
22
24
  def self.read_proj(path)
23
25
  dependencies = []
24
26
  file = File.open(path) { |f| f.read }
@@ -31,7 +33,7 @@ class VSFile_Reader
31
33
  end
32
34
  # find project dependencies
33
35
  document.elements.each('//Project/ItemGroup/ProjectReference') do |element|
34
- path = element.attributes["Include"]
36
+ path = File.join(File.dirname(path), element.attributes["Include"])
35
37
  name = ""
36
38
  element.elements.each('Name') do |e|
37
39
  name = e.text
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cs_sln_graph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-06-23 00:00:00.000000000 -05:00
12
+ date: 2011-06-24 00:00:00.000000000 -05:00
13
13
  default_executable: cs_sln_graph
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: shoulda
17
- requirement: &5769192 !ruby/object:Gem::Requirement
17
+ requirement: &5798580 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *5769192
25
+ version_requirements: *5798580
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: bundler
28
- requirement: &5768496 !ruby/object:Gem::Requirement
28
+ requirement: &5797356 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 1.0.0
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *5768496
36
+ version_requirements: *5797356
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: jeweler
39
- requirement: &5767356 !ruby/object:Gem::Requirement
39
+ requirement: &5796336 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 1.5.2
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *5767356
47
+ version_requirements: *5796336
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rcov
50
- requirement: &5766588 !ruby/object:Gem::Requirement
50
+ requirement: &5793384 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *5766588
58
+ version_requirements: *5793384
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: ruby-graphviz
61
- requirement: &5765760 !ruby/object:Gem::Requirement
61
+ requirement: &5792412 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,7 +66,7 @@ dependencies:
66
66
  version: '0'
67
67
  type: :runtime
68
68
  prerelease: false
69
- version_requirements: *5765760
69
+ version_requirements: *5792412
70
70
  description: Generates dependency graphs using GraphViz from C# solution files
71
71
  email: ctoneal@gmail.com
72
72
  executables:
@@ -106,7 +106,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
106
106
  version: '0'
107
107
  segments:
108
108
  - 0
109
- hash: 93176879
109
+ hash: 270288659
110
110
  required_rubygems_version: !ruby/object:Gem::Requirement
111
111
  none: false
112
112
  requirements: