strideutils 0.2.8__tar.gz → 0.2.10__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. {strideutils-0.2.8 → strideutils-0.2.10}/PKG-INFO +1 -1
  2. {strideutils-0.2.8 → strideutils-0.2.10}/pyproject.toml +12 -2
  3. strideutils-0.2.10/strideutils/__init__.py +0 -0
  4. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/stride_requests.py +17 -5
  5. strideutils-0.2.10/strideutils-stubs/coingecko.pyi +7 -0
  6. strideutils-0.2.10/strideutils-stubs/cryptography.pyi +2 -0
  7. strideutils-0.2.10/strideutils-stubs/exec_tx.pyi +15 -0
  8. strideutils-0.2.10/strideutils-stubs/invariant_helpers.pyi +5 -0
  9. strideutils-0.2.10/strideutils-stubs/run_safely.pyi +5 -0
  10. strideutils-0.2.10/strideutils-stubs/sheets_connector.pyi +13 -0
  11. strideutils-0.2.10/strideutils-stubs/slack_connector.pyi +3 -0
  12. strideutils-0.2.10/strideutils-stubs/stride_alerts.pyi +19 -0
  13. strideutils-0.2.10/strideutils-stubs/stride_config.pyi +109 -0
  14. strideutils-0.2.10/strideutils-stubs/stride_requests.pyi +66 -0
  15. strideutils-0.2.10/strideutils-stubs/stride_upstash.pyi +10 -0
  16. strideutils-0.2.10/strideutils-stubs/twilio_connector.pyi +9 -0
  17. {strideutils-0.2.8 → strideutils-0.2.10}/README.md +0 -0
  18. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/Makefile +0 -0
  19. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/coingecko.py +0 -0
  20. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/config_examples/strideutils_config.yaml.example +0 -0
  21. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/config_examples/strideutils_secrets.yaml.example +0 -0
  22. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/cryptography.py +0 -0
  23. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/exec_tx.py +0 -0
  24. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/invariant_helpers.py +0 -0
  25. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/run_safely.py +0 -0
  26. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/sheets_connector.py +0 -0
  27. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/slack_connector.py +0 -0
  28. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/stride_alerts.py +0 -0
  29. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/stride_config.py +0 -0
  30. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/stride_upstash.py +0 -0
  31. {strideutils-0.2.8 → strideutils-0.2.10}/strideutils/twilio_connector.py +0 -0
  32. /strideutils-0.2.8/strideutils/__init__.py → /strideutils-0.2.10/strideutils-stubs/__init__.pyi +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: strideutils
3
- Version: 0.2.8
3
+ Version: 0.2.10
4
4
  Summary:
5
5
  Author: Your Name
6
6
  Author-email: you@example.com
@@ -1,9 +1,10 @@
1
1
  [tool.poetry]
2
2
  name = "strideutils"
3
- version = "0.2.8"
3
+ version = "0.2.10"
4
4
  description = ""
5
5
  authors = ["Your Name <you@example.com>"]
6
6
  readme = "README.md"
7
+ include = ["strideutils", "strideutils-stubs"]
7
8
 
8
9
  [tool.poetry.dependencies]
9
10
  python = ">=3.9"
@@ -24,9 +25,18 @@ pyyaml = ">=6.0.1"
24
25
  python-dateutil = ">=2.8.2"
25
26
  pycryptodome = ">=3.20.0"
26
27
 
27
-
28
28
  [tool.poetry.group.dev.dependencies]
29
29
  pytest = "^8.1.1"
30
+ mypy = "^1.10.0"
31
+ flake8 = "^7.0.0"
32
+ black = "^24.4.1"
33
+ types-pyyaml = "^6.0.12.20240311"
34
+ twilio-stubs = "^0.2.0"
35
+ pandas-stubs = "^2.2.1.240316"
36
+ types-tabulate = "^0.9.0.20240106"
37
+ types-openpyxl = "^3.1.0.20240408"
38
+ types-python-dateutil = "^2.9.0.20240316"
39
+ types-requests = "^2.31.0.20240406"
30
40
 
31
41
  [build-system]
32
42
  requires = ["poetry-core"]
File without changes
@@ -22,6 +22,8 @@ ACCOUNT_DELEGATIONS_QUERY = "cosmos/staking/v1beta1/delegations/{delegator_addre
22
22
  ACCOUNT_UNBONDINGS_QUERY = "cosmos/staking/v1beta1/delegators/{delegator_address}/unbonding_delegations"
23
23
  MODULE_ACCOUNTS_QUERY = "cosmos/auth/v1beta1/module_accounts"
24
24
  SUPPLY_QUERY = "cosmos/bank/v1beta1/supply/by_denom"
25
+ VALIDATORS_QUERY = "cosmos/staking/v1beta1/validators"
26
+ VALIDATOR_SLASHES_QUERY = "cosmos/distribution/v1beta1/validators/{validator_address}/slashes"
25
27
 
26
28
  CONNECTION_QUERY = "ibc/core/connection/v1/connections/{connection_id}"
27
29
  CHANNELS_QUERY = "ibc/core/channel/v1/connections/{connection_id}/channels"
@@ -101,6 +103,7 @@ def query_list_with_pagination(
101
103
  rel_key: str,
102
104
  block_height: int = 0,
103
105
  max_pages: int = 50,
106
+ params: Union[dict, List[Tuple[str, str]]] = {},
104
107
  ) -> List[Dict]:
105
108
  """
106
109
  Query a list with pagination
@@ -111,7 +114,7 @@ def query_list_with_pagination(
111
114
  query_count = 0
112
115
 
113
116
  while True:
114
- res = request(url=query_url, block_height=block_height)
117
+ res = request(url=query_url, block_height=block_height, params=params)
115
118
  data += res[rel_key]
116
119
 
117
120
  query_count += 1
@@ -393,16 +396,25 @@ def get_rate_limits(**kwargs):
393
396
  return host_zone
394
397
 
395
398
 
396
- def get_validators(
397
- api_endpoint: str = config.stride.api_endpoint,
398
- ) -> List[Dict[str, Any]]:
399
+ def get_validators(api_endpoint: str = config.stride.api_endpoint) -> List[Dict[str, Any]]:
399
400
  """
400
401
  Queries the list of validators from a chain
401
402
  """
402
- url = f"{api_endpoint}/cosmos/staking/v1beta1/validators"
403
+ url = f"{api_endpoint}/{VALIDATORS_QUERY}"
403
404
  return query_list_with_pagination(url, rel_key="validators")
404
405
 
405
406
 
407
+ def get_validator_slashes(api_endpoint: str, validator_address: str) -> List[Dict[str, str]]:
408
+ """
409
+ Queries the list of all slashes for a particular validator
410
+ The start and end heights are required with the query
411
+ An arbitrarily large end height to get all slashes
412
+ """
413
+ url = f"{api_endpoint}/{VALIDATOR_SLASHES_QUERY.format(validator_address=validator_address)}"
414
+ params = {"starting_height": "0", "ending_height": "10000000000000000"}
415
+ return query_list_with_pagination(url, rel_key="slashes", params=params)
416
+
417
+
406
418
  def get_redemption_rate(token: str) -> float:
407
419
  """
408
420
  Queries the redemption rate for a particular token
@@ -0,0 +1,7 @@
1
+ from strideutils import stride_requests as stride_requests
2
+ from strideutils.stride_config import config as config
3
+
4
+ COINGECKO_ENDPOINT: str
5
+ COINGECKO_PRICE_QUERY: str
6
+
7
+ def get_token_price(ticker: str, api_token: str = ..., cache_response: bool = False): ...
@@ -0,0 +1,2 @@
1
+ def encrypt_message(message: str, key: bytes) -> tuple[str, str]: ...
2
+ def decrypt_message(encrypted: str, iv: str, key: bytes) -> str: ...
@@ -0,0 +1,15 @@
1
+ from dataclasses import dataclass
2
+ from strideutils import stride_requests as stride_requests
3
+ from strideutils.stride_config import config as config
4
+
5
+ @dataclass
6
+ class TxResponse:
7
+ stdout: str
8
+ stderr: str
9
+ tx_response: dict | None = ...
10
+ tx_hash: str | None = ...
11
+ success: bool = ...
12
+ raw_log: str | None = ...
13
+ def __init__(self, stdout, stderr, tx_response=..., tx_hash=..., success=..., raw_log=...) -> None: ...
14
+
15
+ def execute_tx(command: str, api_endpoint: str = ...) -> TxResponse: ...
@@ -0,0 +1,5 @@
1
+ import pandas as pd
2
+ from strideutils import stride_requests as stride_requests
3
+ from strideutils.stride_config import config as config
4
+
5
+ def check_slack_on_mainnet(str_output: bool = True, verbose: bool = False) -> pd.DataFrame | str: ...
@@ -0,0 +1,5 @@
1
+ from strideutils import slack_connector as slack_connector
2
+ from strideutils.stride_config import config as config
3
+ from typing import Callable
4
+
5
+ def try_and_log_with_status(*functions: Callable, slack_channel: str = 'alerts-status', job_name: str = 'alerts', botname: str | None = None): ...
@@ -0,0 +1,13 @@
1
+ import gspread
2
+ import pandas as pd
3
+ from _typeshed import Incomplete
4
+ from strideutils.stride_config import config as config
5
+ from typing import Any
6
+
7
+ SCOPES: Incomplete
8
+
9
+ def get_auth(scopes: tuple[str, ...] = ..., service: str = 'sheets', version: str = 'v4'): ...
10
+ def grab_sheet(sheet_id: str, sheet_name: str, columns_labeled: bool = True, worksheet: gspread.Worksheet | None = None, scopes: tuple[str, ...] = ..., _cache: dict[str, Any] = {}) -> pd.DataFrame: ...
11
+ def write_sheet(df: pd.DataFrame, sheet_id: str, sheet_name: str, worksheet: gspread.Worksheet | None = None, scopes: tuple[str, ...] = ...): ...
12
+ def reorder_sheet(sheet_id: str, sheet_name: str, new_location: int = 0, scopes: tuple[str, ...] = ...): ...
13
+ def get_sheet_names(sheet_id: str, scopes: tuple[str, ...] = ...) -> list[str]: ...
@@ -0,0 +1,3 @@
1
+ from strideutils.stride_config import config as config
2
+
3
+ def post_msg(txt: str | list[str], channel: str, token: str = ..., botname: str | None = None, unfurl_links: bool = False, unfurl_media: bool = False, thread_ts: str | None = None): ...
@@ -0,0 +1,19 @@
1
+ import pandas as pd
2
+ from enum import Enum
3
+ from strideutils import slack_connector as slack_connector, twilio_connector as twilio_connector
4
+ from strideutils.stride_config import config as config
5
+ from typing import Callable, Iterable
6
+
7
+ class AlertType(Enum):
8
+ DEBUG: str
9
+ INFO: str
10
+ WARNING: str
11
+ CRITICAL: str
12
+
13
+ def get_tags(individuals: str | Iterable[str]) -> str: ...
14
+ def df_to_message_body(df: pd.DataFrame) -> str: ...
15
+ def wrap_in_code_block(message: str) -> str: ...
16
+ def notify(msgs: str | list[str], urgency, tag: str | Iterable[str] | None = None, call: str | Iterable[str] | None = None, beta_alert: bool = False, debug_readme_section: str = '') -> None: ...
17
+ def raise_alert(urgency: AlertType | str, tag: str | Iterable[str] | None = None, call: str | Iterable[str] | None = None, beta_alert: bool = False, debug_readme_section: str = '') -> Callable: ...
18
+ def run_daily(utc_hour_or_alert: int | Callable) -> Callable: ...
19
+ def run_epochly(f: Callable) -> Callable: ...
@@ -0,0 +1,109 @@
1
+ import yaml
2
+ from _typeshed import Incomplete
3
+ from collections.abc import Generator
4
+ from dataclasses import dataclass
5
+
6
+ MISSING_CONFIG_MSG: str
7
+ ENV: Incomplete
8
+
9
+ class ConfigObj:
10
+ def __getattr__(self, name) -> None: ...
11
+ def __getattribute__(self, name): ...
12
+ def __iter__(self): ...
13
+
14
+ class ConfigDict(dict):
15
+ def __getitem__(self, key): ...
16
+
17
+ class Loader(yaml.FullLoader):
18
+ def construct_yaml_map(self, node) -> Generator[Incomplete, None, None]: ...
19
+
20
+ @dataclass(repr=False)
21
+ class ChainConfig(ConfigObj):
22
+ name: str = ...
23
+ id: str = ...
24
+ coingecko_name: str = ...
25
+ denom: str = ...
26
+ denom_decimals: int = ...
27
+ inflation_frequency_hours: int = ...
28
+ ticker: str = ...
29
+ stride_token_hash: str = ...
30
+ api_endpoint: str = ...
31
+ rpc_endpoint: str = ...
32
+ library_api: str = ...
33
+ library_rpc: str = ...
34
+ def __init__(self, name=..., id=..., coingecko_name=..., denom=..., denom_decimals=..., inflation_frequency_hours=..., ticker=..., stride_token_hash=..., api_endpoint=..., rpc_endpoint=..., library_api=..., library_rpc=...) -> None: ...
35
+
36
+ @dataclass(repr=False)
37
+ class HostZoneChainConfig(ConfigObj):
38
+ cosmoshub: ChainConfig = ...
39
+ osmosis: ChainConfig = ...
40
+ evmos: ChainConfig = ...
41
+ injective: ChainConfig = ...
42
+ juno: ChainConfig = ...
43
+ stargaze: ChainConfig = ...
44
+ terra: ChainConfig = ...
45
+ umee: ChainConfig = ...
46
+ comdex: ChainConfig = ...
47
+ sommelier: ChainConfig = ...
48
+ dydx: ChainConfig = ...
49
+ saga: ChainConfig = ...
50
+ def __init__(self, cosmoshub=..., osmosis=..., evmos=..., injective=..., juno=..., stargaze=..., terra=..., umee=..., comdex=..., sommelier=..., dydx=..., saga=...) -> None: ...
51
+
52
+ @dataclass(repr=False)
53
+ class AppConfig(ConfigObj):
54
+ neutron: ChainConfig = ...
55
+ kava: ChainConfig = ...
56
+ iris: ChainConfig = ...
57
+ akash: ChainConfig = ...
58
+ sentinel: ChainConfig = ...
59
+ persistence: ChainConfig = ...
60
+ cryptoorg: ChainConfig = ...
61
+ kichain: ChainConfig = ...
62
+ bitcanna: ChainConfig = ...
63
+ regen: ChainConfig = ...
64
+ gravity: ChainConfig = ...
65
+ desmos: ChainConfig = ...
66
+ chihuahua: ChainConfig = ...
67
+ secret: ChainConfig = ...
68
+ axelar: ChainConfig = ...
69
+ crescent: ChainConfig = ...
70
+ mantle: ChainConfig = ...
71
+ mars: ChainConfig = ...
72
+ canto: ChainConfig = ...
73
+ agoric: ChainConfig = ...
74
+ celestia: ChainConfig = ...
75
+ dymension: ChainConfig = ...
76
+ def __init__(self, neutron=..., kava=..., iris=..., akash=..., sentinel=..., persistence=..., cryptoorg=..., kichain=..., bitcanna=..., regen=..., gravity=..., desmos=..., chihuahua=..., secret=..., axelar=..., crescent=..., mantle=..., mars=..., canto=..., agoric=..., celestia=..., dymension=...) -> None: ...
77
+
78
+ @dataclass(repr=False)
79
+ class Config(ConfigObj):
80
+ ENV: str
81
+ timezone: str = ...
82
+ TWILIO_ALERTS_NUMBER: str = ...
83
+ TWILIO_ACCOUNT_ID: str = ...
84
+ TWILIO_API_TOKEN: str = ...
85
+ PHONE_NUMBERS: ConfigDict = ...
86
+ STRIDEBOT_API_TOKEN: str = ...
87
+ PUBLICSHEETS_AUTH: str | ConfigDict = ...
88
+ COINGECKO_API_TOKEN: str = ...
89
+ PROTOCOL_STAKING_API_TOKEN: str = ...
90
+ alerts_playbook: str = ...
91
+ slack_channels: ConfigDict = ...
92
+ UPSTASH_PUBLIC_PASSWORD: str = ...
93
+ UPSTASH_STRIDE_FRONTEND_PASSWORD: str = ...
94
+ UPSTASH_STRIDE_BACKEND_PASSWORD: str = ...
95
+ UPSTASH_STRIDE_DYDX_PUBLIC_PASSWORD: str = ...
96
+ SLACK_BEARER_TOKEN: str = ...
97
+ SLACK_SUCCESS_CHANNEL_ID: str = ...
98
+ SLACK_INVARIANT_FAILURE_CHANNEL_ID: str = ...
99
+ SLACK_PACKET_FAILURE_CHANNEL_ID: str = ...
100
+ NUMIA_API_TOKEN: str = ...
101
+ founders: list[str] = ...
102
+ stride: ChainConfig = ...
103
+ host_zones: HostZoneChainConfig = ...
104
+ app_chains: AppConfig = ...
105
+ def __post_init__(self) -> None: ...
106
+ def get_chain(self, name: str | None = None, id: str | None = None, ticker: str | None = None, denom: str | None = None, stride_token_hash: str | None = None) -> ChainConfig: ...
107
+ def __init__(self, ENV, timezone=..., TWILIO_ALERTS_NUMBER=..., TWILIO_ACCOUNT_ID=..., TWILIO_API_TOKEN=..., PHONE_NUMBERS=..., STRIDEBOT_API_TOKEN=..., PUBLICSHEETS_AUTH=..., COINGECKO_API_TOKEN=..., PROTOCOL_STAKING_API_TOKEN=..., alerts_playbook=..., slack_channels=..., UPSTASH_PUBLIC_PASSWORD=..., UPSTASH_STRIDE_FRONTEND_PASSWORD=..., UPSTASH_STRIDE_BACKEND_PASSWORD=..., UPSTASH_STRIDE_DYDX_PUBLIC_PASSWORD=..., SLACK_BEARER_TOKEN=..., SLACK_SUCCESS_CHANNEL_ID=..., SLACK_INVARIANT_FAILURE_CHANNEL_ID=..., SLACK_PACKET_FAILURE_CHANNEL_ID=..., NUMIA_API_TOKEN=..., founders=..., stride=..., host_zones=..., app_chains=...) -> None: ...
108
+
109
+ config: Config
@@ -0,0 +1,66 @@
1
+ import datetime
2
+ import pandas as pd
3
+ from _typeshed import Incomplete
4
+ from strideutils import stride_upstash as stride_upstash
5
+ from strideutils.stride_config import config as config
6
+ from typing import Any
7
+
8
+ ACCOUNT_QUERY: str
9
+ ACCOUNT_BALANCE_QUERY: str
10
+ ACCOUNT_DELEGATIONS_QUERY: str
11
+ ACCOUNT_UNBONDINGS_QUERY: str
12
+ MODULE_ACCOUNTS_QUERY: str
13
+ SUPPLY_QUERY: str
14
+ CONNECTION_QUERY: str
15
+ CHANNELS_QUERY: str
16
+ CHANNEL_QUERY: str
17
+ TXS_QUERY: str
18
+ TX_BY_ACCOUNT_EVENT: str
19
+ HOST_ZONE_QUERY: str
20
+ EPOCHS_QUERY: str
21
+ RATE_LIMIT_QUERY: str
22
+ STAKETIA: str
23
+ STAKEDYM: str
24
+ MULTISIG_HOST_ZONE_QUERY: str
25
+ MULTISIG_DELEGATION_RECORDS_QUERY: str
26
+ MULTISIG_UNBONDING_RECORDS_QUERY: str
27
+ MULTISIG_REDEMPTION_RECORDS_QUERY: str
28
+ COSMWASM_CONTRACT_QUERY: str
29
+ requests_session: Incomplete
30
+ retries: Incomplete
31
+
32
+ def request(url: str, headers: dict = {}, params: dict | list[tuple[str, str]] = {}, block_height: int = 0, cache_response: bool = False, _cache: dict[str, Any] = {}): ...
33
+ def query_list_with_pagination(endpoint: str, rel_key: str, block_height: int = 0, max_pages: int = 50) -> list[dict]: ...
34
+ def get_all_host_zones() -> list[dict]: ...
35
+ def get_host_zone_json(zone_id: str, cast_types: bool = True, **kwargs) -> dict[str, Any]: ...
36
+ def get_celestia_host_zone(cast_types: bool = True) -> dict[str, Any]: ...
37
+ def get_dymension_host_zone(cast_types: bool = True) -> dict[str, Any]: ...
38
+ def get_multisig_delegation_records(module: str, include_archived: bool = False) -> list[dict]: ...
39
+ def get_multisig_unbonding_records(module: str, include_archived: bool = False) -> list[dict]: ...
40
+ def get_multisig_redemption_records(module: str, address: str | None = None, unbonding_record_id: int | None = None) -> list[dict]: ...
41
+ def get_rate_limits(**kwargs): ...
42
+ def get_validators(api_endpoint: str = ...) -> list[dict[str, Any]]: ...
43
+ def get_redemption_rate(token: str) -> float: ...
44
+ def get_tvl_in_utokens(host_zone_id: str) -> float: ...
45
+ def get_latest_block(rpc_endpoint: str = ...) -> int: ...
46
+ def convert_cosmos_address(address: str, new_prefix: str) -> str: ...
47
+ def get_balances(address: str, block_height: int = 0, api_endpoint: str = ..., cache_response: bool = False) -> dict[str, int]: ...
48
+ def get_balance(address: str, denom: str, block_height: int = 0, api_endpoint: str = ..., cache_response: bool = False) -> int: ...
49
+ def get_supply(denom: str, block_height: int = 0, api_endpoint: str = ..., cache_response: bool = False) -> int: ...
50
+ def get_block_time(height: int, rpc_endpoint: str = ...) -> datetime.datetime: ...
51
+ def get_icns_name(address: str) -> str: ...
52
+ def get_account_info(address: str, api_endpoint: str = ...): ...
53
+ def get_txs(event_filters: list[str], api_endpoint: str = ..., limit: Incomplete | None = None) -> dict: ...
54
+ def get_tx_info(address: str, sequence: str | int, api_endpoint: str = ...) -> dict: ...
55
+ def generate_vesting_account(start_time_in_local_tz: str, total_tokens: int, seconds_in_period: int = 3600, number_of_days: int = 30, output_file: str = 'vesting_account.json') -> str: ...
56
+ def get_block_height_in_past(time_in_past: datetime.timedelta = ..., max_acceptable_error_seconds: int = ..., seconds_per_block: int = 6, prev_time: str | None = None, verbose: bool = False, rpc_endpoint: str = ...) -> int: ...
57
+ def get_block_height_one_day_ago(verbose: bool = False) -> int: ...
58
+ def get_sttoken_apr(token: str) -> float | None: ...
59
+ def get_delegated_tokens_on_address(delegator_address: str, api_endpoint: str = ...) -> dict[str, int]: ...
60
+ def get_unbonding_tokens_on_address(delegator_address: str, api_endpoint: str = ...) -> dict[str, int]: ...
61
+ def get_host_zone_delegations(host_zone_id: str, ground_truth_included: bool = True) -> pd.DataFrame: ...
62
+ def get_epochs() -> list[dict]: ...
63
+ def get_day_epoch() -> int: ...
64
+ def query_wasm_contract(contract_address: str, query_msg: dict, api_endpoint: str, block_height: int = 0) -> dict: ...
65
+ def get_module_accounts(api_endpoint: str = ...) -> list[dict]: ...
66
+ def get_empirical_annual_fees(ticker: str) -> float: ...
@@ -0,0 +1,10 @@
1
+ import redis
2
+ from _typeshed import Incomplete
3
+ from strideutils.stride_config import config as config
4
+
5
+ redis_dbs: Incomplete
6
+
7
+ def get_redis_db(redis_db_name: str) -> redis.Redis: ...
8
+ def get(redis_key: str, db_name: str = 'frontend') -> str | None: ...
9
+ def set(redis_key: str, redis_val: str, db_name: str = 'frontend'): ...
10
+ def set_keys(dict_to_upload: dict[str, str], db_name: str = 'frontend', prefix: str = ''): ...
@@ -0,0 +1,9 @@
1
+ from _typeshed import Incomplete
2
+ from strideutils.stride_config import config as config
3
+ from typing import Iterable
4
+
5
+ _: Incomplete
6
+ CALL_TEMPLATE: str
7
+ client: Incomplete
8
+
9
+ def send_calls(msg: str, to: str | Iterable[str] | list[str]) -> None: ...
File without changes