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)
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)
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)
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'
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/')