churn 0.0.35 → 1.0.1
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/.travis.yml +0 -1
- data/Gemfile.lock +17 -9
- data/lib/churn/calculator.rb +6 -9
- data/lib/churn/history.rb +7 -11
- data/lib/churn/options.rb +4 -5
- data/lib/churn/scm/svn_analyzer.rb +9 -0
- data/lib/churn/version.rb +1 -1
- data/lib/tasks/churn_tasks.rb +1 -1
- data/test/unit/churn_calculator_test.rb +31 -3
- data/test/unit/churn_history_test.rb +2 -2
- data/test/unit/churn_options_test.rb +3 -3
- metadata +71 -28
- checksums.yaml +0 -7
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
churn (
|
4
|
+
churn (1.0.1)
|
5
5
|
chronic (>= 0.2.3)
|
6
6
|
hirb
|
7
7
|
json_pure
|
@@ -16,30 +16,37 @@ GEM
|
|
16
16
|
activesupport (3.2.10)
|
17
17
|
i18n (~> 0.6)
|
18
18
|
multi_json (~> 1.0)
|
19
|
-
arrayfields (4.9.
|
19
|
+
arrayfields (4.9.2)
|
20
20
|
chronic (0.10.2)
|
21
|
-
|
21
|
+
coderay (1.1.0)
|
22
|
+
fattr (2.2.2)
|
22
23
|
hirb (0.7.1)
|
23
24
|
i18n (0.6.1)
|
24
25
|
json (1.8.1)
|
25
|
-
json_pure (1.8.
|
26
|
-
main (5.2
|
26
|
+
json_pure (1.8.1)
|
27
|
+
main (5.3.2)
|
27
28
|
arrayfields (>= 4.7.4)
|
28
29
|
chronic (>= 0.6.2)
|
29
30
|
fattr (>= 2.2.0)
|
30
31
|
map (>= 5.1.0)
|
31
|
-
|
32
|
-
|
32
|
+
pry (>= 0.9)
|
33
|
+
map (6.5.3)
|
34
|
+
method_source (0.8.2)
|
35
|
+
mime-types (2.2)
|
33
36
|
mocha (0.9.12)
|
34
37
|
multi_json (1.5.0)
|
38
|
+
pry (0.9.12.6)
|
39
|
+
coderay (~> 1.0)
|
40
|
+
method_source (~> 0.8)
|
41
|
+
slop (~> 3.4)
|
35
42
|
rake (10.0.3)
|
36
43
|
rdoc (4.0.1)
|
37
44
|
json (~> 1.4)
|
38
45
|
rest-client (1.6.7)
|
39
46
|
mime-types (>= 1.16)
|
40
|
-
ruby_parser (3.
|
47
|
+
ruby_parser (3.4.1)
|
41
48
|
sexp_processor (~> 4.1)
|
42
|
-
sexp_processor (4.
|
49
|
+
sexp_processor (4.4.2)
|
43
50
|
shoulda (3.3.2)
|
44
51
|
shoulda-context (~> 1.0.1)
|
45
52
|
shoulda-matchers (~> 1.4.1)
|
@@ -50,6 +57,7 @@ GEM
|
|
50
57
|
multi_json (~> 1.0)
|
51
58
|
simplecov-html (~> 0.7.1)
|
52
59
|
simplecov-html (0.7.1)
|
60
|
+
slop (3.5.0)
|
53
61
|
test-construct (1.2.0)
|
54
62
|
|
55
63
|
PLATFORMS
|
data/lib/churn/calculator.rb
CHANGED
@@ -28,10 +28,10 @@ module Churn
|
|
28
28
|
|
29
29
|
# intialized the churn calculator object
|
30
30
|
def initialize(options={})
|
31
|
-
@churn_options = ChurnOptions.
|
31
|
+
@churn_options = ChurnOptions.new.set_options(options)
|
32
32
|
|
33
33
|
@minimum_churn_count = @churn_options.minimum_churn_count
|
34
|
-
@
|
34
|
+
@ignores = @churn_options.ignores
|
35
35
|
@source_control = SourceControl.set_source_control(@churn_options.start_date)
|
36
36
|
|
37
37
|
@changes = {}
|
@@ -91,7 +91,7 @@ module Churn
|
|
91
91
|
|
92
92
|
# Emits various data from source control to be analyses later... Currently this is broken up like this as a throwback to metric_fu
|
93
93
|
def emit
|
94
|
-
@changes = parse_log_for_changes.reject {|file, change_count| change_count < @minimum_churn_count || @
|
94
|
+
@changes = parse_log_for_changes.reject {|file, change_count| change_count < @minimum_churn_count || @ignores.any?{ |ignore| file.match(/#{ignore}/) } }
|
95
95
|
@revisions = parse_log_for_revision_changes
|
96
96
|
end
|
97
97
|
|
@@ -123,7 +123,7 @@ module Churn
|
|
123
123
|
hash[:churn][:changed_methods] = changes[:methods]
|
124
124
|
end
|
125
125
|
#TODO crappy place to do this but save hash to revision file but while entirely under metric_fu only choice
|
126
|
-
ChurnHistory.store_revision_history(first_revision, hash)
|
126
|
+
ChurnHistory.store_revision_history(first_revision, hash, @churn_options.data_directory)
|
127
127
|
hash
|
128
128
|
end
|
129
129
|
|
@@ -190,7 +190,7 @@ module Churn
|
|
190
190
|
#parsing requires the files
|
191
191
|
changed_files, changed_classes, changed_methods = calculate_revision_data(revision)
|
192
192
|
else
|
193
|
-
changed_files, changed_classes, changed_methods = ChurnHistory.load_revision_data(revision)
|
193
|
+
changed_files, changed_classes, changed_methods = ChurnHistory.load_revision_data(revision, @churn_options.data_directory)
|
194
194
|
end
|
195
195
|
calculate_changes!(changed_methods, @method_changes) if changed_methods
|
196
196
|
calculate_changes!(changed_classes, @class_changes) if changed_classes
|
@@ -266,15 +266,12 @@ module Churn
|
|
266
266
|
end
|
267
267
|
|
268
268
|
def parse_log_for_revision_changes
|
269
|
-
return [] unless @source_control.respond_to?(:get_revisions)
|
270
269
|
@source_control.get_revisions
|
271
270
|
end
|
272
271
|
|
273
272
|
def parse_logs_for_updated_files(revision, revisions)
|
274
|
-
#TODO SVN doesn't support this
|
275
|
-
return {} unless @source_control.respond_to?(:get_updated_files_change_info)
|
276
273
|
files = @source_control.get_updated_files_change_info(revision, revisions)
|
277
|
-
files.select{ |file, value| !@
|
274
|
+
files.select{ |file, value| !@ignores.any?{ |ignore| file.match(/#{ignore}/) } }
|
278
275
|
end
|
279
276
|
|
280
277
|
end
|
data/lib/churn/history.rb
CHANGED
@@ -4,16 +4,16 @@ module Churn
|
|
4
4
|
# and for loading old churn history data from json.
|
5
5
|
class ChurnHistory
|
6
6
|
|
7
|
-
#takes current revision and
|
8
|
-
def self.store_revision_history(revision, hash_data)
|
9
|
-
FileUtils.mkdir_p
|
10
|
-
File.open("#{
|
7
|
+
#takes current revision and its hash_data and stores it
|
8
|
+
def self.store_revision_history(revision, hash_data, data_directory)
|
9
|
+
FileUtils.mkdir_p data_directory
|
10
|
+
File.open("#{data_directory}/#{revision}.json", 'w') {|file| file.write(hash_data.to_json) }
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
#given a previous project revision find and load the churn data from a json file
|
14
|
-
def self.load_revision_data(revision)
|
14
|
+
def self.load_revision_data(revision, data_directory)
|
15
15
|
#load revision data from scratch folder if it exists
|
16
|
-
filename = "#{
|
16
|
+
filename = "#{data_directory}/#{revision}.json"
|
17
17
|
if File.exists?(filename)
|
18
18
|
begin
|
19
19
|
json_data = File.read(filename)
|
@@ -28,10 +28,6 @@ module Churn
|
|
28
28
|
[changed_files, changed_classes, changed_methods]
|
29
29
|
end
|
30
30
|
|
31
|
-
def self.tmp_churn_directory
|
32
|
-
ChurnOptions.instance.data_directory
|
33
|
-
end
|
34
|
-
|
35
31
|
end
|
36
32
|
|
37
33
|
end
|
data/lib/churn/options.rb
CHANGED
@@ -4,18 +4,17 @@ module Churn
|
|
4
4
|
|
5
5
|
# responsible for storing the churn configuration
|
6
6
|
class ChurnOptions
|
7
|
-
include Singleton
|
8
7
|
DEFAULT_CHURN_DIRECTORY = "tmp/churn"
|
9
8
|
DEFAULT_MINIMUM_CHURN_COUNT = 5
|
10
9
|
DEFAULT_START_TIME = '3 months ago'
|
11
10
|
DEFAULT_REPORT_HOST = 'http://churn.picoappz.com'
|
12
11
|
|
13
|
-
attr_accessor :data_directory, :minimum_churn_count, :
|
12
|
+
attr_accessor :data_directory, :minimum_churn_count, :ignores, :start_date, :history, :report_host, :name
|
14
13
|
|
15
14
|
def initialize()
|
16
15
|
@data_directory = DEFAULT_CHURN_DIRECTORY
|
17
16
|
@minimum_churn_count = DEFAULT_MINIMUM_CHURN_COUNT
|
18
|
-
@
|
17
|
+
@ignores = '/dev/null'
|
19
18
|
@start_date = DEFAULT_START_TIME
|
20
19
|
@history = nil
|
21
20
|
@report_host = nil
|
@@ -25,8 +24,8 @@ module Churn
|
|
25
24
|
def set_options(options = {})
|
26
25
|
@data_directory = options.fetch(:data_directory){ @data_directory } unless options[:data_directory]==''
|
27
26
|
@minimum_churn_count = options.fetch(:minimum_churn_count){ @minimum_churn_count }.to_i
|
28
|
-
@
|
29
|
-
@
|
27
|
+
@ignores = (options.fetch(:ignores){ @ignores }).to_s.split(',').map(&:strip)
|
28
|
+
@ignores << '/dev/null' unless @ignores.include?('/dev/null')
|
30
29
|
@start_date = options[:start_date] if !options[:start_date].nil? && options[:start_date]!=''
|
31
30
|
@history = options[:history] if !options[:history].nil? && options[:history]!=''
|
32
31
|
if @history=='true'
|
@@ -11,6 +11,15 @@ 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
|
+
#below 2 methods aren't supported by SVN so they become noops
|
15
|
+
def get_revisions
|
16
|
+
[]
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_updated_files_change_info(revision, revisions)
|
20
|
+
{}
|
21
|
+
end
|
22
|
+
|
14
23
|
private
|
15
24
|
def svn_credentials
|
16
25
|
" --username #{ENV['SVN_USR']} --password #{ENV['SVN_PWD']}" if ENV['SVN_PWD'] && ENV['SVN_USR']
|
data/lib/churn/version.rb
CHANGED
data/lib/tasks/churn_tasks.rb
CHANGED
@@ -4,7 +4,7 @@ if defined?(RakeFileUtils) # self.respond_to?(:desc)
|
|
4
4
|
options = {}
|
5
5
|
{ :minimum_churn_count => ENV['CHURN_MINIMUM_CHURN_COUNT'],
|
6
6
|
:start_date => ENV['CHURN_START_DATE'],
|
7
|
-
:
|
7
|
+
:ignores => ENV['CHURN_IGNORES'],
|
8
8
|
:data_directory => ENV['CHURN_DATA_DIRECTORY'],
|
9
9
|
}.each {|k,v| options[k] = v unless v.nil? }
|
10
10
|
Churn::ChurnCalculator.new(options).report
|
@@ -25,10 +25,10 @@ class ChurnCalculatorTest < Test::Unit::TestCase
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
should "use
|
28
|
+
should "use ignores filter" do
|
29
29
|
within_construct do |container|
|
30
30
|
Churn::GitAnalyzer.stubs(:supported?).returns(true)
|
31
|
-
churn = Churn::ChurnCalculator.new({:
|
31
|
+
churn = Churn::ChurnCalculator.new({:ignores => "file.rb"})
|
32
32
|
|
33
33
|
churn.stubs(:parse_log_for_changes).returns([['file.rb', 10],['new.rb',11]])
|
34
34
|
churn.stubs(:parse_log_for_revision_changes).returns(['revision'])
|
@@ -39,7 +39,35 @@ class ChurnCalculatorTest < Test::Unit::TestCase
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
should "
|
42
|
+
should "use ignores with regex" do
|
43
|
+
within_construct do |container|
|
44
|
+
Churn::GitAnalyzer.stubs(:supported?).returns(true)
|
45
|
+
churn = Churn::ChurnCalculator.new({:ignores => "f.*le.rb"})
|
46
|
+
|
47
|
+
churn.stubs(:parse_log_for_changes).returns([['file.rb', 10],['new.rb',11]])
|
48
|
+
churn.stubs(:parse_log_for_revision_changes).returns(['revision'])
|
49
|
+
churn.stubs(:analyze)
|
50
|
+
report = churn.report(false)
|
51
|
+
assert_equal 1, report[:churn][:changes].length
|
52
|
+
assert_equal ["new.rb", 11], report[:churn][:changes].first
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
should "use ignores with regex and directories" do
|
57
|
+
within_construct do |container|
|
58
|
+
Churn::GitAnalyzer.stubs(:supported?).returns(true)
|
59
|
+
churn = Churn::ChurnCalculator.new({:ignores => "lib/.*"})
|
60
|
+
|
61
|
+
churn.stubs(:parse_log_for_changes).returns([['lib/file.rb', 10],['new.rb',11]])
|
62
|
+
churn.stubs(:parse_log_for_revision_changes).returns(['revision'])
|
63
|
+
churn.stubs(:analyze)
|
64
|
+
report = churn.report(false)
|
65
|
+
assert_equal 1, report[:churn][:changes].length
|
66
|
+
assert_equal ["new.rb", 11], report[:churn][:changes].first
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
should "analyze sorts changes" do
|
43
71
|
within_construct do |container|
|
44
72
|
Churn::GitAnalyzer.stubs(:supported?).returns(true)
|
45
73
|
churn = Churn::ChurnCalculator.new({:minimum_churn_count => 3})
|
@@ -4,7 +4,7 @@ class ChurnHistoryTest < Test::Unit::TestCase
|
|
4
4
|
|
5
5
|
should "store results" do
|
6
6
|
within_construct do |container|
|
7
|
-
Churn::ChurnHistory.store_revision_history('aaa','data')
|
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
10
|
assert data.match(/data/)
|
@@ -14,7 +14,7 @@ class ChurnHistoryTest < Test::Unit::TestCase
|
|
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"}]}}')
|
17
|
-
changed_files, changed_classes, changed_methods = Churn::ChurnHistory.load_revision_data('aaa')
|
17
|
+
changed_files, changed_classes, changed_methods = Churn::ChurnHistory.load_revision_data('aaa', 'tmp/churn/')
|
18
18
|
assert changed_files.include?("lib/churn/source_control.rb")
|
19
19
|
assert_equal 2, changed_classes.length
|
20
20
|
assert_equal 1, changed_methods.length
|
@@ -3,14 +3,14 @@ require File.expand_path('../test_helper', File.dirname(__FILE__))
|
|
3
3
|
class ChurnOptionsTest < Test::Unit::TestCase
|
4
4
|
|
5
5
|
should "store get default directory" do
|
6
|
-
assert_equal Churn::ChurnOptions::DEFAULT_CHURN_DIRECTORY, Churn::ChurnOptions.
|
6
|
+
assert_equal Churn::ChurnOptions::DEFAULT_CHURN_DIRECTORY, Churn::ChurnOptions.new.data_directory
|
7
7
|
end
|
8
8
|
|
9
9
|
should "store get over ride directory" do
|
10
|
-
options = Churn::ChurnOptions.
|
10
|
+
options = Churn::ChurnOptions.new
|
11
11
|
tmp_dir = '/tmp/fake'
|
12
12
|
options.set_options({:data_directory => tmp_dir})
|
13
|
-
assert_equal tmp_dir,
|
13
|
+
assert_equal tmp_dir, options.data_directory
|
14
14
|
end
|
15
15
|
|
16
16
|
end
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: churn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.1
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Dan Mayer
|
@@ -13,48 +14,55 @@ dependencies:
|
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: shoulda
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
|
-
- - '>='
|
19
|
+
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
19
21
|
version: '0'
|
20
22
|
type: :development
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
|
-
- - '>='
|
27
|
+
- - ! '>='
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '0'
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: test-construct
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
|
-
- - '>='
|
35
|
+
- - ! '>='
|
32
36
|
- !ruby/object:Gem::Version
|
33
37
|
version: '0'
|
34
38
|
type: :development
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
|
-
- - '>='
|
43
|
+
- - ! '>='
|
39
44
|
- !ruby/object:Gem::Version
|
40
45
|
version: '0'
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: rake
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
|
-
- - '>='
|
51
|
+
- - ! '>='
|
46
52
|
- !ruby/object:Gem::Version
|
47
53
|
version: '0'
|
48
54
|
type: :development
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
|
-
- - '>='
|
59
|
+
- - ! '>='
|
53
60
|
- !ruby/object:Gem::Version
|
54
61
|
version: '0'
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: mocha
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
67
|
- - ~>
|
60
68
|
- !ruby/object:Gem::Version
|
@@ -62,6 +70,7 @@ dependencies:
|
|
62
70
|
type: :development
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
75
|
- - ~>
|
67
76
|
- !ruby/object:Gem::Version
|
@@ -69,76 +78,87 @@ dependencies:
|
|
69
78
|
- !ruby/object:Gem::Dependency
|
70
79
|
name: simplecov
|
71
80
|
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
72
82
|
requirements:
|
73
|
-
- - '>='
|
83
|
+
- - ! '>='
|
74
84
|
- !ruby/object:Gem::Version
|
75
85
|
version: '0'
|
76
86
|
type: :development
|
77
87
|
prerelease: false
|
78
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
79
90
|
requirements:
|
80
|
-
- - '>='
|
91
|
+
- - ! '>='
|
81
92
|
- !ruby/object:Gem::Version
|
82
93
|
version: '0'
|
83
94
|
- !ruby/object:Gem::Dependency
|
84
95
|
name: rdoc
|
85
96
|
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
86
98
|
requirements:
|
87
|
-
- - '>='
|
99
|
+
- - ! '>='
|
88
100
|
- !ruby/object:Gem::Version
|
89
101
|
version: '0'
|
90
102
|
type: :development
|
91
103
|
prerelease: false
|
92
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
93
106
|
requirements:
|
94
|
-
- - '>='
|
107
|
+
- - ! '>='
|
95
108
|
- !ruby/object:Gem::Version
|
96
109
|
version: '0'
|
97
110
|
- !ruby/object:Gem::Dependency
|
98
111
|
name: main
|
99
112
|
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
100
114
|
requirements:
|
101
|
-
- - '>='
|
115
|
+
- - ! '>='
|
102
116
|
- !ruby/object:Gem::Version
|
103
117
|
version: '0'
|
104
118
|
type: :runtime
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
107
122
|
requirements:
|
108
|
-
- - '>='
|
123
|
+
- - ! '>='
|
109
124
|
- !ruby/object:Gem::Version
|
110
125
|
version: '0'
|
111
126
|
- !ruby/object:Gem::Dependency
|
112
127
|
name: json_pure
|
113
128
|
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
114
130
|
requirements:
|
115
|
-
- - '>='
|
131
|
+
- - ! '>='
|
116
132
|
- !ruby/object:Gem::Version
|
117
133
|
version: '0'
|
118
134
|
type: :runtime
|
119
135
|
prerelease: false
|
120
136
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
121
138
|
requirements:
|
122
|
-
- - '>='
|
139
|
+
- - ! '>='
|
123
140
|
- !ruby/object:Gem::Version
|
124
141
|
version: '0'
|
125
142
|
- !ruby/object:Gem::Dependency
|
126
143
|
name: chronic
|
127
144
|
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
128
146
|
requirements:
|
129
|
-
- - '>='
|
147
|
+
- - ! '>='
|
130
148
|
- !ruby/object:Gem::Version
|
131
149
|
version: 0.2.3
|
132
150
|
type: :runtime
|
133
151
|
prerelease: false
|
134
152
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
135
154
|
requirements:
|
136
|
-
- - '>='
|
155
|
+
- - ! '>='
|
137
156
|
- !ruby/object:Gem::Version
|
138
157
|
version: 0.2.3
|
139
158
|
- !ruby/object:Gem::Dependency
|
140
159
|
name: sexp_processor
|
141
160
|
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
142
162
|
requirements:
|
143
163
|
- - ~>
|
144
164
|
- !ruby/object:Gem::Version
|
@@ -146,6 +166,7 @@ dependencies:
|
|
146
166
|
type: :runtime
|
147
167
|
prerelease: false
|
148
168
|
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
149
170
|
requirements:
|
150
171
|
- - ~>
|
151
172
|
- !ruby/object:Gem::Version
|
@@ -153,6 +174,7 @@ dependencies:
|
|
153
174
|
- !ruby/object:Gem::Dependency
|
154
175
|
name: ruby_parser
|
155
176
|
requirement: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
156
178
|
requirements:
|
157
179
|
- - ~>
|
158
180
|
- !ruby/object:Gem::Version
|
@@ -160,6 +182,7 @@ dependencies:
|
|
160
182
|
type: :runtime
|
161
183
|
prerelease: false
|
162
184
|
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
163
186
|
requirements:
|
164
187
|
- - ~>
|
165
188
|
- !ruby/object:Gem::Version
|
@@ -167,32 +190,36 @@ dependencies:
|
|
167
190
|
- !ruby/object:Gem::Dependency
|
168
191
|
name: hirb
|
169
192
|
requirement: !ruby/object:Gem::Requirement
|
193
|
+
none: false
|
170
194
|
requirements:
|
171
|
-
- - '>='
|
195
|
+
- - ! '>='
|
172
196
|
- !ruby/object:Gem::Version
|
173
197
|
version: '0'
|
174
198
|
type: :runtime
|
175
199
|
prerelease: false
|
176
200
|
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
177
202
|
requirements:
|
178
|
-
- - '>='
|
203
|
+
- - ! '>='
|
179
204
|
- !ruby/object:Gem::Version
|
180
205
|
version: '0'
|
181
206
|
- !ruby/object:Gem::Dependency
|
182
207
|
name: rest-client
|
183
208
|
requirement: !ruby/object:Gem::Requirement
|
209
|
+
none: false
|
184
210
|
requirements:
|
185
|
-
- - '>='
|
211
|
+
- - ! '>='
|
186
212
|
- !ruby/object:Gem::Version
|
187
213
|
version: 1.6.0
|
188
214
|
type: :runtime
|
189
215
|
prerelease: false
|
190
216
|
version_requirements: !ruby/object:Gem::Requirement
|
217
|
+
none: false
|
191
218
|
requirements:
|
192
|
-
- - '>='
|
219
|
+
- - ! '>='
|
193
220
|
- !ruby/object:Gem::Version
|
194
221
|
version: 1.6.0
|
195
|
-
description: 'High method and class churn has been shown to have increased bug and
|
222
|
+
description: ! 'High method and class churn has been shown to have increased bug and
|
196
223
|
error rates. This gem helps you know what is changing a lot so you can do additional
|
197
224
|
testing, code review, or refactoring to try to tame the volatile code. '
|
198
225
|
email: dan@mayerdan.com
|
@@ -243,25 +270,41 @@ files:
|
|
243
270
|
homepage: http://github.com/danmayer/churn
|
244
271
|
licenses:
|
245
272
|
- MIT
|
246
|
-
metadata: {}
|
247
273
|
post_install_message:
|
248
274
|
rdoc_options: []
|
249
275
|
require_paths:
|
250
276
|
- lib
|
251
277
|
required_ruby_version: !ruby/object:Gem::Requirement
|
278
|
+
none: false
|
252
279
|
requirements:
|
253
|
-
- - '>='
|
280
|
+
- - ! '>='
|
254
281
|
- !ruby/object:Gem::Version
|
255
282
|
version: '0'
|
283
|
+
segments:
|
284
|
+
- 0
|
285
|
+
hash: 4401989909685383083
|
256
286
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
287
|
+
none: false
|
257
288
|
requirements:
|
258
|
-
- - '>='
|
289
|
+
- - ! '>='
|
259
290
|
- !ruby/object:Gem::Version
|
260
291
|
version: '0'
|
261
292
|
requirements: []
|
262
293
|
rubyforge_project: churn
|
263
|
-
rubygems_version:
|
294
|
+
rubygems_version: 1.8.23
|
264
295
|
signing_key:
|
265
|
-
specification_version:
|
296
|
+
specification_version: 3
|
266
297
|
summary: Providing additional churn metrics over the original metric_fu churn
|
267
|
-
test_files:
|
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
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: b1ef198f417e616080e9ada053a19596286c0ceb
|
4
|
-
data.tar.gz: d42960ccea815f89f846123808fd346fb5f5f65b
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: e92d32eade6ace59e1ed9b663f12d90ba1d1fe91de7d6675fa4910c4e8bb2e95df14d8cf20f53a1dd574c3ed5ea737c965f72c955188399c86ca41d2442bd376
|
7
|
-
data.tar.gz: 4a69afaa2311f8847089b8e1b28ee820679e790b9795bbfc843554db832b6d5c48c540930529b4c29ee0ba7a30b0d5559f36fc32ddd6cf5b919c59159a04cc2a
|