1:- autoload(library(aggregate)).    2:- autoload(library(apply)).    3:- autoload(library(lists)).    4:- autoload(library(sort)).    5:- autoload(library(yall)).    6:- autoload(library(http/json)).    7:- autoload(library(canny/pack)).    8:- autoload(library(canny/cover)).    9:- autoload(library(print/table)).   10:- autoload(library(gh/api)).   11
   12cov :-
   13    module_coverages(ModuleCoverages),
   14    print_module_coverages(ModuleCoverages),
   15    aggregate_all(
   16        all(sum(Clauses), sum(Cov), sum(Fail), count),
   17        member(_-coverage{
   18                     clauses:Clauses,
   19                     cov:Cov,
   20                     fail:Fail
   21                 }, ModuleCoverages),
   22        all(AllClauses, AllCov, AllFail, AllModule)),
   23    AvgCov is AllCov / AllModule,
   24    AvgFail is AllFail / AllModule,
   25    format('Modules:~t~d~40|~n', [AllModule]),
   26    format('Clauses:~t~d~40|~n', [AllClauses]),
   27    format('Cov:~t~f~40|%~n', [AvgCov]),
   28    format('Fail:~t~f~40|%~n', [AvgFail]),
   29    (   getenv('CANNY_COV_GIST_ID', GistID)
   30    ->  shield_files([cov-AvgCov, fail-AvgFail], Files),
   31        ghapi_update_gist(GistID, json(json([files=Files])), _, [])
   32    ;   true
   33    ).
   34
   35module_coverages(ModuleCoverages) :-
   36    load_pack_modules(canny_tudor, Modules),
   37    findall(
   38        Module-Coverage,
   39        coverage_for_modules(run_tests, Modules, Module, Coverage),
   40        ModuleCoverages).
   41
   42print_module_coverages(ModuleCoverages) :-
   43    predsort(compare_cov_fail, ModuleCoverages, SortedModuleCoverages),
   44    print_table(
   45        member(
   46            Module-coverage{
   47                       clauses:Clauses,
   48                       cov:Cov,
   49                       fail:Fail
   50                   }, SortedModuleCoverages), [Module, Clauses, Cov, Fail]).
   51
   52compare_cov_fail(Order, _-Coverage1, _-Coverage2) :-
   53    compare(Order0, Coverage1.cov, Coverage2.cov),
   54    compare_fail(Order, Order0, Coverage1.fail, Coverage2.fail),
   55    !.
   56compare_cov_fail(>, _, _).
   57
   58compare_fail(<, <, _, _) :- !.
   59compare_fail(<, =, Fail1, Fail2) :- compare(>, Fail1, Fail2), !.
   60compare_fail(>, _, _, _).
   61
   62shield_files(Pairs, json(Files)) :-
   63    maplist([Label-Percent, File=json([content=Content])]>>
   64            (   atom_concat(Label, '.json', File),
   65                format(atom(Message), '~1f%', [Percent]),
   66                shield_color(Percent, Color),
   67                atom_json_term(Content, json([ schemaVersion=1,
   68                                               label=Label,
   69                                               message=Message,
   70                                               color=Color
   71                                             ]), []),
   72                format('raw/~s~n', [File])
   73            ), Pairs, Files).
   74
   75shield_color(Percent, red) :- Percent < 20, !.
   76shield_color(Percent, orange) :- Percent < 40, !.
   77shield_color(Percent, yellow) :- Percent < 60, !.
   78shield_color(Percent, yellowgreen) :- Percent < 80, !.
   79shield_color(_, green)