Пример #1
0
def create_extension_route():
    """
    Create extension

    Request params:
    * GithubUrl: (string)
    * Name: (string) extension display name
    * Description: (string)
    * DeveloperName: (string)
    * Images: (list) list of image URLs

    Response:
    * Extension object
    """
    user = request.get('REMOTE_USER')
    data = request.json

    try:
        assert data.get('Name'), 'Name cannot be empty'
        assert data.get('Description'), 'Description cannot be empty'
        assert data.get('DeveloperName'), 'DeveloperName cannot be empty'
        assert data.get('GithubUrl'), 'GithubUrl cannot be empty'
        assert isinstance(data.get('Images'),
                          list), 'Images must be a list of URLs'
        # pylint: disable=len-as-condition
        assert 0 < len(
            data['Images']
        ) < 6, 'You must upload at least 1 (max 5) screenshot of your extension'

        project_path = get_project_path(data['GithubUrl'])
        info = get_repo_info(project_path)
        try:
            versions = get_json(project_path, 'master', 'versions')
            versions_only = [v['required_api_version'] for v in versions]
            commit_or_branch = get_latest_version_commit(versions)
        except JsonFileNotFoundError:
            commit_or_branch = 'master'
            versions_only = ['^1.0.0']

        manifest = get_json(project_path, commit_or_branch, 'manifest')
        validate_manifest(manifest)

        for image_url in data['Images']:
            validate_image_url(image_url)

        data = put_extension(User=user,
                             GithubUrl=data['GithubUrl'],
                             ProjectPath=project_path,
                             Name=data['Name'],
                             Description=data['Description'],
                             DeveloperName=data['DeveloperName'],
                             Images=data['Images'],
                             SupportedVersions=versions_only,
                             GithubStars=info['stargazers_count'],
                             Published=True)
        return {'data': data}
    except (AssertionError, ImageUrlValidationError, InvalidGithubUrlError,
            HTTPError, ProjectValidationError,
            ExtensionAlreadyExistsError) as e:
        return ErrorResponse(e, 400)
def update_ext_stars(ext):
    project_path = get_project_path(ext['GithubUrl'])
    try:
        info = get_repo_info(project_path)
        stars = info['stargazers_count']
    except ProjectNotFoundError:
        stars = 0

    try:
        update_extension(ext['ID'], GithubStars=stars)
    except Exception as e:
        logger.error('%s: %s', type(e).__name__, e)
        traceback.print_exc(file=sys.stderr)

    logger.info('Extension %s is synced. GithubStars: %s', ext['ID'], stars)
Пример #3
0
def validate_project():
    """
    Checks that versions.json file is valid

    Query params:
    * url: string. Example https://github.com/user/project

    Response:
    * {Name: (str), Description: (str), DeveloperName: (str)}
    """

    try:
        url = request.GET.get('url')
        assert url, 'query argument "url" cannot be empty'
        project_path = get_project_path(url)
        get_repo_info(project_path)
        try:
            versions = get_json(project_path, 'master', 'versions')
            commit_or_branch = get_latest_version_commit(versions)
        except JsonFileNotFoundError:
            commit_or_branch = 'master'
        except json.JSONDecodeError as e:
            return ErrorResponse(
                ProjectValidationError(f'Error in versions.json: {str(e)}'),
                400)

        manifest = get_json(project_path, commit_or_branch, 'manifest')
        validate_manifest(manifest)

        return {
            'data': {
                'GithubUrl': url,
                'Name': manifest['name'],
                'Description': manifest['description'],
                'DeveloperName': manifest['developer_name'],
            }
        }
    except json.JSONDecodeError as e:
        return ErrorResponse(
            ProjectValidationError(f'Error in manifest.json: {str(e)}'), 400)
    except (InvalidGithubUrlError, HTTPError, ProjectValidationError,
            AssertionError) as e:
        return ErrorResponse(e, 400)
Пример #4
0
def update_ext_versions(ext):
    project_path = get_project_path(ext['GithubUrl'])
    try:
        versions = get_json(project_path, 'master', 'versions')
        valid_versions = validate_versions(versions)
        versions_only = [v['required_api_version'] for v in valid_versions]
    except JsonFileNotFoundError:
        versions_only = ['^1.0.0']
    except VersionsValidationError:
        versions_only = []

    try:
        update_extension(ext['ID'], SupportedVersions=versions_only)
    except Exception as e:
        logger.error('%s: %s', type(e).__name__, e)
        traceback.print_exc(file=sys.stderr)

    logger.info('Extension %s is synced. SupportedVersions: %s', ext['ID'],
                versions_only)
Пример #5
0
def test_get_project_path__returns_path():
    assert get_project_path(
        'https://github.com/owner_name/repo-name') == 'owner_name/repo-name'
    assert get_project_path(
        'https://github.com/owner_name/repo-name/') == 'owner_name/repo-name'
Пример #6
0
def test_get_project_path__raises_InvalidGithubUrlError():
    with pytest.raises(InvalidGithubUrlError):
        assert get_project_path('') == 'owner_name/repo-name'
    with pytest.raises(InvalidGithubUrlError):
        assert get_project_path('https://github.coms/owner_name/repo-name/')