churn 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +2 -1
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +44 -38
  5. data/README.md +7 -7
  6. data/bin/churn +0 -1
  7. data/churn.gemspec +15 -14
  8. data/doc/Churn.html +165 -0
  9. data/doc/Churn/BzrAnalyzer.html +276 -0
  10. data/doc/Churn/ChurnCalculator.html +578 -0
  11. data/doc/Churn/ChurnHistory.html +250 -0
  12. data/doc/Churn/ChurnOptions.html +393 -0
  13. data/doc/Churn/GitAnalyzer.html +311 -0
  14. data/doc/Churn/HgAnalyzer.html +276 -0
  15. data/doc/Churn/LocationMapping.html +448 -0
  16. data/doc/Churn/SourceControl.html +451 -0
  17. data/doc/Churn/SvnAnalyzer.html +311 -0
  18. data/doc/LICENSE.html +123 -0
  19. data/doc/Object.html +246 -0
  20. data/doc/created.rid +15 -0
  21. data/doc/images/add.png +0 -0
  22. data/doc/images/arrow_up.png +0 -0
  23. data/doc/images/brick.png +0 -0
  24. data/doc/images/brick_link.png +0 -0
  25. data/doc/images/bug.png +0 -0
  26. data/doc/images/bullet_black.png +0 -0
  27. data/doc/images/bullet_toggle_minus.png +0 -0
  28. data/doc/images/bullet_toggle_plus.png +0 -0
  29. data/doc/images/date.png +0 -0
  30. data/doc/images/delete.png +0 -0
  31. data/doc/images/find.png +0 -0
  32. data/doc/images/loadingAnimation.gif +0 -0
  33. data/doc/images/macFFBgHack.png +0 -0
  34. data/doc/images/package.png +0 -0
  35. data/doc/images/page_green.png +0 -0
  36. data/doc/images/page_white_text.png +0 -0
  37. data/doc/images/page_white_width.png +0 -0
  38. data/doc/images/plugin.png +0 -0
  39. data/doc/images/ruby.png +0 -0
  40. data/doc/images/tag_blue.png +0 -0
  41. data/doc/images/tag_green.png +0 -0
  42. data/doc/images/transparent.png +0 -0
  43. data/doc/images/wrench.png +0 -0
  44. data/doc/images/wrench_orange.png +0 -0
  45. data/doc/images/zoom.png +0 -0
  46. data/doc/index.html +100 -0
  47. data/doc/js/darkfish.js +155 -0
  48. data/doc/js/jquery.js +18 -0
  49. data/doc/js/navigation.js +142 -0
  50. data/doc/js/search.js +94 -0
  51. data/doc/js/search_index.js +1 -0
  52. data/doc/js/searcher.js +228 -0
  53. data/doc/rdoc.css +595 -0
  54. data/doc/table_of_contents.html +167 -0
  55. data/lib/churn/calculator.rb +43 -43
  56. data/lib/churn/options.rb +3 -3
  57. data/lib/churn/scm/bzr_analyzer.rb +6 -2
  58. data/lib/churn/scm/git_analyzer.rb +19 -5
  59. data/lib/churn/scm/hg_analyzer.rb +5 -1
  60. data/lib/churn/scm/source_control.rb +15 -15
  61. data/lib/churn/scm/svn_analyzer.rb +5 -0
  62. data/lib/churn/version.rb +1 -1
  63. data/lib/tasks/churn_tasks.rb +1 -1
  64. data/test/data/churn_calculator.rb +14 -14
  65. data/test/data/test_helper.rb +5 -5
  66. data/test/test_helper.rb +5 -5
  67. data/test/unit/bzr_analyzer_test.rb +2 -2
  68. data/test/unit/churn_calculator_test.rb +1 -1
  69. data/test/unit/churn_history_test.rb +5 -5
  70. data/test/unit/churn_options_test.rb +3 -3
  71. data/test/unit/git_analyzer_test.rb +3 -3
  72. data/test/unit/hg_analyzer_test.rb +2 -2
  73. data/test/unit/location_mapping_test.rb +2 -2
  74. data/test/unit/source_control_test.rb +3 -3
  75. data/test/unit/svn_analyzer_test.rb +3 -3
  76. 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
- if GitAnalyzer.supported?
8
- GitAnalyzer.new(start_date)
9
- elsif HgAnalyzer.supported?
10
- HgAnalyzer.new(start_date)
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 line.match(/^---/) || line.match(/^\+\+\+/)
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.match(/^@@/)
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.match(/^---/)
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 = line.gsub(/^--- /,'').gsub(/^\+\+\+ /,'').gsub(/^a\//,'').gsub(/^b\//,'')
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
@@ -1,3 +1,3 @@
1
1
  module Churn
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
@@ -9,7 +9,7 @@ if defined?(RakeFileUtils) # self.respond_to?(:desc)
9
9
  }.each {|k,v| options[k] = v unless v.nil? }
10
10
  Churn::ChurnCalculator.new(options).report
11
11
  end
12
-
12
+
13
13
  desc "Report the current churn for the project"
14
14
  task :churn do
15
15
  report = report_churn()
@@ -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] ? changes[line] += 1 : changes[line] = 1
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 line.match(/^---/) || line.match(/^\+\+\+/)
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.match(/^@@/)
185
+ elsif /^@@/ =~ line
186
186
  #TODO cleanup / refactor
187
187
  #puts "#{recent_file}: #{line}"
188
188
  removed = line.match(/-[0-9]+/)
@@ -1,14 +1,14 @@
1
1
  require 'rubygems'
2
- require 'test/unit'
2
+ require 'minitest/autorun'
3
3
  require 'shoulda'
4
- require 'construct'
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::Unit::TestCase
13
- include Construct::Helpers
12
+ class Minitest::Test
13
+ include TestConstruct::Helpers
14
14
  end
@@ -1,9 +1,9 @@
1
1
  require 'rubygems'
2
2
  require 'simplecov'
3
- require 'test/unit'
3
+ require 'minitest/autorun'
4
4
  require 'shoulda'
5
- require 'construct'
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::Unit::TestCase
20
- include Construct::Helpers
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::Unit::TestCase
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
- assert_raise RuntimeError do
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,6 +1,6 @@
1
1
  require File.expand_path('../test_helper', File.dirname(__FILE__))
2
2
 
3
- class ChurnCalculatorTest < Test::Unit::TestCase
3
+ class ChurnCalculatorTest < Minitest::Test
4
4
 
5
5
  should "use minimum churn count" do
6
6
  within_construct do |container|
@@ -1,16 +1,16 @@
1
1
  require File.expand_path('../test_helper', File.dirname(__FILE__))
2
2
 
3
- class ChurnHistoryTest < Test::Unit::TestCase
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.match(/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::Unit::TestCase
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::Unit::TestCase
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::Unit::TestCase
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
- assert_raise RuntimeError do
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::Unit::TestCase
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 = {"TestCase"=>[12..15]}
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::Unit::TestCase
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::Unit::TestCase
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.1
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: test-construct
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: '0'
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: '0'
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: 0.9.5
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: 0.9.5
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: ! 'High method and class churn has been shown to have increased bug and
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: 1.8.23
324
+ rubygems_version: 2.0.3
295
325
  signing_key:
296
- specification_version: 3
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: []