Skip to content

@returns.* decorator doesn't override the return annotation #144

@prkumar

Description

@prkumar

Describe the bug
When decorating a consumer method with @returns and also including a return annotation, it seems that the return annotation is considered the converter type instead of the type given in the @returns decorator.

To Reproduce
Here's an example that reproduces the issue:

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("/"))


class GitHub(Consumer):
    """A Python Client for the GitHub API"""

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

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


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

Expected behavior
The expected behavior here is to

Additional context
It seems that annotating the consumer class with @returns.* also is effected, as expected. We need to make sure that the use case of @returns as the class decorator is also supported.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions