def validate_filename(filepath):
    print('Validate file name looks like an email address')
    print('----------------------------------------------')

    file_name = utils.get_email(filepath)
    is_valid = '@' in file_name

    print('Filename: %s [%s] %s' % (file_name, filepath,
                                    {True: 'PASS', False: 'FAIL'}[is_valid]))
    print('')
    return is_valid
def validate_member(filepath, verbose=0):
    print('Validate email address is OSF member')
    print('------------------------------------')

    email = utils.get_email(filepath)
    member = utils.lookup_member(email, verbose=verbose)
    is_valid = member.get('data', []) != []

    print('Email address: %s %s' % (email,
                                    {True: 'PASS', False: 'FAIL'}[is_valid]))
    print('')
    return is_valid
def check_for_changes(projects, filepath, limit, verbose=0):
    print('Looking for validating changes')
    print('------------------------------')

    email = utils.get_email(filepath)
    project_name = os.path.basename(os.path.dirname(filepath))
    project_name = utils.dir2name(project_name, projects)

    changes_found = check_candidacy.check_candidate(project_name, email,
                                                    projects, limit,
                                                    verbose=verbose)
    print('Email address: %s %s' % (
        email, {True: 'PASS', False: 'FAIL'}[changes_found]))
    print('')
    return bool(changes_found)
def main():
    description = ('Check all files under the current open election are valid')
    parser = argparse.ArgumentParser(description)

    parser.add_argument('--limit', dest='limit', type=int, default=1,
                        help=('How many validating changes to report.  '
                              'A negative value means report many.  '
                              'Default: %(default)s'))
    parser.add_argument('--tag', dest='tag', default=utils.conf['tag'],
                        help=('The governance tag to validate against.  '
                              'Default: %(default)s'))
    parser.add_argument('--release', dest='release',
                        default=utils.conf['release'],
                        help=('The relase to validate candidates against.  '
                              'Default: %(default)s'))
    parser.add_argument('--HEAD',
                        dest='head_only',
                        action='store_true',
                        default=False,
                        help='Validate all candidates.')
    parser.add_argument('files',
                        nargs='*',
                        help='Candidate files to validate.')
    parser.add_argument('-v', '--verbose', action="count", default=0,
                        help='Increase program verbosity')

    args = parser.parse_args()
    errors = False

    if not utils.election_is_running():
        print('no current active election')
        return 0

    if not validate_release(args.release):
        return 1

    projects = utils.get_projects(tag=args.tag, fallback_to_master=True)
    election_type = utils.conf.get('election_type', '').lower()

    if args.files:
        to_process = args.files
    elif args.head_only:
        to_process = find_modified_candidate_files()
    else:
        to_process = utils.find_candidate_files(election=args.release)

    for filepath in to_process:
        email = utils.get_email(filepath)
        team = os.path.basename(os.path.dirname(filepath))

        # Some kind souls remove the .placeholder file when they upload
        # a candidacy
        if email == '.placeholder':
            continue

        candidate_ok = True

        candidate_ok &= validate_filename(filepath)
        candidate_ok &= validate_member(filepath, verbose=args.verbose)

        if candidate_ok:
            if (election_type == 'ptl'
                    or (election_type == 'combined' and team != 'TC')):
                candidate_ok &= check_for_changes(projects, filepath,
                                                  args.limit,
                                                  verbose=args.verbose)

        errors |= not candidate_ok

    return 1 if errors else 0
def main():
    description = ('Check all open reviews for candidacies')
    parser = argparse.ArgumentParser(description)
    parser.add_argument('--limit', dest='limit', type=int, default=1,
                        help=('How many validating changes to report.  '
                              'A negative value means report many.  '
                              'Default: %(default)s'))
    parser.add_argument('--tag', dest='tag', default=utils.conf['tag'],
                        help=('The governance tag to validate against.  '
                              'Default: %(default)s'))
    parser.add_argument('--interactive', dest='interactive', default=False,
                        action='store_true',
                        help=('Pause after each review to manually post '
                              'results'))
    parser.add_argument('-v', '--verbose', action="count", default=0,
                        help='Increase program verbosity')

    args = parser.parse_args()
    projects = utils.get_projects(tag=args.tag, fallback_to_master=True)
    election_type = utils.conf.get('election_type', '').lower()

    for review in get_reviews(verbose=args.verbose):
        if review['status'] != 'NEW':
            continue

        review_url = '%s/%d' % (utils.GERRIT_BASE, review['_number'])
        print('\n\nChecking %s' % (review_url))

        for filepath in utils.candidate_files(review):
            email = utils.get_email(filepath)
            team = os.path.basename(os.path.dirname(filepath))

            # Some kind souls remove the .placeholder file when they upload
            # a candidacy
            if email == '.placeholder':
                continue

            candiate_ok = checks.validate_filename(filepath)
            if candiate_ok:
                candiate_ok = checks.validate_member(filepath,
                                                     verbose=args.verbose)

            if candiate_ok:
                # If we're a PTL election OR if the team is not TC we need
                # to check for validating changes
                if (election_type == 'ptl'
                        or (election_type == 'combined' and team != 'TC')):
                    if args.interactive:
                        print('The following commit and profile validate this '
                              'candidate:')
                    candiate_ok = checks.check_for_changes(
                        projects, filepath, args.limit,
                        verbose=args.verbose)
                    print_member(filepath, verbose=args.verbose)
                else:
                    print('Not checking for changes as this is a TC election')
            else:
                print('Not checking for changes as %s doesn\'t seem to '
                      'describe a valid candidacy' % (filepath))

            if args.interactive:
                try:
                    input('Next review?')
                except KeyboardInterrupt:
                    print('')
                    return 0

            results.append((review_url, email, team, candiate_ok))

    print('\n\n\n')
    print('*' * 80)
    for result in results:
        (review_url, email, team, candiate_ok) = result
        print(review_url)
        if candiate_ok:
            print(' SUCCESS: %s is a valid candidate for %s' % (email, team))
        else:
            print(' ERROR: Candidate %s is not valid, please review '
                  'previous messages for details.' % (email))
    print('*' * 80)
    return 0
def print_member(filepath, verbose=0):
    email = utils.get_email(filepath)
    member = utils.lookup_member(email, verbose=verbose)
    member_id = member.get('data', [{}])[0].get('id')
    base = 'https://www.openstack.org/community/members/profile'
    print('OSF member profile: %s/%s' % (base, member_id))