turbulence 1.2.4 → 1.4.0
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.
- checksums.yaml +5 -5
- data/.github/workflows/ci.yml +51 -0
- data/CHANGELOG.md +227 -0
- data/Gemfile.lock +47 -24
- data/LICENSE.txt +7 -0
- data/README.md +100 -31
- data/bin/bule +1 -1
- data/docs/scatter-plot.png +0 -0
- data/docs/treemap.png +0 -0
- data/lib/turbulence/calculators/churn.rb +3 -1
- data/lib/turbulence/calculators/complexity.rb +4 -16
- data/lib/turbulence/cli_parser.rb +12 -1
- data/lib/turbulence/command_line_interface.rb +28 -3
- data/lib/turbulence/configuration.rb +10 -6
- data/lib/turbulence/generators/scatterplot.rb +10 -4
- data/lib/turbulence/generators/treemap.rb +14 -10
- data/lib/turbulence/scm/git.rb +1 -1
- data/lib/turbulence/version.rb +1 -1
- data/lib/turbulence.rb +1 -1
- data/spec/turbulence/calculators/churn_spec.rb +50 -62
- data/spec/turbulence/calculators/complexity_spec.rb +2 -5
- data/spec/turbulence/cli_parser_spec.rb +16 -6
- data/spec/turbulence/command_line_interface_spec.rb +59 -7
- data/spec/turbulence/configuration_spec.rb +11 -5
- data/spec/turbulence/generators/scatter_plot_spec.rb +49 -44
- data/spec/turbulence/generators/treemap_spec.rb +7 -7
- data/spec/turbulence/scm/git_spec.rb +7 -6
- data/spec/turbulence/scm/perforce_spec.rb +44 -40
- data/spec/turbulence/turbulence_spec.rb +4 -4
- data/template/highcharts-heatmap.js +23 -0
- data/template/highcharts-treemap.js +11 -0
- data/template/highcharts.js +28 -162
- data/template/treemap.html +121 -27
- data/template/turbulence.html +34 -12
- data/turbulence.gemspec +13 -9
- metadata +61 -29
- data/.travis.yml +0 -6
data/template/treemap.html
CHANGED
|
@@ -1,29 +1,123 @@
|
|
|
1
1
|
<html>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
2
|
+
<head>
|
|
3
|
+
<script src="jquery.min.js"></script>
|
|
4
|
+
<script src="highcharts.js"></script>
|
|
5
|
+
<script src="highcharts-heatmap.js"></script>
|
|
6
|
+
<script src="highcharts-treemap.js"></script>
|
|
7
|
+
<script src="treemap_data.js"></script>
|
|
8
|
+
<style>
|
|
9
|
+
body {
|
|
10
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
11
|
+
margin: 20px;
|
|
12
|
+
}
|
|
13
|
+
h1 {
|
|
14
|
+
font-size: 1.5em;
|
|
15
|
+
margin-bottom: 0.5em;
|
|
16
|
+
}
|
|
17
|
+
.legend {
|
|
18
|
+
display: flex;
|
|
19
|
+
gap: 30px;
|
|
20
|
+
margin-bottom: 15px;
|
|
21
|
+
font-size: 14px;
|
|
22
|
+
}
|
|
23
|
+
.legend-item {
|
|
24
|
+
display: flex;
|
|
25
|
+
align-items: center;
|
|
26
|
+
gap: 8px;
|
|
27
|
+
}
|
|
28
|
+
.legend-icon {
|
|
29
|
+
width: 20px;
|
|
30
|
+
height: 20px;
|
|
31
|
+
border: 1px solid #ccc;
|
|
32
|
+
}
|
|
33
|
+
.legend-icon.size-large { width: 24px; height: 24px; background: #888; }
|
|
34
|
+
.legend-icon.size-small { width: 12px; height: 12px; background: #888; }
|
|
35
|
+
.color-gradient {
|
|
36
|
+
width: 80px;
|
|
37
|
+
height: 20px;
|
|
38
|
+
background: linear-gradient(to right, #0d0, #ddd, #f00);
|
|
39
|
+
}
|
|
40
|
+
.tip {
|
|
41
|
+
margin-top: 15px;
|
|
42
|
+
padding: 10px 15px;
|
|
43
|
+
background: #fffbe6;
|
|
44
|
+
border-left: 4px solid #f90;
|
|
45
|
+
font-size: 13px;
|
|
46
|
+
max-width: 900px;
|
|
47
|
+
}
|
|
48
|
+
</style>
|
|
49
|
+
<script>
|
|
50
|
+
$(document).ready(function() {
|
|
51
|
+
Highcharts.chart('container', {
|
|
52
|
+
chart: {
|
|
53
|
+
backgroundColor: '#fff'
|
|
54
|
+
},
|
|
55
|
+
colorAxis: {
|
|
56
|
+
stops: [
|
|
57
|
+
[0, '#0d0'],
|
|
58
|
+
[0.5, '#ddd'],
|
|
59
|
+
[1, '#f00']
|
|
60
|
+
],
|
|
61
|
+
labels: {
|
|
62
|
+
enabled: false
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
title: {
|
|
66
|
+
text: null
|
|
67
|
+
},
|
|
68
|
+
tooltip: {
|
|
69
|
+
formatter: function() {
|
|
70
|
+
return '<b>' + this.point.name + '</b><br/>' +
|
|
71
|
+
'churn: ' + this.point.value + '<br/>' +
|
|
72
|
+
'complexity: ' + this.point.colorValue.toFixed(1);
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
series: [{
|
|
76
|
+
type: 'treemap',
|
|
77
|
+
layoutAlgorithm: 'squarified',
|
|
78
|
+
colorKey: 'colorValue',
|
|
79
|
+
data: treemap_data,
|
|
80
|
+
dataLabels: {
|
|
81
|
+
enabled: true,
|
|
82
|
+
style: {
|
|
83
|
+
textOverflow: 'ellipsis',
|
|
84
|
+
fontSize: '11px',
|
|
85
|
+
fontWeight: 'normal',
|
|
86
|
+
fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
|
|
87
|
+
color: '#000',
|
|
88
|
+
textOutline: 'none'
|
|
22
89
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
90
|
+
},
|
|
91
|
+
levels: [{
|
|
92
|
+
level: 1,
|
|
93
|
+
borderWidth: 2,
|
|
94
|
+
borderColor: '#fff'
|
|
95
|
+
}]
|
|
96
|
+
}]
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
</script>
|
|
100
|
+
</head>
|
|
101
|
+
<body>
|
|
102
|
+
<h1>Churn vs Complexity Treemap</h1>
|
|
103
|
+
<div class="legend">
|
|
104
|
+
<div class="legend-item">
|
|
105
|
+
<strong>Size</strong> = Churn (how often the file changes)
|
|
106
|
+
<span class="legend-icon size-large"></span>
|
|
107
|
+
<span style="font-size: 12px;">more</span>
|
|
108
|
+
<span class="legend-icon size-small"></span>
|
|
109
|
+
<span style="font-size: 12px;">less</span>
|
|
110
|
+
</div>
|
|
111
|
+
<div class="legend-item">
|
|
112
|
+
<strong>Color</strong> = Complexity
|
|
113
|
+
<div class="color-gradient"></div>
|
|
114
|
+
<span style="font-size: 12px;">low → high</span>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
<div id="container" style="width: 900px; height: 500px;"></div>
|
|
118
|
+
<div class="tip">
|
|
119
|
+
<strong>Tip:</strong> Look for <strong>big red boxes</strong> — these are high-churn, high-complexity files and prime candidates for refactoring.
|
|
120
|
+
Hover over boxes to see details.
|
|
121
|
+
</div>
|
|
122
|
+
</body>
|
|
123
|
+
</html>
|
data/template/turbulence.html
CHANGED
|
@@ -3,17 +3,37 @@
|
|
|
3
3
|
<script src="jquery.min.js"></script>
|
|
4
4
|
<script src="highcharts.js"></script>
|
|
5
5
|
<script src="cc.js"></script>
|
|
6
|
+
<style>
|
|
7
|
+
body {
|
|
8
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
9
|
+
margin: 20px;
|
|
10
|
+
}
|
|
11
|
+
h1 {
|
|
12
|
+
font-size: 1.5em;
|
|
13
|
+
margin-bottom: 0.5em;
|
|
14
|
+
}
|
|
15
|
+
.tip {
|
|
16
|
+
margin-top: 15px;
|
|
17
|
+
padding: 10px 15px;
|
|
18
|
+
background: #fffbe6;
|
|
19
|
+
border-left: 4px solid #f90;
|
|
20
|
+
font-size: 13px;
|
|
21
|
+
max-width: 900px;
|
|
22
|
+
}
|
|
23
|
+
</style>
|
|
6
24
|
<script>
|
|
7
25
|
$(document).ready(function() {
|
|
8
26
|
var chart = new Highcharts.Chart({
|
|
9
27
|
chart: {
|
|
10
28
|
renderTo: 'container',
|
|
11
29
|
defaultSeriesType: 'scatter',
|
|
12
|
-
zoomType: 'xy'
|
|
30
|
+
zoomType: 'xy',
|
|
31
|
+
backgroundColor: '#fff'
|
|
13
32
|
},
|
|
14
33
|
title: {
|
|
15
|
-
text:
|
|
34
|
+
text: null
|
|
16
35
|
},
|
|
36
|
+
colors: ['#4572A7', '#AA4643', '#89A54E', '#80699B', '#3D96AE', '#DB843D', '#92A8CD', '#A47D7C', '#B5CA92'],
|
|
17
37
|
xAxis: {
|
|
18
38
|
title: {
|
|
19
39
|
enabled: true,
|
|
@@ -21,6 +41,8 @@ $(document).ready(function() {
|
|
|
21
41
|
},
|
|
22
42
|
startOnTick: false,
|
|
23
43
|
endOnTick: false,
|
|
44
|
+
minPadding: 0.02,
|
|
45
|
+
maxPadding: 0.02,
|
|
24
46
|
labels: {enabled:false},
|
|
25
47
|
lineWidth: 0,
|
|
26
48
|
tickWidth: 0
|
|
@@ -31,6 +53,8 @@ $(document).ready(function() {
|
|
|
31
53
|
},
|
|
32
54
|
startOnTick: false,
|
|
33
55
|
endOnTick: false,
|
|
56
|
+
minPadding: 0.02,
|
|
57
|
+
maxPadding: 0.05,
|
|
34
58
|
labels: {enabled:false}
|
|
35
59
|
},
|
|
36
60
|
tooltip: {
|
|
@@ -47,16 +71,10 @@ $(document).ready(function() {
|
|
|
47
71
|
states: {
|
|
48
72
|
hover: {
|
|
49
73
|
enabled: true,
|
|
74
|
+
radius: 7,
|
|
50
75
|
lineColor: 'rgb(100,100,100)'
|
|
51
76
|
}
|
|
52
77
|
}
|
|
53
|
-
},
|
|
54
|
-
states: {
|
|
55
|
-
hover: {
|
|
56
|
-
marker: {
|
|
57
|
-
enabled: false
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
78
|
}
|
|
61
79
|
}
|
|
62
80
|
}
|
|
@@ -75,7 +93,11 @@ $(document).ready(function() {
|
|
|
75
93
|
</script>
|
|
76
94
|
</head>
|
|
77
95
|
<body>
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
96
|
+
<h1>Churn vs Complexity</h1>
|
|
97
|
+
<div id='container' style="width: 900px; height: 500px;"></div>
|
|
98
|
+
<div class="tip">
|
|
99
|
+
<strong>Tip:</strong> Files in the <strong>upper right</strong> (high churn + high complexity) are prime candidates for refactoring.
|
|
100
|
+
Click and drag to zoom, click the legend to toggle directories.
|
|
101
|
+
</div>
|
|
102
|
+
</body>
|
|
81
103
|
</html>
|
data/turbulence.gemspec
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
$:.push File.expand_path("../lib", __FILE__)
|
|
3
4
|
require "turbulence/version"
|
|
4
5
|
|
|
@@ -8,21 +9,24 @@ Gem::Specification.new do |s|
|
|
|
8
9
|
s.platform = Gem::Platform::RUBY
|
|
9
10
|
s.authors = ["Chad Fowler", "Michael Feathers", "Corey Haines"]
|
|
10
11
|
s.email = ["chad@chadfowler.com", "mfeathers@obtiva.com", "coreyhaines@gmail.com"]
|
|
11
|
-
s.homepage = "
|
|
12
|
-
s.
|
|
13
|
-
|
|
12
|
+
s.homepage = "https://github.com/chad/turbulence"
|
|
13
|
+
s.license = "MIT"
|
|
14
|
+
|
|
15
|
+
s.add_dependency "flog", ">= 4.1"
|
|
16
|
+
s.add_dependency "json"
|
|
14
17
|
s.add_dependency "launchy", ">= 2.0.0"
|
|
15
|
-
s.
|
|
18
|
+
s.add_dependency "racc" # Required by flog's ruby_parser, removed from stdlib in Ruby 3.3+
|
|
19
|
+
|
|
20
|
+
s.add_development_dependency 'rspec', '~> 3.0'
|
|
21
|
+
s.add_development_dependency 'rspec-its'
|
|
16
22
|
s.add_development_dependency 'rake'
|
|
17
23
|
|
|
18
24
|
s.summary = %q{Automates churn + flog scoring on a git repo for a Ruby project}
|
|
19
|
-
s.description = %q{Based on
|
|
20
|
-
|
|
21
|
-
s.rubyforge_project = "turbulence"
|
|
25
|
+
s.description = %q{Automates churn + flog scoring on a git repo for a Ruby project. Based on the article https://www.stickyminds.com/article/getting-empirical-about-refactoring}
|
|
22
26
|
|
|
23
27
|
s.files = `git ls-files`.split("\n")
|
|
24
28
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
25
29
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
26
30
|
s.require_paths = ["lib"]
|
|
27
|
-
s.required_ruby_version = '>=
|
|
31
|
+
s.required_ruby_version = '>= 3.0'
|
|
28
32
|
end
|
metadata
CHANGED
|
@@ -1,88 +1,116 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: turbulence
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Chad Fowler
|
|
8
8
|
- Michael Feathers
|
|
9
9
|
- Corey Haines
|
|
10
|
-
autorequire:
|
|
11
10
|
bindir: bin
|
|
12
11
|
cert_chain: []
|
|
13
|
-
date:
|
|
12
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
14
13
|
dependencies:
|
|
15
14
|
- !ruby/object:Gem::Dependency
|
|
16
15
|
name: flog
|
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
|
18
17
|
requirements:
|
|
19
|
-
- -
|
|
18
|
+
- - ">="
|
|
20
19
|
- !ruby/object:Gem::Version
|
|
21
20
|
version: '4.1'
|
|
22
21
|
type: :runtime
|
|
23
22
|
prerelease: false
|
|
24
23
|
version_requirements: !ruby/object:Gem::Requirement
|
|
25
24
|
requirements:
|
|
26
|
-
- -
|
|
25
|
+
- - ">="
|
|
27
26
|
- !ruby/object:Gem::Version
|
|
28
27
|
version: '4.1'
|
|
29
28
|
- !ruby/object:Gem::Dependency
|
|
30
29
|
name: json
|
|
31
30
|
requirement: !ruby/object:Gem::Requirement
|
|
32
31
|
requirements:
|
|
33
|
-
- -
|
|
32
|
+
- - ">="
|
|
34
33
|
- !ruby/object:Gem::Version
|
|
35
|
-
version:
|
|
34
|
+
version: '0'
|
|
36
35
|
type: :runtime
|
|
37
36
|
prerelease: false
|
|
38
37
|
version_requirements: !ruby/object:Gem::Requirement
|
|
39
38
|
requirements:
|
|
40
|
-
- -
|
|
39
|
+
- - ">="
|
|
41
40
|
- !ruby/object:Gem::Version
|
|
42
|
-
version:
|
|
41
|
+
version: '0'
|
|
43
42
|
- !ruby/object:Gem::Dependency
|
|
44
43
|
name: launchy
|
|
45
44
|
requirement: !ruby/object:Gem::Requirement
|
|
46
45
|
requirements:
|
|
47
|
-
- -
|
|
46
|
+
- - ">="
|
|
48
47
|
- !ruby/object:Gem::Version
|
|
49
48
|
version: 2.0.0
|
|
50
49
|
type: :runtime
|
|
51
50
|
prerelease: false
|
|
52
51
|
version_requirements: !ruby/object:Gem::Requirement
|
|
53
52
|
requirements:
|
|
54
|
-
- -
|
|
53
|
+
- - ">="
|
|
55
54
|
- !ruby/object:Gem::Version
|
|
56
55
|
version: 2.0.0
|
|
56
|
+
- !ruby/object:Gem::Dependency
|
|
57
|
+
name: racc
|
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
|
59
|
+
requirements:
|
|
60
|
+
- - ">="
|
|
61
|
+
- !ruby/object:Gem::Version
|
|
62
|
+
version: '0'
|
|
63
|
+
type: :runtime
|
|
64
|
+
prerelease: false
|
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
66
|
+
requirements:
|
|
67
|
+
- - ">="
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '0'
|
|
57
70
|
- !ruby/object:Gem::Dependency
|
|
58
71
|
name: rspec
|
|
59
72
|
requirement: !ruby/object:Gem::Requirement
|
|
60
73
|
requirements:
|
|
61
|
-
- - ~>
|
|
74
|
+
- - "~>"
|
|
75
|
+
- !ruby/object:Gem::Version
|
|
76
|
+
version: '3.0'
|
|
77
|
+
type: :development
|
|
78
|
+
prerelease: false
|
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
80
|
+
requirements:
|
|
81
|
+
- - "~>"
|
|
82
|
+
- !ruby/object:Gem::Version
|
|
83
|
+
version: '3.0'
|
|
84
|
+
- !ruby/object:Gem::Dependency
|
|
85
|
+
name: rspec-its
|
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
|
87
|
+
requirements:
|
|
88
|
+
- - ">="
|
|
62
89
|
- !ruby/object:Gem::Version
|
|
63
|
-
version:
|
|
90
|
+
version: '0'
|
|
64
91
|
type: :development
|
|
65
92
|
prerelease: false
|
|
66
93
|
version_requirements: !ruby/object:Gem::Requirement
|
|
67
94
|
requirements:
|
|
68
|
-
- -
|
|
95
|
+
- - ">="
|
|
69
96
|
- !ruby/object:Gem::Version
|
|
70
|
-
version:
|
|
97
|
+
version: '0'
|
|
71
98
|
- !ruby/object:Gem::Dependency
|
|
72
99
|
name: rake
|
|
73
100
|
requirement: !ruby/object:Gem::Requirement
|
|
74
101
|
requirements:
|
|
75
|
-
- -
|
|
102
|
+
- - ">="
|
|
76
103
|
- !ruby/object:Gem::Version
|
|
77
104
|
version: '0'
|
|
78
105
|
type: :development
|
|
79
106
|
prerelease: false
|
|
80
107
|
version_requirements: !ruby/object:Gem::Requirement
|
|
81
108
|
requirements:
|
|
82
|
-
- -
|
|
109
|
+
- - ">="
|
|
83
110
|
- !ruby/object:Gem::Version
|
|
84
111
|
version: '0'
|
|
85
|
-
description:
|
|
112
|
+
description: Automates churn + flog scoring on a git repo for a Ruby project. Based
|
|
113
|
+
on the article https://www.stickyminds.com/article/getting-empirical-about-refactoring
|
|
86
114
|
email:
|
|
87
115
|
- chad@chadfowler.com
|
|
88
116
|
- mfeathers@obtiva.com
|
|
@@ -92,13 +120,17 @@ executables:
|
|
|
92
120
|
extensions: []
|
|
93
121
|
extra_rdoc_files: []
|
|
94
122
|
files:
|
|
95
|
-
- .
|
|
96
|
-
- .
|
|
123
|
+
- ".github/workflows/ci.yml"
|
|
124
|
+
- ".gitignore"
|
|
125
|
+
- CHANGELOG.md
|
|
97
126
|
- Gemfile
|
|
98
127
|
- Gemfile.lock
|
|
128
|
+
- LICENSE.txt
|
|
99
129
|
- README.md
|
|
100
130
|
- Rakefile
|
|
101
131
|
- bin/bule
|
|
132
|
+
- docs/scatter-plot.png
|
|
133
|
+
- docs/treemap.png
|
|
102
134
|
- lib/turbulence.rb
|
|
103
135
|
- lib/turbulence/calculators/churn.rb
|
|
104
136
|
- lib/turbulence/calculators/complexity.rb
|
|
@@ -123,33 +155,33 @@ files:
|
|
|
123
155
|
- spec/turbulence/scm/perforce_spec.rb
|
|
124
156
|
- spec/turbulence/turbulence_spec.rb
|
|
125
157
|
- template/highchart_template.js.erb
|
|
158
|
+
- template/highcharts-heatmap.js
|
|
159
|
+
- template/highcharts-treemap.js
|
|
126
160
|
- template/highcharts.js
|
|
127
161
|
- template/jquery.min.js
|
|
128
162
|
- template/treemap.html
|
|
129
163
|
- template/turbulence.html
|
|
130
164
|
- turbulence.gemspec
|
|
131
165
|
- win_rakefile_location_fix.rb
|
|
132
|
-
homepage:
|
|
133
|
-
licenses:
|
|
166
|
+
homepage: https://github.com/chad/turbulence
|
|
167
|
+
licenses:
|
|
168
|
+
- MIT
|
|
134
169
|
metadata: {}
|
|
135
|
-
post_install_message:
|
|
136
170
|
rdoc_options: []
|
|
137
171
|
require_paths:
|
|
138
172
|
- lib
|
|
139
173
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
140
174
|
requirements:
|
|
141
|
-
- -
|
|
175
|
+
- - ">="
|
|
142
176
|
- !ruby/object:Gem::Version
|
|
143
|
-
version:
|
|
177
|
+
version: '3.0'
|
|
144
178
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
179
|
requirements:
|
|
146
|
-
- -
|
|
180
|
+
- - ">="
|
|
147
181
|
- !ruby/object:Gem::Version
|
|
148
182
|
version: '0'
|
|
149
183
|
requirements: []
|
|
150
|
-
|
|
151
|
-
rubygems_version: 2.0.6
|
|
152
|
-
signing_key:
|
|
184
|
+
rubygems_version: 4.0.10
|
|
153
185
|
specification_version: 4
|
|
154
186
|
summary: Automates churn + flog scoring on a git repo for a Ruby project
|
|
155
187
|
test_files:
|