Пример #1
0
    def get_version(version_pk):
        """
        Retrieve version data from the API.

        :param version_pk: version pk to sync
        :type version_pk: int
        :returns: a data-complete version object
        :rtype: builds.models.APIVersion
        """
        version_data = api_v2.version(version_pk).get()
        return APIVersion(**version_data)
Пример #2
0
def version_from_slug(slug, version):
    from readthedocs.builds.models import Version, APIVersion
    from readthedocs.api.v2.client import api
    if settings.DONT_HIT_DB:
        version_data = api.version().get(
            project=slug,
            slug=version,
        )['results'][0]
        v = APIVersion(**version_data)
    else:
        v = Version.objects.get(project__slug=slug, slug=version)
    return v
Пример #3
0
def version_from_slug(slug, version):
    from readthedocs.builds.models import Version, APIVersion
    from readthedocs.api.v2.client import api
    if settings.DONT_HIT_DB:
        version_data = api.version().get(
            project=slug,
            slug=version,
        )['results'][0]
        v = APIVersion(**version_data)
    else:
        v = Version.objects.get(project__slug=slug, slug=version)
    return v
Пример #4
0
    def get_config_params(self):
        """Get configuration parameters to be rendered into the conf file."""
        # TODO this should be handled better in the theme
        conf_py_path = os.path.join(
            os.path.sep,
            os.path.dirname(
                os.path.relpath(
                    self.config_file,
                    self.project.checkout_path(self.version.slug),
                ), ),
            '',
        )
        remote_version = self.version.commit_name

        github_user, github_repo = version_utils.get_github_username_repo(
            url=self.project.repo, )
        github_version_is_editable = (self.version.type == 'branch')
        display_github = github_user is not None

        bitbucket_user, bitbucket_repo = version_utils.get_bitbucket_username_repo(  # noqa
            url=self.project.repo, )
        bitbucket_version_is_editable = (self.version.type == 'branch')
        display_bitbucket = bitbucket_user is not None

        gitlab_user, gitlab_repo = version_utils.get_gitlab_username_repo(
            url=self.project.repo, )
        gitlab_version_is_editable = (self.version.type == 'branch')
        display_gitlab = gitlab_user is not None

        versions = []
        downloads = []
        subproject_urls = []
        # Avoid hitting database and API if using Docker build environment
        if settings.DONT_HIT_API:
            if self.project.has_feature(Feature.ALL_VERSIONS_IN_HTML_CONTEXT):
                versions = self.project.active_versions()
            else:
                versions = self.project.active_versions().filter(
                    privacy_level=PUBLIC, )
            downloads = self.version.get_downloads(pretty=True)
            subproject_urls = self.project.get_subproject_urls()
        else:
            try:
                versions = self.project.api_versions()
                if not self.project.has_feature(
                        Feature.ALL_VERSIONS_IN_HTML_CONTEXT):
                    versions = [
                        v for v in versions if v.privacy_level == PUBLIC
                    ]
                downloads = api.version(self.version.pk).get()['downloads']
                subproject_urls = self.project.get_subproject_urls()
            except ConnectionError:
                log.exception(
                    'Timeout while fetching versions/downloads/subproject_urls for Sphinx context. '
                    'project: %s version: %s',
                    self.project.slug,
                    self.version.slug,
                )

        data = {
            'html_theme':
            'sphinx_rtd_theme',
            'html_theme_import':
            'sphinx_rtd_theme',
            'current_version':
            self.version.verbose_name,
            'project':
            self.project,
            'version':
            self.version,
            'settings':
            settings,
            'conf_py_path':
            conf_py_path,
            'api_host':
            settings.PUBLIC_API_URL,
            'commit':
            self.project.vcs_repo(self.version.slug).commit,
            'versions':
            versions,
            'downloads':
            downloads,
            'subproject_urls':
            subproject_urls,

            # GitHub
            'github_user':
            github_user,
            'github_repo':
            github_repo,
            'github_version':
            remote_version,
            'github_version_is_editable':
            github_version_is_editable,
            'display_github':
            display_github,

            # BitBucket
            'bitbucket_user':
            bitbucket_user,
            'bitbucket_repo':
            bitbucket_repo,
            'bitbucket_version':
            remote_version,
            'bitbucket_version_is_editable':
            bitbucket_version_is_editable,
            'display_bitbucket':
            display_bitbucket,

            # GitLab
            'gitlab_user':
            gitlab_user,
            'gitlab_repo':
            gitlab_repo,
            'gitlab_version':
            remote_version,
            'gitlab_version_is_editable':
            gitlab_version_is_editable,
            'display_gitlab':
            display_gitlab,

            # Features
            'dont_overwrite_sphinx_context':
            self.project.has_feature(Feature.DONT_OVERWRITE_SPHINX_CONTEXT, ),
        }

        finalize_sphinx_context_data.send(
            sender=self.__class__,
            build_env=self.build_env,
            data=data,
        )

        return data
Пример #5
0
    def on_success(self, retval, task_id, args, kwargs):
        html = self.data.outcomes['html']
        search = self.data.outcomes['search']
        localmedia = self.data.outcomes['localmedia']
        pdf = self.data.outcomes['pdf']
        epub = self.data.outcomes['epub']

        # Store build artifacts to storage (local or cloud storage)
        self.store_build_artifacts(
            self.data.build_env,
            html=html,
            search=search,
            localmedia=localmedia,
            pdf=pdf,
            epub=epub,
        )

        # NOTE: we are updating the db version instance *only* when
        # HTML are built successfully.
        if html:
            try:
                api_v2.version(self.data.version.pk).patch({
                    'built':
                    True,
                    'documentation_type':
                    self.get_final_doctype(),
                    'has_pdf':
                    pdf,
                    'has_epub':
                    epub,
                    'has_htmlzip':
                    localmedia,
                })
            except HttpClientError:
                # NOTE: I think we should fail the build if we cannot update
                # the version at this point. Otherwise, we will have inconsistent data
                log.exception('Updating version failed, skipping file sync.', )

        # Index search data
        fileify.delay(
            version_pk=self.data.version.pk,
            commit=self.data.build['commit'],
            build=self.data.build['id'],
            search_ranking=self.data.config.search.ranking,
            search_ignore=self.data.config.search.ignore,
        )

        if not self.data.project.has_valid_clone:
            self.set_valid_clone()

        self.send_notifications(
            self.data.version.pk,
            self.data.build['id'],
            event=WebHookEvent.BUILD_PASSED,
        )

        if self.data.build_commit:
            send_external_build_status(
                version_type=self.data.version.type,
                build_pk=self.data.build['id'],
                commit=self.data.build_commit,
                status=BUILD_STATUS_SUCCESS,
            )

        # Update build object
        self.data.build['success'] = True
Пример #6
0
    def get_config_params(self):
        """Get configuration parameters to be rendered into the conf file."""
        # TODO this should be handled better in the theme
        conf_py_path = os.path.join(
            os.path.sep,
            os.path.dirname(
                os.path.relpath(
                    self.config_file,
                    self.project.checkout_path(self.version.slug),
                ), ),
            '',
        )
        remote_version = self.version.commit_name

        github_user, github_repo = version_utils.get_github_username_repo(
            url=self.project.repo, )
        github_version_is_editable = (self.version.type == 'branch')
        display_github = github_user is not None

        bitbucket_user, bitbucket_repo = version_utils.get_bitbucket_username_repo(  # noqa
            url=self.project.repo, )
        bitbucket_version_is_editable = (self.version.type == 'branch')
        display_bitbucket = bitbucket_user is not None

        gitlab_user, gitlab_repo = version_utils.get_gitlab_username_repo(
            url=self.project.repo, )
        gitlab_version_is_editable = (self.version.type == 'branch')
        display_gitlab = gitlab_user is not None

        # Avoid hitting database and API if using Docker build environment
        if settings.DONT_HIT_API:
            versions = self.project.active_versions()
            downloads = self.version.get_downloads(pretty=True)
        else:
            versions = self.project.api_versions()
            downloads = api.version(self.version.pk).get()['downloads']

        data = {
            'html_theme':
            'sphinx_rtd_theme',
            'html_theme_import':
            'sphinx_rtd_theme',
            'current_version':
            self.version.verbose_name,
            'project':
            self.project,
            'version':
            self.version,
            'settings':
            settings,
            'conf_py_path':
            conf_py_path,
            'api_host':
            settings.PUBLIC_API_URL,
            'proxied_api_host':
            settings.RTD_PROXIED_API_URL,
            'commit':
            self.project.vcs_repo(self.version.slug).commit,
            'versions':
            versions,
            'downloads':
            downloads,

            # GitHub
            'github_user':
            github_user,
            'github_repo':
            github_repo,
            'github_version':
            remote_version,
            'github_version_is_editable':
            github_version_is_editable,
            'display_github':
            display_github,

            # BitBucket
            'bitbucket_user':
            bitbucket_user,
            'bitbucket_repo':
            bitbucket_repo,
            'bitbucket_version':
            remote_version,
            'bitbucket_version_is_editable':
            bitbucket_version_is_editable,
            'display_bitbucket':
            display_bitbucket,

            # GitLab
            'gitlab_user':
            gitlab_user,
            'gitlab_repo':
            gitlab_repo,
            'gitlab_version':
            remote_version,
            'gitlab_version_is_editable':
            gitlab_version_is_editable,
            'display_gitlab':
            display_gitlab,

            # Features
            'dont_overwrite_sphinx_context':
            self.project.has_feature(Feature.DONT_OVERWRITE_SPHINX_CONTEXT, ),
        }

        finalize_sphinx_context_data.send(
            sender=self.__class__,
            build_env=self.build_env,
            data=data,
        )

        return data
Пример #7
0
    def get_config_params(self):
        """Get configuration parameters to be rendered into the conf file."""
        # TODO this should be handled better in the theme
        conf_py_path = os.path.join(
            os.path.sep,
            os.path.dirname(
                os.path.relpath(
                    self.config_file,
                    self.project.checkout_path(self.version.slug),
                ),
            ),
            '',
        )
        remote_version = self.version.commit_name

        github_user, github_repo = version_utils.get_github_username_repo(
            url=self.project.repo,
        )
        github_version_is_editable = (self.version.type == 'branch')
        display_github = github_user is not None

        bitbucket_user, bitbucket_repo = version_utils.get_bitbucket_username_repo(  # noqa
            url=self.project.repo,
        )
        bitbucket_version_is_editable = (self.version.type == 'branch')
        display_bitbucket = bitbucket_user is not None

        gitlab_user, gitlab_repo = version_utils.get_gitlab_username_repo(
            url=self.project.repo,
        )
        gitlab_version_is_editable = (self.version.type == 'branch')
        display_gitlab = gitlab_user is not None

        # Avoid hitting database and API if using Docker build environment
        if settings.DONT_HIT_API:
            versions = self.project.active_versions()
            downloads = self.version.get_downloads(pretty=True)
        else:
            versions = self.project.api_versions()
            downloads = api.version(self.version.pk).get()['downloads']

        data = {
            'html_theme': 'sphinx_rtd_theme',
            'html_theme_import': 'sphinx_rtd_theme',
            'current_version': self.version.verbose_name,
            'project': self.project,
            'version': self.version,
            'settings': settings,
            'conf_py_path': conf_py_path,
            'api_host': settings.PUBLIC_API_URL,
            'commit': self.project.vcs_repo(self.version.slug).commit,
            'versions': versions,
            'downloads': downloads,

            # GitHub
            'github_user': github_user,
            'github_repo': github_repo,
            'github_version': remote_version,
            'github_version_is_editable': github_version_is_editable,
            'display_github': display_github,

            # BitBucket
            'bitbucket_user': bitbucket_user,
            'bitbucket_repo': bitbucket_repo,
            'bitbucket_version': remote_version,
            'bitbucket_version_is_editable': bitbucket_version_is_editable,
            'display_bitbucket': display_bitbucket,

            # GitLab
            'gitlab_user': gitlab_user,
            'gitlab_repo': gitlab_repo,
            'gitlab_version': remote_version,
            'gitlab_version_is_editable': gitlab_version_is_editable,
            'display_gitlab': display_gitlab,

            # Features
            'dont_overwrite_sphinx_context': self.project.has_feature(
                Feature.DONT_OVERWRITE_SPHINX_CONTEXT,
            ),
            'use_pdf_latexmk': self.project.has_feature(
                Feature.USE_PDF_LATEXMK,
            ),
        }

        finalize_sphinx_context_data.send(
            sender=self.__class__,
            build_env=self.build_env,
            data=data,
        )

        return data