Skip to content

Commit

Permalink
Imaginary package name by source directories and module prefix
Browse files Browse the repository at this point in the history
  • Loading branch information
Shunichi Shinohara committed Dec 23, 2011
1 parent e33fbc8 commit 600085c
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 10 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ Standalone:
{plugins, [rebar_covertool]}.
{covertool_eunit, "eunit.coverage.xml"}. % Output report file name
{covertool_ct, {"ct.coverdata", "ct.coverage.xml"}}. % Source file name, output report file name
{covertool_prefix_len, 2}. % Optional: Use module prefix as (imaginary) package name

4. Configure "Publish Cobertura Coverage Report" post-build action, set path
to the generated `coverage.xml`
Expand Down
68 changes: 58 additions & 10 deletions src/rebar_covertool.erl
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ eunit(Config, AppFile) ->
undefined -> ok;
Output ->
{ok, CoverLog} = cover_init(),
generate_report(AppName, cover:modules() ++ cover:imported_modules(), Output),
generate_report(AppName,
rebar_config:get_local(Config, covertool_prefix_len, 0),
cover:modules() ++ cover:imported_modules(), Output),
file:close(CoverLog),
ok
end.
Expand All @@ -32,7 +34,9 @@ ct(Config, AppFile) ->
{From, To} ->
cover:import(From),
{ok, CoverLog} = cover_init(),
generate_report(AppName, cover:imported_modules(), To),
generate_report(AppName,
rebar_config:get_local(Config, covertool_prefix_len, 0),
cover:imported_modules(), To),
file:close(CoverLog),
ok
end.
Expand Down Expand Up @@ -67,7 +71,7 @@ cover_init() ->
group_leader(F, CoverPid),
{ok, F}.

generate_report(AppName, Modules, Output) ->
generate_report(AppName, PrefixLen, Modules, Output) ->
io:format("Generating report '~s'...~n", [Output]),
Prolog = ["<?xml version=\"1.0\" encoding=\"utf-8\"?>\n",
"<!DOCTYPE coverage SYSTEM \"http://cobertura.sourceforge.net/xml/coverage-04.dtd\">\n"],
Expand All @@ -78,7 +82,7 @@ generate_report(AppName, Modules, Output) ->
Version = "1.9.4.1", % emulate Cobertura 1.9.4.1
Complexity = 0, % not supported at the moment

Result = generate_packages(AppName, Modules),
Result = generate_packages(AppName, PrefixLen, Modules),
{LinesCovered, LinesValid} = Result#result.line,
LineRate = rate(Result#result.line),

Expand All @@ -96,20 +100,64 @@ generate_report(AppName, Modules, Output) ->
{complexity, Complexity},
{version, Version}],
[{sources, [{source, [Sources]}]},
{packages, [Result#result.data]}]},
{packages, Result#result.data}]},
Report = xmerl:export_simple([Root], xmerl_xml, [{prolog, Prolog}]),
write_output(Report, Output),
ok.

generate_packages(AppName, Modules) ->
generate_packages(AppName, PrefixLen, Modules) ->
PackageAndModules =
lists:foldl(fun(Module, Acc) ->
PackageName = package_name(AppName, PrefixLen, Module),
case lists:keyfind(PackageName, 1, Acc) of
false ->
[{PackageName, [Module]} | Acc];
{_Key, ModulesInPackage} ->
lists:keyreplace(
PackageName, 1, Acc,
{PackageName, [Module|ModulesInPackage]})
end
end, [], Modules),
Fun = fun({PackageName, ModulesInPackage}, Result) ->
Package = generate_package(PackageName, ModulesInPackage),
{Package#result.data, sum(Result, Package)}
end,
{Packages, Result} = lists:mapfoldl(Fun, #result{}, PackageAndModules),
Result#result{data = Packages}.

%% Package name is generated by
%% - AppName itself
%% - source direcotry
%% - module prefix (name devided by "_")
package_name(AppName, PrefixLen, Module) ->
SourceDirs = case lookup_source(Module) of
false ->
[];
SourceFile ->
case filename:dirname(SourceFile) of
"." ->
[];
DirName ->
string:tokens(DirName, "/")
end
end,
Prefix = case PrefixLen of
0 ->
"";
_Other ->
lists:sublist(string:tokens(atom_to_list(Module), "_"),
PrefixLen)
end,
string:join([atom_to_list(AppName)] ++ SourceDirs ++ Prefix, ".").

generate_package(PackageName, Modules) ->
Classes = generate_classes(Modules),
% for now, the whole data file is a single "package"
Data = {package, [{name, AppName},
Data = {package, [{name, PackageName},
{'line-rate', rate(Classes#result.line)},
{'branch-rate', rate(Classes#result.branches)},
{complexity, 0}],
[{classes, Classes#result.data}]},
Classes#result{data = Data}. % leave the metrics as is
#result{data = Data}.

% generate <classes> element, each Erlang module is "class"
generate_classes(Modules) ->
Expand Down Expand Up @@ -155,7 +203,7 @@ generate_class(Module) ->
{complexity, 0}],
[{methods, []},
{lines, LinesData}]},
#result{data = Data}.
Result#result{data = Data}.

write_output(Report, Output) ->
io:format("Writing output report '~s'...~n", [Output]),
Expand Down

0 comments on commit 600085c

Please sign in to comment.