""" Central place to calculate statistics about the entries. Used for updating the statistics.md file and the statistics page of the website. """ import os import matplotlib.pyplot as plt def get_build_systems(entries): """ Given a list of entries, calculates statistics about the used build systems and returns the statistics as sorted list of elements (build-system-name, occurence). "n/a" is used if no build system was specified """ build_systems = [] for entry in entries: build_systems.extend(entry['Building'].get('Build system', ['N/A'])) unique_build_systems = set(build_systems) build_systems_stat = [(l, build_systems.count(l)) for l in unique_build_systems] build_systems_stat.sort(key=lambda x: str.casefold(x[0])) # first sort by name build_systems_stat.sort(key=lambda x: -x[1]) # then sort by occurrence (highest occurrence first) return build_systems_stat def truncate_stats(stat, threshold, name='Other'): """ Combines all entries (name, count) with a count below the threshold and appends a new entry """ a, b = [], [] for s in stat: (a, b)[s[1] < threshold].append(s) c = 0 for s in b: c += s[1] a.append([name, c]) return a def export_pie_chart(stat, file): """ :param stat: :return: """ labels = [x[0] for x in stat] sizes = [x[1] for x in stat] fig, ax = plt.subplots(figsize=[4,4], tight_layout=True) ax.pie(sizes, labels=labels, autopct='%1.1f%%', pctdistance=0.8, shadow=True, labeldistance=1.2) # create output directory if necessary containing_dir = os.path.dirname(file) if not os.path.isdir(containing_dir): os.mkdir(containing_dir) plt.savefig(file, transparent=True) # TODO can we also just generate svg in text form and save later?