def get_modules_json(records): module_group_index = vault.get_vault()['module_group_index'] module_id_index = vault.get_vault()['module_id_index'] tags = parameters.get_parameter({}, 'tag', 'tags') # all modules mentioned in records module_ids = set(record['module'] for record in records) # plus all module groups that hold these modules module_ids |= set(itertools.chain.from_iterable( module_group_index.get(module, []) for module in module_ids)) # keep only modules with specified tags if tags: module_ids = set(module_id for module_id in module_ids if module_id_index[module_id].get('tag') in tags) # keep only modules that are in project type completely pts = parameters.get_parameter({}, 'project_type', 'project_types') if pts: m = set(vault.resolve_project_types(pts)) module_ids = set(module_id for module_id in module_ids if module_id_index[module_id]['modules'] <= m) query = (flask.request.args.get('query') or '').lower() matched = [] for module_id in module_ids: if module_id.find(query) >= 0: module = dict([(k, v) for k, v in six.iteritems(module_id_index[module_id]) if k not in ['modules']]) matched.append(module) return sorted(matched, key=operator.itemgetter('text'))
def get_modules_json(records): module_group_index = vault.get_vault()['module_group_index'] module_id_index = vault.get_vault()['module_id_index'] modules_set = set() for record in records: module = record['module'] if module not in modules_set: modules_set.add(module) modules_groups_set = set() for module in modules_set: if module in module_group_index: modules_groups_set |= module_group_index[module] modules_set |= modules_groups_set query = (flask.request.args.get('module_name') or '').lower() options = [] for module in modules_set: if module.find(query) >= 0: options.append(module_id_index[module]) return sorted(options, key=operator.itemgetter('text'))
def timeline(records, **kwargs): # find start and end dates release_names = parameters.get_parameter(kwargs, "release", "releases") releases = vault.get_vault()["releases"] if not release_names: flask.abort(404) if "all" in release_names: start_date = release_start_date = utils.timestamp_to_week(vault.get_vault()["start_date"]) end_date = release_end_date = utils.timestamp_to_week(vault.get_vault()["end_date"]) else: release = releases[release_names[0]] start_date = release_start_date = utils.timestamp_to_week(release["start_date"]) end_date = release_end_date = utils.timestamp_to_week(release["end_date"]) now = utils.timestamp_to_week(int(time.time())) + 1 # expand start-end to year if needed if release_end_date - release_start_date < 52: expansion = (52 - (release_end_date - release_start_date)) // 2 if release_end_date + expansion < now: end_date += expansion else: end_date = now start_date = end_date - 52 # empty stats for all weeks in range weeks = range(start_date, end_date) week_stat_loc = dict((c, 0) for c in weeks) week_stat_commits = dict((c, 0) for c in weeks) week_stat_commits_hl = dict((c, 0) for c in weeks) param = parameters.get_parameter(kwargs, "metric") if ("commits" in param) or ("loc" in param): handler = lambda record: record["loc"] else: handler = lambda record: 0 # fill stats with the data for record in records: week = record["week"] if week in weeks: week_stat_loc[week] += handler(record) week_stat_commits[week] += 1 if "all" in release_names or record["release"] in release_names: week_stat_commits_hl[week] += 1 # form arrays in format acceptable to timeline plugin array_loc = [] array_commits = [] array_commits_hl = [] for week in weeks: week_str = utils.week_to_date(week) array_loc.append([week_str, week_stat_loc[week]]) array_commits.append([week_str, week_stat_commits[week]]) array_commits_hl.append([week_str, week_stat_commits_hl[week]]) return [array_commits, array_commits_hl, array_loc]
def get_modules_json(records): module_id_index = vault.get_vault()['module_id_index'] tags = parameters.get_parameter({}, 'tag', 'tags') # all modules mentioned in records module_ids = set(record['module'] for record in records if record['module'] in module_id_index) add_modules = set([]) for module in six.itervalues(module_id_index): if set(module['modules']) <= module_ids: add_modules.add(module['id']) module_ids |= add_modules # keep only modules with specified tags if tags: module_ids = set(module_id for module_id in module_ids if module_id_index[module_id].get('tag') in tags) query = (flask.request.args.get('query') or '').lower() matched = [] for module_id in module_ids: if module_id.find(query) >= 0: module = dict([(k, v) for k, v in six.iteritems(module_id_index[module_id]) if k not in ['modules']]) module['text'] = module['module_group_name'] del module['module_group_name'] matched.append(module) return sorted(matched, key=operator.itemgetter('text'))
def get_modules_json(record_ids, **kwargs): module_id_index = vault.get_vault()["module_id_index"] tags = parameters.get_parameter({}, "tag", "tags") # all modules mentioned in records module_ids = vault.get_memory_storage().get_index_keys_by_record_ids("module", record_ids) add_modules = set([]) for module in six.itervalues(module_id_index): if set(module["modules"]) & module_ids: add_modules.add(module["id"]) module_ids |= add_modules # keep only modules with specified tags if tags: module_ids = set( module_id for module_id in module_ids if ((module_id in module_id_index) and (module_id_index[module_id].get("tag") in tags)) ) result = [] for module_id in module_ids: module = module_id_index[module_id] result.append({"id": module["id"], "text": module["module_group_name"], "tag": module["tag"]}) return sorted(result, key=operator.itemgetter("text"))
def get_modules_json(records): module_id_index = vault.get_vault()['module_id_index'] tags = parameters.get_parameter({}, 'tag', 'tags') # all modules mentioned in records module_ids = set(record['module'] for record in records if record['module'] in module_id_index) add_modules = set([]) for module in six.itervalues(module_id_index): if set(module['modules']) <= module_ids: add_modules.add(module['id']) module_ids |= add_modules # keep only modules with specified tags if tags: module_ids = set(module_id for module_id in module_ids if module_id_index[module_id].get('tag') in tags) query = (flask.request.args.get('query') or '').lower() matched = [] for module_id in module_ids: if module_id.find(query) >= 0: module = dict([ (k, v) for k, v in six.iteritems(module_id_index[module_id]) if k not in ['modules'] ]) module['text'] = module['module_group_name'] del module['module_group_name'] matched.append(module) return sorted(matched, key=operator.itemgetter('text'))
def get_modules_json(record_ids, **kwargs): module_id_index = vault.get_vault()['module_id_index'] tags = parameters.get_parameter({}, 'tag', 'tags') # all modules mentioned in records module_ids = vault.get_memory_storage().get_index_keys_by_record_ids( 'module', record_ids) add_modules = set([]) for module in six.itervalues(module_id_index): if set(module['modules']) & module_ids: add_modules.add(module['id']) module_ids |= add_modules # keep only modules with specified tags if tags: module_ids = set(module_id for module_id in module_ids if ((module_id in module_id_index) and (module_id_index[module_id].get('tag') in tags))) result = [] for module_id in module_ids: module = module_id_index[module_id] result.append({'id': module['id'], 'text': module['module_group_name'], 'tag': module['tag']}) return sorted(result, key=operator.itemgetter('text'))
def open_reviews(module): memory_storage_inst = vault.get_memory_storage() time_now = int(time.time()) module_id_index = vault.get_vault()['module_id_index'] module = module.lower() if module in module_id_index: modules = module_id_index[module]['modules'] else: modules = [module] review_ids = (memory_storage_inst.get_record_ids_by_modules(modules) & memory_storage_inst.get_record_ids_by_type('review')) waiting_on_reviewer = [] total_open = 0 for review in memory_storage_inst.get_records(review_ids): if review['status'] == 'NEW': total_open += 1 if review['value'] in [1, 2]: waiting_on_reviewer.append(review) return { 'module': module, 'total_open': total_open, 'waiting_on_reviewer': len(waiting_on_reviewer), 'waiting_on_submitter': total_open - len(waiting_on_reviewer), 'latest_revision': _process_stat( waiting_on_reviewer, 'updated_on', time_now), 'first_revision': _process_stat(waiting_on_reviewer, 'date', time_now), }
def open_reviews(module): memory_storage_inst = vault.get_memory_storage() time_now = int(time.time()) module_id_index = vault.get_vault()['module_id_index'] module = module.lower() if module in module_id_index: modules = module_id_index[module]['modules'] else: modules = [module] review_ids = (memory_storage_inst.get_record_ids_by_modules(modules) & memory_storage_inst.get_record_ids_by_type('review')) waiting_on_reviewer = [] total_open = 0 for review in memory_storage_inst.get_records(review_ids): if review['status'] == 'NEW': total_open += 1 if review['value'] in [1, 2]: waiting_on_reviewer.append(vault.extend_record(review)) return { 'module': module, 'total_open': total_open, 'waiting_on_reviewer': len(waiting_on_reviewer), 'waiting_on_submitter': total_open - len(waiting_on_reviewer), 'latest_revision': _process_stat( waiting_on_reviewer, 'updated_on', time_now), 'first_revision': _process_stat(waiting_on_reviewer, 'date', time_now), }
def _get_week(kwargs, param_name): date_param = parameters.get_single_parameter(kwargs, param_name) if date_param: ts = utils.date_to_timestamp_ext(date_param) else: ts = vault.get_vault()[param_name] return utils.timestamp_to_week(ts)
def _get_date(kwargs, param_name): date_param = parameters.get_single_parameter(kwargs, param_name) if date_param: ts = utils.date_to_timestamp_ext(date_param) else: ts = vault.get_vault()[param_name] return utils.timestamp_to_week(ts)
def timeline(records, **kwargs): # find start and end dates release_name = parameters.get_single_parameter(kwargs, 'release') or 'all' releases = vault.get_vault()['releases'] if 'all' in release_name: start_date = release_start_date = _get_date(kwargs, 'start_date') end_date = release_end_date = _get_date(kwargs, 'end_date') else: release = releases[release_name] start_date = release_start_date = utils.timestamp_to_week( release['start_date']) end_date = release_end_date = utils.timestamp_to_week( release['end_date']) now = utils.timestamp_to_week(int(time.time())) + 1 # expand start-end to year if needed if release_end_date - release_start_date < 52: expansion = (52 - (release_end_date - release_start_date)) // 2 if release_end_date + expansion < now: end_date += expansion else: end_date = now start_date = end_date - 52 # empty stats for all weeks in range weeks = range(start_date, end_date) week_stat_loc = dict((c, 0) for c in weeks) week_stat_commits = dict((c, 0) for c in weeks) week_stat_commits_hl = dict((c, 0) for c in weeks) param = parameters.get_parameter(kwargs, 'metric') if ('commits' in param) or ('loc' in param): handler = lambda record: record['loc'] else: handler = lambda record: 0 # fill stats with the data for record in records: week = record['week'] if week in weeks: week_stat_loc[week] += handler(record) week_stat_commits[week] += 1 if 'all' == release_name or record['release'] == release_name: week_stat_commits_hl[week] += 1 # form arrays in format acceptable to timeline plugin array_loc = [] array_commits = [] array_commits_hl = [] for week in weeks: week_str = utils.week_to_date(week) array_loc.append([week_str, week_stat_loc[week]]) array_commits.append([week_str, week_stat_commits[week]]) array_commits_hl.append([week_str, week_stat_commits_hl[week]]) return [array_commits, array_commits_hl, array_loc]
def get_module(module): module_id_index = vault.get_vault()['module_id_index'] module = module.lower() if module in module_id_index: return {'id': module_id_index[module]['id'], 'text': module_id_index[module]['text'], 'tag': module_id_index[module]['tag']} flask.abort(404)
def prepare_params_decorated_function(*args, **kwargs): params = _prepare_params(kwargs, ignore) cache_inst = vault.get_vault()['cache'] key = json.dumps(params) value = cache_inst.get(key) if not value: value = func(*args, **kwargs) cache_inst[key] = value vault.get_vault()['cache_size'] += len(key) + len(value) LOG.debug('Cache size: %(size)d, entries: %(len)d', {'size': vault.get_vault()['cache_size'], 'len': len(cache_inst.keys())}) return value
def templated_decorated_function(*args, **kwargs): vault_inst = vault.get_vault() template_name = template if template_name is None: template_name = (flask.request.endpoint.replace('.', '/') + '.html') ctx = f(*args, **kwargs) if ctx is None: ctx = {} # put parameters into template metric = flask.request.args.get('metric') if metric not in parameters.METRIC_LABELS: metric = None ctx['metric'] = metric or parameters.get_default('metric') ctx['metric_label'] = parameters.METRIC_LABELS[ctx['metric']] project_type = flask.request.args.get('project_type') if not vault.is_project_type_valid(project_type): project_type = parameters.get_default('project_type') ctx['project_type'] = project_type release = flask.request.args.get('release') releases = vault_inst['releases'] if release: release = release.lower() if release != 'all': if release not in releases: release = None else: release = releases[release]['release_name'] ctx['release'] = (release or parameters.get_default('release')).lower() ctx['review_nth'] = (flask.request.args.get('review_nth') or parameters.get_default('review_nth')) ctx['project_type_options'] = vault.get_project_type_options() ctx['release_options'] = vault.get_release_options() ctx['metric_options'] = sorted(parameters.METRIC_LABELS.items(), key=lambda x: x[0]) ctx['company'] = parameters.get_single_parameter(kwargs, 'company') ctx['company_original'] = ( vault.get_memory_storage().get_original_company_name( ctx['company'])) ctx['module'] = parameters.get_single_parameter(kwargs, 'module') ctx['user_id'] = parameters.get_single_parameter(kwargs, 'user_id') ctx['page_title'] = helpers.make_page_title( ctx['company'], ctx['user_id'], ctx['module'], ctx['release']) ctx['stackalytics_version'] = ( stackalytics_version.version_info.version_string()) ctx['stackalytics_release'] = ( stackalytics_version.version_info.release_string()) return flask.render_template(template_name, **ctx), return_code
def get_module(module, **kwargs): module_id_index = vault.get_vault()["module_id_index"] module = module.lower() if module in module_id_index: return { "id": module_id_index[module]["id"], "text": module_id_index[module]["module_group_name"], "tag": module_id_index[module]["tag"], } flask.abort(404)
def prepare_params_decorated_function(*args, **kwargs): params = _prepare_params(kwargs, ignore) cache_inst = vault.get_vault()['cache'] key = json.dumps(params) value = cache_inst.get(key) if not value: value = func(*args, **kwargs) cache_inst[key] = value vault.get_vault()['cache_size'] += len(key) + len(value) LOG.debug( 'Cache size: %(size)d, entries: %(len)d', { 'size': vault.get_vault()['cache_size'], 'len': len(cache_inst.keys()) }) return value
def get_default(param_name): if 'release' not in DEFAULTS: release = cfg.CONF.default_release if not release: runtime_storage_inst = vault.get_vault()['runtime_storage'] releases = runtime_storage_inst.get_by_key('releases') if releases: release = releases[-1]['release_name'] else: release = 'all' DEFAULTS['release'] = release.lower() DEFAULTS['metric'] = cfg.CONF.default_metric.lower() DEFAULTS['project_type'] = cfg.CONF.default_project_type.lower() if param_name in DEFAULTS: return DEFAULTS[param_name] else: return None
def timeline(records, **kwargs): # find start and end dates metric = parameters.get_parameter(kwargs, 'metric') start_date = int(parameters.get_single_parameter(kwargs, 'start_date') or 0) release_name = parameters.get_single_parameter(kwargs, 'release') or 'all' releases = vault.get_vault()['releases'] if 'all' in release_name: start_week = release_start_week = _get_week(kwargs, 'start_date') end_week = release_end_week = _get_week(kwargs, 'end_date') else: release = releases[release_name] start_week = release_start_week = utils.timestamp_to_week( release['start_date']) end_week = release_end_week = utils.timestamp_to_week( release['end_date']) now = utils.timestamp_to_week(int(time.time())) + 1 # expand start-end to year if needed if release_end_week - release_start_week < 52: expansion = (52 - (release_end_week - release_start_week)) // 2 if release_end_week + expansion < now: end_week += expansion else: end_week = now start_week = end_week - 52 # empty stats for all weeks in range weeks = range(start_week, end_week) week_stat_loc = dict((c, 0) for c in weeks) week_stat_commits = dict((c, 0) for c in weeks) week_stat_commits_hl = dict((c, 0) for c in weeks) if ('commits' in metric) or ('loc' in metric): handler = lambda record: record['loc'] else: handler = lambda record: 0 # fill stats with the data if 'man-days' in metric: # special case for man-day effort metric release_stat = collections.defaultdict(set) all_stat = collections.defaultdict(set) for record in records: if ((record['record_type'] == 'commit') or (record['week'] not in weeks)): continue day = record['date'] // (24 * 3600) user = vault.get_user_from_runtime_storage(record['user_id']) if record['release'] == release_name: release_stat[day] |= set([user['seq']]) all_stat[day] |= set([user['seq']]) for day, users in six.iteritems(release_stat): week = utils.timestamp_to_week(day * 24 * 3600) week_stat_commits_hl[week] += len(users) for day, users in six.iteritems(all_stat): week = utils.timestamp_to_week(day * 24 * 3600) week_stat_commits[week] += len(users) else: for record in records: week = record['week'] if week in weeks: week_stat_loc[week] += handler(record) week_stat_commits[week] += 1 if 'members' in metric: if record['date'] >= start_date: week_stat_commits_hl[week] += 1 else: if record['release'] == release_name: week_stat_commits_hl[week] += 1 if 'all' == release_name and 'members' not in metric: week_stat_commits_hl = week_stat_commits # form arrays in format acceptable to timeline plugin array_loc = [] array_commits = [] array_commits_hl = [] for week in weeks: week_str = utils.week_to_date(week) array_loc.append([week_str, week_stat_loc[week]]) array_commits.append([week_str, week_stat_commits[week]]) array_commits_hl.append([week_str, week_stat_commits_hl[week]]) return [array_commits, array_commits_hl, array_loc]
def get_release_json(release): if release != 'all': if release not in vault.get_vault()['releases']: release = parameters.get_default('release') return {'id': release, 'text': release.capitalize()}
def get_module(module): module_id_index = vault.get_vault()['module_id_index'] module = module.lower() if module in module_id_index: return module_id_index[module] flask.abort(404)
def timeline(records, **kwargs): # find start and end dates metric = parameters.get_parameter(kwargs, "metric") start_date = int(parameters.get_single_parameter(kwargs, "start_date") or 0) release_name = parameters.get_single_parameter(kwargs, "release") or "all" releases = vault.get_vault()["releases"] if "all" in release_name: start_week = release_start_week = _get_week(kwargs, "start_date") end_week = release_end_week = _get_week(kwargs, "end_date") else: release = releases[release_name] start_week = release_start_week = utils.timestamp_to_week(release["start_date"]) end_week = release_end_week = utils.timestamp_to_week(release["end_date"]) now = utils.timestamp_to_week(int(time.time())) + 1 # expand start-end to year if needed if release_end_week - release_start_week < 52: expansion = (52 - (release_end_week - release_start_week)) // 2 if release_end_week + expansion < now: end_week += expansion else: end_week = now start_week = end_week - 52 # empty stats for all weeks in range weeks = range(start_week, end_week) week_stat_loc = dict((c, 0) for c in weeks) week_stat_commits = dict((c, 0) for c in weeks) week_stat_commits_hl = dict((c, 0) for c in weeks) if ("commits" in metric) or ("loc" in metric): handler = lambda record: record["loc"] else: handler = lambda record: 0 # fill stats with the data if "man-days" in metric: # special case for man-day effort metric release_stat = collections.defaultdict(set) all_stat = collections.defaultdict(set) for record in records: if (record["record_type"] == "commit") or (record["week"] not in weeks): continue day = utils.timestamp_to_day(record["date"]) user = vault.get_user_from_runtime_storage(record["user_id"]) if record["release"] == release_name: release_stat[day] |= set([user["seq"]]) all_stat[day] |= set([user["seq"]]) for day, users in six.iteritems(release_stat): week = utils.timestamp_to_week(day * 24 * 3600) week_stat_commits_hl[week] += len(users) for day, users in six.iteritems(all_stat): week = utils.timestamp_to_week(day * 24 * 3600) week_stat_commits[week] += len(users) else: for record in records: week = record["week"] if week in weeks: week_stat_loc[week] += handler(record) week_stat_commits[week] += 1 if "members" in metric: if record["date"] >= start_date: week_stat_commits_hl[week] += 1 else: if record["release"] == release_name: week_stat_commits_hl[week] += 1 if "all" == release_name and "members" not in metric: week_stat_commits_hl = week_stat_commits # form arrays in format acceptable to timeline plugin array_loc = [] array_commits = [] array_commits_hl = [] for week in weeks: week_str = utils.week_to_date(week) array_loc.append([week_str, week_stat_loc[week]]) array_commits.append([week_str, week_stat_commits[week]]) array_commits_hl.append([week_str, week_stat_commits_hl[week]]) return [array_commits, array_commits_hl, array_loc]
def record_filter_decorated_function(*args, **kwargs): vault_inst = vault.get_vault() memory_storage_inst = vault.get_memory_storage() record_ids = set(memory_storage_inst.get_record_ids()) # a copy if 'module' not in ignore: param = parameters.get_parameter(kwargs, 'module', 'modules', use_default) if param: record_ids &= ( memory_storage_inst.get_record_ids_by_modules( vault.resolve_modules(param))) if 'project_type' not in ignore: param = parameters.get_parameter(kwargs, 'project_type', 'project_types', use_default) if param: ptgi = vault_inst['project_type_group_index'] modules = set() for project_type in param: project_type = project_type.lower() if project_type in ptgi: modules |= ptgi[project_type] record_ids &= ( memory_storage_inst.get_record_ids_by_modules(modules)) if 'user_id' not in ignore: param = parameters.get_parameter(kwargs, 'user_id', 'user_ids') param = [ u for u in param if vault.get_user_from_runtime_storage(u) ] if param: record_ids &= ( memory_storage_inst.get_record_ids_by_user_ids(param)) if 'company' not in ignore: param = parameters.get_parameter(kwargs, 'company', 'companies') if param: record_ids &= ( memory_storage_inst.get_record_ids_by_companies(param)) if 'release' not in ignore: param = parameters.get_parameter(kwargs, 'release', 'releases', use_default) if param: if 'all' not in param: record_ids &= ( memory_storage_inst.get_record_ids_by_releases( c.lower() for c in param)) if 'metric' not in ignore: metrics = parameters.get_parameter(kwargs, 'metric') if 'all' not in metrics: for metric in metrics: record_ids &= ( memory_storage_inst.get_record_ids_by_type( parameters.METRIC_TO_RECORD_TYPE[metric])) if 'tm_marks' in metrics: filtered_ids = [] review_nth = int( parameters.get_parameter(kwargs, 'review_nth')[0]) for record in memory_storage_inst.get_records(record_ids): parent = memory_storage_inst.get_record_by_primary_key( record['review_id']) if (parent and ('review_number' in parent) and (parent['review_number'] <= review_nth)): filtered_ids.append(record['record_id']) record_ids = filtered_ids if 'blueprint_id' not in ignore: param = parameters.get_parameter(kwargs, 'blueprint_id') if param: record_ids &= (memory_storage_inst. get_record_ids_by_blueprint_ids(param)) kwargs['records'] = memory_storage_inst.get_records(record_ids) return f(*args, **kwargs)
def record_filter_decorated_function(*args, **kwargs): vault_inst = vault.get_vault() memory_storage_inst = vault.get_memory_storage() record_ids = set(memory_storage_inst.get_record_ids()) # a copy if 'module' not in ignore: param = parameters.get_parameter(kwargs, 'module', 'modules', use_default) if param: record_ids &= ( memory_storage_inst.get_record_ids_by_modules( vault.resolve_modules(param))) if 'project_type' not in ignore: param = parameters.get_parameter(kwargs, 'project_type', 'project_types', use_default) if param: ptgi = vault_inst['project_type_group_index'] modules = set() for project_type in param: project_type = project_type.lower() if project_type in ptgi: modules |= ptgi[project_type] record_ids &= ( memory_storage_inst.get_record_ids_by_modules(modules)) if 'user_id' not in ignore: param = parameters.get_parameter(kwargs, 'user_id', 'user_ids') param = [u for u in param if vault.get_user_from_runtime_storage(u)] if param: record_ids &= ( memory_storage_inst.get_record_ids_by_user_ids(param)) if 'company' not in ignore: param = parameters.get_parameter(kwargs, 'company', 'companies') if param: record_ids &= ( memory_storage_inst.get_record_ids_by_companies(param)) if 'release' not in ignore: param = parameters.get_parameter(kwargs, 'release', 'releases', use_default) if param: if 'all' not in param: record_ids &= ( memory_storage_inst.get_record_ids_by_releases( c.lower() for c in param)) if 'metric' not in ignore: metrics = parameters.get_parameter(kwargs, 'metric') if 'all' not in metrics: for metric in metrics: record_ids &= ( memory_storage_inst.get_record_ids_by_type( parameters.METRIC_TO_RECORD_TYPE[metric])) if 'tm_marks' in metrics: filtered_ids = [] review_nth = int(parameters.get_parameter( kwargs, 'review_nth')[0]) for record in memory_storage_inst.get_records(record_ids): parent = memory_storage_inst.get_record_by_primary_key( record['review_id']) if (parent and ('review_number' in parent) and (parent['review_number'] <= review_nth)): filtered_ids.append(record['record_id']) record_ids = filtered_ids if 'blueprint_id' not in ignore: param = parameters.get_parameter(kwargs, 'blueprint_id') if param: record_ids &= ( memory_storage_inst.get_record_ids_by_blueprint_ids( param)) time_filter = _get_time_filter(kwargs) kwargs['records'] = time_filter( memory_storage_inst.get_records(record_ids)) return f(*args, **kwargs)
def get_release_json(release): if release != "all": if release not in vault.get_vault()["releases"]: release = parameters.get_default("release") return {"id": release, "text": release.capitalize()}
def timeline(records, **kwargs): # find start and end dates metric = parameters.get_parameter(kwargs, 'metric') start_date = int(parameters.get_single_parameter(kwargs, 'start_date') or 0) release_name = parameters.get_single_parameter(kwargs, 'release') or 'all' releases = vault.get_vault()['releases'] if 'all' in release_name: start_week = release_start_week = _get_week(kwargs, 'start_date') end_week = release_end_week = _get_week(kwargs, 'end_date') else: release = releases[release_name] start_week = release_start_week = utils.timestamp_to_week( release['start_date']) end_week = release_end_week = utils.timestamp_to_week( release['end_date']) now = utils.timestamp_to_week(int(time.time())) + 1 # expand start-end to year if needed if release_end_week - release_start_week < 52: expansion = (52 - (release_end_week - release_start_week)) // 2 if release_end_week + expansion < now: end_week += expansion else: end_week = now start_week = end_week - 52 # empty stats for all weeks in range weeks = range(start_week, end_week) week_stat_loc = dict((c, 0) for c in weeks) week_stat_commits = dict((c, 0) for c in weeks) week_stat_commits_hl = dict((c, 0) for c in weeks) if ('commits' in metric) or ('loc' in metric): handler = lambda record: record['loc'] else: handler = lambda record: 0 # fill stats with the data if 'man-days' in metric: # special case for man-day effort metric release_stat = collections.defaultdict(set) all_stat = collections.defaultdict(set) for record in records: if ((record['record_type'] == 'commit') or (record['week'] not in weeks)): continue day = utils.timestamp_to_day(record['date']) user = vault.get_user_from_runtime_storage(record['user_id']) if record['release'] == release_name: release_stat[day] |= set([user['seq']]) all_stat[day] |= set([user['seq']]) for day, users in six.iteritems(release_stat): week = utils.timestamp_to_week(day * 24 * 3600) week_stat_commits_hl[week] += len(users) for day, users in six.iteritems(all_stat): week = utils.timestamp_to_week(day * 24 * 3600) week_stat_commits[week] += len(users) else: for record in records: week = record['week'] if week in weeks: week_stat_loc[week] += handler(record) week_stat_commits[week] += 1 if 'members' in metric: if record['date'] >= start_date: week_stat_commits_hl[week] += 1 else: if record['release'] == release_name: week_stat_commits_hl[week] += 1 if 'all' == release_name and 'members' not in metric: week_stat_commits_hl = week_stat_commits # form arrays in format acceptable to timeline plugin array_loc = [] array_commits = [] array_commits_hl = [] for week in weeks: week_str = utils.week_to_date(week) array_loc.append([week_str, week_stat_loc[week]]) array_commits.append([week_str, week_stat_commits[week]]) array_commits_hl.append([week_str, week_stat_commits_hl[week]]) return [array_commits, array_commits_hl, array_loc]