saikuro_treemap 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/MIT-LICENSE.txt +21 -0
- data/README.textile +65 -0
- data/Rakefile +62 -0
- data/lib/saikuro_treemap/ccn_node.rb +76 -0
- data/lib/saikuro_treemap/parser.rb +162 -0
- data/lib/saikuro_treemap.rb +74 -0
- data/saikuro_treemap.gemspec +37 -0
- data/templates/css/treemap.css +33 -0
- data/templates/js/jit-min.js +27 -0
- data/templates/js/jit.js +16675 -0
- data/templates/js/saikuro-render.js +48 -0
- data/templates/saikuro.html.erb +27 -0
- data/test/ccn_node_test.rb +96 -0
- data/test/test_helper.rb +4 -0
- metadata +107 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
function init(json){
|
2
|
+
var tm = new $jit.TM.Squarified({
|
3
|
+
injectInto: 'infovis',
|
4
|
+
titleHeight: 15,
|
5
|
+
animate: false,
|
6
|
+
offset: 1,
|
7
|
+
Events: {
|
8
|
+
enable: true,
|
9
|
+
onClick: function(node) {
|
10
|
+
if(node) tm.enter(node);
|
11
|
+
},
|
12
|
+
onRightClick: function() {
|
13
|
+
tm.out();
|
14
|
+
}
|
15
|
+
},
|
16
|
+
duration: 1000,
|
17
|
+
Tips: {
|
18
|
+
enable: true,
|
19
|
+
offsetX: 20,
|
20
|
+
offsetY: 20,
|
21
|
+
onShow: function(tip, node, isLeaf, domElement) {
|
22
|
+
var html = "<b>Name:</b> " + node.id + "<br/>";
|
23
|
+
var data = node.data;
|
24
|
+
if(data.complexity) {
|
25
|
+
html += "<b>Complexity:</b> " + data.complexity + "<br/>";
|
26
|
+
}
|
27
|
+
if(data.lines) {
|
28
|
+
html += "<b>Lines:</b> " + data.lines + "<br/>";
|
29
|
+
}
|
30
|
+
tip.innerHTML = html;
|
31
|
+
}
|
32
|
+
},
|
33
|
+
onCreateLabel: function(domElement, node){
|
34
|
+
domElement.innerHTML = node.name;
|
35
|
+
var style = domElement.style;
|
36
|
+
style.display = '';
|
37
|
+
style.border = '1px solid transparent';
|
38
|
+
domElement.onmouseover = function() {
|
39
|
+
style.border = '1px solid #9FD4FF';
|
40
|
+
};
|
41
|
+
domElement.onmouseout = function() {
|
42
|
+
style.border = '1px solid transparent';
|
43
|
+
};
|
44
|
+
}
|
45
|
+
});
|
46
|
+
tm.loadJSON(json);
|
47
|
+
tm.refresh();
|
48
|
+
};
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2
|
+
<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'>
|
3
|
+
<head>
|
4
|
+
<meta content='text/html; charset=utf-8' http-equiv='Content-Type' />
|
5
|
+
<meta content='en' http-equiv='Content-Language' />
|
6
|
+
<title>Saikuro Treemap</title>
|
7
|
+
<style>
|
8
|
+
<%= File.read(template('css/treemap.css')) %>
|
9
|
+
</style>
|
10
|
+
<script type="text/javascript">
|
11
|
+
<%= File.read(template('js/jit-min.js')) %>
|
12
|
+
<%= File.read(template('js/saikuro-render.js')) %>
|
13
|
+
</script>
|
14
|
+
</head>
|
15
|
+
<body>
|
16
|
+
<div id='content'>
|
17
|
+
<div id="detail"></div>
|
18
|
+
<div id="infovis"></div>
|
19
|
+
<script type="text/javascript">
|
20
|
+
init(<%= @ccn_node.to_json %>);
|
21
|
+
</script>
|
22
|
+
</div>
|
23
|
+
</body>
|
24
|
+
</html>
|
25
|
+
|
26
|
+
|
27
|
+
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CCNNodeTest < Test::Unit::TestCase
|
4
|
+
include SaikuroTreemap
|
5
|
+
|
6
|
+
def test_to_json_for_single_node
|
7
|
+
assert_equal '{"name":"A","data":{},"id":"A","children":[]}', CCNNode.new('A').to_json
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_to_json_for_node_with_children
|
11
|
+
root = CCNNode.new('A')
|
12
|
+
root.add_child CCNNode.new('A::B')
|
13
|
+
assert_equal '{"name":"A","data":{},"id":"A","children":[{"name":"B","data":{},"id":"A::B","children":[]}]}', root.to_json
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_to_json_for_method_node
|
17
|
+
assert_equal '{"name":"abc","data":{},"id":"A#abc","children":[]}', CCNNode.new('A#abc').to_json
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_to_json_for_root_node
|
21
|
+
assert_equal '{"name":"","data":{},"id":"","children":[]}', CCNNode.new('').to_json
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_to_json_include_complicity_and_lines
|
25
|
+
node = CCNNode.new('A', 2, 30)
|
26
|
+
node_json = JSON.parse(node.to_json)
|
27
|
+
assert_equal 2, node_json['data']['complexity']
|
28
|
+
assert_equal 30, node_json['data']['lines']
|
29
|
+
assert_equal node.area, node_json['data']['$area']
|
30
|
+
assert_equal node.color, node_json['data']['$color']
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_find_node_without_param_should_return_it_self
|
34
|
+
node = CCNNode.new('A::B::C')
|
35
|
+
assert_equal node, node.find_node()
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_find_node_should_find_it_self_it_path_match
|
39
|
+
node = CCNNode.new('A::B::C')
|
40
|
+
assert_equal node, node.find_node('A', 'B', 'C')
|
41
|
+
assert_equal nil, node.find_node('A', 'B')
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_find_node_should_find_matching_child_node
|
45
|
+
parent = CCNNode.new('A')
|
46
|
+
child = CCNNode.new('A::B::C')
|
47
|
+
parent.add_child child
|
48
|
+
|
49
|
+
assert_equal child, parent.find_node('A', 'B', 'C')
|
50
|
+
assert_equal nil, parent.find_node('A', 'B')
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_create_nodes
|
54
|
+
node = CCNNode.new('A')
|
55
|
+
node.create_nodes('A', 'B', 'C', 'D')
|
56
|
+
assert_equal 'A::B', node.find_node('A', 'B').path
|
57
|
+
assert_equal 'A::B::C', node.find_node('A', 'B', 'C').path
|
58
|
+
assert_equal 'A::B::C::D', node.find_node('A', 'B', 'C', 'D').path
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_node_should_be_red_when_code_is_ridiculous
|
62
|
+
assert_equal "#AE0000", CCNNode.new('A', 15).color
|
63
|
+
assert_equal "#AE0000", CCNNode.new('A', 10).color
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_node_should_be_blue_when_code_should_be_noticed
|
67
|
+
assert_equal "#4545C2", CCNNode.new('A', 5).color
|
68
|
+
assert_equal "#4545C2", CCNNode.new('A', 9).color
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_node_should_be_green_if_code_is_ok
|
72
|
+
assert_equal "#006500", CCNNode.new('A', 1).color
|
73
|
+
assert_equal "#006500", CCNNode.new('A', 4).color
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_none_left_node_color_is_consistent_dark
|
77
|
+
parent = CCNNode.new('A', 10)
|
78
|
+
parent.add_child CCNNode.new('A::B::C')
|
79
|
+
|
80
|
+
assert_equal "#101010", parent.color
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_area_is_same_with_lines_for_leaf_node
|
84
|
+
assert_equal 30, CCNNode.new('A', 10, 30).area
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_area_is_sum_of_child_node_area_for_non_leaf_node
|
88
|
+
parent = CCNNode.new('A', 10, 10)
|
89
|
+
parent.add_child CCNNode.new('A::B::C', 10, 20)
|
90
|
+
parent.add_child CCNNode.new('A::B::C', 10, 30)
|
91
|
+
|
92
|
+
assert_equal 50, parent.area
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: saikuro_treemap
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 9
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: "0.1"
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- ThoughtWorks Studios
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-07-16 00:00:00 -07:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: json
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: Saikuro
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
48
|
+
description: " Generate CCN Treemap based on saikuro analysis\n"
|
49
|
+
email: studios@thoughtworks.com
|
50
|
+
executables: []
|
51
|
+
|
52
|
+
extensions: []
|
53
|
+
|
54
|
+
extra_rdoc_files:
|
55
|
+
- README.textile
|
56
|
+
files:
|
57
|
+
- .gitignore
|
58
|
+
- MIT-LICENSE.txt
|
59
|
+
- README.textile
|
60
|
+
- Rakefile
|
61
|
+
- lib/saikuro_treemap.rb
|
62
|
+
- lib/saikuro_treemap/ccn_node.rb
|
63
|
+
- lib/saikuro_treemap/parser.rb
|
64
|
+
- saikuro_treemap.gemspec
|
65
|
+
- templates/css/treemap.css
|
66
|
+
- templates/js/jit-min.js
|
67
|
+
- templates/js/jit.js
|
68
|
+
- templates/js/saikuro-render.js
|
69
|
+
- templates/saikuro.html.erb
|
70
|
+
- test/ccn_node_test.rb
|
71
|
+
- test/test_helper.rb
|
72
|
+
has_rdoc: true
|
73
|
+
homepage: http://github.com/ThoughtWorksStudios/saikuro_treemap
|
74
|
+
licenses: []
|
75
|
+
|
76
|
+
post_install_message:
|
77
|
+
rdoc_options: []
|
78
|
+
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
hash: 3
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
version: "0"
|
90
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
hash: 3
|
96
|
+
segments:
|
97
|
+
- 0
|
98
|
+
version: "0"
|
99
|
+
requirements: []
|
100
|
+
|
101
|
+
rubyforge_project: saikuro_treemap
|
102
|
+
rubygems_version: 1.3.7
|
103
|
+
signing_key:
|
104
|
+
specification_version: 3
|
105
|
+
summary: Generate CCN Treemap based on saikuro analysis
|
106
|
+
test_files:
|
107
|
+
- test/test_helper.rb
|