churn 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,20 @@
1
+ source :rubygems
2
+
3
+ gem 'arrayfields', '4.7.4'
4
+ gem 'chronic', '0.6.4'
5
+ gem 'fattr', '2.2.0'
6
+ gem 'hirb', '0.5.0'
7
+ gem 'jeweler', '1.6.4'
8
+ gem 'json', '1.6.1'
9
+ gem 'main', '4.7.7'
10
+ gem 'map', '4.3.0'
11
+ gem 'ruby_parser', '2.3.1'
12
+ gem 'sexp_processor', '3.0.7'
13
+
14
+ group :test do
15
+ # bundler requires these gems while running tests
16
+ gem "shoulda", '2.11.3'
17
+ gem "test-construct", '1.2.0'
18
+ gem "mocha", '0.10.0'
19
+ gem 'rake', '0.8.7'
20
+ end
@@ -0,0 +1,47 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ arrayfields (4.7.4)
5
+ chronic (0.6.4)
6
+ fattr (2.2.0)
7
+ git (1.2.5)
8
+ hirb (0.5.0)
9
+ jeweler (1.6.4)
10
+ bundler (~> 1.0)
11
+ git (>= 1.2.5)
12
+ rake
13
+ json (1.6.1)
14
+ main (4.7.7)
15
+ arrayfields (~> 4.7.4)
16
+ chronic (~> 0.6.2)
17
+ fattr (~> 2.2.0)
18
+ map (~> 4.3.0)
19
+ map (4.3.0)
20
+ metaclass (0.0.1)
21
+ mocha (0.10.0)
22
+ metaclass (~> 0.0.1)
23
+ rake (0.8.7)
24
+ ruby_parser (2.3.1)
25
+ sexp_processor (~> 3.0)
26
+ sexp_processor (3.0.7)
27
+ shoulda (2.11.3)
28
+ test-construct (1.2.0)
29
+
30
+ PLATFORMS
31
+ ruby
32
+
33
+ DEPENDENCIES
34
+ arrayfields (= 4.7.4)
35
+ chronic (= 0.6.4)
36
+ fattr (= 2.2.0)
37
+ hirb (= 0.5.0)
38
+ jeweler (= 1.6.4)
39
+ json (= 1.6.1)
40
+ main (= 4.7.7)
41
+ map (= 4.3.0)
42
+ mocha (= 0.10.0)
43
+ rake (= 0.8.7)
44
+ ruby_parser (= 2.3.1)
45
+ sexp_processor (= 3.0.7)
46
+ shoulda (= 2.11.3)
47
+ test-construct (= 1.2.0)
@@ -4,13 +4,18 @@ A Project to give the churn file, class, and method for a project for a given ch
4
4
  Over time the tool adds up the history of chruns to give the number of times a file, class, or method is changing during the life of a project.
5
5
  Churn for files is immediate, but classes and methods requires buildings up a history using churn between revisions. The history is stored in ./tmp
6
6
 
7
- Currently has Full Git and Mercurial (hg) support, and partial SVN support (supports only file level churn currnetly)
7
+ Currently has full Git, Mercurial (hg), and Bazaar (bzr) support, and partial SVN support (supports only file level churn currently)
8
8
 
9
9
  Authors:
10
10
  * danmayer
11
11
  * ajwalters
12
12
  * cldwalker
13
+ * absurdhero
13
14
 
15
+ Execute with:
16
+ rake churn #after adding require 'lib/tasks/churn_tasks' to projects rakefile
17
+ churn
18
+
14
19
  == Example Output
15
20
  **********************************************************************
16
21
  * Revision Changes
data/Rakefile CHANGED
@@ -8,20 +8,20 @@ begin
8
8
  gem.name = "churn"
9
9
  gem.summary = %Q{Providing additional churn metrics over the original metric_fu churn}
10
10
  gem.description = %Q{High method and class churn has been shown to have increased bug and error rates. This gem helps you know what is changing a lot so you can do additional testing, code review, or refactoring to try to tame the volatile code. }
11
- gem.email = "dan@devver.net"
11
+ gem.email = "dan@mayerdan.com"
12
12
  gem.homepage = "http://github.com/danmayer/churn"
13
13
  gem.authors = ["Dan Mayer"]
14
14
  gem.add_development_dependency "shoulda"
15
+ gem.add_development_dependency "jeweler", '~> 1.6.0'
15
16
  gem.add_development_dependency "test-construct"
16
17
  gem.add_development_dependency "mocha", '~> 0.9.5'
17
18
  gem.add_dependency "main"
18
19
  gem.add_dependency "json_pure"
19
20
  gem.add_dependency "chronic", '>= 0.2.3'
20
21
  gem.add_dependency "sexp_processor", '~> 3.0.3'
21
- gem.add_dependency "ruby_parser", '~> 2.0.4'
22
+ gem.add_dependency "ruby_parser", '~> 2.3'
22
23
  gem.add_dependency 'hirb'
23
24
  gem.executables = ['churn']
24
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
25
25
  end
26
26
  rescue LoadError
27
27
  puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
@@ -79,8 +79,6 @@ rescue LoadError
79
79
  end
80
80
  end
81
81
 
82
- task :test => :check_dependencies
83
-
84
82
  task :default => :test
85
83
 
86
84
  require 'rake/rdoctask'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.13
1
+ 0.0.14
@@ -0,0 +1,102 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{churn}
8
+ s.version = "0.0.13"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Dan Mayer"]
12
+ s.date = %q{2010-11-30}
13
+ s.default_executable = %q{churn}
14
+ s.description = %q{High method and class churn has been shown to have increased bug and error rates. This gem helps you know what is changing a lot so you can do additional testing, code review, or refactoring to try to tame the volatile code. }
15
+ s.email = %q{dan@devver.net}
16
+ s.executables = ["churn"]
17
+ s.extra_rdoc_files = [
18
+ "LICENSE",
19
+ "README.rdoc"
20
+ ]
21
+ s.files = [
22
+ ".document",
23
+ ".gitignore",
24
+ "LICENSE",
25
+ "README.rdoc",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "bin/churn",
29
+ "lib/churn.rb",
30
+ "lib/churn/churn_calculator.rb",
31
+ "lib/churn/churn_history.rb",
32
+ "lib/churn/git_analyzer.rb",
33
+ "lib/churn/hg_analyzer.rb",
34
+ "lib/churn/location_mapping.rb",
35
+ "lib/churn/source_control.rb",
36
+ "lib/churn/svn_analyzer.rb",
37
+ "lib/tasks/churn_tasks.rb",
38
+ "man/churn.1",
39
+ "man/churn.html",
40
+ "test/data/churn_calculator.rb",
41
+ "test/data/test_helper.rb",
42
+ "test/test_helper.rb",
43
+ "test/unit/churn_calculator_test.rb",
44
+ "test/unit/churn_history_test.rb",
45
+ "test/unit/git_analyzer_test.rb",
46
+ "test/unit/hg_analyzer_test.rb",
47
+ "test/unit/location_mapping_test.rb"
48
+ ]
49
+ s.homepage = %q{http://github.com/danmayer/churn}
50
+ s.rdoc_options = ["--charset=UTF-8"]
51
+ s.require_paths = ["lib"]
52
+ s.rubygems_version = %q{1.3.6}
53
+ s.summary = %q{Providing additional churn metrics over the original metric_fu churn}
54
+ s.test_files = [
55
+ "test/data/churn_calculator.rb",
56
+ "test/data/test_helper.rb",
57
+ "test/test_helper.rb",
58
+ "test/unit/churn_calculator_test.rb",
59
+ "test/unit/churn_history_test.rb",
60
+ "test/unit/git_analyzer_test.rb",
61
+ "test/unit/hg_analyzer_test.rb",
62
+ "test/unit/location_mapping_test.rb"
63
+ ]
64
+
65
+ if s.respond_to? :specification_version then
66
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
67
+ s.specification_version = 3
68
+
69
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
70
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
71
+ s.add_development_dependency(%q<test-construct>, [">= 0"])
72
+ s.add_development_dependency(%q<mocha>, ["~> 0.9.5"])
73
+ s.add_runtime_dependency(%q<main>, [">= 0"])
74
+ s.add_runtime_dependency(%q<json_pure>, [">= 0"])
75
+ s.add_runtime_dependency(%q<chronic>, [">= 0.2.3"])
76
+ s.add_runtime_dependency(%q<sexp_processor>, ["~> 3.0.3"])
77
+ s.add_runtime_dependency(%q<ruby_parser>, ["~> 2.0.4"])
78
+ s.add_runtime_dependency(%q<hirb>, [">= 0"])
79
+ else
80
+ s.add_dependency(%q<shoulda>, [">= 0"])
81
+ s.add_dependency(%q<test-construct>, [">= 0"])
82
+ s.add_dependency(%q<mocha>, ["~> 0.9.5"])
83
+ s.add_dependency(%q<main>, [">= 0"])
84
+ s.add_dependency(%q<json_pure>, [">= 0"])
85
+ s.add_dependency(%q<chronic>, [">= 0.2.3"])
86
+ s.add_dependency(%q<sexp_processor>, ["~> 3.0.3"])
87
+ s.add_dependency(%q<ruby_parser>, ["~> 2.0.4"])
88
+ s.add_dependency(%q<hirb>, [">= 0"])
89
+ end
90
+ else
91
+ s.add_dependency(%q<shoulda>, [">= 0"])
92
+ s.add_dependency(%q<test-construct>, [">= 0"])
93
+ s.add_dependency(%q<mocha>, ["~> 0.9.5"])
94
+ s.add_dependency(%q<main>, [">= 0"])
95
+ s.add_dependency(%q<json_pure>, [">= 0"])
96
+ s.add_dependency(%q<chronic>, [">= 0.2.3"])
97
+ s.add_dependency(%q<sexp_processor>, ["~> 3.0.3"])
98
+ s.add_dependency(%q<ruby_parser>, ["~> 2.0.4"])
99
+ s.add_dependency(%q<hirb>, [">= 0"])
100
+ end
101
+ end
102
+
@@ -0,0 +1,31 @@
1
+ module Churn
2
+
3
+ #analizes Bzr / Bazaar SCM to find recently changed files, and what lines have been altered
4
+ class BzrAnalyzer < SourceControl
5
+ def get_logs
6
+ `bzr log -v --short #{date_range}`.split("\n").reject{|line| line !~ /^[ ]*(M|A) /}.map{|line| line.strip.split(" ")[1..-1]}.flatten
7
+ end
8
+
9
+ def get_revisions
10
+ `bzr log --line #{date_range}`.split("\n").map{|line| line[/^(\S+):/, 1] }
11
+ end
12
+
13
+ private
14
+
15
+ def get_diff(revision, previous_revision)
16
+ `bzr diff -r #{previous_revision}..#{revision}`.split(/\n/).select{|line| line.match(/^@@/) || line.match(/^---/) || line.match(/^\+\+\+/) }
17
+ end
18
+
19
+ def date_range
20
+ if @start_date
21
+ date = Chronic.parse(@start_date)
22
+ "-r #{date.strftime('%Y-%m-%d')}.."
23
+ end
24
+ end
25
+
26
+ def get_recent_file(line)
27
+ super(line).split("\t")[0]
28
+ end
29
+
30
+ end
31
+ end
@@ -10,6 +10,7 @@ require 'source_control'
10
10
  require 'git_analyzer'
11
11
  require 'svn_analyzer'
12
12
  require 'hg_analyzer'
13
+ require 'bzr_analyzer'
13
14
  require 'location_mapping'
14
15
  require 'churn_history'
15
16
 
@@ -134,15 +135,21 @@ module Churn
134
135
  system("hg branch")
135
136
  end
136
137
 
138
+ def self.bzr?
139
+ system("bzr nick")
140
+ end
141
+
137
142
  def set_source_control(start_date)
138
143
  if self.class.git?
139
144
  GitAnalyzer.new(start_date)
140
145
  elsif self.class.hg?
141
146
  HgAnalyzer.new(start_date)
147
+ elsif self.class.bzr?
148
+ BzrAnalyzer.new(start_date)
142
149
  elsif File.exist?(".svn")
143
150
  SvnAnalyzer.new(start_date)
144
151
  else
145
- raise "Churning requires a subversion or git repo"
152
+ raise "Churning requires a bazaar, git, mercurial, or subversion repo"
146
153
  end
147
154
  end
148
155
 
@@ -10,13 +10,14 @@ Over time the tool adds up the history of chruns to give the number of times a f
10
10
  Churn for files is immediate, but classes and methods requires buildings up a history using churn between revisions. The history is stored in ./tmp
11
11
  .
12
12
  .P
13
- Currently has Full Git and Mercurial (hg) support, and partial SVN support (supports only file level churn currnetly)
13
+ Currently has Full Git, Mercurial (hg), and Bazaar (bzr) support, and partial SVN support (supports only file level churn currnetly)
14
14
  .
15
15
  .P
16
16
  Authors:
17
17
  * danmayer
18
18
  * ajwalters
19
19
  * cldwalker
20
+ * absurdhero
20
21
  .
21
22
  .P
22
23
  == Example Output
@@ -391,11 +391,12 @@ div#toc a:visited { color: blue; }
391
391
  <div class="paragraph"><p>A Project to give the churn file, class, and method for a project for a given checkin
392
392
  Over time the tool adds up the history of chruns to give the number of times a file, class, or method is changing during the life of a project.
393
393
  Churn for files is immediate, but classes and methods requires buildings up a history using churn between revisions. The history is stored in ./tmp</p></div>
394
- <div class="paragraph"><p>Currently has Full Git and Mercurial (hg) support, and partial SVN support (supports only file level churn currnetly)</p></div>
394
+ <div class="paragraph"><p>Currently has Full Git, Mercurial (hg), and Bazaar (bzr) support, and partial SVN support (supports only file level churn currnetly)</p></div>
395
395
  <div class="paragraph"><p>Authors:
396
396
  * danmayer
397
397
  * ajwalters
398
- * cldwalker</p></div>
398
+ * cldwalker
399
+ * absurdhero</p></div>
399
400
  </div>
400
401
  </div>
401
402
  <h2 id="_example_output">Example Output</h2>
@@ -0,0 +1,65 @@
1
+ require File.expand_path('../test_helper', File.dirname(__FILE__))
2
+
3
+ class BzrAnalyzerTest < Test::Unit::TestCase
4
+ context "BzrAnalyzer#get_logs" do
5
+ should "return a list of changed files" do
6
+ bzr_analyzer = Churn::BzrAnalyzer.new
7
+ bzr_analyzer.expects(:`).with('bzr log -v --short ').returns(" 1947 Adam Walters 2010-01-16\n Second commit with 3 files now.\n M file1.rb\n M file2.rb\n M file3.rb\n\n 1946 Adam Walters 2010-01-16\n First commit\n A file1.rb\n")
8
+ assert_equal ["file1.rb", "file2.rb", "file3.rb", "file1.rb"], bzr_analyzer.get_logs
9
+ end
10
+
11
+ should "scope the changed files to an optional date range" do
12
+ bzr_analyzer = Churn::BzrAnalyzer.new("1/16/2010")
13
+ bzr_analyzer.expects(:`).with('bzr log -v --short -r 2010-01-16..').returns(" 1947 Adam Walters 2010-01-16\n Second commit with 3 files now.\n M file1.rb\n M file2.rb\n M file3.rb\n\n 1946 Adam Walters 2010-01-16\n First commit\n A file1.rb\n")
14
+ assert_equal ["file1.rb", "file2.rb", "file3.rb", "file1.rb"], bzr_analyzer.get_logs
15
+ end
16
+ end
17
+
18
+ context "BzrAnalyzer#get_revisions" do
19
+ should "return a list of changeset ids" do
20
+ bzr_analyzer = Churn::BzrAnalyzer.new
21
+ bzr_analyzer.expects(:`).with('bzr log --line ').returns("1947: Adam Walters 2010-01-16 Second commit with 3 files now.\n1946: Adam Walters 2010-01-16 First commit\n")
22
+ assert_equal ["1947", "1946"], bzr_analyzer.get_revisions
23
+ end
24
+
25
+ should "scope the changesets to an optional date range" do
26
+ bzr_analyzer = Churn::BzrAnalyzer.new("1/16/2010")
27
+ bzr_analyzer.expects(:`).with('bzr log --line -r 2010-01-16..').returns("1947: Adam Walters 2010-01-16 Second commit with 3 files now.\n1946: Adam Walters 2010-01-16 First commit\n")
28
+ assert_equal ["1947", "1946"], bzr_analyzer.get_revisions
29
+ end
30
+ end
31
+
32
+ context "BzrAnalyzer#get_updated_files_from_log(revision, revisions)" do
33
+ should "return a list of modified files and the change hunks (chunks)" do
34
+ bzr_analyzer = Churn::BzrAnalyzer.new
35
+ bzr_analyzer.expects(:`).with('bzr diff -r 1946..1947').returns("=== modified file 'a/file1.rb'\n--- a/file1.rb\tSat Jan 16 14:21:28 2010 -0600\n+++ b/file1.rb\tSat Jan 16 14:19:32 2010 -0600\n@@ -1,3 +0,0 @@\n-First\n-Adding sample data\n-Third line\ndiff -r 1947 -r 1946 file2.rb\n=== modified file 'a/file2.rb'\n--- a/file2.rb\tSat Jan 16 14:21:28 2010 -0600\n+++ /dev/null\tThu Jan 01 00:00:00 1970 +0000\n@@ -1,7 +0,0 @@\n-This is the second file.\n-\n-Little more data\n-\n-def cool_method\n- \"hello\"\n-end\ndiff -r 1947 -r 1946 file3.rb\n--- a/file3.rb\tSat Jan 16 14:21:28 2010 -0600\n+++ /dev/null\tThu Jan 01 00:00:00 1970 +0000\n@@ -1,5 +0,0 @@\n-Third file here.\n-\n-def another_method\n- \"foo\"\n-end\n")
36
+ assert_equal ["--- a/file1.rb\tSat Jan 16 14:21:28 2010 -0600", "+++ b/file1.rb\tSat Jan 16 14:19:32 2010 -0600", "@@ -1,3 +0,0 @@", "--- a/file2.rb\tSat Jan 16 14:21:28 2010 -0600", "+++ /dev/null\tThu Jan 01 00:00:00 1970 +0000", "@@ -1,7 +0,0 @@", "--- a/file3.rb\tSat Jan 16 14:21:28 2010 -0600", "+++ /dev/null\tThu Jan 01 00:00:00 1970 +0000", "@@ -1,5 +0,0 @@"], bzr_analyzer.get_updated_files_from_log("1947", ["1947", "1946"])
37
+ end
38
+
39
+ should "return an empty array if it's the final revision" do
40
+ bzr_analyzer = Churn::BzrAnalyzer.new
41
+ assert_equal [], bzr_analyzer.get_updated_files_from_log("1946", ["1947", "1946"])
42
+ end
43
+ end
44
+
45
+ context "BzrAnalyzer#get_updated_files_change_info(revision, revisions)" do
46
+ setup do
47
+ @bzr_analyzer = Churn::BzrAnalyzer.new
48
+ end
49
+
50
+ should "return all modified files with their line differences" do
51
+ @bzr_analyzer.expects(:get_updated_files_from_log).with("1947", ["1947", "1946"]).returns(["--- a/file1.rb\tSat Jan 16 14:21:28 2010 -0600", "+++ b/file1.rb\tSat Jan 16 14:19:32 2010 -0600", "@@ -1,3 +0,0 @@", "--- a/file2.rb\tSat Jan 16 14:21:28 2010 -0600", "+++ /dev/null\tThu Jan 01 00:00:00 1970 +0000", "@@ -1,7 +0,0 @@", "--- a/file3.rb\tSat Jan 16 14:21:28 2010 -0600", "+++ /dev/null\tThu Jan 01 00:00:00 1970 +0000", "@@ -1,5 +0,0 @@"])
52
+ assert_equal({"/dev/null" => [1..8, 0..0, 1..6, 0..0], "file3.rb" => [], "file1.rb" => [], "file2.rb" => [], "file1.rb" => [1..4, 0..0]}, @bzr_analyzer.get_updated_files_change_info("1947", ["1947", "1946"]))
53
+ end
54
+
55
+ should "raise an error if it encounters a line it cannot parse" do
56
+ @bzr_analyzer.expects(:get_updated_files_from_log).with("1947", ["1947", "1946"]).returns(["foo"])
57
+ assert_raise RuntimeError do
58
+ @bzr_analyzer.stubs(:puts) # supress output from raised error
59
+ @bzr_analyzer.get_updated_files_change_info("1947", ["1947", "1946"])
60
+ end
61
+ end
62
+ end
63
+
64
+ end
65
+
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: churn
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 3
5
+ prerelease:
5
6
  segments:
6
7
  - 0
7
8
  - 0
8
- - 13
9
- version: 0.0.13
9
+ - 14
10
+ version: 0.0.14
10
11
  platform: ruby
11
12
  authors:
12
13
  - Dan Mayer
@@ -14,127 +15,319 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-11-30 00:00:00 -05:00
18
- default_executable: churn
18
+ date: 2011-10-30 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: shoulda
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
22
+ none: false
23
+ requirements:
24
+ - - "="
25
+ - !ruby/object:Gem::Version
26
+ hash: 43
27
+ segments:
28
+ - 4
29
+ - 7
30
+ - 4
31
+ version: 4.7.4
32
+ requirement: *id001
33
+ prerelease: false
34
+ name: arrayfields
35
+ type: :runtime
36
+ - !ruby/object:Gem::Dependency
37
+ version_requirements: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - "="
41
+ - !ruby/object:Gem::Version
42
+ hash: 15
43
+ segments:
44
+ - 0
45
+ - 6
46
+ - 4
47
+ version: 0.6.4
48
+ requirement: *id002
49
+ prerelease: false
50
+ name: chronic
51
+ type: :runtime
52
+ - !ruby/object:Gem::Dependency
53
+ version_requirements: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - "="
57
+ - !ruby/object:Gem::Version
58
+ hash: 7
59
+ segments:
60
+ - 2
61
+ - 2
62
+ - 0
63
+ version: 2.2.0
64
+ requirement: *id003
65
+ prerelease: false
66
+ name: fattr
67
+ type: :runtime
68
+ - !ruby/object:Gem::Dependency
69
+ version_requirements: &id004 !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - "="
73
+ - !ruby/object:Gem::Version
74
+ hash: 11
75
+ segments:
76
+ - 0
77
+ - 5
78
+ - 0
79
+ version: 0.5.0
80
+ requirement: *id004
81
+ prerelease: false
82
+ name: hirb
83
+ type: :runtime
84
+ - !ruby/object:Gem::Dependency
85
+ version_requirements: &id005 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - "="
89
+ - !ruby/object:Gem::Version
90
+ hash: 7
91
+ segments:
92
+ - 1
93
+ - 6
94
+ - 4
95
+ version: 1.6.4
96
+ requirement: *id005
97
+ prerelease: false
98
+ name: jeweler
99
+ type: :runtime
100
+ - !ruby/object:Gem::Dependency
101
+ version_requirements: &id006 !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - "="
105
+ - !ruby/object:Gem::Version
106
+ hash: 13
107
+ segments:
108
+ - 1
109
+ - 6
110
+ - 1
111
+ version: 1.6.1
112
+ requirement: *id006
113
+ prerelease: false
114
+ name: json
115
+ type: :runtime
116
+ - !ruby/object:Gem::Dependency
117
+ version_requirements: &id007 !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - "="
121
+ - !ruby/object:Gem::Version
122
+ hash: 45
123
+ segments:
124
+ - 4
125
+ - 7
126
+ - 7
127
+ version: 4.7.7
128
+ requirement: *id007
129
+ prerelease: false
130
+ name: main
131
+ type: :runtime
132
+ - !ruby/object:Gem::Dependency
133
+ version_requirements: &id008 !ruby/object:Gem::Requirement
134
+ none: false
135
+ requirements:
136
+ - - "="
137
+ - !ruby/object:Gem::Version
138
+ hash: 51
139
+ segments:
140
+ - 4
141
+ - 3
142
+ - 0
143
+ version: 4.3.0
144
+ requirement: *id008
145
+ prerelease: false
146
+ name: map
147
+ type: :runtime
148
+ - !ruby/object:Gem::Dependency
149
+ version_requirements: &id009 !ruby/object:Gem::Requirement
150
+ none: false
151
+ requirements:
152
+ - - "="
153
+ - !ruby/object:Gem::Version
154
+ hash: 1
155
+ segments:
156
+ - 2
157
+ - 3
158
+ - 1
159
+ version: 2.3.1
160
+ requirement: *id009
161
+ prerelease: false
162
+ name: ruby_parser
163
+ type: :runtime
164
+ - !ruby/object:Gem::Dependency
165
+ version_requirements: &id010 !ruby/object:Gem::Requirement
166
+ none: false
167
+ requirements:
168
+ - - "="
169
+ - !ruby/object:Gem::Version
170
+ hash: 9
171
+ segments:
172
+ - 3
173
+ - 0
174
+ - 7
175
+ version: 3.0.7
176
+ requirement: *id010
22
177
  prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
178
+ name: sexp_processor
179
+ type: :runtime
180
+ - !ruby/object:Gem::Dependency
181
+ version_requirements: &id011 !ruby/object:Gem::Requirement
182
+ none: false
24
183
  requirements:
25
184
  - - ">="
26
185
  - !ruby/object:Gem::Version
186
+ hash: 3
27
187
  segments:
28
188
  - 0
29
189
  version: "0"
190
+ requirement: *id011
191
+ prerelease: false
192
+ name: shoulda
30
193
  type: :development
31
- version_requirements: *id001
32
194
  - !ruby/object:Gem::Dependency
33
- name: test-construct
195
+ version_requirements: &id012 !ruby/object:Gem::Requirement
196
+ none: false
197
+ requirements:
198
+ - - ~>
199
+ - !ruby/object:Gem::Version
200
+ hash: 15
201
+ segments:
202
+ - 1
203
+ - 6
204
+ - 0
205
+ version: 1.6.0
206
+ requirement: *id012
34
207
  prerelease: false
35
- requirement: &id002 !ruby/object:Gem::Requirement
208
+ name: jeweler
209
+ type: :development
210
+ - !ruby/object:Gem::Dependency
211
+ version_requirements: &id013 !ruby/object:Gem::Requirement
212
+ none: false
36
213
  requirements:
37
214
  - - ">="
38
215
  - !ruby/object:Gem::Version
216
+ hash: 3
39
217
  segments:
40
218
  - 0
41
219
  version: "0"
220
+ requirement: *id013
221
+ prerelease: false
222
+ name: test-construct
42
223
  type: :development
43
- version_requirements: *id002
44
224
  - !ruby/object:Gem::Dependency
45
- name: mocha
46
- prerelease: false
47
- requirement: &id003 !ruby/object:Gem::Requirement
225
+ version_requirements: &id014 !ruby/object:Gem::Requirement
226
+ none: false
48
227
  requirements:
49
228
  - - ~>
50
229
  - !ruby/object:Gem::Version
230
+ hash: 49
51
231
  segments:
52
232
  - 0
53
233
  - 9
54
234
  - 5
55
235
  version: 0.9.5
236
+ requirement: *id014
237
+ prerelease: false
238
+ name: mocha
56
239
  type: :development
57
- version_requirements: *id003
58
240
  - !ruby/object:Gem::Dependency
59
- name: main
60
- prerelease: false
61
- requirement: &id004 !ruby/object:Gem::Requirement
241
+ version_requirements: &id015 !ruby/object:Gem::Requirement
242
+ none: false
62
243
  requirements:
63
244
  - - ">="
64
245
  - !ruby/object:Gem::Version
246
+ hash: 3
65
247
  segments:
66
248
  - 0
67
249
  version: "0"
250
+ requirement: *id015
251
+ prerelease: false
252
+ name: main
68
253
  type: :runtime
69
- version_requirements: *id004
70
254
  - !ruby/object:Gem::Dependency
71
- name: json_pure
72
- prerelease: false
73
- requirement: &id005 !ruby/object:Gem::Requirement
255
+ version_requirements: &id016 !ruby/object:Gem::Requirement
256
+ none: false
74
257
  requirements:
75
258
  - - ">="
76
259
  - !ruby/object:Gem::Version
260
+ hash: 3
77
261
  segments:
78
262
  - 0
79
263
  version: "0"
264
+ requirement: *id016
265
+ prerelease: false
266
+ name: json_pure
80
267
  type: :runtime
81
- version_requirements: *id005
82
268
  - !ruby/object:Gem::Dependency
83
- name: chronic
84
- prerelease: false
85
- requirement: &id006 !ruby/object:Gem::Requirement
269
+ version_requirements: &id017 !ruby/object:Gem::Requirement
270
+ none: false
86
271
  requirements:
87
272
  - - ">="
88
273
  - !ruby/object:Gem::Version
274
+ hash: 17
89
275
  segments:
90
276
  - 0
91
277
  - 2
92
278
  - 3
93
279
  version: 0.2.3
280
+ requirement: *id017
281
+ prerelease: false
282
+ name: chronic
94
283
  type: :runtime
95
- version_requirements: *id006
96
284
  - !ruby/object:Gem::Dependency
97
- name: sexp_processor
98
- prerelease: false
99
- requirement: &id007 !ruby/object:Gem::Requirement
285
+ version_requirements: &id018 !ruby/object:Gem::Requirement
286
+ none: false
100
287
  requirements:
101
288
  - - ~>
102
289
  - !ruby/object:Gem::Version
290
+ hash: 1
103
291
  segments:
104
292
  - 3
105
293
  - 0
106
294
  - 3
107
295
  version: 3.0.3
296
+ requirement: *id018
297
+ prerelease: false
298
+ name: sexp_processor
108
299
  type: :runtime
109
- version_requirements: *id007
110
300
  - !ruby/object:Gem::Dependency
111
- name: ruby_parser
112
- prerelease: false
113
- requirement: &id008 !ruby/object:Gem::Requirement
301
+ version_requirements: &id019 !ruby/object:Gem::Requirement
302
+ none: false
114
303
  requirements:
115
304
  - - ~>
116
305
  - !ruby/object:Gem::Version
306
+ hash: 5
117
307
  segments:
118
308
  - 2
119
- - 0
120
- - 4
121
- version: 2.0.4
309
+ - 3
310
+ version: "2.3"
311
+ requirement: *id019
312
+ prerelease: false
313
+ name: ruby_parser
122
314
  type: :runtime
123
- version_requirements: *id008
124
315
  - !ruby/object:Gem::Dependency
125
- name: hirb
126
- prerelease: false
127
- requirement: &id009 !ruby/object:Gem::Requirement
316
+ version_requirements: &id020 !ruby/object:Gem::Requirement
317
+ none: false
128
318
  requirements:
129
319
  - - ">="
130
320
  - !ruby/object:Gem::Version
321
+ hash: 3
131
322
  segments:
132
323
  - 0
133
324
  version: "0"
325
+ requirement: *id020
326
+ prerelease: false
327
+ name: hirb
134
328
  type: :runtime
135
- version_requirements: *id009
136
329
  description: "High method and class churn has been shown to have increased bug and error rates. This gem helps you know what is changing a lot so you can do additional testing, code review, or refactoring to try to tame the volatile code. "
137
- email: dan@devver.net
330
+ email: dan@mayerdan.com
138
331
  executables:
139
332
  - churn
140
333
  extensions: []
@@ -144,13 +337,16 @@ extra_rdoc_files:
144
337
  - README.rdoc
145
338
  files:
146
339
  - .document
147
- - .gitignore
340
+ - Gemfile
341
+ - Gemfile.lock
148
342
  - LICENSE
149
343
  - README.rdoc
150
344
  - Rakefile
151
345
  - VERSION
152
346
  - bin/churn
347
+ - churn.gemspec
153
348
  - lib/churn.rb
349
+ - lib/churn/bzr_analyzer.rb
154
350
  - lib/churn/churn_calculator.rb
155
351
  - lib/churn/churn_history.rb
156
352
  - lib/churn/git_analyzer.rb
@@ -164,47 +360,44 @@ files:
164
360
  - test/data/churn_calculator.rb
165
361
  - test/data/test_helper.rb
166
362
  - test/test_helper.rb
363
+ - test/unit/bzr_analyzer_test.rb
167
364
  - test/unit/churn_calculator_test.rb
168
365
  - test/unit/churn_history_test.rb
169
366
  - test/unit/git_analyzer_test.rb
170
367
  - test/unit/hg_analyzer_test.rb
171
368
  - test/unit/location_mapping_test.rb
172
- has_rdoc: true
173
369
  homepage: http://github.com/danmayer/churn
174
370
  licenses: []
175
371
 
176
372
  post_install_message:
177
- rdoc_options:
178
- - --charset=UTF-8
373
+ rdoc_options: []
374
+
179
375
  require_paths:
180
376
  - lib
181
377
  required_ruby_version: !ruby/object:Gem::Requirement
378
+ none: false
182
379
  requirements:
183
380
  - - ">="
184
381
  - !ruby/object:Gem::Version
382
+ hash: 3
185
383
  segments:
186
384
  - 0
187
385
  version: "0"
188
386
  required_rubygems_version: !ruby/object:Gem::Requirement
387
+ none: false
189
388
  requirements:
190
389
  - - ">="
191
390
  - !ruby/object:Gem::Version
391
+ hash: 3
192
392
  segments:
193
393
  - 0
194
394
  version: "0"
195
395
  requirements: []
196
396
 
197
397
  rubyforge_project:
198
- rubygems_version: 1.3.6
398
+ rubygems_version: 1.8.10
199
399
  signing_key:
200
400
  specification_version: 3
201
401
  summary: Providing additional churn metrics over the original metric_fu churn
202
- test_files:
203
- - test/data/churn_calculator.rb
204
- - test/data/test_helper.rb
205
- - test/test_helper.rb
206
- - test/unit/churn_calculator_test.rb
207
- - test/unit/churn_history_test.rb
208
- - test/unit/git_analyzer_test.rb
209
- - test/unit/hg_analyzer_test.rb
210
- - test/unit/location_mapping_test.rb
402
+ test_files: []
403
+
data/.gitignore DELETED
@@ -1,6 +0,0 @@
1
- *.sw?
2
- .DS_Store
3
- coverage
4
- rdoc
5
- pkg
6
- tmp