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.
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: []