Skip to content

Annotating consumer class with @returns.* doesn't propagate to consumer methods #145

@prkumar

Description

@prkumar

Describe the bug
Annotating consumer class with @returns.* decorator doesn't propagate in some cases to consumer methods.

To Reproduce

from collections import namedtuple
from marshmallow import Schema, fields, post_load
from typing import List
from uplink import get, post, json, retry, returns, Consumer, Path, Query, Body

Repo = namedtuple("Repo", field_names=["owner", "name"])


class RepoResource(Schema):
    """Schema for GitHub's repository resource."""
    full_name = fields.Str()

    @post_load
    def make_repo(self, data):
        """Decodes the repository resource into a Python object."""
        return Repo(*data["full_name"].split("/"))


@returns.json
class GitHub(Consumer):
    """A Python Client for the GitHub API"""

    @retry(max_attempts=3)
    @get("/users/{user}/repos", args={"user": Path, "sort_by": Query("sort")})
    def get_repos(self, user: str, sort_by: str = "created") -> List[RepoResource]:
        """Get user's public repositories"""

    @json
    @post("/user/repos", args={"repo": Body(RepoResource), "access_token": Query})
    def create_repo(self, repo: Repo, access_token: str) -> RepoResource:
        """Create a repository for the authenticated user."""


if __name__ == "__main__":
    github = GitHub(base_url="https://api.github.com/")
    print(github.get_repos("prkumar"))

The printed out response is a requests.Response object instead of the expected Repo object.

Expected behavior
The expected behavior is that @returns.json propagates to consumer methods.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions