def _summary_for_a_product_version_pair(self, an_accumulator): """in the original code, the counter structures were walked and manipulated to form the statistics. Once a stat was determined, it was printed to stdout. Since we want to have various means of outputting the data, instead of printing to stdout, this method save the statistic in a "summary_structure" This structure will later be walked for printing or output to some future storage scheme The summary structure looks like this: summary[product_version*] .note - a list of comments by the algorithm [os_name] .count .signatures[signame*] .name .count .cores[number_of_cores] .in_sig_count .in_sig_ratio .rounded_in_sig_ratio .in_os_count .in_os_ratio .rounded_in_os_ratio """ pv_summary = { 'notes': [], } if (len(self.date_suffix) > 1): message = ("crashes from more than one day %s" % str(tuple(self.date_suffix.keys()))) pv_summary['notes'].append(message) pv_summary['date_key'] = self.date_suffix.keys()[0] MIN_CRASHES = self.config.min_crashes osyses = an_accumulator.osyses # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # begin - minimally altered section from original code # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - infostr_re = re.compile("^(.*) with (\d+) cores$") #---------------------------------------------------------------------- def cmp_infostr(x, y): (familyx, coresx) = infostr_re.match(x).groups() (familyy, coresy) = infostr_re.match(y).groups() if familyx != familyy: return cmp(familyx, familyy) return cmp(int(coresx), int(coresy)) #---------------------------------------------------------------------- sorted_osyses = osyses.keys() sorted_osyses.sort() for osname in sorted_osyses: osys = osyses[osname] pv_summary[osname] = SocorroDotDict() pv_summary[osname].count = osys['count'] pv_summary[osname].signatures = {} sorted_signatures = [ sig for sig in osys["signatures"].items() if sig[1]["count"] >= MIN_CRASHES ] sorted_signatures.sort(key=lambda tuple: tuple[1]["count"], reverse=True) sorted_cores = osys["core_counts"].keys() # strongly suspect that sorting is useless here sorted_cores.sort(cmp=cmp_infostr) for signame, sig in sorted_signatures: pv_summary[osname].signatures[signame] = SocorroDotDict({ 'name': signame, 'count': sig['count'], 'cores': {}, }) by_number_of_cores = \ pv_summary[osname].signatures[signame].cores for cores in sorted_cores: by_number_of_cores[cores] = SocorroDotDict() in_sig_count = sig["core_counts"].get(cores, 0) in_sig_ratio = float(in_sig_count) / sig["count"] in_os_count = osys["core_counts"][cores] in_os_ratio = float(in_os_count) / osys["count"] rounded_in_sig_ratio = int(round(in_sig_ratio * 100)) rounded_in_os_ratio = int(round(in_os_ratio * 100)) by_number_of_cores[cores].in_sig_count = in_sig_count by_number_of_cores[cores].in_sig_ratio = in_sig_ratio by_number_of_cores[cores].rounded_in_sig_ratio = \ rounded_in_sig_ratio by_number_of_cores[cores].in_os_count = in_os_count by_number_of_cores[cores].in_os_ratio = in_os_ratio by_number_of_cores[cores].rounded_in_os_ratio = \ rounded_in_os_ratio # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # end - minimally altered code section # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - return pv_summary
def _summary_for_a_product_version_pair(self, an_accumulator): """in the original code, the counter structures were walked and manipulated to form the statistics. Once a stat was determined, it was printed to stdout. Since we want to have various means of outputting the data, instead of printing to stdout, this method save the statistic in a "summary_structure" This structure will later be walked for printing or output to some future storage scheme The summary structure looks like this: summary[product_version*] .note - a list of comments by the algorithm [os_name] .count .signatures[signame*] .name .count .cores[number_of_cores] .in_sig_count .in_sig_ratio .rounded_in_sig_ratio .in_os_count .in_os_ratio .rounded_in_os_ratio """ pv_summary = { 'notes': [], } if (len(self.date_suffix) > 1): message = ( "crashes from more than one day %s" % str(tuple(self.date_suffix.keys())) ) pv_summary['notes'].append(message) pv_summary['date_key'] = self.date_suffix.keys()[0] MIN_CRASHES = self.config.min_crashes osyses = an_accumulator.osyses # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # begin - minimally altered section from original code # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - infostr_re = re.compile("^(.*) with (\d+) cores$") #---------------------------------------------------------------------- def cmp_infostr(x, y): (familyx, coresx) = infostr_re.match(x).groups() (familyy, coresy) = infostr_re.match(y).groups() if familyx != familyy: return cmp(familyx, familyy) return cmp(int(coresx), int(coresy)) #---------------------------------------------------------------------- sorted_osyses = osyses.keys() sorted_osyses.sort() for osname in sorted_osyses: osys = osyses[osname] pv_summary[osname] = SocorroDotDict() pv_summary[osname].count = osys['count'] pv_summary[osname].signatures = {} sorted_signatures = [sig for sig in osys["signatures"].items() if sig[1]["count"] >= MIN_CRASHES] sorted_signatures.sort( key=lambda tuple: tuple[1]["count"], reverse=True ) sorted_cores = osys["core_counts"].keys() # strongly suspect that sorting is useless here sorted_cores.sort(cmp=cmp_infostr) for signame, sig in sorted_signatures: pv_summary[osname].signatures[signame] = SocorroDotDict({ 'name': signame, 'count': sig['count'], 'cores': {}, }) by_number_of_cores = \ pv_summary[osname].signatures[signame].cores for cores in sorted_cores: by_number_of_cores[cores] = SocorroDotDict() in_sig_count = sig["core_counts"].get(cores, 0) in_sig_ratio = float(in_sig_count) / sig["count"] in_os_count = osys["core_counts"][cores] in_os_ratio = float(in_os_count) / osys["count"] rounded_in_sig_ratio = int(round(in_sig_ratio * 100)) rounded_in_os_ratio = int(round(in_os_ratio * 100)) by_number_of_cores[cores].in_sig_count = in_sig_count by_number_of_cores[cores].in_sig_ratio = in_sig_ratio by_number_of_cores[cores].rounded_in_sig_ratio = \ rounded_in_sig_ratio by_number_of_cores[cores].in_os_count = in_os_count by_number_of_cores[cores].in_os_ratio = in_os_ratio by_number_of_cores[cores].rounded_in_os_ratio = \ rounded_in_os_ratio # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # end - minimally altered code section # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - return pv_summary