diff --git a/github/ContentFile.py b/github/ContentFile.py index 626fa904..8c4f58cb 100644 --- a/github/ContentFile.py +++ b/github/ContentFile.py @@ -25,6 +25,7 @@ ################################################################################ import github.GithubObject +import github.Repository class ContentFile(github.GithubObject.CompletableGithubObject): @@ -80,6 +81,17 @@ class ContentFile(github.GithubObject.CompletableGithubObject): self._completeIfNotSet(self._path) return self._path.value + @property + def repository(self): + """ + :type: :class:`github.Repository.Repository` + """ + if self._repository is github.GithubObject.NotSet: + # The repository was not set automatically, so it must be looked up by url. + repo_url = "/".join(self.url.split("/")[:6]) + self._repository = github.GithubObject._ValuedAttribute(github.Repository.Repository(self._requester, self._headers, {'url': repo_url}, completed=False)) + return self._repository.value + @property def sha(self): """ @@ -119,6 +131,7 @@ class ContentFile(github.GithubObject.CompletableGithubObject): self._html_url = github.GithubObject.NotSet self._name = github.GithubObject.NotSet self._path = github.GithubObject.NotSet + self._repository = github.GithubObject.NotSet self._sha = github.GithubObject.NotSet self._size = github.GithubObject.NotSet self._type = github.GithubObject.NotSet @@ -136,6 +149,8 @@ class ContentFile(github.GithubObject.CompletableGithubObject): self._name = self._makeStringAttribute(attributes["name"]) if "path" in attributes: # pragma no branch self._path = self._makeStringAttribute(attributes["path"]) + if "repository" in attributes: # pragma no branch + self._repository = self._makeClassAttribute(github.Repository.Repository, attributes["repository"]) if "sha" in attributes: # pragma no branch self._sha = self._makeStringAttribute(attributes["sha"]) if "size" in attributes: # pragma no branch diff --git a/github/MainClass.py b/github/MainClass.py index 2f3ff914..3d325ad4 100644 --- a/github/MainClass.py +++ b/github/MainClass.py @@ -395,6 +395,41 @@ class Github(object): url_parameters ) + def search_code(self, query, sort=github.GithubObject.NotSet, order=github.GithubObject.NotSet, **qualifiers): + """ + :calls: `GET /search/issues `_ + :param query: string + :param sort: string ('indexed') + :param order: string ('asc', 'desc') + :param qualifiers: keyword dict query qualifiers + :rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.CodeSearchResult.CodeSearchResult` + """ + assert isinstance(query, (str, unicode)), query + url_parameters = dict() + if sort is not github.GithubObject.NotSet: + assert sort in ('indexed',), sort + url_parameters["sort"] = sort + if order is not github.GithubObject.NotSet: + assert order in ('asc', 'desc'), order + url_parameters["order"] = order + + query_chunks = [] + if query: + query_chunks.append(urllib.quote(query)) + + for qualifier, value in qualifiers.items(): + query_chunks.append("%s:%s" % (qualifier, value)) + + url_parameters["q"] = ' '.join(query_chunks) + assert url_parameters["q"], "need at least one qualifier" + + return github.PaginatedList.PaginatedList( + github.ContentFile.ContentFile, + self.__requester, + "/search/code", + url_parameters + ) + def render_markdown(self, text, context=github.GithubObject.NotSet): """ :calls: `POST /markdown `_