uncool 1.0.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.
- data/HISTORY.rdoc +10 -0
- data/LICENSE +204 -0
- data/README.rdoc +90 -0
- data/bin/uncool-ruby +3 -0
- data/lib/uncool.rb +8 -0
- data/lib/uncool/analysis.rb +94 -0
- data/lib/uncool/app.rb +85 -0
- data/lib/uncool/autolog.rb +14 -0
- data/lib/uncool/cli.rb +168 -0
- data/lib/uncool/generator/abstract.rb +95 -0
- data/lib/uncool/generator/ko.rb +32 -0
- data/lib/uncool/generator/lemon.rb +31 -0
- data/lib/uncool/generator/qed.rb +30 -0
- data/lib/uncool/lemon.svg +39 -0
- data/lib/uncool/log.rb +17 -0
- data/lib/uncool/meta/data.rb +29 -0
- data/lib/uncool/meta/gemfile.yml +11 -0
- data/lib/uncool/meta/profile.yml +18 -0
- data/lib/uncool/report.rb +79 -0
- data/lib/uncool/report.rhtml +37 -0
- data/lib/uncool/syntax/ko.rb +9 -0
- data/lib/uncool/trace.rb +70 -0
- data/lib/uncool/unit.rb +73 -0
- data/meta/data.rb +29 -0
- data/meta/gemfile.yml +11 -0
- data/meta/profile.yml +18 -0
- data/test/features/coverage_feature.rb +14 -0
- data/test/features/generate_feature.rb +16 -0
- data/test/fixtures/example.rb +20 -0
- data/test/fixtures/example_run.rb +7 -0
- metadata +169 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
---
|
2
|
+
title : Uncool
|
3
|
+
suite : proutils
|
4
|
+
summary: Unit Test Coverage Tool
|
5
|
+
authors: Thomas Sawyer
|
6
|
+
contact: trans <transfire@gmail.com>
|
7
|
+
license: Apache 2.0
|
8
|
+
|
9
|
+
description:
|
10
|
+
Uncool is a unit testing coverage tool that monitors tests
|
11
|
+
recording all the methods covered for the tarageted namespaces.
|
12
|
+
|
13
|
+
resources:
|
14
|
+
home: http://proutils.github.com/uncool
|
15
|
+
repo: git://github.com/proutils/uncool.git
|
16
|
+
|
17
|
+
copyright: Copyright 2009 Thomas Sawyer
|
18
|
+
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Uncool
|
2
|
+
|
3
|
+
#
|
4
|
+
class Report
|
5
|
+
|
6
|
+
#
|
7
|
+
def initialize(analysis, options={})
|
8
|
+
@analysis = analysis
|
9
|
+
@options = options
|
10
|
+
end
|
11
|
+
|
12
|
+
#
|
13
|
+
def options
|
14
|
+
@options
|
15
|
+
end
|
16
|
+
|
17
|
+
#
|
18
|
+
def coverage
|
19
|
+
@analysis.coverage
|
20
|
+
end
|
21
|
+
|
22
|
+
#
|
23
|
+
def render
|
24
|
+
require 'erb'
|
25
|
+
rhtml = File.read(File.dirname(__FILE__) + '/report.rhtml')
|
26
|
+
ERB.new(rhtml).result(binding)
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
def save(logpath)
|
31
|
+
require 'fileutils'
|
32
|
+
dir = File.join(logpath, 'lemon')
|
33
|
+
file = File.join(dir, 'index.html')
|
34
|
+
FileUtils.mkdir_p(dir)
|
35
|
+
File.open(file, 'w'){ |w| w << render }
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
def display(format=nil)
|
40
|
+
case options[:format]
|
41
|
+
when 'tap'
|
42
|
+
display_tap
|
43
|
+
else
|
44
|
+
display_color
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
def display_color
|
50
|
+
require 'ansi'
|
51
|
+
puts "\nUnit Coverage"
|
52
|
+
i = 0
|
53
|
+
coverage.uniq.sort.each do |unit|
|
54
|
+
i += 1
|
55
|
+
if unit.covered?
|
56
|
+
puts "+ " + unit.to_s.ansi(:green)
|
57
|
+
else
|
58
|
+
puts "- " + unit.to_s.ansi(:red)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
puts
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
def display_tap
|
66
|
+
i = 0
|
67
|
+
coverage.uniq.sort.each do |unit|
|
68
|
+
i += 1
|
69
|
+
if unit.covered?
|
70
|
+
puts "ok #{i} - " + unit.to_s
|
71
|
+
else
|
72
|
+
puts "not ok #{i} - " + unit.to_s
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>Lemon Coverage Report</title>
|
4
|
+
<style>
|
5
|
+
body{background:#221; margin: 0; padding: 0; color: yellow;}
|
6
|
+
#main{
|
7
|
+
width:600px; margin:0 auto;
|
8
|
+
}
|
9
|
+
#list {
|
10
|
+
color: #333;
|
11
|
+
border:1px solid #ccc;
|
12
|
+
background:white;
|
13
|
+
padding: 10px 20px 30px 20px;
|
14
|
+
min-height: 300px;
|
15
|
+
}
|
16
|
+
.green{color:green;}
|
17
|
+
.red{color:red;}
|
18
|
+
</style>
|
19
|
+
</head>
|
20
|
+
<body>
|
21
|
+
<div id="main">
|
22
|
+
Lemon
|
23
|
+
<div id="list">
|
24
|
+
<h1>Lemon Coverage Report</h1>
|
25
|
+
<% chart.sort.each do |(unit, yes)| %>
|
26
|
+
<% if yes %>
|
27
|
+
<div class="green"><%= unit.to_s %></div>
|
28
|
+
<% else %>
|
29
|
+
<div class="red"><%= unit.to_s %></div>
|
30
|
+
<% end %>
|
31
|
+
<% end %>
|
32
|
+
</div>
|
33
|
+
Lemon (c) 2010 Thomas Sawyer
|
34
|
+
</div>
|
35
|
+
</body>
|
36
|
+
</html>
|
37
|
+
|
data/lib/uncool/trace.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
gem('tracepoint')
|
3
|
+
|
4
|
+
require 'tracepoint'
|
5
|
+
require 'uncool/analysis'
|
6
|
+
|
7
|
+
module Uncool
|
8
|
+
|
9
|
+
#
|
10
|
+
class Trace
|
11
|
+
|
12
|
+
#
|
13
|
+
attr :targets
|
14
|
+
|
15
|
+
#
|
16
|
+
attr :log
|
17
|
+
|
18
|
+
#
|
19
|
+
def initialize(targets, options={})
|
20
|
+
@targets = [targets].compact.flatten
|
21
|
+
@options = options
|
22
|
+
@log = []
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
def setup
|
27
|
+
tracker = self
|
28
|
+
TracePoint.trace do |tp|
|
29
|
+
#puts "#{tp.self.class}\t#{tp.callee}\t#{tp.event}\t#{tp.return?}"
|
30
|
+
if tp.event == 'call' or tp.event == 'c-call'
|
31
|
+
if tracker.target?(tp.self.class)
|
32
|
+
tracker.log << [tp.self, tp.callee]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
def target?(mod)
|
40
|
+
return true if targets.empty?
|
41
|
+
targets.find do |target|
|
42
|
+
begin
|
43
|
+
target_class = eval(target, TOPLEVEL_BINDING) #Object.const_get(target)
|
44
|
+
rescue
|
45
|
+
nil
|
46
|
+
else
|
47
|
+
target_class == mod
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
#
|
53
|
+
def activate
|
54
|
+
setup
|
55
|
+
TracePoint.activate
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
def deactivate
|
60
|
+
TracePoint.deactivate
|
61
|
+
end
|
62
|
+
|
63
|
+
#
|
64
|
+
def to_analysis
|
65
|
+
Analysis.new(self, @options)
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
data/lib/uncool/unit.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
module Uncool
|
2
|
+
|
3
|
+
#
|
4
|
+
class Unit
|
5
|
+
attr :target
|
6
|
+
attr :method
|
7
|
+
attr :function
|
8
|
+
|
9
|
+
def initialize(target, method, props={})
|
10
|
+
@target = target
|
11
|
+
@method = method.to_sym
|
12
|
+
@function = props[:function] ? true : false
|
13
|
+
@covered = props[:covered]
|
14
|
+
|
15
|
+
if @function
|
16
|
+
@private = !@target.public_methods.find{ |m| m.to_sym == @method }
|
17
|
+
else
|
18
|
+
@private = !@target.public_instance_methods.find{ |m| m.to_sym == @method }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Method access is private or protected?
|
23
|
+
def private?
|
24
|
+
@private
|
25
|
+
end
|
26
|
+
|
27
|
+
# Marked as covered?
|
28
|
+
def covered?
|
29
|
+
@covered
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
def function?
|
34
|
+
@function
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
def hash
|
39
|
+
@target.hash ^ @method.hash ^ @function.hash
|
40
|
+
end
|
41
|
+
|
42
|
+
#
|
43
|
+
def to_s
|
44
|
+
if @function
|
45
|
+
"#{@target}.#{@method}"
|
46
|
+
else
|
47
|
+
"#{@target}##{@method}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
alias to_str to_s
|
51
|
+
|
52
|
+
def eql?(other)
|
53
|
+
return false unless Unit === other
|
54
|
+
return false unless target == other.target
|
55
|
+
return false unless method == other.method
|
56
|
+
return false unless function == other.function
|
57
|
+
return true
|
58
|
+
end
|
59
|
+
|
60
|
+
def inspect
|
61
|
+
"#{target}#{function ? '.' : '#'}#{method}"
|
62
|
+
end
|
63
|
+
|
64
|
+
def <=>(other)
|
65
|
+
c = (target.name <=> other.target.name)
|
66
|
+
return c unless c == 0
|
67
|
+
return -1 if function && !other.function
|
68
|
+
return 1 if !function && other.function
|
69
|
+
method.to_s <=> other.method.to_s
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
data/meta/data.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
Object.__send__(:remove_const, :VERSION) if Object.const_defined?(:VERSION) # becuase Ruby 1.8~ gets in the way
|
2
|
+
|
3
|
+
module Uncool
|
4
|
+
|
5
|
+
def self.__DIR__
|
6
|
+
File.dirname(__FILE__)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.gemfile
|
10
|
+
@gemfile ||= (
|
11
|
+
require 'yaml'
|
12
|
+
YAML.load(File.new(__DIR__ + '/gemfile.yml'))
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.profile
|
17
|
+
@profile ||= (
|
18
|
+
require 'yaml'
|
19
|
+
YAML.load(File.new(__DIR__ + '/profile.yml'))
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.const_missing(name)
|
24
|
+
name = name.to_s.downcase
|
25
|
+
gemfile[name] || profile[name]
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
data/meta/gemfile.yml
ADDED
data/meta/profile.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
---
|
2
|
+
title : Uncool
|
3
|
+
suite : proutils
|
4
|
+
summary: Unit Test Coverage Tool
|
5
|
+
authors: Thomas Sawyer
|
6
|
+
contact: trans <transfire@gmail.com>
|
7
|
+
license: Apache 2.0
|
8
|
+
|
9
|
+
description:
|
10
|
+
Uncool is a unit testing coverage tool that monitors tests
|
11
|
+
recording all the methods covered for the tarageted namespaces.
|
12
|
+
|
13
|
+
resources:
|
14
|
+
home: http://proutils.github.com/uncool
|
15
|
+
repo: git://github.com/proutils/uncool.git
|
16
|
+
|
17
|
+
copyright: Copyright 2009 Thomas Sawyer
|
18
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
feature "Unit Test Coverage Report" do
|
2
|
+
|
3
|
+
scenario "coverage via command-line require" do
|
4
|
+
out = `ns="Example" ruby -Ilib -runcool test/fixtures/example_run.rb`
|
5
|
+
out.assert =~ /^\+.*?Example#f/
|
6
|
+
end
|
7
|
+
|
8
|
+
scenario "coverage via command-line tool" do
|
9
|
+
out = `ruby -Ilib -- ./bin/uncool-ruby -n Example test/fixtures/example_run.rb`
|
10
|
+
out.assert =~ /^\+.*?Example#f/
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
feature "Unit Test Code Generation" do
|
2
|
+
|
3
|
+
scenario "Generate example via API" do
|
4
|
+
require 'uncool/app'
|
5
|
+
app = Uncool::App.new(:namespaces=>"Example")
|
6
|
+
out = app.generate(['test/fixtures/example_run.rb'])
|
7
|
+
out.assert =~ /^TestCase\ Example/
|
8
|
+
end
|
9
|
+
|
10
|
+
scenario "Generate example via command-line" do
|
11
|
+
out = `ruby -Ilib -- ./bin/uncool-ruby -g -n Example test/fixtures/example_run.rb`
|
12
|
+
out.assert =~ /^TestCase\ Example/
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
metadata
ADDED
@@ -0,0 +1,169 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: uncool
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Thomas Sawyer
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-08-05 00:00:00 -04:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: tracepoint
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 11
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 2
|
33
|
+
version: "1.2"
|
34
|
+
type: :runtime
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: ansi
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 3
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
version: "0"
|
48
|
+
type: :runtime
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: syckle
|
52
|
+
prerelease: false
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 3
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
62
|
+
type: :development
|
63
|
+
version_requirements: *id003
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
name: box
|
66
|
+
prerelease: false
|
67
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 3
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
76
|
+
type: :development
|
77
|
+
version_requirements: *id004
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: ko
|
80
|
+
prerelease: false
|
81
|
+
requirement: &id005 !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
|
+
type: :development
|
91
|
+
version_requirements: *id005
|
92
|
+
description: Uncool is a unit testing coverage tool that monitors tests recording all the methods covered for the tarageted namespaces.
|
93
|
+
email: transfire@gmail.com
|
94
|
+
executables:
|
95
|
+
- uncool-ruby
|
96
|
+
extensions: []
|
97
|
+
|
98
|
+
extra_rdoc_files:
|
99
|
+
- README.rdoc
|
100
|
+
files:
|
101
|
+
- bin/uncool-ruby
|
102
|
+
- lib/uncool/analysis.rb
|
103
|
+
- lib/uncool/app.rb
|
104
|
+
- lib/uncool/autolog.rb
|
105
|
+
- lib/uncool/cli.rb
|
106
|
+
- lib/uncool/generator/abstract.rb
|
107
|
+
- lib/uncool/generator/ko.rb
|
108
|
+
- lib/uncool/generator/lemon.rb
|
109
|
+
- lib/uncool/generator/qed.rb
|
110
|
+
- lib/uncool/lemon.svg
|
111
|
+
- lib/uncool/log.rb
|
112
|
+
- lib/uncool/meta/data.rb
|
113
|
+
- lib/uncool/meta/gemfile.yml
|
114
|
+
- lib/uncool/meta/profile.yml
|
115
|
+
- lib/uncool/report.rb
|
116
|
+
- lib/uncool/report.rhtml
|
117
|
+
- lib/uncool/syntax/ko.rb
|
118
|
+
- lib/uncool/trace.rb
|
119
|
+
- lib/uncool/unit.rb
|
120
|
+
- lib/uncool.rb
|
121
|
+
- meta/data.rb
|
122
|
+
- meta/gemfile.yml
|
123
|
+
- meta/profile.yml
|
124
|
+
- test/features/coverage_feature.rb
|
125
|
+
- test/features/generate_feature.rb
|
126
|
+
- test/fixtures/example.rb
|
127
|
+
- test/fixtures/example_run.rb
|
128
|
+
- HISTORY.rdoc
|
129
|
+
- LICENSE
|
130
|
+
- README.rdoc
|
131
|
+
has_rdoc: true
|
132
|
+
homepage: http://proutils.github.com/uncool
|
133
|
+
licenses:
|
134
|
+
- Apache 2.0
|
135
|
+
post_install_message:
|
136
|
+
rdoc_options:
|
137
|
+
- --title
|
138
|
+
- Uncool API
|
139
|
+
- --main
|
140
|
+
- README.rdoc
|
141
|
+
require_paths:
|
142
|
+
- lib
|
143
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
144
|
+
none: false
|
145
|
+
requirements:
|
146
|
+
- - ">="
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
hash: 3
|
149
|
+
segments:
|
150
|
+
- 0
|
151
|
+
version: "0"
|
152
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
hash: 3
|
158
|
+
segments:
|
159
|
+
- 0
|
160
|
+
version: "0"
|
161
|
+
requirements: []
|
162
|
+
|
163
|
+
rubyforge_project: uncool
|
164
|
+
rubygems_version: 1.3.7
|
165
|
+
signing_key:
|
166
|
+
specification_version: 3
|
167
|
+
summary: Unit Test Coverage Tool
|
168
|
+
test_files: []
|
169
|
+
|