Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add metadata attribute to REST #352

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions cosmpy/auth/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
"""Interface for the Auth functionality of CosmosSDK."""

from abc import ABC, abstractmethod
from typing import Optional, Tuple

from cosmpy.protos.cosmos.auth.v1beta1.query_pb2 import (
QueryAccountRequest,
Expand All @@ -33,21 +34,31 @@ class Auth(ABC):
"""Auth abstract class."""

@abstractmethod
def Account(self, request: QueryAccountRequest) -> QueryAccountResponse:
def Account(
self,
request: QueryAccountRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryAccountResponse:
"""
Query account data - sequence, account_id, etc.

:param request: QueryAccountRequest that contains account address
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryAccountResponse
"""

@abstractmethod
def Params(self, request: QueryParamsRequest) -> QueryParamsResponse:
def Params(
self,
request: QueryParamsRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryParamsResponse:
"""
Query all parameters.

:param request: QueryParamsRequest
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryParamsResponse
"""
16 changes: 13 additions & 3 deletions cosmpy/auth/rest_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
# ------------------------------------------------------------------------------

"""Implementation of Auth interface using REST."""
from typing import Optional, Tuple

from google.protobuf.json_format import Parse

Expand All @@ -44,23 +45,32 @@ def __init__(self, rest_api: RestClient):
"""
self._rest_api = rest_api

def Account(self, request: QueryAccountRequest) -> QueryAccountResponse:
def Account(
self,
request: QueryAccountRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryAccountResponse:
"""
Query account data - sequence, account_id, etc.

:param request: QueryAccountRequest that contains account address
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryAccountResponse
"""
json_response = self._rest_api.get(f"{self.API_URL}/accounts/{request.address}")
return Parse(json_response, QueryAccountResponse())

def Params(self, request: QueryParamsRequest) -> QueryParamsResponse:
def Params(
self,
request: QueryParamsRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryParamsResponse:
"""
Query all parameters.

:param request: QueryParamsRequest

:param metadata: The metadata for the call or None. metadata are additional headers
:return: QueryParamsResponse
"""
json_response = self._rest_api.get(f"{self.API_URL}/params")
Expand Down
46 changes: 39 additions & 7 deletions cosmpy/bank/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
"""Interface for the Bank functionality of CosmosSDK."""

from abc import ABC, abstractmethod
from typing import Optional, Tuple

from cosmpy.protos.cosmos.bank.v1beta1.query_pb2 import (
QueryAllBalancesRequest,
Expand All @@ -43,75 +44,106 @@ class Bank(ABC):
"""Bank abstract class."""

@abstractmethod
def Balance(self, request: QueryBalanceRequest) -> QueryBalanceResponse:
def Balance(
self,
request: QueryBalanceRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryBalanceResponse:
"""
Query balance of selected denomination from specific account.

:param request: QueryBalanceRequest with address and denomination
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryBalanceResponse
"""

@abstractmethod
def AllBalances(self, request: QueryAllBalancesRequest) -> QueryAllBalancesResponse:
def AllBalances(
self,
request: QueryAllBalancesRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryAllBalancesResponse:
"""
Query balance of all denominations from specific account.

:param request: QueryAllBalancesRequest with account address
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryAllBalancesResponse
"""

@abstractmethod
def TotalSupply(self, request: QueryTotalSupplyRequest) -> QueryTotalSupplyResponse:
def TotalSupply(
self,
request: QueryTotalSupplyRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryTotalSupplyResponse:
"""
Query total supply of all denominations.

:param request: QueryTotalSupplyRequest
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryTotalSupplyResponse
"""

@abstractmethod
def SupplyOf(self, request: QuerySupplyOfRequest) -> QuerySupplyOfResponse:
def SupplyOf(
self,
request: QuerySupplyOfRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QuerySupplyOfResponse:
"""
Query total supply of specific denomination.

:param request: QuerySupplyOfRequest with denomination
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QuerySupplyOfResponse
"""

@abstractmethod
def Params(self, request: QueryParamsRequest) -> QueryParamsResponse:
def Params(
self,
request: QueryParamsRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryParamsResponse:
"""
Query the parameters of bank module.

:param request: QueryParamsRequest
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryParamsResponse
"""

@abstractmethod
def DenomMetadata(
self, request: QueryDenomMetadataRequest
self,
request: QueryDenomMetadataRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryDenomMetadataResponse:
"""
Query the client metadata for all registered coin denominations.

:param request: QueryDenomMetadataRequest with denomination
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryDenomMetadataResponse
"""

@abstractmethod
def DenomsMetadata(
self, request: QueryDenomsMetadataRequest
self,
request: QueryDenomsMetadataRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryDenomsMetadataResponse:
"""
Query the client metadata of a given coin denomination.

:param request: QueryDenomsMetadataRequest
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryDenomsMetadataResponse
"""
46 changes: 39 additions & 7 deletions cosmpy/bank/rest_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
# ------------------------------------------------------------------------------

"""Implementation of Bank interface using REST."""
from typing import Optional, Tuple

from google.protobuf.json_format import Parse

Expand Down Expand Up @@ -54,11 +55,16 @@ def __init__(self, rest_api: RestClient):
"""
self._rest_api = rest_api

def Balance(self, request: QueryBalanceRequest) -> QueryBalanceResponse:
def Balance(
self,
request: QueryBalanceRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryBalanceResponse:
"""
Query balance of selected denomination from specific account.

:param request: QueryBalanceRequest with address and denomination
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryBalanceResponse
"""
Expand All @@ -69,11 +75,16 @@ def Balance(self, request: QueryBalanceRequest) -> QueryBalanceResponse:
)
return Parse(response, QueryBalanceResponse())

def AllBalances(self, request: QueryAllBalancesRequest) -> QueryAllBalancesResponse:
def AllBalances(
self,
request: QueryAllBalancesRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryAllBalancesResponse:
"""
Query balance of all denominations from specific account.

:param request: QueryAllBalancesRequest with account address
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryAllBalancesResponse
"""
Expand All @@ -82,59 +93,80 @@ def AllBalances(self, request: QueryAllBalancesRequest) -> QueryAllBalancesRespo
)
return Parse(response, QueryAllBalancesResponse())

def TotalSupply(self, request: QueryTotalSupplyRequest) -> QueryTotalSupplyResponse:
def TotalSupply(
self,
request: QueryTotalSupplyRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryTotalSupplyResponse:
"""
Query total supply of all denominations.

:param request: QueryTotalSupplyRequest
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryTotalSupplyResponse
"""
response = self._rest_api.get(f"{self.API_URL}/supply", request)
return Parse(response, QueryTotalSupplyResponse())

def SupplyOf(self, request: QuerySupplyOfRequest) -> QuerySupplyOfResponse:
def SupplyOf(
self,
request: QuerySupplyOfRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QuerySupplyOfResponse:
"""
Query total supply of specific denomination.

:param request: QuerySupplyOfRequest with denomination
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QuerySupplyOfResponse
"""
response = self._rest_api.get(f"{self.API_URL}/supply/{request.denom}")
return Parse(response, QuerySupplyOfResponse())

def Params(self, request: QueryParamsRequest) -> QueryParamsResponse:
def Params(
self,
request: QueryParamsRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryParamsResponse:
"""
Query the parameters of bank module.

:param request: QueryParamsRequest
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryParamsResponse
"""
response = self._rest_api.get(f"{self.API_URL}/params")
return Parse(response, QueryParamsResponse())

def DenomMetadata(
self, request: QueryDenomMetadataRequest
self,
request: QueryDenomMetadataRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryDenomMetadataResponse:
"""
Query the client metadata for all registered coin denominations.

:param request: QueryDenomMetadataRequest with denomination
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryDenomMetadataResponse
"""
response = self._rest_api.get(f"{self.API_URL}/denoms_metadata/{request.denom}")
return Parse(response, QueryDenomMetadataResponse())

def DenomsMetadata(
self, request: QueryDenomsMetadataRequest
self,
request: QueryDenomsMetadataRequest,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> QueryDenomsMetadataResponse:
"""
Query the client metadata of a given coin denomination.

:param request: QueryDenomsMetadataRequest
:param metadata: The metadata for the call or None. metadata are additional headers

:return: QueryDenomsMetadataResponse
"""
Expand Down
11 changes: 8 additions & 3 deletions cosmpy/common/rest_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"""Implementation of REST api client."""
import base64
import json
from typing import List, Optional
from typing import List, Optional, Tuple
from urllib.parse import urlencode

import requests
Expand All @@ -45,13 +45,15 @@ def get(
url_base_path: str,
request: Optional[Message] = None,
used_params: Optional[List[str]] = None,
metadata: Optional[Tuple[Tuple[str, str]]] = None,
) -> bytes:
"""
Send a GET request.

:param url_base_path: URL base path
:param request: Protobuf coded request
:param used_params: Parameters to be removed from request after converting it to dict
:param metadata: The metadata for the call or None. metadata are additional headers

:raises RuntimeError: if response code is not 200

Expand All @@ -60,8 +62,11 @@ def get(
url = self._make_url(
url_base_path=url_base_path, request=request, used_params=used_params
)

response = self._session.get(url=url)
headers = {}
if metadata:
for key, value in metadata:
headers[key] = value
response = self._session.get(url=url, headers=headers)
if response.status_code != 200:
raise RuntimeError(
f"Error when sending a GET request.\n Response: {response.status_code}, {str(response.content)})"
Expand Down
Loading