churn 0.0.35 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
- - rbx
5
4
  - 2.0.0
6
5
  - jruby-19mode
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- churn (0.0.35)
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.0)
19
+ arrayfields (4.9.2)
20
20
  chronic (0.10.2)
21
- fattr (2.2.1)
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.0)
26
- main (5.2.0)
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
- map (6.5.1)
32
- mime-types (1.25)
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.2.2)
47
+ ruby_parser (3.4.1)
41
48
  sexp_processor (~> 4.1)
42
- sexp_processor (4.3.0)
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
@@ -28,10 +28,10 @@ module Churn
28
28
 
29
29
  # intialized the churn calculator object
30
30
  def initialize(options={})
31
- @churn_options = ChurnOptions.instance.set_options(options)
31
+ @churn_options = ChurnOptions.new.set_options(options)
32
32
 
33
33
  @minimum_churn_count = @churn_options.minimum_churn_count
34
- @ignore_files = @churn_options.ignore_files
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 || @ignore_files.include?(file) }
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| !@ignore_files.include?(file) }
274
+ files.select{ |file, value| !@ignores.any?{ |ignore| file.match(/#{ignore}/) } }
278
275
  end
279
276
 
280
277
  end
@@ -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 it's hash_data and stores it
8
- def self.store_revision_history(revision, hash_data)
9
- FileUtils.mkdir_p tmp_churn_directory unless File.directory?(tmp_churn_directory)
10
- File.open("#{tmp_churn_directory}/#{revision}.json", 'w') {|file| file.write(hash_data.to_json) }
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 = "#{tmp_churn_directory}/#{revision}.json"
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
@@ -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, :ignore_files, :start_date, :history, :report_host, :name
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
- @ignore_files = ['/dev/null']
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
- @ignore_files = (options.fetch(:ignore_files){ @ignore_files }).to_s.split(',').map(&:strip)
29
- @ignore_files << '/dev/null' unless @ignore_files.include?('/dev/null')
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']
@@ -1,3 +1,3 @@
1
1
  module Churn
2
- VERSION = "0.0.35"
2
+ VERSION = "1.0.1"
3
3
  end
@@ -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
- :ignore_files => ENV['CHURN_IGNORE_FILES'],
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 ignore_files filter" do
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({:ignore_files => "file.rb"})
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 "analize sorts changes" do
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.instance.data_directory
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.instance
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, Churn::ChurnOptions.instance.data_directory
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: 0.0.35
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: 2.0.3
294
+ rubygems_version: 1.8.23
264
295
  signing_key:
265
- specification_version: 4
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