codespicuous 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +7 -0
- data/LICENSE +29 -0
- data/README.md +2 -0
- data/Rakefile +6 -0
- data/bin/codespicuous +4 -0
- data/bin/filezilla/codespicuous.yaml +23 -0
- data/bin/filezilla/committers.csv +4 -0
- data/bin/filezilla/svnlog/filezilla.log +3939 -0
- data/bin/filezilla/svnlog/python.log +3 -0
- data/bin/filezilla/svnlog/xiph.log +265 -0
- data/codespicuous.gemspec +22 -0
- data/lib/codespicuous.rb +38 -0
- data/lib/codespicuous/codespicuous.rb +55 -0
- data/lib/codespicuous/codespicuous_config.rb +35 -0
- data/lib/codespicuous/codespicuousconfigurator.rb +136 -0
- data/lib/codespicuous/commandrunner.rb +13 -0
- data/lib/codespicuous/commithistory.rb +71 -0
- data/lib/codespicuous/commithistory_builder.rb +49 -0
- data/lib/codespicuous/commits.rb +147 -0
- data/lib/codespicuous/commitstatistics.rb +245 -0
- data/lib/codespicuous/committer.rb +105 -0
- data/lib/codespicuous/danielparser.rb +31 -0
- data/lib/codespicuous/dateutil.rb +18 -0
- data/lib/codespicuous/metrics_generator.rb +22 -0
- data/lib/codespicuous/metrics_generator_csv.rb +67 -0
- data/lib/codespicuous/metrics_generator_daniel.rb +13 -0
- data/lib/codespicuous/participantsparser_from_csv.rb +37 -0
- data/lib/codespicuous/repositories.rb +80 -0
- data/lib/codespicuous/repository_lister.rb +8 -0
- data/lib/codespicuous/svn_client.rb +14 -0
- data/lib/codespicuous/svn_data_collector.rb +50 -0
- data/lib/codespicuous/svn_log_parser.rb +100 -0
- data/lib/codespicuous/teams.rb +99 -0
- data/lib/codespicuous/version.rb +4 -0
- data/spec/codespicuous_spec.rb +81 -0
- data/spec/codespicuousconfigurator_spec.rb +202 -0
- data/spec/commithistories_data.rb +46 -0
- data/spec/commithistory_spec.rb +57 -0
- data/spec/commits_spec.rb +93 -0
- data/spec/committers_spec.rb +66 -0
- data/spec/danielparser_spec.rb +12 -0
- data/spec/integration_filezilla_spec.rb +41 -0
- data/spec/metrics_generator_csv_spec.rb +91 -0
- data/spec/metrics_generator_daniel_spec.rb +10 -0
- data/spec/metrics_generator_spec.rb +35 -0
- data/spec/repositories_spec.rb +29 -0
- data/spec/svn_client_spec.rb +16 -0
- data/spec/svn_data_collector_spec.rb +93 -0
- data/spec/svn_log_parser_spec.rb +141 -0
- data/spec/teams_spec.rb +16 -0
- metadata +142 -0
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
COMMIT_HISTORY_WINE_CHEESE_DANIEL_FORMAT = "
|
3
|
+
repository: osaka
|
4
|
+
*** basvodde
|
5
|
+
team: Wine
|
6
|
+
commits in week:
|
7
|
+
2016-04-18: 2 commits
|
8
|
+
2016-05-02: 2 commits
|
9
|
+
|
10
|
+
*** daniel
|
11
|
+
team: Cheese
|
12
|
+
commits in week:
|
13
|
+
2016-03-28: 1 commits
|
14
|
+
|
15
|
+
*** basvodde
|
16
|
+
team: Wine
|
17
|
+
commits in week:
|
18
|
+
2016-03-14: 4 commits
|
19
|
+
2016-04-04: 1 commits
|
20
|
+
|
21
|
+
repository: cpputest
|
22
|
+
|
23
|
+
*** janne
|
24
|
+
team: Wine
|
25
|
+
commits in week:
|
26
|
+
2016-02-29: 1 commits
|
27
|
+
2016-04-04: 3 commits
|
28
|
+
2016-05-16: 3 commits"
|
29
|
+
|
30
|
+
COMMIT_HISTORY_WINE_CHEESE = CommitHistoryBuilder.new.
|
31
|
+
in_repository("osaka").
|
32
|
+
commits_of("basvodde").of_team("Wine").
|
33
|
+
at("2016-04-18").times(2).
|
34
|
+
at("2016-05-02").times(2).
|
35
|
+
commits_of("daniel").of_team("Cheese").
|
36
|
+
at("2016-03-28").
|
37
|
+
commits_of("basvodde").of_team("Wine").
|
38
|
+
at("2016-03-14").times(4).
|
39
|
+
at("2016-04-04").
|
40
|
+
in_repository("cpputest").
|
41
|
+
commits_of("janne").of_team("Wine").
|
42
|
+
at("2016-02-29").
|
43
|
+
at("2016-04-04").times(3).
|
44
|
+
at("2016-05-16").times(3).
|
45
|
+
build
|
46
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
|
2
|
+
require 'codespicuous'
|
3
|
+
require 'commithistories_data.rb'
|
4
|
+
|
5
|
+
describe "Team commits per week table" do
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
@commit_history = COMMIT_HISTORY_WINE_CHEESE
|
9
|
+
end
|
10
|
+
|
11
|
+
it "can compare two commit histories" do
|
12
|
+
expect(@commit_history).to eq(@commit_history)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "calculates the amount of committers" do
|
16
|
+
expect(@commit_history.amount_of_comitters).to eq(3)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "knows the team the person is in" do
|
20
|
+
expect(@commit_history.committer("basvodde").team.name).to eq "Wine"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "can extract the commit amounts per user per week" do
|
24
|
+
expect(@commit_history.committer("basvodde").amount_of_weeks_committed_to_repository("osaka")).to eq 4
|
25
|
+
end
|
26
|
+
|
27
|
+
it "can extract the commits per user" do
|
28
|
+
expect(@commit_history.committer("basvodde").amount_of_commits_to_repository_in_week("osaka", DateTime.new(2016,03,14))).to eq 4
|
29
|
+
expect(@commit_history.committer("basvodde").amount_of_commits_to_repository_in_week("osaka", DateTime.new(2016,04,18))).to eq 2
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should be able to extract all the repositories" do
|
33
|
+
expect(@commit_history.repository_names).to include "osaka"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should be able to extract all the teams" do
|
37
|
+
expect(@commit_history.teams.team_names).to eq ["Wine", "Cheese"]
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should be able to find the earliest commit date" do
|
41
|
+
expect(@commit_history.earliest_commit_date).to eq DateTime.new(2016,02,29)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should be able to find the latest commit date" do
|
45
|
+
expect(@commit_history.latest_commit_date).to eq DateTime.new(2016,05,16)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "Should be able to get the amount of commits per team per week without commits" do
|
49
|
+
expect(@commit_history.amount_of_commits_for_team_in_week("Cheese", DateTime.new(2016,01,01))).to eq 0
|
50
|
+
end
|
51
|
+
|
52
|
+
it "Should be able to get the amount of commits per team per week" do
|
53
|
+
expect(@commit_history.amount_of_commits_for_team_in_week("Cheese", DateTime.new(2016,03,28))).to eq 1
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
@@ -0,0 +1,93 @@
|
|
1
|
+
|
2
|
+
require 'codespicuous.rb'
|
3
|
+
|
4
|
+
describe "commits" do
|
5
|
+
|
6
|
+
it "be able to plus to Commits" do
|
7
|
+
commit1 = Commit.new
|
8
|
+
commits1 = Commits.new
|
9
|
+
commits1.add(commit1)
|
10
|
+
|
11
|
+
commit2 = Commit.new
|
12
|
+
commits2 = Commits.new
|
13
|
+
commits2.add(commit2)
|
14
|
+
|
15
|
+
result = Commits.new
|
16
|
+
result.add(commit1)
|
17
|
+
result.add(commit2)
|
18
|
+
|
19
|
+
expect(commits1 + commits2).to eq result
|
20
|
+
end
|
21
|
+
|
22
|
+
it "can compare Commits and they are equal" do
|
23
|
+
commit1 = Commit.new
|
24
|
+
commits1 = Commits.new
|
25
|
+
commits2 = Commits.new
|
26
|
+
commits1.add(commit1)
|
27
|
+
commits2.add(commit1)
|
28
|
+
|
29
|
+
expect(commits1).to eq(commits2)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "can compare Commits and they are equal with different objects" do
|
33
|
+
commit1 = Commit.new
|
34
|
+
commit2 = Commit.new
|
35
|
+
|
36
|
+
commit1.repository = Repository.new("repo", "url")
|
37
|
+
commit2.repository = Repository.new("repo", "url")
|
38
|
+
commit1.revision = 1
|
39
|
+
commit2.revision = 2
|
40
|
+
|
41
|
+
commits1 = Commits.new
|
42
|
+
commits2 = Commits.new
|
43
|
+
|
44
|
+
commits1.add(commit1)
|
45
|
+
commits2.add(commit1)
|
46
|
+
|
47
|
+
expect(commits1).to eq(commits2)
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
it "can compare Commits and they aren't equal" do
|
52
|
+
commit1 = Commit.new
|
53
|
+
commits1 = Commits.new
|
54
|
+
commits2 = Commits.new
|
55
|
+
commits1.add(commit1)
|
56
|
+
|
57
|
+
expect(commits1).not_to eq(commits2)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "can inspect commits without printing the entire data structure recursively" do
|
61
|
+
commit = Commit.new
|
62
|
+
commit.repository = Repository.new("Repo", "url")
|
63
|
+
commit.revision = 10
|
64
|
+
expect(commit).to receive(:my_object_id).and_return(1)
|
65
|
+
|
66
|
+
expect(commit.inspect).to eq("Commit(o:1) Repo:10")
|
67
|
+
end
|
68
|
+
|
69
|
+
it "two commits are the same when they are in the same repository and have the same revision" do
|
70
|
+
commit1 = Commit.new
|
71
|
+
commit2 = Commit.new
|
72
|
+
commit1.repository = Repository.new("Repos", "url")
|
73
|
+
commit2.repository = Repository.new("Repos", "url")
|
74
|
+
commit1.revision = 20
|
75
|
+
commit2.revision = 20
|
76
|
+
|
77
|
+
expect(commit1).to eq(commit2)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "can compare commits, but raises an exception when some of the others are not the same" do
|
81
|
+
commit1 = Commit.new
|
82
|
+
commit2 = Commit.new
|
83
|
+
commit1.repository = Repository.new("Repos", "url")
|
84
|
+
commit2.repository = Repository.new("Repos", "url")
|
85
|
+
commit1.revision = 20
|
86
|
+
commit2.revision = 20
|
87
|
+
|
88
|
+
commit1.author = "me"
|
89
|
+
|
90
|
+
expect{commit1 == commit2}.to raise_error(CommitSameButDifferentError)
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
describe "The committers and the teams that we're examining" do
|
4
|
+
|
5
|
+
subject { committers.new }
|
6
|
+
|
7
|
+
before (:each) do
|
8
|
+
@committers = Committers.new
|
9
|
+
@teams = Teams.new
|
10
|
+
|
11
|
+
wine = Team.new("Wine")
|
12
|
+
cheese = Team.new("Cheese")
|
13
|
+
|
14
|
+
bas = Committer.create_committer("basvodde", "Bas", "Vodde", "basv@wow.com", wine)
|
15
|
+
janne = Committer.create_committer("janne", "Janne", "Yeah", "janne@yeah.com", cheese)
|
16
|
+
daniel = Committer.create_committer("daniel", "Daniel", "Hum", "daniel@hum.com", wine)
|
17
|
+
|
18
|
+
@committers.add(bas)
|
19
|
+
@committers.add(daniel)
|
20
|
+
@committers.add(janne)
|
21
|
+
|
22
|
+
wine.add_member(bas)
|
23
|
+
wine.add_member(daniel)
|
24
|
+
cheese.add_member(janne)
|
25
|
+
|
26
|
+
@teams.add(wine)
|
27
|
+
@teams.add(cheese)
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
it "can calculate amounts" do
|
32
|
+
expect(@committers.amount).to eq 3
|
33
|
+
expect(@teams.amount).to eq 2
|
34
|
+
end
|
35
|
+
|
36
|
+
it "has all the committer information" do
|
37
|
+
bas = @committers.find_by_username('basvodde')
|
38
|
+
expect(bas.first_name).to eq "Bas"
|
39
|
+
expect(bas.last_name).to eq "Vodde"
|
40
|
+
expect(bas.email).to eq "basv@wow.com"
|
41
|
+
expect(bas.team.name).to eq "Wine"
|
42
|
+
end
|
43
|
+
|
44
|
+
it "has all the team information" do
|
45
|
+
wine = @teams.find_by_name("Wine")
|
46
|
+
expect(wine.amount_of_members).to eq 2
|
47
|
+
expect(wine.member_usernames).to include('daniel')
|
48
|
+
end
|
49
|
+
|
50
|
+
it "can compare two committers" do
|
51
|
+
team = Team.new("team")
|
52
|
+
bas = Committer.create_committer("basv", "Bas", "Vodde", "basv@wow.com", team)
|
53
|
+
dobbel_bas = Committer.create_committer("basv", "Bas", "Vodde", "basv@wow.com", team)
|
54
|
+
|
55
|
+
expect(bas).to eq dobbel_bas
|
56
|
+
end
|
57
|
+
|
58
|
+
it "can compare two committers that aren't equal" do
|
59
|
+
team = Team.new("team")
|
60
|
+
bas = Committer.create_committer("basv", "Bas", "Fake", "basv@wow.com", team)
|
61
|
+
dobbel_bas = Committer.create_committer("basv", "Bas", "Vodde", "basv@wow.com", team)
|
62
|
+
|
63
|
+
expect(bas).not_to eq dobbel_bas
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
describe "Daniel format parser" do
|
4
|
+
|
5
|
+
it "Should be able to parse daniel format correctly" do
|
6
|
+
daniel_format = COMMIT_HISTORY_WINE_CHEESE_DANIEL_FORMAT
|
7
|
+
commit_history = COMMIT_HISTORY_WINE_CHEESE
|
8
|
+
|
9
|
+
expect(DanielFormatParser.new.parse(daniel_format)).to eq commit_history
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
describe "Integration tests using offline logs from the filezilla project" do
|
5
|
+
|
6
|
+
before (:each) do
|
7
|
+
@codespicuous_script = "#{File.dirname(__FILE__)}/../bin/codespicuous"
|
8
|
+
@filezilla_path = "#{File.dirname(__FILE__)}/../bin/filezilla"
|
9
|
+
@tempdir = Dir.mktmpdir
|
10
|
+
|
11
|
+
ARGV.clear
|
12
|
+
end
|
13
|
+
|
14
|
+
after (:each) do
|
15
|
+
FileUtils.remove_entry_secure @tempdir
|
16
|
+
end
|
17
|
+
|
18
|
+
it "Gives the standard error when not finding repositories" do
|
19
|
+
|
20
|
+
expect($stdout).to receive(:puts).with("Stage 1: Configuring")
|
21
|
+
expect($stdout).to receive(:puts).with("** Error: No repositories configured in \"codespicuous.yaml\"")
|
22
|
+
|
23
|
+
load @codespicuous_script
|
24
|
+
end
|
25
|
+
|
26
|
+
it "Is able to list the repositories" do
|
27
|
+
ARGV.clear
|
28
|
+
ARGV[0] = "-i"
|
29
|
+
ARGV[1] = "#{@filezilla_path}"
|
30
|
+
ARGV[2] = "-r"
|
31
|
+
|
32
|
+
expect($stdout).to receive(:puts).with("Stage 1: Configuring")
|
33
|
+
expect($stdout).to receive(:puts).with("** Configuring options with \"/Users/basvodde/git/codespicuous/spec/../bin/filezilla/codespicuous.yaml\"")
|
34
|
+
expect($stdout).to receive(:puts).with("Stage 2: Collecting input data")
|
35
|
+
expect($stdout).to receive(:puts).with("Getting svn log from repository: filezilla")
|
36
|
+
expect($stdout).to receive(:puts).with("Getting svn log from repository: xiph")
|
37
|
+
expect($stdout).to receive(:puts).with("Stage 3: Listing repositories committed to")
|
38
|
+
|
39
|
+
load @codespicuous_script
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
|
2
|
+
require 'commithistories_data.rb'
|
3
|
+
|
4
|
+
describe "Generate CSV files from the commit history" do
|
5
|
+
|
6
|
+
before (:each) do
|
7
|
+
@metrics_generator = MetricsGeneratorCsv.new(COMMIT_HISTORY_WINE_CHEESE)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "Should be able to create the wonderful table (sorted on team)" do
|
11
|
+
table = "Committer,Team,osaka,cpputest,Total
|
12
|
+
daniel,Cheese,1,0,1
|
13
|
+
basvodde,Wine,9,0,9
|
14
|
+
janne,Wine,0,7,7
|
15
|
+
"
|
16
|
+
expect(@metrics_generator.create_commit_table_with_committers_and_repository_info).to eq table
|
17
|
+
end
|
18
|
+
|
19
|
+
it "Should make a time table with commits and team" do
|
20
|
+
table = "Week,Wine,Cheese
|
21
|
+
2016-02-29,1,0
|
22
|
+
2016-03-07,0,0
|
23
|
+
2016-03-14,4,0
|
24
|
+
2016-03-21,0,0
|
25
|
+
2016-03-28,0,1
|
26
|
+
2016-04-04,4,0
|
27
|
+
2016-04-11,0,0
|
28
|
+
2016-04-18,2,0
|
29
|
+
2016-04-25,0,0
|
30
|
+
2016-05-02,2,0
|
31
|
+
2016-05-09,0,0
|
32
|
+
2016-05-16,3,0
|
33
|
+
"
|
34
|
+
expect(@metrics_generator.create_commit_table_with_weeks_and_team_commits).to eq table
|
35
|
+
end
|
36
|
+
|
37
|
+
it "Should make a time table with commits per repository" do
|
38
|
+
table = "Week,osaka,cpputest
|
39
|
+
2016-02-29,0,1
|
40
|
+
2016-03-07,0,0
|
41
|
+
2016-03-14,4,0
|
42
|
+
2016-03-21,0,0
|
43
|
+
2016-03-28,1,0
|
44
|
+
2016-04-04,1,3
|
45
|
+
2016-04-11,0,0
|
46
|
+
2016-04-18,2,0
|
47
|
+
2016-04-25,0,0
|
48
|
+
2016-05-02,2,0
|
49
|
+
2016-05-09,0,0
|
50
|
+
2016-05-16,0,3
|
51
|
+
"
|
52
|
+
expect(@metrics_generator.create_commit_table_with_week_and_repository_info).to eq table
|
53
|
+
end
|
54
|
+
|
55
|
+
it "Should make a time table with commits per user" do
|
56
|
+
table = "Week,basvodde,janne,daniel
|
57
|
+
2016-02-29,0,1,0
|
58
|
+
2016-03-07,0,0,0
|
59
|
+
2016-03-14,4,0,0
|
60
|
+
2016-03-21,0,0,0
|
61
|
+
2016-03-28,0,0,1
|
62
|
+
2016-04-04,1,3,0
|
63
|
+
2016-04-11,0,0,0
|
64
|
+
2016-04-18,2,0,0
|
65
|
+
2016-04-25,0,0,0
|
66
|
+
2016-05-02,2,0,0
|
67
|
+
2016-05-09,0,0,0
|
68
|
+
2016-05-16,0,3,0
|
69
|
+
"
|
70
|
+
expect(@metrics_generator.create_commit_table_with_weeks_and_committers).to eq table
|
71
|
+
end
|
72
|
+
|
73
|
+
it "Should make a time table with commits per user in team" do
|
74
|
+
table = "Week,basvodde,janne
|
75
|
+
2016-02-29,0,1
|
76
|
+
2016-03-07,0,0
|
77
|
+
2016-03-14,4,0
|
78
|
+
2016-03-21,0,0
|
79
|
+
2016-03-28,0,0
|
80
|
+
2016-04-04,1,3
|
81
|
+
2016-04-11,0,0
|
82
|
+
2016-04-18,2,0
|
83
|
+
2016-04-25,0,0
|
84
|
+
2016-05-02,2,0
|
85
|
+
2016-05-09,0,0
|
86
|
+
2016-05-16,0,3
|
87
|
+
"
|
88
|
+
expect(@metrics_generator.create_commit_table_with_weeks_and_committers("Wine")).to eq table
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
describe "Generate different types of code metrics" do
|
3
|
+
|
4
|
+
before (:each) do
|
5
|
+
@commit_history = CommitHistory.new
|
6
|
+
@subject = MetricsGenerator.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it "can generate different metrics" do
|
10
|
+
expect(@subject).to receive(:generate_daniel)
|
11
|
+
expect(@subject).to receive(:generate_csv)
|
12
|
+
|
13
|
+
@subject.generate(@commit_history)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "generate daniel format metrics" do
|
17
|
+
@subject.commit_history = @commit_history
|
18
|
+
|
19
|
+
daniel = MetricsGeneratorDaniel.new(@commit_history)
|
20
|
+
expect(MetricsGeneratorDaniel).to receive(:new).with(@commit_history).and_return(daniel)
|
21
|
+
expect(daniel).to receive(:generate)
|
22
|
+
|
23
|
+
@subject.generate_daniel
|
24
|
+
end
|
25
|
+
|
26
|
+
it "generate csv format metrics" do
|
27
|
+
@subject.commit_history = @commit_history
|
28
|
+
|
29
|
+
csv = MetricsGeneratorCsv.new(@commit_history)
|
30
|
+
expect(MetricsGeneratorCsv).to receive(:new).with(@commit_history).and_return(csv)
|
31
|
+
expect(csv).to receive(:generate)
|
32
|
+
|
33
|
+
@subject.generate_csv
|
34
|
+
end
|
35
|
+
end
|