churn 1.0.1 → 1.0.2
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 +7 -0
- data/.travis.yml +2 -1
- data/Gemfile +1 -1
- data/Gemfile.lock +44 -38
- data/README.md +7 -7
- data/bin/churn +0 -1
- data/churn.gemspec +15 -14
- data/doc/Churn.html +165 -0
- data/doc/Churn/BzrAnalyzer.html +276 -0
- data/doc/Churn/ChurnCalculator.html +578 -0
- data/doc/Churn/ChurnHistory.html +250 -0
- data/doc/Churn/ChurnOptions.html +393 -0
- data/doc/Churn/GitAnalyzer.html +311 -0
- data/doc/Churn/HgAnalyzer.html +276 -0
- data/doc/Churn/LocationMapping.html +448 -0
- data/doc/Churn/SourceControl.html +451 -0
- data/doc/Churn/SvnAnalyzer.html +311 -0
- data/doc/LICENSE.html +123 -0
- data/doc/Object.html +246 -0
- data/doc/created.rid +15 -0
- data/doc/images/add.png +0 -0
- data/doc/images/arrow_up.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +100 -0
- data/doc/js/darkfish.js +155 -0
- data/doc/js/jquery.js +18 -0
- data/doc/js/navigation.js +142 -0
- data/doc/js/search.js +94 -0
- data/doc/js/search_index.js +1 -0
- data/doc/js/searcher.js +228 -0
- data/doc/rdoc.css +595 -0
- data/doc/table_of_contents.html +167 -0
- data/lib/churn/calculator.rb +43 -43
- data/lib/churn/options.rb +3 -3
- data/lib/churn/scm/bzr_analyzer.rb +6 -2
- data/lib/churn/scm/git_analyzer.rb +19 -5
- data/lib/churn/scm/hg_analyzer.rb +5 -1
- data/lib/churn/scm/source_control.rb +15 -15
- data/lib/churn/scm/svn_analyzer.rb +5 -0
- data/lib/churn/version.rb +1 -1
- data/lib/tasks/churn_tasks.rb +1 -1
- data/test/data/churn_calculator.rb +14 -14
- data/test/data/test_helper.rb +5 -5
- data/test/test_helper.rb +5 -5
- data/test/unit/bzr_analyzer_test.rb +2 -2
- data/test/unit/churn_calculator_test.rb +1 -1
- data/test/unit/churn_history_test.rb +5 -5
- data/test/unit/churn_options_test.rb +3 -3
- data/test/unit/git_analyzer_test.rb +3 -3
- data/test/unit/hg_analyzer_test.rb +2 -2
- data/test/unit/location_mapping_test.rb +2 -2
- data/test/unit/source_control_test.rb +3 -3
- data/test/unit/svn_analyzer_test.rb +3 -3
- metadata +94 -76
@@ -4,19 +4,15 @@ module Churn
|
|
4
4
|
class SourceControl
|
5
5
|
|
6
6
|
def self.set_source_control(start_date)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
elsif BzrAnalyzer.supported?
|
12
|
-
BzrAnalyzer.new(start_date)
|
13
|
-
elsif SvnAnalyzer.supported?
|
14
|
-
SvnAnalyzer.new(start_date)
|
7
|
+
analyzers = [GitAnalyzer, HgAnalyzer, BzrAnalyzer, SvnAnalyzer]
|
8
|
+
analyzer = analyzers.detect(&:supported?)
|
9
|
+
if analyzer
|
10
|
+
analyzer.new(start_date)
|
15
11
|
else
|
16
12
|
raise "Churn requires a bazaar, git, mercurial, or subversion source control"
|
17
13
|
end
|
18
14
|
end
|
19
|
-
|
15
|
+
|
20
16
|
def self.supported?
|
21
17
|
raise "child class must implement"
|
22
18
|
end
|
@@ -33,23 +29,27 @@ module Churn
|
|
33
29
|
raise "child class must implement"
|
34
30
|
end
|
35
31
|
|
32
|
+
def generate_history(starting_point)
|
33
|
+
raise "child class must implement"
|
34
|
+
end
|
35
|
+
|
36
36
|
def get_updated_files_change_info(revision, revisions)
|
37
37
|
updated = {}
|
38
38
|
logs = get_updated_files_from_log(revision, revisions)
|
39
39
|
recent_file = nil
|
40
40
|
logs.each do |line|
|
41
|
-
if
|
41
|
+
if /^---|^\+\+\+/ =~ line
|
42
42
|
# Remove the --- a/ and +++ b/ if present
|
43
43
|
recent_file = get_recent_file(line)
|
44
44
|
updated[recent_file] = [] unless updated.include?(recent_file)
|
45
|
-
elsif line
|
45
|
+
elsif /^@@/ =~ line
|
46
46
|
# Now add the added/removed ranges for the line
|
47
47
|
removed_range = get_changed_range(line, '-')
|
48
48
|
added_range = get_changed_range(line, '\+')
|
49
49
|
updated[recent_file] << removed_range
|
50
50
|
updated[recent_file] << added_range
|
51
51
|
else
|
52
|
-
puts line
|
52
|
+
puts /^---/ =~ line
|
53
53
|
raise "diff lines that don't match the two patterns aren't expected: '#{line}'"
|
54
54
|
end
|
55
55
|
end
|
@@ -66,7 +66,7 @@ module Churn
|
|
66
66
|
[]
|
67
67
|
end
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
private
|
71
71
|
|
72
72
|
def get_changed_range(line, matcher)
|
@@ -74,7 +74,7 @@ module Churn
|
|
74
74
|
change_end = line.match(/#{matcher}[0-9]+,[0-9]+/)
|
75
75
|
change_start = change_start.to_s.gsub(/#{matcher}/,'')
|
76
76
|
change_end = change_end.to_s.gsub(/.*,/,'')
|
77
|
-
|
77
|
+
|
78
78
|
change_start_num = change_start.to_i
|
79
79
|
range = if change_end && change_end!=''
|
80
80
|
(change_start_num..(change_start_num+change_end.to_i))
|
@@ -85,7 +85,7 @@ module Churn
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def get_recent_file(line)
|
88
|
-
line
|
88
|
+
line.gsub(/^--- /,'').gsub(/^\+\+\+ /,'').gsub(/^a\//,'').gsub(/^b\//,'')
|
89
89
|
end
|
90
90
|
|
91
91
|
end
|
@@ -11,6 +11,10 @@ module Churn
|
|
11
11
|
`svn log --verbose#{date_range}#{svn_credentials}`.split(/\n/).map { |line| clean_up_svn_line(line) }.compact
|
12
12
|
end
|
13
13
|
|
14
|
+
def generate_history(starting_point)
|
15
|
+
raise "currently the generate history option does not support subversion"
|
16
|
+
end
|
17
|
+
|
14
18
|
#below 2 methods aren't supported by SVN so they become noops
|
15
19
|
def get_revisions
|
16
20
|
[]
|
@@ -21,6 +25,7 @@ module Churn
|
|
21
25
|
end
|
22
26
|
|
23
27
|
private
|
28
|
+
|
24
29
|
def svn_credentials
|
25
30
|
" --username #{ENV['SVN_USR']} --password #{ENV['SVN_PWD']}" if ENV['SVN_PWD'] && ENV['SVN_USR']
|
26
31
|
end
|
data/lib/churn/version.rb
CHANGED
data/lib/tasks/churn_tasks.rb
CHANGED
@@ -30,15 +30,15 @@ module Churn
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def report
|
33
|
-
self.emit
|
33
|
+
self.emit
|
34
34
|
self.analyze
|
35
35
|
self.to_h
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def emit
|
39
39
|
@changes = parse_log_for_changes.reject {|file, change_count| change_count < @minimum_churn_count}
|
40
|
-
@revisions = parse_log_for_revision_changes
|
41
|
-
end
|
40
|
+
@revisions = parse_log_for_revision_changes
|
41
|
+
end
|
42
42
|
|
43
43
|
def analyze
|
44
44
|
@changes = @changes.to_a.sort {|x,y| y[1] <=> x[1]}
|
@@ -87,14 +87,14 @@ module Churn
|
|
87
87
|
end
|
88
88
|
calculate_changes!(changed_methods, @method_changes) if changed_methods
|
89
89
|
calculate_changes!(changed_classes, @class_changes) if changed_classes
|
90
|
-
|
90
|
+
|
91
91
|
@revision_changes[revision] = { :files => changed_files, :classes => changed_classes, :methods => changed_methods }
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
95
95
|
def calculate_revision_data(revision)
|
96
96
|
changed_files = parse_logs_for_updated_files(revision, @revisions)
|
97
|
-
|
97
|
+
|
98
98
|
changed_classes = []
|
99
99
|
changed_methods = []
|
100
100
|
changed_files.each do |file|
|
@@ -153,13 +153,13 @@ module Churn
|
|
153
153
|
end
|
154
154
|
changed_items
|
155
155
|
end
|
156
|
-
|
156
|
+
|
157
157
|
def parse_log_for_changes
|
158
|
-
changes =
|
159
|
-
|
158
|
+
changes = Hash.new(0)
|
159
|
+
|
160
160
|
logs = @source_control.get_logs
|
161
161
|
logs.each do |line|
|
162
|
-
changes[line]
|
162
|
+
changes[line] += 1
|
163
163
|
end
|
164
164
|
changes
|
165
165
|
end
|
@@ -167,7 +167,7 @@ module Churn
|
|
167
167
|
def parse_log_for_revision_changes
|
168
168
|
@source_control.get_revisions
|
169
169
|
end
|
170
|
-
|
170
|
+
|
171
171
|
def parse_logs_for_updated_files(revision, revisions)
|
172
172
|
updated = {}
|
173
173
|
recent_file = nil
|
@@ -176,13 +176,13 @@ module Churn
|
|
176
176
|
return updated unless @source_control.respond_to?(:get_updated_files_from_log)
|
177
177
|
logs = @source_control.get_updated_files_from_log(revision, revisions)
|
178
178
|
logs.each do |line|
|
179
|
-
if
|
179
|
+
if /^---|^\+\+\+/ =~ line
|
180
180
|
line = line.gsub(/^--- /,'').gsub(/^\+\+\+ /,'').gsub(/^a\//,'').gsub(/^b\//,'')
|
181
181
|
unless updated.include?(line)
|
182
|
-
updated[line] = []
|
182
|
+
updated[line] = []
|
183
183
|
end
|
184
184
|
recent_file = line
|
185
|
-
elsif line
|
185
|
+
elsif /^@@/ =~ line
|
186
186
|
#TODO cleanup / refactor
|
187
187
|
#puts "#{recent_file}: #{line}"
|
188
188
|
removed = line.match(/-[0-9]+/)
|
data/test/data/test_helper.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require '
|
2
|
+
require 'minitest/autorun'
|
3
3
|
require 'shoulda'
|
4
|
-
require '
|
5
|
-
require 'mocha'
|
4
|
+
require 'test_construct'
|
5
|
+
require 'mocha/mini_test'
|
6
6
|
|
7
7
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
8
8
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
9
9
|
require 'churn/churn_calculator'
|
10
10
|
Mocha::Configuration.prevent(:stubbing_non_existent_method)
|
11
11
|
|
12
|
-
class Test
|
13
|
-
include
|
12
|
+
class Minitest::Test
|
13
|
+
include TestConstruct::Helpers
|
14
14
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'simplecov'
|
3
|
-
require '
|
3
|
+
require 'minitest/autorun'
|
4
4
|
require 'shoulda'
|
5
|
-
require '
|
6
|
-
require 'mocha'
|
5
|
+
require 'test_construct'
|
6
|
+
require 'mocha/mini_test'
|
7
7
|
|
8
8
|
SimpleCov.start do
|
9
9
|
add_filter 'specs/ruby/1.9.1/gems/'
|
@@ -16,6 +16,6 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
16
16
|
require 'churn/calculator'
|
17
17
|
Mocha::Configuration.prevent(:stubbing_non_existent_method)
|
18
18
|
|
19
|
-
class Test
|
20
|
-
include
|
19
|
+
class Minitest::Test
|
20
|
+
include TestConstruct::Helpers
|
21
21
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.expand_path('../test_helper', File.dirname(__FILE__))
|
2
2
|
|
3
|
-
class BzrAnalyzerTest < Test
|
3
|
+
class BzrAnalyzerTest < Minitest::Test
|
4
4
|
context "BzrAnalyzer#get_logs" do
|
5
5
|
should "return a list of changed files" do
|
6
6
|
bzr_analyzer = Churn::BzrAnalyzer.new
|
@@ -54,7 +54,7 @@ class BzrAnalyzerTest < Test::Unit::TestCase
|
|
54
54
|
|
55
55
|
should "raise an error if it encounters a line it cannot parse" do
|
56
56
|
@bzr_analyzer.expects(:get_updated_files_from_log).with("1947", ["1947", "1946"]).returns(["foo"])
|
57
|
-
|
57
|
+
assert_raises RuntimeError do
|
58
58
|
@bzr_analyzer.stubs(:puts) # supress output from raised error
|
59
59
|
@bzr_analyzer.get_updated_files_change_info("1947", ["1947", "1946"])
|
60
60
|
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
require File.expand_path('../test_helper', File.dirname(__FILE__))
|
2
2
|
|
3
|
-
class ChurnHistoryTest < Test
|
4
|
-
|
3
|
+
class ChurnHistoryTest < Minitest::Test
|
4
|
+
|
5
5
|
should "store results" do
|
6
6
|
within_construct do |container|
|
7
7
|
Churn::ChurnHistory.store_revision_history('aaa','data','tmp/churn/')
|
8
8
|
assert File.exists?('tmp/churn/aaa.json')
|
9
9
|
data = File.read('tmp/churn/aaa.json')
|
10
|
-
assert data
|
10
|
+
assert data =~ /data/
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
should "restores results" do
|
15
15
|
within_construct do |container|
|
16
16
|
container.file('tmp/churn/aaa.json', '{"churn":{"changes":[{"file_path":".gitignore","times_changed":2},{"file_path":"lib\/churn.rb","times_changed":2},{"file_path":"Rakefile","times_changed":2},{"file_path":"README.rdoc","times_changed":2},{"file_path":"lib\/churn\/source_control.rb","times_changed":1},{"file_path":"lib\/churn\/svn_analyzer.rb","times_changed":1},{"file_path":"lib\/tasks\/churn_tasks.rb","times_changed":1},{"file_path":"LICENSE","times_changed":1},{"file_path":"test\/churn_test.rb","times_changed":1},{"file_path":"lib\/churn\/locationmapping.rb","times_changed":1},{"file_path":"lib\/churn\/git_analyzer.rb","times_changed":1},{"file_path":".document","times_changed":1},{"file_path":"test\/test_helper.rb","times_changed":1},{"file_path":"lib\/churn\/churn_calculator.rb","times_changed":1}],"method_churn":[],"changed_files":[".gitignore","lib\/churn\/source_control.rb","lib\/tasks\/churn_tasks.rb","lib\/churn\/svn_analyzer.rb","Rakefile","README.rdoc","lib\/churn\/locationmapping.rb","lib\/churn\/git_analyzer.rb","\/dev\/null","lib\/churn\/churn_calculator.rb","lib\/churn.rb"],"class_churn":[],"changed_classes":[{"klass":"ChurnTest","file":"test\/churn_test.rb"},{"klass":"ChurnCalculator","file":"lib\/churn\/churn_calculator.rb"}],"changed_methods":[{"klass":"","method":"#report_churn","file":"lib\/tasks\/churn_tasks.rb"}]}}')
|
@@ -20,5 +20,5 @@ class ChurnHistoryTest < Test::Unit::TestCase
|
|
20
20
|
assert_equal 1, changed_methods.length
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.expand_path('../test_helper', File.dirname(__FILE__))
|
2
2
|
|
3
|
-
class ChurnOptionsTest < Test
|
4
|
-
|
3
|
+
class ChurnOptionsTest < Minitest::Test
|
4
|
+
|
5
5
|
should "store get default directory" do
|
6
6
|
assert_equal Churn::ChurnOptions::DEFAULT_CHURN_DIRECTORY, Churn::ChurnOptions.new.data_directory
|
7
7
|
end
|
@@ -12,5 +12,5 @@ class ChurnOptionsTest < Test::Unit::TestCase
|
|
12
12
|
options.set_options({:data_directory => tmp_dir})
|
13
13
|
assert_equal tmp_dir, options.data_directory
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.expand_path('../test_helper', File.dirname(__FILE__))
|
2
2
|
|
3
|
-
class GitAnalyzerTest < Test
|
4
|
-
|
3
|
+
class GitAnalyzerTest < Minitest::Test
|
4
|
+
|
5
5
|
should "parses logs correctly" do
|
6
6
|
git_analyzer = Churn::GitAnalyzer.new
|
7
7
|
revision = 'first'
|
@@ -26,7 +26,7 @@ class GitAnalyzerTest < Test::Unit::TestCase
|
|
26
26
|
"8038f1b17c3749540650aaab3f4e5e846cfc3b47",
|
27
27
|
"4d7e4859b2ed8a7e4f73e3540e7879c00cba9783"], git_analyzer.get_revisions
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
should "run date range correctly" do
|
31
31
|
git_analyzer = Churn::GitAnalyzer.new(Date.parse('3/3/2010'))
|
32
32
|
assert_equal "--after=2010-03-03", git_analyzer.send(:date_range)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.expand_path('../test_helper', File.dirname(__FILE__))
|
2
2
|
|
3
|
-
class HgAnalyzerTest < Test
|
3
|
+
class HgAnalyzerTest < Minitest::Test
|
4
4
|
|
5
5
|
context "HgAnalyzer#get_logs" do
|
6
6
|
should "return a list of changed files" do
|
@@ -55,7 +55,7 @@ class HgAnalyzerTest < Test::Unit::TestCase
|
|
55
55
|
|
56
56
|
should "raise an error if it encounters a line it cannot parse" do
|
57
57
|
@hg_analyzer.expects(:get_updated_files_from_log).with("4760c1d7cd40", ["4760c1d7cd40", "3cb77114f02a"]).returns(["foo"])
|
58
|
-
|
58
|
+
assert_raises RuntimeError do
|
59
59
|
@hg_analyzer.stubs(:puts) # supress output from raised error
|
60
60
|
@hg_analyzer.get_updated_files_change_info("4760c1d7cd40", ["4760c1d7cd40", "3cb77114f02a"])
|
61
61
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.expand_path('../test_helper', File.dirname(__FILE__))
|
2
2
|
|
3
|
-
class LocationMappingTest < Test
|
3
|
+
class LocationMappingTest < Minitest::Test
|
4
4
|
|
5
5
|
#todo unfortunately it looks like ruby parser can't handle construct tmp dirs
|
6
6
|
#<Pathname:/private/var/folders/gl/glhHkYYSGgG5nb6+4OG0yU+++TI/-Tmp-/construct_container-56784-851001101/fake_class.rb>
|
@@ -27,7 +27,7 @@ class LocationMappingTest < Test::Unit::TestCase
|
|
27
27
|
file = 'test/data/test_helper.rb'
|
28
28
|
locationmapping = Churn::LocationMapping.new
|
29
29
|
locationmapping.get_info(file.to_s)
|
30
|
-
klass_hash = {"
|
30
|
+
klass_hash = {"Test"=>[12..15]}
|
31
31
|
assert_equal klass_hash.sort, locationmapping.klasses_collection.sort
|
32
32
|
end
|
33
33
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.expand_path('../test_helper', File.dirname(__FILE__))
|
2
2
|
|
3
|
-
class SourceControlTest < Test
|
4
|
-
|
3
|
+
class SourceControlTest < Minitest::Test
|
4
|
+
|
5
5
|
should "get_updated_files_from_log if revision and previous revision" do
|
6
6
|
sc = Churn::SourceControl.new(Date.today)
|
7
7
|
current = 'current'
|
@@ -18,5 +18,5 @@ class SourceControlTest < Test::Unit::TestCase
|
|
18
18
|
revisions = ['future',current]
|
19
19
|
assert_equal [], sc.get_updated_files_from_log(current,revisions)
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.expand_path('../test_helper', File.dirname(__FILE__))
|
2
2
|
|
3
|
-
class SvnAnalyzerTest < Test
|
4
|
-
|
3
|
+
class SvnAnalyzerTest < Minitest::Test
|
4
|
+
|
5
5
|
should "parses logs correctly" do
|
6
6
|
svn_analyzer = Churn::SvnAnalyzer.new
|
7
7
|
revision = 'first'
|
@@ -61,5 +61,5 @@ Changed paths:
|
|
61
61
|
Initial import of project1
|
62
62
|
------------------------------------------------------------------------"
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: churn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Dan Mayer
|
@@ -11,154 +10,149 @@ bindir: bin
|
|
11
10
|
cert_chain: []
|
12
11
|
date: 2012-12-17 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: minitest
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5.3'
|
14
27
|
- !ruby/object:Gem::Dependency
|
15
28
|
name: shoulda
|
16
29
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
30
|
requirements:
|
19
|
-
- -
|
31
|
+
- - '>='
|
20
32
|
- !ruby/object:Gem::Version
|
21
33
|
version: '0'
|
22
34
|
type: :development
|
23
35
|
prerelease: false
|
24
36
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
37
|
requirements:
|
27
|
-
- -
|
38
|
+
- - '>='
|
28
39
|
- !ruby/object:Gem::Version
|
29
40
|
version: '0'
|
30
41
|
- !ruby/object:Gem::Dependency
|
31
|
-
name:
|
42
|
+
name: test_construct
|
32
43
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
44
|
requirements:
|
35
|
-
- -
|
45
|
+
- - ~>
|
36
46
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
47
|
+
version: 2.0.0
|
38
48
|
type: :development
|
39
49
|
prerelease: false
|
40
50
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
51
|
requirements:
|
43
|
-
- -
|
52
|
+
- - ~>
|
44
53
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
54
|
+
version: 2.0.0
|
46
55
|
- !ruby/object:Gem::Dependency
|
47
56
|
name: rake
|
48
57
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
58
|
requirements:
|
51
|
-
- -
|
59
|
+
- - '>='
|
52
60
|
- !ruby/object:Gem::Version
|
53
61
|
version: '0'
|
54
62
|
type: :development
|
55
63
|
prerelease: false
|
56
64
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
65
|
requirements:
|
59
|
-
- -
|
66
|
+
- - '>='
|
60
67
|
- !ruby/object:Gem::Version
|
61
68
|
version: '0'
|
62
69
|
- !ruby/object:Gem::Dependency
|
63
70
|
name: mocha
|
64
71
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
72
|
requirements:
|
67
73
|
- - ~>
|
68
74
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
75
|
+
version: 1.1.0
|
70
76
|
type: :development
|
71
77
|
prerelease: false
|
72
78
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
79
|
requirements:
|
75
80
|
- - ~>
|
76
81
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
82
|
+
version: 1.1.0
|
78
83
|
- !ruby/object:Gem::Dependency
|
79
84
|
name: simplecov
|
80
85
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
86
|
requirements:
|
83
|
-
- -
|
87
|
+
- - '>='
|
84
88
|
- !ruby/object:Gem::Version
|
85
89
|
version: '0'
|
86
90
|
type: :development
|
87
91
|
prerelease: false
|
88
92
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
93
|
requirements:
|
91
|
-
- -
|
94
|
+
- - '>='
|
92
95
|
- !ruby/object:Gem::Version
|
93
96
|
version: '0'
|
94
97
|
- !ruby/object:Gem::Dependency
|
95
98
|
name: rdoc
|
96
99
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
100
|
requirements:
|
99
|
-
- -
|
101
|
+
- - '>='
|
100
102
|
- !ruby/object:Gem::Version
|
101
103
|
version: '0'
|
102
104
|
type: :development
|
103
105
|
prerelease: false
|
104
106
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
107
|
requirements:
|
107
|
-
- -
|
108
|
+
- - '>='
|
108
109
|
- !ruby/object:Gem::Version
|
109
110
|
version: '0'
|
110
111
|
- !ruby/object:Gem::Dependency
|
111
112
|
name: main
|
112
113
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - '>='
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
121
|
requirements:
|
123
|
-
- -
|
122
|
+
- - '>='
|
124
123
|
- !ruby/object:Gem::Version
|
125
124
|
version: '0'
|
126
125
|
- !ruby/object:Gem::Dependency
|
127
126
|
name: json_pure
|
128
127
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
128
|
requirements:
|
131
|
-
- -
|
129
|
+
- - '>='
|
132
130
|
- !ruby/object:Gem::Version
|
133
131
|
version: '0'
|
134
132
|
type: :runtime
|
135
133
|
prerelease: false
|
136
134
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
135
|
requirements:
|
139
|
-
- -
|
136
|
+
- - '>='
|
140
137
|
- !ruby/object:Gem::Version
|
141
138
|
version: '0'
|
142
139
|
- !ruby/object:Gem::Dependency
|
143
140
|
name: chronic
|
144
141
|
requirement: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
142
|
requirements:
|
147
|
-
- -
|
143
|
+
- - '>='
|
148
144
|
- !ruby/object:Gem::Version
|
149
145
|
version: 0.2.3
|
150
146
|
type: :runtime
|
151
147
|
prerelease: false
|
152
148
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
149
|
requirements:
|
155
|
-
- -
|
150
|
+
- - '>='
|
156
151
|
- !ruby/object:Gem::Version
|
157
152
|
version: 0.2.3
|
158
153
|
- !ruby/object:Gem::Dependency
|
159
154
|
name: sexp_processor
|
160
155
|
requirement: !ruby/object:Gem::Requirement
|
161
|
-
none: false
|
162
156
|
requirements:
|
163
157
|
- - ~>
|
164
158
|
- !ruby/object:Gem::Version
|
@@ -166,7 +160,6 @@ dependencies:
|
|
166
160
|
type: :runtime
|
167
161
|
prerelease: false
|
168
162
|
version_requirements: !ruby/object:Gem::Requirement
|
169
|
-
none: false
|
170
163
|
requirements:
|
171
164
|
- - ~>
|
172
165
|
- !ruby/object:Gem::Version
|
@@ -174,7 +167,6 @@ dependencies:
|
|
174
167
|
- !ruby/object:Gem::Dependency
|
175
168
|
name: ruby_parser
|
176
169
|
requirement: !ruby/object:Gem::Requirement
|
177
|
-
none: false
|
178
170
|
requirements:
|
179
171
|
- - ~>
|
180
172
|
- !ruby/object:Gem::Version
|
@@ -182,7 +174,6 @@ dependencies:
|
|
182
174
|
type: :runtime
|
183
175
|
prerelease: false
|
184
176
|
version_requirements: !ruby/object:Gem::Requirement
|
185
|
-
none: false
|
186
177
|
requirements:
|
187
178
|
- - ~>
|
188
179
|
- !ruby/object:Gem::Version
|
@@ -190,36 +181,32 @@ dependencies:
|
|
190
181
|
- !ruby/object:Gem::Dependency
|
191
182
|
name: hirb
|
192
183
|
requirement: !ruby/object:Gem::Requirement
|
193
|
-
none: false
|
194
184
|
requirements:
|
195
|
-
- -
|
185
|
+
- - '>='
|
196
186
|
- !ruby/object:Gem::Version
|
197
187
|
version: '0'
|
198
188
|
type: :runtime
|
199
189
|
prerelease: false
|
200
190
|
version_requirements: !ruby/object:Gem::Requirement
|
201
|
-
none: false
|
202
191
|
requirements:
|
203
|
-
- -
|
192
|
+
- - '>='
|
204
193
|
- !ruby/object:Gem::Version
|
205
194
|
version: '0'
|
206
195
|
- !ruby/object:Gem::Dependency
|
207
196
|
name: rest-client
|
208
197
|
requirement: !ruby/object:Gem::Requirement
|
209
|
-
none: false
|
210
198
|
requirements:
|
211
|
-
- -
|
199
|
+
- - '>='
|
212
200
|
- !ruby/object:Gem::Version
|
213
201
|
version: 1.6.0
|
214
202
|
type: :runtime
|
215
203
|
prerelease: false
|
216
204
|
version_requirements: !ruby/object:Gem::Requirement
|
217
|
-
none: false
|
218
205
|
requirements:
|
219
|
-
- -
|
206
|
+
- - '>='
|
220
207
|
- !ruby/object:Gem::Version
|
221
208
|
version: 1.6.0
|
222
|
-
description:
|
209
|
+
description: 'High method and class churn has been shown to have increased bug and
|
223
210
|
error rates. This gem helps you know what is changing a lot so you can do additional
|
224
211
|
testing, code review, or refactoring to try to tame the volatile code. '
|
225
212
|
email: dan@mayerdan.com
|
@@ -241,6 +228,53 @@ files:
|
|
241
228
|
- Rakefile
|
242
229
|
- bin/churn
|
243
230
|
- churn.gemspec
|
231
|
+
- doc/Churn.html
|
232
|
+
- doc/Churn/BzrAnalyzer.html
|
233
|
+
- doc/Churn/ChurnCalculator.html
|
234
|
+
- doc/Churn/ChurnHistory.html
|
235
|
+
- doc/Churn/ChurnOptions.html
|
236
|
+
- doc/Churn/GitAnalyzer.html
|
237
|
+
- doc/Churn/HgAnalyzer.html
|
238
|
+
- doc/Churn/LocationMapping.html
|
239
|
+
- doc/Churn/SourceControl.html
|
240
|
+
- doc/Churn/SvnAnalyzer.html
|
241
|
+
- doc/LICENSE.html
|
242
|
+
- doc/Object.html
|
243
|
+
- doc/created.rid
|
244
|
+
- doc/images/add.png
|
245
|
+
- doc/images/arrow_up.png
|
246
|
+
- doc/images/brick.png
|
247
|
+
- doc/images/brick_link.png
|
248
|
+
- doc/images/bug.png
|
249
|
+
- doc/images/bullet_black.png
|
250
|
+
- doc/images/bullet_toggle_minus.png
|
251
|
+
- doc/images/bullet_toggle_plus.png
|
252
|
+
- doc/images/date.png
|
253
|
+
- doc/images/delete.png
|
254
|
+
- doc/images/find.png
|
255
|
+
- doc/images/loadingAnimation.gif
|
256
|
+
- doc/images/macFFBgHack.png
|
257
|
+
- doc/images/package.png
|
258
|
+
- doc/images/page_green.png
|
259
|
+
- doc/images/page_white_text.png
|
260
|
+
- doc/images/page_white_width.png
|
261
|
+
- doc/images/plugin.png
|
262
|
+
- doc/images/ruby.png
|
263
|
+
- doc/images/tag_blue.png
|
264
|
+
- doc/images/tag_green.png
|
265
|
+
- doc/images/transparent.png
|
266
|
+
- doc/images/wrench.png
|
267
|
+
- doc/images/wrench_orange.png
|
268
|
+
- doc/images/zoom.png
|
269
|
+
- doc/index.html
|
270
|
+
- doc/js/darkfish.js
|
271
|
+
- doc/js/jquery.js
|
272
|
+
- doc/js/navigation.js
|
273
|
+
- doc/js/search.js
|
274
|
+
- doc/js/search_index.js
|
275
|
+
- doc/js/searcher.js
|
276
|
+
- doc/rdoc.css
|
277
|
+
- doc/table_of_contents.html
|
244
278
|
- lib/churn.rb
|
245
279
|
- lib/churn/calculator.rb
|
246
280
|
- lib/churn/history.rb
|
@@ -270,41 +304,25 @@ files:
|
|
270
304
|
homepage: http://github.com/danmayer/churn
|
271
305
|
licenses:
|
272
306
|
- MIT
|
307
|
+
metadata: {}
|
273
308
|
post_install_message:
|
274
309
|
rdoc_options: []
|
275
310
|
require_paths:
|
276
311
|
- lib
|
277
312
|
required_ruby_version: !ruby/object:Gem::Requirement
|
278
|
-
none: false
|
279
313
|
requirements:
|
280
|
-
- -
|
314
|
+
- - '>='
|
281
315
|
- !ruby/object:Gem::Version
|
282
316
|
version: '0'
|
283
|
-
segments:
|
284
|
-
- 0
|
285
|
-
hash: 4401989909685383083
|
286
317
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
287
|
-
none: false
|
288
318
|
requirements:
|
289
|
-
- -
|
319
|
+
- - '>='
|
290
320
|
- !ruby/object:Gem::Version
|
291
321
|
version: '0'
|
292
322
|
requirements: []
|
293
323
|
rubyforge_project: churn
|
294
|
-
rubygems_version:
|
324
|
+
rubygems_version: 2.0.3
|
295
325
|
signing_key:
|
296
|
-
specification_version:
|
326
|
+
specification_version: 4
|
297
327
|
summary: Providing additional churn metrics over the original metric_fu churn
|
298
|
-
test_files:
|
299
|
-
- test/data/churn_calculator.rb
|
300
|
-
- test/data/test_helper.rb
|
301
|
-
- test/test_helper.rb
|
302
|
-
- test/unit/bzr_analyzer_test.rb
|
303
|
-
- test/unit/churn_calculator_test.rb
|
304
|
-
- test/unit/churn_history_test.rb
|
305
|
-
- test/unit/churn_options_test.rb
|
306
|
-
- test/unit/git_analyzer_test.rb
|
307
|
-
- test/unit/hg_analyzer_test.rb
|
308
|
-
- test/unit/location_mapping_test.rb
|
309
|
-
- test/unit/source_control_test.rb
|
310
|
-
- test/unit/svn_analyzer_test.rb
|
328
|
+
test_files: []
|