codespicuous 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/codespicuous.gemspec +1 -0
- data/lib/codespicuous/codespicuous.rb +4 -5
- data/lib/codespicuous/codespicuousconfigurator.rb +18 -17
- data/lib/codespicuous/commithistory.rb +8 -3
- data/lib/codespicuous/committer.rb +15 -2
- data/lib/codespicuous/repository_lister.rb +27 -0
- data/lib/codespicuous/svn_data_collector.rb +4 -4
- data/lib/codespicuous/teams.rb +24 -0
- data/lib/codespicuous/version.rb +1 -1
- data/spec/codespicuous_spec.rb +2 -6
- data/spec/codespicuousconfigurator_spec.rb +14 -10
- data/spec/committers_spec.rb +16 -10
- data/spec/integration_filezilla_spec.rb +1 -0
- data/spec/repository_lister_spec.rb +23 -0
- data/spec/svn_data_collector_spec.rb +3 -1
- data/spec/teams_spec.rb +3 -2
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2f6aa844f077caec750d39a33e9c748daca60eed
|
4
|
+
data.tar.gz: 66f2b73f5bfe77d9bee7f12c20fbf0916eb46138
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6fb02298619c7efe10bb65731cf6023d92ed9e7e2fd59042e01f9f90a8f1cfc4a330898569565badf7ecab0c05293b04b7c34b83696d66e6d2b6b7b8a63fae01
|
7
|
+
data.tar.gz: f880b34a43da171ee189fd8ba3e3d6ad66c6c466702902e23ecd2df0f1c505fc4fbff2629996e3cd19c9417d3278885b49aa59e7db0c1c9d330d9df40aef7262
|
data/codespicuous.gemspec
CHANGED
@@ -6,6 +6,7 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.version = Codespicuous::VERSION
|
7
7
|
gem.date = Date.today.to_s
|
8
8
|
gem.license = "MIT"
|
9
|
+
gem.executables = [ "codespicuous" ]
|
9
10
|
|
10
11
|
gem.summary = "Codespicuous is a tool for generating team based metrics from code"
|
11
12
|
gem.description = "Codespicuous is a tool for generating several different metrics from codebases to gain insight in how the teams are working."
|
@@ -7,6 +7,7 @@ class Codespicuous
|
|
7
7
|
|
8
8
|
def initialize
|
9
9
|
@config = CodespicuousConfig.new
|
10
|
+
@commit_history = CommitHistory.new
|
10
11
|
end
|
11
12
|
|
12
13
|
def run(argv)
|
@@ -31,16 +32,14 @@ class Codespicuous
|
|
31
32
|
configurator = CodespicuousConfigurator.new(@config)
|
32
33
|
return false unless configurator.configure(argv)
|
33
34
|
|
34
|
-
@
|
35
|
-
@committers = configurator.committers
|
36
|
-
@teams = configurator.teams
|
35
|
+
@commit_history.configure(configurator.teams, configurator.repositories)
|
37
36
|
|
38
37
|
true
|
39
38
|
end
|
40
39
|
|
41
40
|
def collect
|
42
|
-
collector = SVNDataCollector.new(config)
|
43
|
-
|
41
|
+
collector = SVNDataCollector.new(config, @commit_history)
|
42
|
+
collector.collect_commit_history(@commit_history.repositories)
|
44
43
|
end
|
45
44
|
|
46
45
|
def generate_output
|
@@ -3,7 +3,7 @@ require 'yaml'
|
|
3
3
|
class CodespicuousConfigurator
|
4
4
|
|
5
5
|
|
6
|
-
attr_reader :repositories, :repositories_to_check, :
|
6
|
+
attr_reader :repositories, :repositories_to_check, :teams, :config
|
7
7
|
|
8
8
|
def initialize(config)
|
9
9
|
|
@@ -12,7 +12,6 @@ class CodespicuousConfigurator
|
|
12
12
|
@repositories = Repositories.new
|
13
13
|
@repositories_to_check = Repositories.new
|
14
14
|
|
15
|
-
@committers = Committers.new
|
16
15
|
@teams = Teams.new
|
17
16
|
end
|
18
17
|
|
@@ -63,7 +62,7 @@ class CodespicuousConfigurator
|
|
63
62
|
puts "** Configuring options with \"#{config.path_to_configuration_file}\""
|
64
63
|
yaml_content = YAML::load(File.read(config.path_to_configuration_file))
|
65
64
|
config.offline = yaml_content["offline"] if yaml_content["offline"]
|
66
|
-
|
65
|
+
yaml_content
|
67
66
|
end
|
68
67
|
|
69
68
|
def postprocess_yaml_configuration_repositories(yaml_content)
|
@@ -102,35 +101,37 @@ class CodespicuousConfigurator
|
|
102
101
|
end
|
103
102
|
|
104
103
|
def postprocess_yaml_configuration_committers(yaml_content)
|
105
|
-
|
104
|
+
teams_yaml = yaml_content["teams"] || []
|
106
105
|
|
107
|
-
|
108
|
-
|
106
|
+
teams_yaml.each do |team_name, team_members|
|
107
|
+
|
108
|
+
committers = Committers.new
|
109
109
|
team_members.each { |person|
|
110
|
-
|
111
|
-
new_team.add_member(committer)
|
112
|
-
@committers.add(committer)
|
113
|
-
@teams.add(new_team)
|
110
|
+
committers.add(Committer.create_committer(person["Login"], person["First Name"], person["Last Name"], person["Email"]))
|
114
111
|
}
|
115
|
-
|
112
|
+
|
113
|
+
unless committers.empty?
|
114
|
+
new_team = Team.new(team_name)
|
115
|
+
new_team.add_members(committers)
|
116
|
+
@teams.add(new_team)
|
117
|
+
end
|
118
|
+
end
|
116
119
|
end
|
117
120
|
|
118
121
|
def find_alternative_configuration_files_for_committers
|
119
|
-
return unless
|
122
|
+
return unless teams.empty?
|
120
123
|
return unless File.exist?("committers.csv")
|
121
124
|
|
122
125
|
puts '** Configuring committers with "committers.csv"'
|
123
126
|
|
124
|
-
@committers = Committers.new
|
125
127
|
@teams = Teams.new
|
126
128
|
|
127
129
|
CSV.parse(File.read("committers.csv"), headers: true) { |row|
|
128
|
-
|
129
|
-
|
130
|
+
committer = Committer.create_committer(row["Login"], row["First Name"], row["Last Name"], row["Email"])
|
131
|
+
|
132
|
+
team = @teams.team(row["Team"] || "")
|
130
133
|
team.add_member(committer)
|
131
|
-
@committers.add(committer)
|
132
134
|
}
|
133
|
-
@committers
|
134
135
|
end
|
135
136
|
|
136
137
|
end
|
@@ -4,12 +4,17 @@ class CommitHistory
|
|
4
4
|
|
5
5
|
attr_reader :commits, :teams, :repositories, :committers
|
6
6
|
|
7
|
-
def initialize
|
7
|
+
def initialize
|
8
8
|
@commits = Commits.new
|
9
|
-
@committers = Committers.new
|
10
9
|
@teams = Teams.new
|
10
|
+
@committers = teams.committers
|
11
11
|
@repositories = Repositories.new
|
12
|
-
|
12
|
+
end
|
13
|
+
|
14
|
+
def configure(teams, repositories)
|
15
|
+
@teams = teams
|
16
|
+
@committers = teams.committers
|
17
|
+
@repositories = repositories
|
13
18
|
end
|
14
19
|
|
15
20
|
def add_commit(commit)
|
@@ -9,12 +9,11 @@ class Committer
|
|
9
9
|
@commits = Commits.new
|
10
10
|
end
|
11
11
|
|
12
|
-
def self.create_committer(login, firstname, lastname, email
|
12
|
+
def self.create_committer(login, firstname, lastname, email)
|
13
13
|
committer = Committer.new(login)
|
14
14
|
committer.first_name = firstname
|
15
15
|
committer.last_name = lastname
|
16
16
|
committer.email = email
|
17
|
-
committer.team = team
|
18
17
|
committer
|
19
18
|
end
|
20
19
|
|
@@ -47,6 +46,14 @@ class Committer
|
|
47
46
|
@commits.amount_of_commits_to_repository_in_week(name, week_start)
|
48
47
|
end
|
49
48
|
|
49
|
+
def committed_repositories
|
50
|
+
repositories = []
|
51
|
+
commits.each do |commit|
|
52
|
+
repositories.push(commit.repository)
|
53
|
+
end
|
54
|
+
repositories.uniq
|
55
|
+
end
|
56
|
+
|
50
57
|
def ==(committer)
|
51
58
|
username == committer.username &&
|
52
59
|
first_name == committer.first_name &&
|
@@ -77,6 +84,12 @@ class Committers
|
|
77
84
|
@committers[name] ||= Committer.new(name)
|
78
85
|
end
|
79
86
|
|
87
|
+
def each
|
88
|
+
@committers.values.each do |committer|
|
89
|
+
yield committer
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
80
93
|
def amount
|
81
94
|
@committers.size
|
82
95
|
end
|
@@ -4,5 +4,32 @@ class RepositoryLister
|
|
4
4
|
|
5
5
|
def list(commit_history)
|
6
6
|
|
7
|
+
teams_and_repositories = collect_teams_and_repositories_they_committed_to(commit_history)
|
8
|
+
|
9
|
+
if teams_and_repositories.empty?
|
10
|
+
puts "No teams committed in any of the repositories"
|
11
|
+
return
|
12
|
+
end
|
13
|
+
|
14
|
+
print_teams_commit_to_which_repository(teams_and_repositories)
|
15
|
+
end
|
16
|
+
|
17
|
+
def collect_teams_and_repositories_they_committed_to(commit_history)
|
18
|
+
teams_and_repositories = {}
|
19
|
+
commit_history.teams.each do |team|
|
20
|
+
repositories = team.committed_repositories
|
21
|
+
teams_and_repositories[team.name] = repositories unless repositories.empty?
|
22
|
+
end
|
23
|
+
teams_and_repositories
|
24
|
+
end
|
25
|
+
|
26
|
+
def print_teams_commit_to_which_repository(teams_and_repositories)
|
27
|
+
teams_and_repositories.each do |team, repositories|
|
28
|
+
repositories_string = ""
|
29
|
+
repositories.each do |repository|
|
30
|
+
repositories_string += " " + repository.name + "\n"
|
31
|
+
end
|
32
|
+
puts "Team \"#{team}\" committed in:\n" + repositories_string
|
33
|
+
end
|
7
34
|
end
|
8
35
|
end
|
@@ -4,7 +4,8 @@ class SVNDataCollector
|
|
4
4
|
|
5
5
|
attr_reader :config
|
6
6
|
|
7
|
-
def initialize(config)
|
7
|
+
def initialize(config, commit_history = CommitHistory.new)
|
8
|
+
@commit_history = commit_history
|
8
9
|
@config = config
|
9
10
|
end
|
10
11
|
|
@@ -40,11 +41,10 @@ class SVNDataCollector
|
|
40
41
|
end
|
41
42
|
|
42
43
|
def collect_commit_history(repositories)
|
43
|
-
commit_history = CommitHistory.new
|
44
44
|
repositories.each { | repository|
|
45
|
-
commit_history.add_commits(collect_commits_for_repository(repository))
|
45
|
+
@commit_history.add_commits(collect_commits_for_repository(repository))
|
46
46
|
}
|
47
|
-
commit_history
|
47
|
+
@commit_history
|
48
48
|
end
|
49
49
|
|
50
50
|
end
|
data/lib/codespicuous/teams.rb
CHANGED
@@ -13,6 +13,10 @@ class Team
|
|
13
13
|
member.team = self
|
14
14
|
end
|
15
15
|
|
16
|
+
def add_members(members)
|
17
|
+
members.each { |member| add_member(member) }
|
18
|
+
end
|
19
|
+
|
16
20
|
def members
|
17
21
|
@members.values
|
18
22
|
end
|
@@ -38,6 +42,16 @@ class Team
|
|
38
42
|
def ==(team)
|
39
43
|
name == team.name && members == team.members
|
40
44
|
end
|
45
|
+
|
46
|
+
def committed_repositories
|
47
|
+
|
48
|
+
repositories = []
|
49
|
+
|
50
|
+
each_member do |member|
|
51
|
+
repositories += member.committed_repositories
|
52
|
+
end
|
53
|
+
repositories.uniq
|
54
|
+
end
|
41
55
|
end
|
42
56
|
|
43
57
|
class Teams
|
@@ -62,6 +76,16 @@ class Teams
|
|
62
76
|
}
|
63
77
|
end
|
64
78
|
|
79
|
+
def committers
|
80
|
+
committers = Committers.new
|
81
|
+
each_member { |team, committer| committers.add(committer) }
|
82
|
+
committers
|
83
|
+
end
|
84
|
+
|
85
|
+
def empty?
|
86
|
+
@teams.empty?
|
87
|
+
end
|
88
|
+
|
65
89
|
def map(&block)
|
66
90
|
@teams.values.map(&block)
|
67
91
|
end
|
data/lib/codespicuous/version.rb
CHANGED
data/spec/codespicuous_spec.rb
CHANGED
@@ -37,27 +37,23 @@ describe "Codespicuous command line" do
|
|
37
37
|
it "configures the config data" do
|
38
38
|
configurator = CodespicuousConfigurator.new(subject.config)
|
39
39
|
repositories = Repositories.new
|
40
|
-
committers = Committers.new
|
41
40
|
teams = Teams.new
|
42
41
|
|
43
42
|
expect(CodespicuousConfigurator).to receive(:new).and_return(configurator)
|
44
43
|
expect(configurator).to receive(:configure).with(["argv"]).and_return(true)
|
45
44
|
|
46
45
|
expect(configurator).to receive(:repositories).and_return(repositories)
|
47
|
-
expect(configurator).to receive(:committers).and_return(committers)
|
48
46
|
expect(configurator).to receive(:teams).and_return(teams)
|
47
|
+
expect(subject.commit_history).to receive(:configure).with(teams, repositories)
|
49
48
|
|
50
49
|
subject.configure(["argv"])
|
51
|
-
expect(subject.committers).to be committers
|
52
|
-
expect(subject.repositories).to be repositories
|
53
|
-
expect(subject.teams).to be teams
|
54
50
|
end
|
55
51
|
|
56
52
|
it "collects the input data" do
|
57
53
|
collector = SVNDataCollector.new(subject.config)
|
58
54
|
commit_history = CommitHistory.new
|
59
55
|
expect(SVNDataCollector).to receive(:new).and_return(collector)
|
60
|
-
expect(collector).to receive(:collect_commit_history).with(
|
56
|
+
expect(collector).to receive(:collect_commit_history).with(commit_history.repositories).and_return(commit_history)
|
61
57
|
|
62
58
|
subject.collect
|
63
59
|
|
@@ -130,14 +130,14 @@ describe "CodepicuousConfigurator reads all the config files and provides the da
|
|
130
130
|
context "Parsing the teams and committers" do
|
131
131
|
|
132
132
|
before (:each) do
|
133
|
+
@committer_bas = Committer.create_committer("basvodde", "Bas", "Vodde", "basv@wow.com")
|
133
134
|
@team_wine = Team.new("Wine")
|
134
|
-
@
|
135
|
+
@team_wine.add_member(@committer_bas)
|
135
136
|
end
|
136
137
|
|
137
138
|
it "can have no committers and teams. Just empty then" do
|
138
139
|
subject.postprocess_yaml_configuration_committers({})
|
139
140
|
|
140
|
-
expect(subject.committers).to eq Committers.new
|
141
141
|
expect(subject.teams).to eq Teams.new
|
142
142
|
end
|
143
143
|
|
@@ -160,15 +160,17 @@ describe "CodepicuousConfigurator reads all the config files and provides the da
|
|
160
160
|
teams = Teams.new
|
161
161
|
teams.add(@team_wine)
|
162
162
|
|
163
|
-
expect(subject.committers).to eq committers
|
164
163
|
expect(subject.teams).to eq teams
|
165
164
|
|
166
165
|
end
|
167
166
|
|
168
167
|
it "will not bother checking the CSV file when it found committers already" do
|
169
|
-
|
170
|
-
|
171
|
-
|
168
|
+
teams = Teams.new
|
169
|
+
team = Team.new("Wine")
|
170
|
+
team.add_member(@committer_bas)
|
171
|
+
teams.add(team)
|
172
|
+
|
173
|
+
expect(subject).to receive(:teams).and_return(teams)
|
172
174
|
expect(File).not_to receive(:exist?)
|
173
175
|
|
174
176
|
subject.find_alternative_configuration_files_for_committers
|
@@ -179,7 +181,7 @@ describe "CodepicuousConfigurator reads all the config files and provides the da
|
|
179
181
|
|
180
182
|
subject.find_alternative_configuration_files_for_committers
|
181
183
|
|
182
|
-
expect(subject.
|
184
|
+
expect(subject.teams).to eq Teams.new
|
183
185
|
end
|
184
186
|
|
185
187
|
it "will read the CSV file when it exists" do
|
@@ -190,10 +192,12 @@ describe "CodepicuousConfigurator reads all the config files and provides the da
|
|
190
192
|
|
191
193
|
subject.find_alternative_configuration_files_for_committers
|
192
194
|
|
193
|
-
|
194
|
-
|
195
|
+
teams = Teams.new
|
196
|
+
team = Team.new("Wine")
|
197
|
+
team.add_member(@committer_bas)
|
198
|
+
teams.add(team)
|
195
199
|
|
196
|
-
expect(subject.
|
200
|
+
expect(subject.teams).to eq teams
|
197
201
|
end
|
198
202
|
|
199
203
|
end
|
data/spec/committers_spec.rb
CHANGED
@@ -8,19 +8,20 @@ describe "The committers and the teams that we're examining" do
|
|
8
8
|
@committers = Committers.new
|
9
9
|
@teams = Teams.new
|
10
10
|
|
11
|
-
wine = Team.new("Wine")
|
12
|
-
cheese = Team.new("Cheese")
|
13
11
|
|
14
|
-
bas = Committer.create_committer("basvodde", "Bas", "Vodde", "basv@wow.com"
|
15
|
-
janne = Committer.create_committer("janne", "Janne", "Yeah", "janne@yeah.com"
|
16
|
-
daniel = Committer.create_committer("daniel", "Daniel", "Hum", "daniel@hum.com"
|
12
|
+
bas = Committer.create_committer("basvodde", "Bas", "Vodde", "basv@wow.com")
|
13
|
+
janne = Committer.create_committer("janne", "Janne", "Yeah", "janne@yeah.com")
|
14
|
+
daniel = Committer.create_committer("daniel", "Daniel", "Hum", "daniel@hum.com")
|
17
15
|
|
18
16
|
@committers.add(bas)
|
19
17
|
@committers.add(daniel)
|
20
18
|
@committers.add(janne)
|
21
19
|
|
20
|
+
wine = Team.new("Wine")
|
22
21
|
wine.add_member(bas)
|
23
22
|
wine.add_member(daniel)
|
23
|
+
|
24
|
+
cheese = Team.new("Cheese")
|
24
25
|
cheese.add_member(janne)
|
25
26
|
|
26
27
|
@teams.add(wine)
|
@@ -48,18 +49,23 @@ describe "The committers and the teams that we're examining" do
|
|
48
49
|
end
|
49
50
|
|
50
51
|
it "can compare two committers" do
|
52
|
+
bas = Committer.create_committer("basv", "Bas", "Vodde", "basv@wow.com")
|
53
|
+
dobbel_bas = Committer.create_committer("basv", "Bas", "Vodde", "basv@wow.com")
|
54
|
+
|
51
55
|
team = Team.new("team")
|
52
|
-
|
53
|
-
|
56
|
+
team.add_member(bas)
|
57
|
+
team.add_member(dobbel_bas)
|
54
58
|
|
55
59
|
expect(bas).to eq dobbel_bas
|
56
60
|
end
|
57
61
|
|
58
62
|
it "can compare two committers that aren't equal" do
|
59
|
-
|
60
|
-
|
61
|
-
dobbel_bas = Committer.create_committer("basv", "Bas", "Vodde", "basv@wow.com", team)
|
63
|
+
bas = Committer.create_committer("basv", "Bas", "Fake", "basv@wow.com")
|
64
|
+
dobbel_bas = Committer.create_committer("basv", "Bas", "Vodde", "basv@wow.com")
|
62
65
|
|
66
|
+
team = Team.new("team")
|
67
|
+
team.add_member(bas)
|
68
|
+
team.add_member(dobbel_bas)
|
63
69
|
expect(bas).not_to eq dobbel_bas
|
64
70
|
end
|
65
71
|
end
|
@@ -35,6 +35,7 @@ describe "Integration tests using offline logs from the filezilla project" do
|
|
35
35
|
expect($stdout).to receive(:puts).with("Getting svn log from repository: filezilla")
|
36
36
|
expect($stdout).to receive(:puts).with("Getting svn log from repository: xiph")
|
37
37
|
expect($stdout).to receive(:puts).with("Stage 3: Listing repositories committed to")
|
38
|
+
expect($stdout).to receive(:puts).with("Team \"wine\" committed in:\n filezilla\n")
|
38
39
|
|
39
40
|
load @codespicuous_script
|
40
41
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
describe "listing which repositories the team committed to" do
|
3
|
+
|
4
|
+
subject { RepositoryLister.new }
|
5
|
+
|
6
|
+
it "informs that the team didn't commit to any of the repositories" do
|
7
|
+
|
8
|
+
expect(subject).to receive(:puts).with("No teams committed in any of the repositories")
|
9
|
+
subject.list(CommitHistory.new)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "informs that one team has committed in one repository" do
|
13
|
+
commit_history = CommitHistoryBuilder.new.
|
14
|
+
in_repository("repo").
|
15
|
+
commits_of("basvodde").of_team("Wine").
|
16
|
+
at("2016-04-18").times(2).
|
17
|
+
build
|
18
|
+
|
19
|
+
expect(subject).to receive(:puts).with("Team \"Wine\" committed in:\n repo\n")
|
20
|
+
subject.list(commit_history)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -73,7 +73,9 @@ describe "Collecting data from SVN" do
|
|
73
73
|
expect(subject).to receive(:collect_commits_for_repository).with(@heh_repository).and_return(heh_commits)
|
74
74
|
expect(subject).to receive(:collect_commits_for_repository).with(wow_repository).and_return(wow_commits)
|
75
75
|
|
76
|
-
|
76
|
+
commit_history = CommitHistory.new
|
77
|
+
commit_history.add_commits(heh_commits + wow_commits)
|
78
|
+
expect(subject.collect_commit_history(repositories)).to eq (commit_history)
|
77
79
|
end
|
78
80
|
|
79
81
|
it "Should write the svn logs to the svnlog directory" do
|
data/spec/teams_spec.rb
CHANGED
@@ -2,12 +2,13 @@
|
|
2
2
|
describe "teams" do
|
3
3
|
|
4
4
|
it "spec_name" do
|
5
|
+
bas = Committer.create_committer("basv", "Bas", "Vodde", "basv@wow.com")
|
6
|
+
|
5
7
|
team = Team.new("team")
|
6
|
-
bas = Committer.create_committer("basv", "Bas", "Vodde", "basv@wow.com", team)
|
7
8
|
team.add_member(bas)
|
8
9
|
|
10
|
+
bas_dobbel = Committer.create_committer("basv", "Bas", "Vodde", "basv@wow.com")
|
9
11
|
team_dobbel = Team.new("team")
|
10
|
-
bas_dobbel = Committer.create_committer("basv", "Bas", "Vodde", "basv@wow.com", team)
|
11
12
|
team_dobbel.add_member(bas_dobbel)
|
12
13
|
|
13
14
|
expect(team).to eq team_dobbel
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: codespicuous
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bas Vodde
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -61,7 +61,8 @@ dependencies:
|
|
61
61
|
description: Codespicuous is a tool for generating several different metrics from
|
62
62
|
codebases to gain insight in how the teams are working.
|
63
63
|
email: basv@odd-e.com
|
64
|
-
executables:
|
64
|
+
executables:
|
65
|
+
- codespicuous
|
65
66
|
extensions: []
|
66
67
|
extra_rdoc_files: []
|
67
68
|
files:
|
@@ -111,6 +112,7 @@ files:
|
|
111
112
|
- spec/metrics_generator_daniel_spec.rb
|
112
113
|
- spec/metrics_generator_spec.rb
|
113
114
|
- spec/repositories_spec.rb
|
115
|
+
- spec/repository_lister_spec.rb
|
114
116
|
- spec/svn_client_spec.rb
|
115
117
|
- spec/svn_data_collector_spec.rb
|
116
118
|
- spec/svn_log_parser_spec.rb
|