churn 0.0.35 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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