crypticorn 2.10.3__py3-none-any.whl → 2.11.4__py3-none-any.whl
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.
- crypticorn/auth/client/configuration.py +2 -2
- crypticorn/auth/client/models/create_api_key_request.py +2 -1
- crypticorn/auth/client/models/get_api_keys200_response_inner.py +2 -1
- crypticorn/cli/templates/merge-env.sh +3 -5
- crypticorn/client.py +2 -2
- crypticorn/common/ansi_colors.py +4 -1
- crypticorn/common/auth.py +9 -8
- crypticorn/common/enums.py +5 -1
- crypticorn/common/errors.py +6 -1
- crypticorn/common/exceptions.py +5 -1
- crypticorn/common/logging.py +5 -1
- crypticorn/common/scopes.py +14 -1
- crypticorn/common/urls.py +5 -1
- crypticorn/common/utils.py +3 -3
- crypticorn/common/warnings.py +2 -1
- crypticorn/klines/main.py +13 -1
- crypticorn/metrics/client/__init__.py +4 -0
- crypticorn/metrics/client/api/exchanges_api.py +7 -6
- crypticorn/metrics/client/api/indicators_api.py +12 -6
- crypticorn/metrics/client/api/marketcap_api.py +49 -31
- crypticorn/metrics/client/configuration.py +2 -2
- crypticorn/metrics/client/models/__init__.py +4 -0
- crypticorn/metrics/client/models/exchange_availability.py +88 -0
- crypticorn/metrics/client/models/marketcap_ranking.py +9 -6
- crypticorn/metrics/client/models/marketcap_symbol_ranking.py +86 -0
- crypticorn/metrics/main.py +12 -19
- {crypticorn-2.10.3.dist-info → crypticorn-2.11.4.dist-info}/METADATA +12 -21
- {crypticorn-2.10.3.dist-info → crypticorn-2.11.4.dist-info}/RECORD +32 -30
- {crypticorn-2.10.3.dist-info → crypticorn-2.11.4.dist-info}/WHEEL +1 -1
- {crypticorn-2.10.3.dist-info → crypticorn-2.11.4.dist-info}/entry_points.txt +0 -0
- {crypticorn-2.10.3.dist-info → crypticorn-2.11.4.dist-info}/licenses/LICENSE +0 -0
- {crypticorn-2.10.3.dist-info → crypticorn-2.11.4.dist-info}/top_level.txt +0 -0
@@ -195,7 +195,7 @@ class Configuration:
|
|
195
195
|
debug: Optional[bool] = None,
|
196
196
|
) -> None:
|
197
197
|
"""Constructor"""
|
198
|
-
self._base_path = "
|
198
|
+
self._base_path = "https://api.crypticorn.dev/v1/auth" if host is None else host
|
199
199
|
"""Default Base url
|
200
200
|
"""
|
201
201
|
self.server_index = 0 if server_index is None and host is None else server_index
|
@@ -528,7 +528,7 @@ class Configuration:
|
|
528
528
|
"""
|
529
529
|
return [
|
530
530
|
{
|
531
|
-
"url": "
|
531
|
+
"url": "https://api.crypticorn.dev/v1/auth",
|
532
532
|
"description": "No description provided",
|
533
533
|
}
|
534
534
|
]
|
@@ -78,12 +78,13 @@ class CreateApiKeyRequest(BaseModel):
|
|
78
78
|
"read:metrics:tokens",
|
79
79
|
"read:metrics:markets",
|
80
80
|
"read:sentiment",
|
81
|
+
"read:klines",
|
81
82
|
"read:admin",
|
82
83
|
"write:admin",
|
83
84
|
]
|
84
85
|
):
|
85
86
|
raise ValueError(
|
86
|
-
"each list item must be one of ('read:predictions', 'read:hive:model', 'read:hive:data', 'write:hive:model', 'read:trade:bots', 'write:trade:bots', 'read:trade:exchangekeys', 'write:trade:exchangekeys', 'read:trade:orders', 'read:trade:actions', 'write:trade:actions', 'read:trade:exchanges', 'read:trade:futures', 'write:trade:futures', 'read:trade:notifications', 'write:trade:notifications', 'read:trade:strategies', 'write:trade:strategies', 'read:pay:payments', 'read:pay:products', 'write:pay:products', 'read:pay:now', 'write:pay:now', 'read:metrics:marketcap', 'read:metrics:indicators', 'read:metrics:exchanges', 'read:metrics:tokens', 'read:metrics:markets', 'read:sentiment', 'read:admin', 'write:admin')"
|
87
|
+
"each list item must be one of ('read:predictions', 'read:hive:model', 'read:hive:data', 'write:hive:model', 'read:trade:bots', 'write:trade:bots', 'read:trade:exchangekeys', 'write:trade:exchangekeys', 'read:trade:orders', 'read:trade:actions', 'write:trade:actions', 'read:trade:exchanges', 'read:trade:futures', 'write:trade:futures', 'read:trade:notifications', 'write:trade:notifications', 'read:trade:strategies', 'write:trade:strategies', 'read:pay:payments', 'read:pay:products', 'write:pay:products', 'read:pay:now', 'write:pay:now', 'read:metrics:marketcap', 'read:metrics:indicators', 'read:metrics:exchanges', 'read:metrics:tokens', 'read:metrics:markets', 'read:sentiment', 'read:klines', 'read:admin', 'write:admin')"
|
87
88
|
)
|
88
89
|
return value
|
89
90
|
|
@@ -86,12 +86,13 @@ class GetApiKeys200ResponseInner(BaseModel):
|
|
86
86
|
"read:metrics:tokens",
|
87
87
|
"read:metrics:markets",
|
88
88
|
"read:sentiment",
|
89
|
+
"read:klines",
|
89
90
|
"read:admin",
|
90
91
|
"write:admin",
|
91
92
|
]
|
92
93
|
):
|
93
94
|
raise ValueError(
|
94
|
-
"each list item must be one of ('read:predictions', 'read:hive:model', 'read:hive:data', 'write:hive:model', 'read:trade:bots', 'write:trade:bots', 'read:trade:exchangekeys', 'write:trade:exchangekeys', 'read:trade:orders', 'read:trade:actions', 'write:trade:actions', 'read:trade:exchanges', 'read:trade:futures', 'write:trade:futures', 'read:trade:notifications', 'write:trade:notifications', 'read:trade:strategies', 'write:trade:strategies', 'read:pay:payments', 'read:pay:products', 'write:pay:products', 'read:pay:now', 'write:pay:now', 'read:metrics:marketcap', 'read:metrics:indicators', 'read:metrics:exchanges', 'read:metrics:tokens', 'read:metrics:markets', 'read:sentiment', 'read:admin', 'write:admin')"
|
95
|
+
"each list item must be one of ('read:predictions', 'read:hive:model', 'read:hive:data', 'write:hive:model', 'read:trade:bots', 'write:trade:bots', 'read:trade:exchangekeys', 'write:trade:exchangekeys', 'read:trade:orders', 'read:trade:actions', 'write:trade:actions', 'read:trade:exchanges', 'read:trade:futures', 'write:trade:futures', 'read:trade:notifications', 'write:trade:notifications', 'read:trade:strategies', 'write:trade:strategies', 'read:pay:payments', 'read:pay:products', 'write:pay:products', 'read:pay:now', 'write:pay:now', 'read:metrics:marketcap', 'read:metrics:indicators', 'read:metrics:exchanges', 'read:metrics:tokens', 'read:metrics:markets', 'read:sentiment', 'read:klines', 'read:admin', 'write:admin')"
|
95
96
|
)
|
96
97
|
return value
|
97
98
|
|
@@ -1,17 +1,15 @@
|
|
1
1
|
#!/usr/bin/env bash
|
2
|
-
|
3
2
|
# this script merges the env variables from the environment and the .env.example file into the .env file
|
4
3
|
# the appended variables take precedence over the .env.example variables (if both are set)
|
5
4
|
|
6
|
-
# Make executable before running in github actions
|
7
|
-
# chmod +x scripts/merge-env.sh
|
8
|
-
|
9
5
|
# Usage in a github action:
|
10
6
|
# - name: Generate .env
|
11
7
|
# run: ./scripts/merge-env.sh
|
8
|
+
# add this after checkout before copying files to the host
|
12
9
|
|
13
10
|
set -e
|
14
11
|
|
15
12
|
cp .env.example .env
|
16
13
|
echo >> .env
|
17
|
-
|
14
|
+
echo "# Environment variables" >> .env
|
15
|
+
printenv | awk -F= '/^[a-zA-Z_][a-zA-Z0-9_]*=/{print $1"=\""substr($0, index($0,$2))"\""}' | sort | uniq >> .env
|
crypticorn/client.py
CHANGED
@@ -119,8 +119,8 @@ class ApiClient:
|
|
119
119
|
:param service: The service to configure.
|
120
120
|
|
121
121
|
Example:
|
122
|
-
>>> async with ApiClient(
|
123
|
-
|
122
|
+
>>> async with ApiClient() as client:
|
123
|
+
... client.configure(config=HiveConfig(host="http://localhost:8000"), service=Service.HIVE)
|
124
124
|
"""
|
125
125
|
assert Service.validate(service), f"Invalid service: {service}"
|
126
126
|
client = self._services[service]
|
crypticorn/common/ansi_colors.py
CHANGED
crypticorn/common/auth.py
CHANGED
@@ -18,6 +18,7 @@ from fastapi.security import (
|
|
18
18
|
APIKeyHeader,
|
19
19
|
)
|
20
20
|
from typing_extensions import Annotated
|
21
|
+
from typing import Union
|
21
22
|
|
22
23
|
# Auth Schemes
|
23
24
|
http_bearer = HTTPBearer(
|
@@ -132,7 +133,7 @@ class AuthHandler:
|
|
132
133
|
|
133
134
|
async def api_key_auth(
|
134
135
|
self,
|
135
|
-
api_key: Annotated[str
|
136
|
+
api_key: Annotated[Union[str, None], Depends(apikey_header)] = None,
|
136
137
|
sec: SecurityScopes = SecurityScopes(),
|
137
138
|
) -> Verify200Response:
|
138
139
|
"""
|
@@ -144,7 +145,7 @@ class AuthHandler:
|
|
144
145
|
async def bearer_auth(
|
145
146
|
self,
|
146
147
|
bearer: Annotated[
|
147
|
-
HTTPAuthorizationCredentials
|
148
|
+
Union[HTTPAuthorizationCredentials, None],
|
148
149
|
Depends(http_bearer),
|
149
150
|
] = None,
|
150
151
|
sec: SecurityScopes = SecurityScopes(),
|
@@ -158,9 +159,9 @@ class AuthHandler:
|
|
158
159
|
async def combined_auth(
|
159
160
|
self,
|
160
161
|
bearer: Annotated[
|
161
|
-
HTTPAuthorizationCredentials
|
162
|
+
Union[HTTPAuthorizationCredentials, None], Depends(http_bearer)
|
162
163
|
] = None,
|
163
|
-
api_key: Annotated[str
|
164
|
+
api_key: Annotated[Union[str, None], Depends(apikey_header)] = None,
|
164
165
|
sec: SecurityScopes = SecurityScopes(),
|
165
166
|
) -> Verify200Response:
|
166
167
|
"""
|
@@ -202,7 +203,7 @@ class AuthHandler:
|
|
202
203
|
|
203
204
|
async def ws_api_key_auth(
|
204
205
|
self,
|
205
|
-
api_key: Annotated[str
|
206
|
+
api_key: Annotated[Union[str, None], Query()] = None,
|
206
207
|
sec: SecurityScopes = SecurityScopes(),
|
207
208
|
) -> Verify200Response:
|
208
209
|
"""
|
@@ -213,7 +214,7 @@ class AuthHandler:
|
|
213
214
|
|
214
215
|
async def ws_bearer_auth(
|
215
216
|
self,
|
216
|
-
bearer: Annotated[str
|
217
|
+
bearer: Annotated[Union[str, None], Query()] = None,
|
217
218
|
sec: SecurityScopes = SecurityScopes(),
|
218
219
|
) -> Verify200Response:
|
219
220
|
"""
|
@@ -224,8 +225,8 @@ class AuthHandler:
|
|
224
225
|
|
225
226
|
async def ws_combined_auth(
|
226
227
|
self,
|
227
|
-
bearer: Annotated[str
|
228
|
-
api_key: Annotated[str
|
228
|
+
bearer: Annotated[Union[str, None], Query()] = None,
|
229
|
+
api_key: Annotated[Union[str, None], Query()] = None,
|
229
230
|
sec: SecurityScopes = SecurityScopes(),
|
230
231
|
) -> Verify200Response:
|
231
232
|
"""
|
crypticorn/common/enums.py
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
"""Defines common enumerations used throughout the codebase for type safety and consistency."""
|
2
2
|
|
3
|
-
|
3
|
+
try:
|
4
|
+
from enum import StrEnum
|
5
|
+
except ImportError:
|
6
|
+
from strenum import StrEnum
|
7
|
+
|
4
8
|
from crypticorn.common.mixins import ValidateEnumMixin
|
5
9
|
|
6
10
|
|
crypticorn/common/errors.py
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
"""Comprehensive error handling system defining various API error types, HTTP exceptions, and error content structures."""
|
2
2
|
|
3
|
-
from enum import Enum
|
3
|
+
from enum import Enum
|
4
4
|
from fastapi import status
|
5
5
|
from crypticorn.common.mixins import ApiErrorFallback
|
6
6
|
|
7
|
+
try:
|
8
|
+
from enum import StrEnum
|
9
|
+
except ImportError:
|
10
|
+
from strenum import StrEnum
|
11
|
+
|
7
12
|
|
8
13
|
class ApiErrorType(StrEnum):
|
9
14
|
"""Type of the API error."""
|
crypticorn/common/exceptions.py
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
from typing import Optional, Dict, Any
|
2
|
-
from enum import StrEnum
|
3
2
|
from pydantic import BaseModel, Field
|
4
3
|
from fastapi import HTTPException as FastAPIHTTPException, Request, FastAPI
|
5
4
|
from fastapi.exceptions import RequestValidationError, ResponseValidationError
|
@@ -8,6 +7,11 @@ from crypticorn.common import ApiError, ApiErrorIdentifier, ApiErrorType, ApiErr
|
|
8
7
|
import logging
|
9
8
|
import json
|
10
9
|
|
10
|
+
try:
|
11
|
+
from enum import StrEnum
|
12
|
+
except ImportError:
|
13
|
+
from strenum import StrEnum
|
14
|
+
|
11
15
|
_logger = logging.getLogger("crypticorn")
|
12
16
|
|
13
17
|
|
crypticorn/common/logging.py
CHANGED
@@ -2,12 +2,16 @@ from __future__ import annotations
|
|
2
2
|
|
3
3
|
import logging
|
4
4
|
import sys
|
5
|
-
from enum import StrEnum
|
6
5
|
from crypticorn.common.mixins import ValidateEnumMixin
|
7
6
|
from crypticorn.common.ansi_colors import AnsiColors as C
|
8
7
|
from datetime import datetime
|
9
8
|
import os
|
10
9
|
|
10
|
+
try:
|
11
|
+
from enum import StrEnum
|
12
|
+
except ImportError:
|
13
|
+
from strenum import StrEnum
|
14
|
+
|
11
15
|
|
12
16
|
class LogLevel(ValidateEnumMixin, StrEnum):
|
13
17
|
DEBUG = "DEBUG"
|
crypticorn/common/scopes.py
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
|
1
|
+
try:
|
2
|
+
from enum import StrEnum
|
3
|
+
except ImportError:
|
4
|
+
from strenum import StrEnum
|
2
5
|
|
3
6
|
|
4
7
|
class Scope(StrEnum):
|
@@ -52,6 +55,9 @@ class Scope(StrEnum):
|
|
52
55
|
# Sentiment scopes
|
53
56
|
READ_SENTIMENT = "read:sentiment"
|
54
57
|
|
58
|
+
# Klines scopes
|
59
|
+
READ_KLINES = "read:klines"
|
60
|
+
|
55
61
|
@classmethod
|
56
62
|
def admin_scopes(cls) -> list["Scope"]:
|
57
63
|
"""Scopes that are only available to admins."""
|
@@ -74,4 +80,11 @@ class Scope(StrEnum):
|
|
74
80
|
"""Scopes that can be purchased."""
|
75
81
|
return [
|
76
82
|
cls.READ_PREDICTIONS,
|
83
|
+
cls.READ_METRICS_MARKETCAP,
|
84
|
+
cls.READ_METRICS_INDICATORS,
|
85
|
+
cls.READ_METRICS_EXCHANGES,
|
86
|
+
cls.READ_METRICS_TOKENS,
|
87
|
+
cls.READ_METRICS_MARKETS,
|
88
|
+
cls.READ_KLINES,
|
89
|
+
cls.READ_SENTIMENT,
|
77
90
|
]
|
crypticorn/common/urls.py
CHANGED
crypticorn/common/utils.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
"""General utility functions and helper methods used across the codebase."""
|
2
2
|
|
3
3
|
from datetime import datetime
|
4
|
-
from typing import Any
|
4
|
+
from typing import Any, Union
|
5
5
|
from decimal import Decimal
|
6
6
|
import string
|
7
7
|
import random
|
@@ -41,8 +41,8 @@ def gen_random_id(length: int = 20) -> str:
|
|
41
41
|
"The `is_equal` method is deprecated; use `math.is_close` instead.", category=None
|
42
42
|
)
|
43
43
|
def is_equal(
|
44
|
-
a: float
|
45
|
-
b: float
|
44
|
+
a: Union[float, Decimal],
|
45
|
+
b: Union[float, Decimal],
|
46
46
|
rel_tol: float = 1e-9,
|
47
47
|
abs_tol: float = 0.0,
|
48
48
|
) -> bool:
|
crypticorn/common/warnings.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
"""Crypticorn-specific warnings."""
|
2
2
|
|
3
3
|
from __future__ import annotations
|
4
|
+
from typing import Union
|
4
5
|
|
5
6
|
|
6
7
|
class CrypticornDeprecationWarning(DeprecationWarning):
|
@@ -24,7 +25,7 @@ class CrypticornDeprecationWarning(DeprecationWarning):
|
|
24
25
|
message: str,
|
25
26
|
*args: object,
|
26
27
|
since: tuple[int, int],
|
27
|
-
expected_removal: tuple[int, int]
|
28
|
+
expected_removal: Union[tuple[int, int], None] = None,
|
28
29
|
) -> None:
|
29
30
|
super().__init__(message, *args)
|
30
31
|
self.message = message.rstrip(".")
|
crypticorn/klines/main.py
CHANGED
@@ -65,7 +65,19 @@ class OHLCVDataApiWrapper(OHLCVDataApi):
|
|
65
65
|
"""
|
66
66
|
pd = optional_import("pandas", "extra")
|
67
67
|
response = await self.get_ohlcv(*args, **kwargs)
|
68
|
-
|
68
|
+
rows = []
|
69
|
+
for item in response:
|
70
|
+
row = {
|
71
|
+
'timestamp': item.timestamp,
|
72
|
+
'open': item.open,
|
73
|
+
'high': item.high,
|
74
|
+
'low': item.low,
|
75
|
+
'close': item.close,
|
76
|
+
'volume': item.volume
|
77
|
+
}
|
78
|
+
rows.append(row)
|
79
|
+
df = pd.DataFrame(rows)
|
80
|
+
return df
|
69
81
|
|
70
82
|
|
71
83
|
class SymbolsApiWrapper(SymbolsApi):
|
@@ -43,11 +43,15 @@ from crypticorn.metrics.client.models.api_error_identifier import ApiErrorIdenti
|
|
43
43
|
from crypticorn.metrics.client.models.api_error_level import ApiErrorLevel
|
44
44
|
from crypticorn.metrics.client.models.api_error_type import ApiErrorType
|
45
45
|
from crypticorn.metrics.client.models.exception_detail import ExceptionDetail
|
46
|
+
from crypticorn.metrics.client.models.exchange_availability import ExchangeAvailability
|
46
47
|
from crypticorn.metrics.client.models.exchange_mapping import ExchangeMapping
|
47
48
|
from crypticorn.metrics.client.models.internal_exchange import InternalExchange
|
48
49
|
from crypticorn.metrics.client.models.log_level import LogLevel
|
49
50
|
from crypticorn.metrics.client.models.market_type import MarketType
|
50
51
|
from crypticorn.metrics.client.models.marketcap_ranking import MarketcapRanking
|
52
|
+
from crypticorn.metrics.client.models.marketcap_symbol_ranking import (
|
53
|
+
MarketcapSymbolRanking,
|
54
|
+
)
|
51
55
|
from crypticorn.metrics.client.models.ohlcv import OHLCV
|
52
56
|
from crypticorn.metrics.client.models.severity import Severity
|
53
57
|
from crypticorn.metrics.client.models.time_interval import TimeInterval
|
@@ -17,8 +17,9 @@ from typing import Any, Dict, List, Optional, Tuple, Union
|
|
17
17
|
from typing_extensions import Annotated
|
18
18
|
|
19
19
|
from pydantic import Field, StrictInt, StrictStr
|
20
|
-
from typing import
|
20
|
+
from typing import List, Optional
|
21
21
|
from typing_extensions import Annotated
|
22
|
+
from crypticorn.metrics.client.models.exchange_availability import ExchangeAvailability
|
22
23
|
from crypticorn.metrics.client.models.exchange_mapping import ExchangeMapping
|
23
24
|
from crypticorn.metrics.client.models.internal_exchange import InternalExchange
|
24
25
|
from crypticorn.metrics.client.models.market_type import MarketType
|
@@ -88,7 +89,7 @@ class ExchangesApi:
|
|
88
89
|
_content_type: Optional[StrictStr] = None,
|
89
90
|
_headers: Optional[Dict[StrictStr, Any]] = None,
|
90
91
|
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
91
|
-
) -> List[
|
92
|
+
) -> List[ExchangeAvailability]:
|
92
93
|
"""Get Available Exchanges
|
93
94
|
|
94
95
|
Get available exchanges for a symbol with various filtering options.
|
@@ -144,7 +145,7 @@ class ExchangesApi:
|
|
144
145
|
)
|
145
146
|
|
146
147
|
_response_types_map: Dict[str, Optional[str]] = {
|
147
|
-
"200": "List[
|
148
|
+
"200": "List[ExchangeAvailability]",
|
148
149
|
}
|
149
150
|
response_data = await self.api_client.call_api(
|
150
151
|
*_param, _request_timeout=_request_timeout
|
@@ -201,7 +202,7 @@ class ExchangesApi:
|
|
201
202
|
_content_type: Optional[StrictStr] = None,
|
202
203
|
_headers: Optional[Dict[StrictStr, Any]] = None,
|
203
204
|
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
204
|
-
) -> ApiResponse[List[
|
205
|
+
) -> ApiResponse[List[ExchangeAvailability]]:
|
205
206
|
"""Get Available Exchanges
|
206
207
|
|
207
208
|
Get available exchanges for a symbol with various filtering options.
|
@@ -257,7 +258,7 @@ class ExchangesApi:
|
|
257
258
|
)
|
258
259
|
|
259
260
|
_response_types_map: Dict[str, Optional[str]] = {
|
260
|
-
"200": "List[
|
261
|
+
"200": "List[ExchangeAvailability]",
|
261
262
|
}
|
262
263
|
response_data = await self.api_client.call_api(
|
263
264
|
*_param, _request_timeout=_request_timeout
|
@@ -370,7 +371,7 @@ class ExchangesApi:
|
|
370
371
|
)
|
371
372
|
|
372
373
|
_response_types_map: Dict[str, Optional[str]] = {
|
373
|
-
"200": "List[
|
374
|
+
"200": "List[ExchangeAvailability]",
|
374
375
|
}
|
375
376
|
response_data = await self.api_client.call_api(
|
376
377
|
*_param, _request_timeout=_request_timeout
|
@@ -44,7 +44,9 @@ class IndicatorsApi:
|
|
44
44
|
symbol: Annotated[
|
45
45
|
StrictStr, Field(description="Symbol to fetch KER indicator for")
|
46
46
|
],
|
47
|
-
market: Annotated[
|
47
|
+
market: Annotated[
|
48
|
+
Optional[MarketType], Field(description="Market. Defaults to futures.")
|
49
|
+
] = None,
|
48
50
|
period: Annotated[
|
49
51
|
Optional[StrictInt], Field(description="KER indicator period")
|
50
52
|
] = None,
|
@@ -70,7 +72,7 @@ class IndicatorsApi:
|
|
70
72
|
|
71
73
|
:param symbol: Symbol to fetch KER indicator for (required)
|
72
74
|
:type symbol: str
|
73
|
-
:param market: Market
|
75
|
+
:param market: Market. Defaults to futures.
|
74
76
|
:type market: MarketType
|
75
77
|
:param period: KER indicator period
|
76
78
|
:type period: int
|
@@ -127,7 +129,9 @@ class IndicatorsApi:
|
|
127
129
|
symbol: Annotated[
|
128
130
|
StrictStr, Field(description="Symbol to fetch KER indicator for")
|
129
131
|
],
|
130
|
-
market: Annotated[
|
132
|
+
market: Annotated[
|
133
|
+
Optional[MarketType], Field(description="Market. Defaults to futures.")
|
134
|
+
] = None,
|
131
135
|
period: Annotated[
|
132
136
|
Optional[StrictInt], Field(description="KER indicator period")
|
133
137
|
] = None,
|
@@ -153,7 +157,7 @@ class IndicatorsApi:
|
|
153
157
|
|
154
158
|
:param symbol: Symbol to fetch KER indicator for (required)
|
155
159
|
:type symbol: str
|
156
|
-
:param market: Market
|
160
|
+
:param market: Market. Defaults to futures.
|
157
161
|
:type market: MarketType
|
158
162
|
:param period: KER indicator period
|
159
163
|
:type period: int
|
@@ -210,7 +214,9 @@ class IndicatorsApi:
|
|
210
214
|
symbol: Annotated[
|
211
215
|
StrictStr, Field(description="Symbol to fetch KER indicator for")
|
212
216
|
],
|
213
|
-
market: Annotated[
|
217
|
+
market: Annotated[
|
218
|
+
Optional[MarketType], Field(description="Market. Defaults to futures.")
|
219
|
+
] = None,
|
214
220
|
period: Annotated[
|
215
221
|
Optional[StrictInt], Field(description="KER indicator period")
|
216
222
|
] = None,
|
@@ -236,7 +242,7 @@ class IndicatorsApi:
|
|
236
242
|
|
237
243
|
:param symbol: Symbol to fetch KER indicator for (required)
|
238
244
|
:type symbol: str
|
239
|
-
:param market: Market
|
245
|
+
:param market: Market. Defaults to futures.
|
240
246
|
:type market: MarketType
|
241
247
|
:param period: KER indicator period
|
242
248
|
:type period: int
|
@@ -21,6 +21,9 @@ from typing import Any, Dict, List, Optional
|
|
21
21
|
from typing_extensions import Annotated
|
22
22
|
from crypticorn.metrics.client.models.market_type import MarketType
|
23
23
|
from crypticorn.metrics.client.models.marketcap_ranking import MarketcapRanking
|
24
|
+
from crypticorn.metrics.client.models.marketcap_symbol_ranking import (
|
25
|
+
MarketcapSymbolRanking,
|
26
|
+
)
|
24
27
|
from crypticorn.metrics.client.models.ohlcv import OHLCV
|
25
28
|
|
26
29
|
from crypticorn.metrics.client.api_client import ApiClient, RequestSerialized
|
@@ -313,7 +316,7 @@ class MarketcapApi:
|
|
313
316
|
_content_type: Optional[StrictStr] = None,
|
314
317
|
_headers: Optional[Dict[StrictStr, Any]] = None,
|
315
318
|
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
316
|
-
) -> List[
|
319
|
+
) -> List[MarketcapRanking]:
|
317
320
|
"""Get Marketcap Between Timestamps
|
318
321
|
|
319
322
|
Retrieve marketcap data between timestamps.
|
@@ -354,7 +357,7 @@ class MarketcapApi:
|
|
354
357
|
)
|
355
358
|
|
356
359
|
_response_types_map: Dict[str, Optional[str]] = {
|
357
|
-
"200": "List[
|
360
|
+
"200": "List[MarketcapRanking]",
|
358
361
|
}
|
359
362
|
response_data = await self.api_client.call_api(
|
360
363
|
*_param, _request_timeout=_request_timeout
|
@@ -385,7 +388,7 @@ class MarketcapApi:
|
|
385
388
|
_content_type: Optional[StrictStr] = None,
|
386
389
|
_headers: Optional[Dict[StrictStr, Any]] = None,
|
387
390
|
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
388
|
-
) -> ApiResponse[List[
|
391
|
+
) -> ApiResponse[List[MarketcapRanking]]:
|
389
392
|
"""Get Marketcap Between Timestamps
|
390
393
|
|
391
394
|
Retrieve marketcap data between timestamps.
|
@@ -426,7 +429,7 @@ class MarketcapApi:
|
|
426
429
|
)
|
427
430
|
|
428
431
|
_response_types_map: Dict[str, Optional[str]] = {
|
429
|
-
"200": "List[
|
432
|
+
"200": "List[MarketcapRanking]",
|
430
433
|
}
|
431
434
|
response_data = await self.api_client.call_api(
|
432
435
|
*_param, _request_timeout=_request_timeout
|
@@ -498,7 +501,7 @@ class MarketcapApi:
|
|
498
501
|
)
|
499
502
|
|
500
503
|
_response_types_map: Dict[str, Optional[str]] = {
|
501
|
-
"200": "List[
|
504
|
+
"200": "List[MarketcapRanking]",
|
502
505
|
}
|
503
506
|
response_data = await self.api_client.call_api(
|
504
507
|
*_param, _request_timeout=_request_timeout
|
@@ -581,11 +584,15 @@ class MarketcapApi:
|
|
581
584
|
] = None,
|
582
585
|
market: Annotated[
|
583
586
|
Optional[MarketType],
|
584
|
-
Field(
|
587
|
+
Field(
|
588
|
+
description="Market for which to fetch symbols and marketcap data. Defaults to futures."
|
589
|
+
),
|
585
590
|
] = None,
|
586
591
|
exchange: Annotated[
|
587
592
|
Optional[StrictStr],
|
588
|
-
Field(
|
593
|
+
Field(
|
594
|
+
description="Exchange for which to fetch symbols and marketcap data. If not provided, all exchanges will be returned."
|
595
|
+
),
|
589
596
|
] = None,
|
590
597
|
_request_timeout: Union[
|
591
598
|
None,
|
@@ -598,10 +605,10 @@ class MarketcapApi:
|
|
598
605
|
_content_type: Optional[StrictStr] = None,
|
599
606
|
_headers: Optional[Dict[StrictStr, Any]] = None,
|
600
607
|
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
601
|
-
) -> List[
|
608
|
+
) -> List[MarketcapSymbolRanking]:
|
602
609
|
"""Get Symbols Marketcap Between Timestamps
|
603
610
|
|
604
|
-
Retrieve
|
611
|
+
Retrieve a ranking of symbols by marketcap between timestamps.
|
605
612
|
|
606
613
|
:param start_timestamp: Start timestamp
|
607
614
|
:type start_timestamp: int
|
@@ -609,9 +616,9 @@ class MarketcapApi:
|
|
609
616
|
:type end_timestamp: int
|
610
617
|
:param interval: Interval for which to fetch symbols and marketcap data
|
611
618
|
:type interval: str
|
612
|
-
:param market: Market for which to fetch symbols and marketcap data
|
619
|
+
:param market: Market for which to fetch symbols and marketcap data. Defaults to futures.
|
613
620
|
:type market: MarketType
|
614
|
-
:param exchange: Exchange for which to fetch symbols and marketcap data
|
621
|
+
:param exchange: Exchange for which to fetch symbols and marketcap data. If not provided, all exchanges will be returned.
|
615
622
|
:type exchange: str
|
616
623
|
:param _request_timeout: timeout setting for this request. If one
|
617
624
|
number provided, it will be total request
|
@@ -648,7 +655,7 @@ class MarketcapApi:
|
|
648
655
|
)
|
649
656
|
|
650
657
|
_response_types_map: Dict[str, Optional[str]] = {
|
651
|
-
"200": "List[
|
658
|
+
"200": "List[MarketcapSymbolRanking]",
|
652
659
|
}
|
653
660
|
response_data = await self.api_client.call_api(
|
654
661
|
*_param, _request_timeout=_request_timeout
|
@@ -674,11 +681,15 @@ class MarketcapApi:
|
|
674
681
|
] = None,
|
675
682
|
market: Annotated[
|
676
683
|
Optional[MarketType],
|
677
|
-
Field(
|
684
|
+
Field(
|
685
|
+
description="Market for which to fetch symbols and marketcap data. Defaults to futures."
|
686
|
+
),
|
678
687
|
] = None,
|
679
688
|
exchange: Annotated[
|
680
689
|
Optional[StrictStr],
|
681
|
-
Field(
|
690
|
+
Field(
|
691
|
+
description="Exchange for which to fetch symbols and marketcap data. If not provided, all exchanges will be returned."
|
692
|
+
),
|
682
693
|
] = None,
|
683
694
|
_request_timeout: Union[
|
684
695
|
None,
|
@@ -691,10 +702,10 @@ class MarketcapApi:
|
|
691
702
|
_content_type: Optional[StrictStr] = None,
|
692
703
|
_headers: Optional[Dict[StrictStr, Any]] = None,
|
693
704
|
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
694
|
-
) -> ApiResponse[List[
|
705
|
+
) -> ApiResponse[List[MarketcapSymbolRanking]]:
|
695
706
|
"""Get Symbols Marketcap Between Timestamps
|
696
707
|
|
697
|
-
Retrieve
|
708
|
+
Retrieve a ranking of symbols by marketcap between timestamps.
|
698
709
|
|
699
710
|
:param start_timestamp: Start timestamp
|
700
711
|
:type start_timestamp: int
|
@@ -702,9 +713,9 @@ class MarketcapApi:
|
|
702
713
|
:type end_timestamp: int
|
703
714
|
:param interval: Interval for which to fetch symbols and marketcap data
|
704
715
|
:type interval: str
|
705
|
-
:param market: Market for which to fetch symbols and marketcap data
|
716
|
+
:param market: Market for which to fetch symbols and marketcap data. Defaults to futures.
|
706
717
|
:type market: MarketType
|
707
|
-
:param exchange: Exchange for which to fetch symbols and marketcap data
|
718
|
+
:param exchange: Exchange for which to fetch symbols and marketcap data. If not provided, all exchanges will be returned.
|
708
719
|
:type exchange: str
|
709
720
|
:param _request_timeout: timeout setting for this request. If one
|
710
721
|
number provided, it will be total request
|
@@ -741,7 +752,7 @@ class MarketcapApi:
|
|
741
752
|
)
|
742
753
|
|
743
754
|
_response_types_map: Dict[str, Optional[str]] = {
|
744
|
-
"200": "List[
|
755
|
+
"200": "List[MarketcapSymbolRanking]",
|
745
756
|
}
|
746
757
|
response_data = await self.api_client.call_api(
|
747
758
|
*_param, _request_timeout=_request_timeout
|
@@ -767,11 +778,15 @@ class MarketcapApi:
|
|
767
778
|
] = None,
|
768
779
|
market: Annotated[
|
769
780
|
Optional[MarketType],
|
770
|
-
Field(
|
781
|
+
Field(
|
782
|
+
description="Market for which to fetch symbols and marketcap data. Defaults to futures."
|
783
|
+
),
|
771
784
|
] = None,
|
772
785
|
exchange: Annotated[
|
773
786
|
Optional[StrictStr],
|
774
|
-
Field(
|
787
|
+
Field(
|
788
|
+
description="Exchange for which to fetch symbols and marketcap data. If not provided, all exchanges will be returned."
|
789
|
+
),
|
775
790
|
] = None,
|
776
791
|
_request_timeout: Union[
|
777
792
|
None,
|
@@ -787,7 +802,7 @@ class MarketcapApi:
|
|
787
802
|
) -> RESTResponseType:
|
788
803
|
"""Get Symbols Marketcap Between Timestamps
|
789
804
|
|
790
|
-
Retrieve
|
805
|
+
Retrieve a ranking of symbols by marketcap between timestamps.
|
791
806
|
|
792
807
|
:param start_timestamp: Start timestamp
|
793
808
|
:type start_timestamp: int
|
@@ -795,9 +810,9 @@ class MarketcapApi:
|
|
795
810
|
:type end_timestamp: int
|
796
811
|
:param interval: Interval for which to fetch symbols and marketcap data
|
797
812
|
:type interval: str
|
798
|
-
:param market: Market for which to fetch symbols and marketcap data
|
813
|
+
:param market: Market for which to fetch symbols and marketcap data. Defaults to futures.
|
799
814
|
:type market: MarketType
|
800
|
-
:param exchange: Exchange for which to fetch symbols and marketcap data
|
815
|
+
:param exchange: Exchange for which to fetch symbols and marketcap data. If not provided, all exchanges will be returned.
|
801
816
|
:type exchange: str
|
802
817
|
:param _request_timeout: timeout setting for this request. If one
|
803
818
|
number provided, it will be total request
|
@@ -834,7 +849,7 @@ class MarketcapApi:
|
|
834
849
|
)
|
835
850
|
|
836
851
|
_response_types_map: Dict[str, Optional[str]] = {
|
837
|
-
"200": "List[
|
852
|
+
"200": "List[MarketcapSymbolRanking]",
|
838
853
|
}
|
839
854
|
response_data = await self.api_client.call_api(
|
840
855
|
*_param, _request_timeout=_request_timeout
|
@@ -928,7 +943,8 @@ class MarketcapApi:
|
|
928
943
|
Optional[StrictStr], Field(description="Timeframe for OHLCV data")
|
929
944
|
] = None,
|
930
945
|
market: Annotated[
|
931
|
-
Optional[MarketType],
|
946
|
+
Optional[MarketType],
|
947
|
+
Field(description="Market for OHLCV data. Defaults to futures."),
|
932
948
|
] = None,
|
933
949
|
top_n: Annotated[
|
934
950
|
Optional[StrictInt], Field(description="Number of symbols to fetch")
|
@@ -957,7 +973,7 @@ class MarketcapApi:
|
|
957
973
|
:type timestamp: int
|
958
974
|
:param timeframe: Timeframe for OHLCV data
|
959
975
|
:type timeframe: str
|
960
|
-
:param market: Market for OHLCV data
|
976
|
+
:param market: Market for OHLCV data. Defaults to futures.
|
961
977
|
:type market: MarketType
|
962
978
|
:param top_n: Number of symbols to fetch
|
963
979
|
:type top_n: int
|
@@ -1020,7 +1036,8 @@ class MarketcapApi:
|
|
1020
1036
|
Optional[StrictStr], Field(description="Timeframe for OHLCV data")
|
1021
1037
|
] = None,
|
1022
1038
|
market: Annotated[
|
1023
|
-
Optional[MarketType],
|
1039
|
+
Optional[MarketType],
|
1040
|
+
Field(description="Market for OHLCV data. Defaults to futures."),
|
1024
1041
|
] = None,
|
1025
1042
|
top_n: Annotated[
|
1026
1043
|
Optional[StrictInt], Field(description="Number of symbols to fetch")
|
@@ -1049,7 +1066,7 @@ class MarketcapApi:
|
|
1049
1066
|
:type timestamp: int
|
1050
1067
|
:param timeframe: Timeframe for OHLCV data
|
1051
1068
|
:type timeframe: str
|
1052
|
-
:param market: Market for OHLCV data
|
1069
|
+
:param market: Market for OHLCV data. Defaults to futures.
|
1053
1070
|
:type market: MarketType
|
1054
1071
|
:param top_n: Number of symbols to fetch
|
1055
1072
|
:type top_n: int
|
@@ -1112,7 +1129,8 @@ class MarketcapApi:
|
|
1112
1129
|
Optional[StrictStr], Field(description="Timeframe for OHLCV data")
|
1113
1130
|
] = None,
|
1114
1131
|
market: Annotated[
|
1115
|
-
Optional[MarketType],
|
1132
|
+
Optional[MarketType],
|
1133
|
+
Field(description="Market for OHLCV data. Defaults to futures."),
|
1116
1134
|
] = None,
|
1117
1135
|
top_n: Annotated[
|
1118
1136
|
Optional[StrictInt], Field(description="Number of symbols to fetch")
|
@@ -1141,7 +1159,7 @@ class MarketcapApi:
|
|
1141
1159
|
:type timestamp: int
|
1142
1160
|
:param timeframe: Timeframe for OHLCV data
|
1143
1161
|
:type timeframe: str
|
1144
|
-
:param market: Market for OHLCV data
|
1162
|
+
:param market: Market for OHLCV data. Defaults to futures.
|
1145
1163
|
:type market: MarketType
|
1146
1164
|
:param top_n: Number of symbols to fetch
|
1147
1165
|
:type top_n: int
|
@@ -215,7 +215,7 @@ class Configuration:
|
|
215
215
|
debug: Optional[bool] = None,
|
216
216
|
) -> None:
|
217
217
|
"""Constructor"""
|
218
|
-
self._base_path = "http://
|
218
|
+
self._base_path = "http://localhost/v1/metrics" if host is None else host
|
219
219
|
"""Default Base url
|
220
220
|
"""
|
221
221
|
self.server_index = 0 if server_index is None and host is None else server_index
|
@@ -557,7 +557,7 @@ class Configuration:
|
|
557
557
|
"""
|
558
558
|
return [
|
559
559
|
{
|
560
|
-
"url": "http://
|
560
|
+
"url": "http://localhost/v1/metrics",
|
561
561
|
"description": "No description provided",
|
562
562
|
}
|
563
563
|
]
|
@@ -18,11 +18,15 @@ from crypticorn.metrics.client.models.api_error_identifier import ApiErrorIdenti
|
|
18
18
|
from crypticorn.metrics.client.models.api_error_level import ApiErrorLevel
|
19
19
|
from crypticorn.metrics.client.models.api_error_type import ApiErrorType
|
20
20
|
from crypticorn.metrics.client.models.exception_detail import ExceptionDetail
|
21
|
+
from crypticorn.metrics.client.models.exchange_availability import ExchangeAvailability
|
21
22
|
from crypticorn.metrics.client.models.exchange_mapping import ExchangeMapping
|
22
23
|
from crypticorn.metrics.client.models.internal_exchange import InternalExchange
|
23
24
|
from crypticorn.metrics.client.models.log_level import LogLevel
|
24
25
|
from crypticorn.metrics.client.models.market_type import MarketType
|
25
26
|
from crypticorn.metrics.client.models.marketcap_ranking import MarketcapRanking
|
27
|
+
from crypticorn.metrics.client.models.marketcap_symbol_ranking import (
|
28
|
+
MarketcapSymbolRanking,
|
29
|
+
)
|
26
30
|
from crypticorn.metrics.client.models.ohlcv import OHLCV
|
27
31
|
from crypticorn.metrics.client.models.severity import Severity
|
28
32
|
from crypticorn.metrics.client.models.time_interval import TimeInterval
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
"""
|
4
|
+
Marketcap Service API
|
5
|
+
|
6
|
+
API for retrieving historical marketcap data, available exchanges, and indicators.
|
7
|
+
|
8
|
+
The version of the OpenAPI document: 1.0.0
|
9
|
+
Generated by OpenAPI Generator (https://openapi-generator.tech)
|
10
|
+
|
11
|
+
Do not edit the class manually.
|
12
|
+
""" # noqa: E501
|
13
|
+
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
import pprint
|
17
|
+
import re # noqa: F401
|
18
|
+
import json
|
19
|
+
|
20
|
+
from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictInt
|
21
|
+
from typing import Any, ClassVar, Dict, List
|
22
|
+
from typing import Optional, Set
|
23
|
+
from typing_extensions import Self
|
24
|
+
|
25
|
+
|
26
|
+
class ExchangeAvailability(BaseModel):
|
27
|
+
"""
|
28
|
+
ExchangeAvailability
|
29
|
+
""" # noqa: E501
|
30
|
+
|
31
|
+
timestamp: StrictInt = Field(description="The timestamp of the availability")
|
32
|
+
exchanges: Dict[str, StrictBool] = Field(
|
33
|
+
description="The availability of the exchange. Returns a dictionary of exchange names and their availability as a boolean."
|
34
|
+
)
|
35
|
+
__properties: ClassVar[List[str]] = ["timestamp", "exchanges"]
|
36
|
+
|
37
|
+
model_config = ConfigDict(
|
38
|
+
populate_by_name=True,
|
39
|
+
validate_assignment=True,
|
40
|
+
protected_namespaces=(),
|
41
|
+
)
|
42
|
+
|
43
|
+
def to_str(self) -> str:
|
44
|
+
"""Returns the string representation of the model using alias"""
|
45
|
+
return pprint.pformat(self.model_dump(by_alias=True))
|
46
|
+
|
47
|
+
def to_json(self) -> str:
|
48
|
+
"""Returns the JSON representation of the model using alias"""
|
49
|
+
# TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
|
50
|
+
return json.dumps(self.to_dict())
|
51
|
+
|
52
|
+
@classmethod
|
53
|
+
def from_json(cls, json_str: str) -> Optional[Self]:
|
54
|
+
"""Create an instance of ExchangeAvailability from a JSON string"""
|
55
|
+
return cls.from_dict(json.loads(json_str))
|
56
|
+
|
57
|
+
def to_dict(self) -> Dict[str, Any]:
|
58
|
+
"""Return the dictionary representation of the model using alias.
|
59
|
+
|
60
|
+
This has the following differences from calling pydantic's
|
61
|
+
`self.model_dump(by_alias=True)`:
|
62
|
+
|
63
|
+
* `None` is only added to the output dict for nullable fields that
|
64
|
+
were set at model initialization. Other fields with value `None`
|
65
|
+
are ignored.
|
66
|
+
"""
|
67
|
+
excluded_fields: Set[str] = set([])
|
68
|
+
|
69
|
+
_dict = self.model_dump(
|
70
|
+
by_alias=True,
|
71
|
+
exclude=excluded_fields,
|
72
|
+
exclude_none=True,
|
73
|
+
)
|
74
|
+
return _dict
|
75
|
+
|
76
|
+
@classmethod
|
77
|
+
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
78
|
+
"""Create an instance of ExchangeAvailability from a dict"""
|
79
|
+
if obj is None:
|
80
|
+
return None
|
81
|
+
|
82
|
+
if not isinstance(obj, dict):
|
83
|
+
return cls.model_validate(obj)
|
84
|
+
|
85
|
+
_obj = cls.model_validate(
|
86
|
+
{"timestamp": obj.get("timestamp"), "exchanges": obj.get("exchanges")}
|
87
|
+
)
|
88
|
+
return _obj
|
@@ -17,20 +17,20 @@ import pprint
|
|
17
17
|
import re # noqa: F401
|
18
18
|
import json
|
19
19
|
|
20
|
-
from pydantic import BaseModel, ConfigDict,
|
21
|
-
from typing import Any, ClassVar, Dict, List, Optional
|
20
|
+
from pydantic import BaseModel, ConfigDict, StrictFloat, StrictInt
|
21
|
+
from typing import Any, ClassVar, Dict, List, Optional, Union
|
22
22
|
from typing import Optional, Set
|
23
23
|
from typing_extensions import Self
|
24
24
|
|
25
25
|
|
26
26
|
class MarketcapRanking(BaseModel):
|
27
27
|
"""
|
28
|
-
|
28
|
+
A ranking of symbols by marketcap at a given timestamp.
|
29
29
|
""" # noqa: E501
|
30
30
|
|
31
31
|
timestamp: StrictInt
|
32
|
-
|
33
|
-
__properties: ClassVar[List[str]] = ["timestamp", "
|
32
|
+
marketcap_values: List[Optional[Union[StrictFloat, StrictInt]]]
|
33
|
+
__properties: ClassVar[List[str]] = ["timestamp", "marketcap_values"]
|
34
34
|
|
35
35
|
model_config = ConfigDict(
|
36
36
|
populate_by_name=True,
|
@@ -81,6 +81,9 @@ class MarketcapRanking(BaseModel):
|
|
81
81
|
return cls.model_validate(obj)
|
82
82
|
|
83
83
|
_obj = cls.model_validate(
|
84
|
-
{
|
84
|
+
{
|
85
|
+
"timestamp": obj.get("timestamp"),
|
86
|
+
"marketcap_values": obj.get("marketcap_values"),
|
87
|
+
}
|
85
88
|
)
|
86
89
|
return _obj
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
"""
|
4
|
+
Marketcap Service API
|
5
|
+
|
6
|
+
API for retrieving historical marketcap data, available exchanges, and indicators.
|
7
|
+
|
8
|
+
The version of the OpenAPI document: 1.0.0
|
9
|
+
Generated by OpenAPI Generator (https://openapi-generator.tech)
|
10
|
+
|
11
|
+
Do not edit the class manually.
|
12
|
+
""" # noqa: E501
|
13
|
+
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
import pprint
|
17
|
+
import re # noqa: F401
|
18
|
+
import json
|
19
|
+
|
20
|
+
from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr
|
21
|
+
from typing import Any, ClassVar, Dict, List, Optional
|
22
|
+
from typing import Optional, Set
|
23
|
+
from typing_extensions import Self
|
24
|
+
|
25
|
+
|
26
|
+
class MarketcapSymbolRanking(BaseModel):
|
27
|
+
"""
|
28
|
+
A ranking of marketcap values at a given timestamp.
|
29
|
+
""" # noqa: E501
|
30
|
+
|
31
|
+
timestamp: StrictInt
|
32
|
+
symbols: List[Optional[StrictStr]]
|
33
|
+
__properties: ClassVar[List[str]] = ["timestamp", "symbols"]
|
34
|
+
|
35
|
+
model_config = ConfigDict(
|
36
|
+
populate_by_name=True,
|
37
|
+
validate_assignment=True,
|
38
|
+
protected_namespaces=(),
|
39
|
+
)
|
40
|
+
|
41
|
+
def to_str(self) -> str:
|
42
|
+
"""Returns the string representation of the model using alias"""
|
43
|
+
return pprint.pformat(self.model_dump(by_alias=True))
|
44
|
+
|
45
|
+
def to_json(self) -> str:
|
46
|
+
"""Returns the JSON representation of the model using alias"""
|
47
|
+
# TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
|
48
|
+
return json.dumps(self.to_dict())
|
49
|
+
|
50
|
+
@classmethod
|
51
|
+
def from_json(cls, json_str: str) -> Optional[Self]:
|
52
|
+
"""Create an instance of MarketcapSymbolRanking from a JSON string"""
|
53
|
+
return cls.from_dict(json.loads(json_str))
|
54
|
+
|
55
|
+
def to_dict(self) -> Dict[str, Any]:
|
56
|
+
"""Return the dictionary representation of the model using alias.
|
57
|
+
|
58
|
+
This has the following differences from calling pydantic's
|
59
|
+
`self.model_dump(by_alias=True)`:
|
60
|
+
|
61
|
+
* `None` is only added to the output dict for nullable fields that
|
62
|
+
were set at model initialization. Other fields with value `None`
|
63
|
+
are ignored.
|
64
|
+
"""
|
65
|
+
excluded_fields: Set[str] = set([])
|
66
|
+
|
67
|
+
_dict = self.model_dump(
|
68
|
+
by_alias=True,
|
69
|
+
exclude=excluded_fields,
|
70
|
+
exclude_none=True,
|
71
|
+
)
|
72
|
+
return _dict
|
73
|
+
|
74
|
+
@classmethod
|
75
|
+
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
76
|
+
"""Create an instance of MarketcapSymbolRanking from a dict"""
|
77
|
+
if obj is None:
|
78
|
+
return None
|
79
|
+
|
80
|
+
if not isinstance(obj, dict):
|
81
|
+
return cls.model_validate(obj)
|
82
|
+
|
83
|
+
_obj = cls.model_validate(
|
84
|
+
{"timestamp": obj.get("timestamp"), "symbols": obj.get("symbols")}
|
85
|
+
)
|
86
|
+
return _obj
|
crypticorn/metrics/main.py
CHANGED
@@ -54,7 +54,7 @@ class MarketcapApiWrapper(MarketcapApi):
|
|
54
54
|
rows = []
|
55
55
|
for item in response:
|
56
56
|
row = {"timestamp": item.timestamp}
|
57
|
-
row.update({i+1: sym for i, sym in enumerate(item.symbols)})
|
57
|
+
row.update({i + 1: sym for i, sym in enumerate(item.symbols)})
|
58
58
|
rows.append(row)
|
59
59
|
df = pd.DataFrame(rows)
|
60
60
|
return df
|
@@ -93,22 +93,15 @@ class ExchangesApiWrapper(ExchangesApi):
|
|
93
93
|
"""
|
94
94
|
pd = optional_import("pandas", "extra")
|
95
95
|
response = await self.get_available_exchanges(*args, **kwargs)
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
# Convert exchange availability to boolean integers (0/1)
|
108
|
-
df = df.astype(
|
109
|
-
{
|
110
|
-
"timestamp": "int64",
|
111
|
-
**{col: "int8" for col in df.columns if col != "timestamp"},
|
112
|
-
}
|
113
|
-
)
|
96
|
+
|
97
|
+
# Create list of dictionaries with timestamp and flattened exchange data
|
98
|
+
rows = []
|
99
|
+
for item in response:
|
100
|
+
row = {"timestamp": item.timestamp}
|
101
|
+
row.update(
|
102
|
+
item.exchanges
|
103
|
+
) # This spreads the exchanges dict into individual columns
|
104
|
+
rows.append(row)
|
105
|
+
|
106
|
+
df = pd.DataFrame(rows)
|
114
107
|
return df
|
@@ -1,23 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: crypticorn
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.11.4
|
4
4
|
Summary: Maximise Your Crypto Trading Profits with Machine Learning
|
5
5
|
Author-email: Crypticorn <timon@crypticorn.com>
|
6
|
-
License:
|
7
|
-
|
8
|
-
All rights reserved. This software and accompanying documentation files (collectively referred to as "the Software") are the proprietary property of Crypticorn. Any unauthorised reproduction, modification, integration, publication, distribution, sublicensing, sale, or enabling access to the Software without explicit written permission from Crypticorn is strictly prohibited, subject to the conditions outlined herein:
|
9
|
-
|
10
|
-
1. The aforementioned copyright notice and this permission notice must be included unaltered in all copies, or significant portions, of the Software.
|
11
|
-
|
12
|
-
2. The Software is provided "AS IS", without any warranty, whether express or implied. Crypticorn expressly disclaims any guarantees, including but not limited to those of satisfactory quality, fitness for a particular purpose, or non-infringement of third-party rights.
|
13
|
-
|
14
|
-
3. In no event shall Crypticorn, its authors, or copyright holders be held liable for any claim, damages, or other liability arising from or associated with the use of the Software or any other dealings involving the Software, to the extent that such liability can be limited or excluded by applicable law.
|
15
|
-
|
16
|
-
Changes to this agreement may be made without notice, and it is the user's responsibility to keep abreast of any changes. This agreement and its interpretation are subject to the laws of the Federal Republic of Germany.
|
17
|
-
|
18
|
-
If any provision of this license agreement is held to be invalid or unenforceable under applicable law, the remaining provisions will continue in full force and effect. Crypticorn's failure to enforce any provision of this agreement does not constitute a waiver of its right to do so in the future.
|
19
|
-
|
20
|
-
This agreement is written in English. In the event of any discrepancy between the English version and any translation, the English version shall prevail.
|
6
|
+
License-Expression: MIT
|
21
7
|
Project-URL: Homepage, https://crypticorn.com
|
22
8
|
Project-URL: Documentation, https://docs.crypticorn.com
|
23
9
|
Project-URL: Dashboard, https://app.crypticorn.com
|
@@ -26,19 +12,19 @@ Classifier: Topic :: Scientific/Engineering
|
|
26
12
|
Classifier: Development Status :: 4 - Beta
|
27
13
|
Classifier: Intended Audience :: Developers
|
28
14
|
Classifier: Operating System :: OS Independent
|
29
|
-
Classifier: License :: OSI Approved :: MIT License
|
30
15
|
Classifier: Programming Language :: Python :: 3.10
|
31
16
|
Classifier: Programming Language :: Python :: 3.11
|
32
17
|
Classifier: Programming Language :: Python :: 3.12
|
33
18
|
Classifier: Programming Language :: Python :: 3.13
|
34
19
|
Classifier: Typing :: Typed
|
35
|
-
Requires-Python: >=3.
|
20
|
+
Requires-Python: >=3.9
|
36
21
|
Description-Content-Type: text/markdown
|
37
22
|
License-File: LICENSE
|
38
23
|
Requires-Dist: fastapi<1.0.0,>=0.115.0
|
39
24
|
Requires-Dist: click<9.0.0,>=8.0.0
|
40
25
|
Requires-Dist: psutil<8.0.0,>=7.0.0
|
41
26
|
Requires-Dist: setuptools<81.0.0,>=80.0.0
|
27
|
+
Requires-Dist: strenum
|
42
28
|
Requires-Dist: urllib3<3.0.0,>=1.25.3
|
43
29
|
Requires-Dist: python_dateutil<3.0.0,>=2.8.2
|
44
30
|
Requires-Dist: aiohttp<4.0.0,>=3.8.4
|
@@ -76,7 +62,7 @@ crypto market - and programmatically interact with the entire Crypticorn ecosyst
|
|
76
62
|
|
77
63
|
## Installation
|
78
64
|
|
79
|
-
You need Python 3.
|
65
|
+
You need Python 3.9+ installed to be able to use this library.
|
80
66
|
|
81
67
|
You can install the latest stable version from [PyPi](https://pypi.org/project/crypticorn/):
|
82
68
|
```bash
|
@@ -98,7 +84,7 @@ from crypticorn import ApiClient
|
|
98
84
|
```
|
99
85
|
The ApiClient serves as the central interface for API operations. It instantiates multiple API wrappers corresponding to our micro services. These are structured the following:
|
100
86
|
|
101
|
-
<img src="pip-structure.svg" alt="pip package structure" />
|
87
|
+
<img src="static/pip-structure.svg" alt="pip package structure" />
|
102
88
|
|
103
89
|
You can either explore each API by clicking through the library or checkout the [API Documentation](https://docs.crypticorn.com/api).
|
104
90
|
|
@@ -115,7 +101,12 @@ from crypticorn.common import Scope, Exchange
|
|
115
101
|
|
116
102
|
## Authentication
|
117
103
|
|
118
|
-
To get started, [create an API key in your dashboard](https://app.crypticorn.com/account/developer).
|
104
|
+
To get started, [create an API key in your dashboard](https://app.crypticorn.com/account/developer).
|
105
|
+
|
106
|
+
The scopes you can assign, resemble the [package structure](#structure). The first part defines if the scopes is for reading or writing a ressource, the second matches the API, the third the ROUTER being used. `read` scopes gives access to GET, `write` to PUT, PATCH, POST, DELETE endpoints.
|
107
|
+
|
108
|
+
There are scopes which don't follow this structure. Those are either scopes that must be purchased (e.g. `read:predictions`), give access to endpoints existing in all APIs (e.g. `read:admin`) or provide access to an entire service (e.g. `read:sentiment`).
|
109
|
+
|
119
110
|
|
120
111
|
## Basic Usage
|
121
112
|
|
@@ -1,11 +1,11 @@
|
|
1
1
|
crypticorn/__init__.py,sha256=ctrwe5CQtYhnetHYPgSmC0CIHa4xbDsLZvpY38tfEow,423
|
2
|
-
crypticorn/client.py,sha256=
|
2
|
+
crypticorn/client.py,sha256=G3b0O27ETRqmyPMxx1tKMUTSu3JkevcuJf3mTKaZ5XM,4673
|
3
3
|
crypticorn/auth/__init__.py,sha256=JAl1tBLK9pYLr_-YKaj581c-c94PWLoqnatTIVAVvMM,81
|
4
4
|
crypticorn/auth/main.py,sha256=j8eRGN2gUWyeOCnWnUPe3mCAfaidGnOMnZRiSQy-yzM,720
|
5
5
|
crypticorn/auth/client/__init__.py,sha256=do16xS84uXvVoJuWERjb9RwlOaLy4UF4uKBZWczFC3c,5291
|
6
6
|
crypticorn/auth/client/api_client.py,sha256=YumNsoI1ROiukpmDloiSfy7ZTd207khTmNLa7Dien5o,26888
|
7
7
|
crypticorn/auth/client/api_response.py,sha256=WhxwYDSMm6wPixp9CegO8dJzjFxDz3JF1yCq9s0ZqKE,639
|
8
|
-
crypticorn/auth/client/configuration.py,sha256=
|
8
|
+
crypticorn/auth/client/configuration.py,sha256=hsdlmSIReQLV_-IlrOOZ7zI3XJ_8IrnkjWvNcKIBH18,18054
|
9
9
|
crypticorn/auth/client/exceptions.py,sha256=h0Uf70boJaADhffgwDC5bXtOneCeiRyaxWZXgE8OlgM,6393
|
10
10
|
crypticorn/auth/client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
11
|
crypticorn/auth/client/rest.py,sha256=7ykLyiCyjtTiC1F-9JfrD79vaA831O_irNDmaRArnGg,6994
|
@@ -22,9 +22,9 @@ crypticorn/auth/client/models/authorize_user200_response.py,sha256=fstTaffARzCe7
|
|
22
22
|
crypticorn/auth/client/models/authorize_user200_response_auth.py,sha256=OQzmKNICdr7tHrlhEDIxagDZx7XuW8VO2U3OMsWIJOA,3208
|
23
23
|
crypticorn/auth/client/models/authorize_user_request.py,sha256=o_1Ms6npD_1dJQ6aYshEk9JPV7JIkmAmuRawDDPUoTc,3205
|
24
24
|
crypticorn/auth/client/models/create_api_key200_response.py,sha256=UGjZwITv2EdS7bbt55D0w2an6_uO4u6gYr-GihL9m80,2459
|
25
|
-
crypticorn/auth/client/models/create_api_key_request.py,sha256=
|
25
|
+
crypticorn/auth/client/models/create_api_key_request.py,sha256=mCdGZ4C7u73et_bv0pcRZgf1TU0cTmKty5idj9VaOqI,5627
|
26
26
|
crypticorn/auth/client/models/create_user_request.py,sha256=nq4t2R4ldqSsJUoVhLw9YocdUwatH4gQ-jdFz3jaqrg,3481
|
27
|
-
crypticorn/auth/client/models/get_api_keys200_response_inner.py,sha256=
|
27
|
+
crypticorn/auth/client/models/get_api_keys200_response_inner.py,sha256=6JGaM7NXn6C55s6VmAZSfzZHTFx5I5BCJ8eMJF1GlG4,6015
|
28
28
|
crypticorn/auth/client/models/list_wallets200_response.py,sha256=G2LQiThhtynkuDGFvIs-BowR38ut7cRbIeCzK4wMnPw,4732
|
29
29
|
crypticorn/auth/client/models/list_wallets200_response_balances_inner.py,sha256=acTJa8B5U8j3_wS1TUYXnprptqF_T4dlV-wVaQ5ZXig,4023
|
30
30
|
crypticorn/auth/client/models/list_wallets200_response_balances_inner_sale_round.py,sha256=KrCHFXXfc6U61nDFsq26gRtQQnc2_tSjL2fwQOnBfzI,3603
|
@@ -63,24 +63,24 @@ crypticorn/cli/templates/Dockerfile,sha256=89KlphaXJH51L7Vs4B928WmwYcMtpvLmKGyoD
|
|
63
63
|
crypticorn/cli/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
64
64
|
crypticorn/cli/templates/auth.py,sha256=Q1TxlA7qzhjvrqp1xz1aV2vGnj3DKFNN-VSl3o0B-dI,983
|
65
65
|
crypticorn/cli/templates/dependabot.yml,sha256=ct5ieB8KAV1KLzoYKUNm6dZ9wKG_P_JQHgRjZUfT54w,861
|
66
|
-
crypticorn/cli/templates/merge-env.sh,sha256=
|
66
|
+
crypticorn/cli/templates/merge-env.sh,sha256=BNPrDTihII0yG2gehBkWwWj0GqHmb6xwmrAgwFpl8dA,554
|
67
67
|
crypticorn/cli/templates/ruff.yml,sha256=gWicFFTzC4nToSmRkIIGipos8CZ447YG0kebBCJhtJE,319
|
68
68
|
crypticorn/common/__init__.py,sha256=DXEuUU_kaLBSBcvpiFie_ROuK5XEZuTMIfsg-BZE0iE,752
|
69
|
-
crypticorn/common/ansi_colors.py,sha256
|
70
|
-
crypticorn/common/auth.py,sha256=
|
69
|
+
crypticorn/common/ansi_colors.py,sha256=-tMlUTE8NI7TPv7uj0kGRe-SI2hGaUNPKBFI_dfiZy0,1392
|
70
|
+
crypticorn/common/auth.py,sha256=HxiAEej315qQGbX0p8WmQI50blUTOWsMWpCtguMx-A4,8786
|
71
71
|
crypticorn/common/decorators.py,sha256=t5Y3vSJ-gt0n2vOYYjYN0dtzNXvZxrJs2SEItpzG8oo,1127
|
72
|
-
crypticorn/common/enums.py,sha256
|
73
|
-
crypticorn/common/errors.py,sha256=
|
74
|
-
crypticorn/common/exceptions.py,sha256=
|
75
|
-
crypticorn/common/logging.py,sha256=
|
72
|
+
crypticorn/common/enums.py,sha256=md7C_p2gAu6BbDboLm-DYYuJWjCHgRdk68iC1H5ZqPg,755
|
73
|
+
crypticorn/common/errors.py,sha256=cAxMlHLLR-StgMmSdUwhnN0eUh0aBQmW0BIXYfa1GOI,28023
|
74
|
+
crypticorn/common/exceptions.py,sha256=31WcS1OEcGBAMc3FnPrtb6jFbh6Ni1v9Kciz7Av4y84,6098
|
75
|
+
crypticorn/common/logging.py,sha256=3ZTFB9j8Mqy_AlNYABUFQ_134OH0YtophJkP4_GDJ9w,4408
|
76
76
|
crypticorn/common/middleware.py,sha256=O7XiXPimNYUhF9QTv6yFUTVlb91-SK-3CfTrWMNP6Ck,1011
|
77
77
|
crypticorn/common/mixins.py,sha256=l7XQrBISaee6fDZXy96k0HnQ18XYocjTUXlNpVxhaOY,2206
|
78
78
|
crypticorn/common/openapi.py,sha256=D8bCpCVVzYQptHrJ7SYOgCxI3R_d0cjW9KMOBq-x0xk,279
|
79
79
|
crypticorn/common/pagination.py,sha256=BYMNB4JUW9eeiTw1q3CyHXaT_-hk_BrSXAOqvif08Ek,2334
|
80
|
-
crypticorn/common/scopes.py,sha256=
|
81
|
-
crypticorn/common/urls.py,sha256=
|
82
|
-
crypticorn/common/utils.py,sha256=
|
83
|
-
crypticorn/common/warnings.py,sha256=
|
80
|
+
crypticorn/common/scopes.py,sha256=H-ow744XhArgN2Zb7SESP5ZZ6fNjA5oY1eHuZsuF4Gw,2827
|
81
|
+
crypticorn/common/urls.py,sha256=v23H2gevTNZ6HMRXDPiuc8znBbNdNqj0JTAdm5Hhms8,1223
|
82
|
+
crypticorn/common/utils.py,sha256=LcWudhcjZtULg87yYghh5muTYdHvk3UmkEAXmX7xgLk,3073
|
83
|
+
crypticorn/common/warnings.py,sha256=TNDiIbwFYh18zs20QnrYHYL9pB20Ip1tTzv5KlnDSUE,2426
|
84
84
|
crypticorn/common/router/admin_router.py,sha256=x81s1gxhH7nLf7txqAIjVxrNgQmXsA1YG7g9v9KJwHA,3740
|
85
85
|
crypticorn/common/router/status_router.py,sha256=it6kfvx_Pn4Rv06fmViwhwr-m6f4WuSgcZwc6VTaMz4,868
|
86
86
|
crypticorn/hive/__init__.py,sha256=hRfTlEzEql4msytdUC_04vfaHzVKG5CGZle1M-9QFgY,81
|
@@ -122,7 +122,7 @@ crypticorn/hive/client/models/target.py,sha256=otOJK8s5WVUen6J1AQZpRiD330RIpaJU6
|
|
122
122
|
crypticorn/hive/client/models/target_info.py,sha256=hFaOMZlirH2B68DQstL_c4WvtejwXyOk67lxIaeuh3Q,2857
|
123
123
|
crypticorn/hive/client/models/target_type.py,sha256=FUMaEFkPM7EvStPJE1auimDJ9mxDf6pbsFf-dF3coGw,684
|
124
124
|
crypticorn/klines/__init__.py,sha256=9UUW013uZ5x4evz5zRUxbNid-6O9WAPPYvPZIHpAwms,87
|
125
|
-
crypticorn/klines/main.py,sha256=
|
125
|
+
crypticorn/klines/main.py,sha256=s93aizwJVVdtFw6_NbnuG5rJDWzXvPoQSKMwJwbrTcs,2695
|
126
126
|
crypticorn/klines/client/__init__.py,sha256=KAwR6kMFkKap_1Un_HsT8LqYLsTIKUNIJe9JI6Acprg,2792
|
127
127
|
crypticorn/klines/client/api_client.py,sha256=XYk_eoVRHxQDoTKJJwMpO__LbU1DQtpMikBTyulJrvE,26925
|
128
128
|
crypticorn/klines/client/api_response.py,sha256=WhxwYDSMm6wPixp9CegO8dJzjFxDz3JF1yCq9s0ZqKE,639
|
@@ -159,34 +159,36 @@ crypticorn/klines/client/models/symbol_type.py,sha256=uOEqlQJ714fa0SEYOxzCOx9cG-
|
|
159
159
|
crypticorn/klines/client/models/timeframe.py,sha256=bSZJz3Q78V1RAnm3ZDtGBzFOnDKE3Pc5A0eP3ky3KaI,760
|
160
160
|
crypticorn/klines/client/models/udf_config.py,sha256=cVSxnJrkwnS4p0fEUgZMekueDv28k-p58bZwvHMSmqc,5152
|
161
161
|
crypticorn/metrics/__init__.py,sha256=t7FrHV5PaVTka90eIxDgOaWvOiyznSStcUanSbLov2o,126
|
162
|
-
crypticorn/metrics/main.py,sha256=
|
163
|
-
crypticorn/metrics/client/__init__.py,sha256=
|
162
|
+
crypticorn/metrics/main.py,sha256=pNR7sYh7YarA_4kHtVyQQ1afsfbUfLFAxdFBxxcNYG0,3304
|
163
|
+
crypticorn/metrics/client/__init__.py,sha256=bu9LdJkG7vljgmLVKhoSY08ooOuEo0AhoHt7-zDVyek,2720
|
164
164
|
crypticorn/metrics/client/api_client.py,sha256=pGWJuO-mgxlUdhJGwkScf7CviGzjDrmUAiU0LXasQY4,26934
|
165
165
|
crypticorn/metrics/client/api_response.py,sha256=WhxwYDSMm6wPixp9CegO8dJzjFxDz3JF1yCq9s0ZqKE,639
|
166
|
-
crypticorn/metrics/client/configuration.py,sha256=
|
166
|
+
crypticorn/metrics/client/configuration.py,sha256=wA1hBWEINMM_AlZg-DAv1AelmkjBERB5d2gA66aEwSM,19158
|
167
167
|
crypticorn/metrics/client/exceptions.py,sha256=UegnYftFlQDXAQv8BmD20yRzTtWpjTHcuOymTBWmgeE,6421
|
168
168
|
crypticorn/metrics/client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
169
169
|
crypticorn/metrics/client/rest.py,sha256=pWeYnpTfTV7L5U6Kli3b7i8VrmqdG8sskqSnTHPIoQo,7025
|
170
170
|
crypticorn/metrics/client/api/__init__.py,sha256=nNmEy9XBH8jQboMzedrzeGl8OVuDo_iylCaFw4Fgysg,649
|
171
171
|
crypticorn/metrics/client/api/admin_api.py,sha256=_YobvzUaNfv0CohQdAndUH2HPw5u6FbHwVaUATvsFyU,59843
|
172
|
-
crypticorn/metrics/client/api/exchanges_api.py,sha256=
|
173
|
-
crypticorn/metrics/client/api/indicators_api.py,sha256=
|
172
|
+
crypticorn/metrics/client/api/exchanges_api.py,sha256=Ft_Lgit-tx_X0uwMBDKv5tXk_zCKV6lONqTRiBo87VA,40547
|
173
|
+
crypticorn/metrics/client/api/indicators_api.py,sha256=jjSeTZe_o1_TJx_S3m-qngXRhAuGifk_MAqZXYedbns,26946
|
174
174
|
crypticorn/metrics/client/api/logs_api.py,sha256=lDOixn5hn3DWc6HjExWtKZfy7U4NfcSLsO1bNFrx4GE,13550
|
175
|
-
crypticorn/metrics/client/api/marketcap_api.py,sha256=
|
175
|
+
crypticorn/metrics/client/api/marketcap_api.py,sha256=WYkg5AptRtU_aUXiqqig8RHS7FQc79qhC1mM5EObfL8,51965
|
176
176
|
crypticorn/metrics/client/api/markets_api.py,sha256=NbPtD5bQK_Nt73hlVd6cd1pAZ7HO1QQgNl_abNoN00s,14739
|
177
177
|
crypticorn/metrics/client/api/quote_currencies_api.py,sha256=H4c3zOp5eTTUrRMlMH-H8aIIBpV4Ioj8c65UUt_BEuE,11259
|
178
178
|
crypticorn/metrics/client/api/status_api.py,sha256=_Ou_EGmjPyv32G-S4QKfRemdpGG6FUsgOkbGDfYaFp0,19633
|
179
179
|
crypticorn/metrics/client/api/tokens_api.py,sha256=x5a-YAeAgFJm-pN4K3-lOM-WPVYAxoBr-AYb-oxhysM,19522
|
180
|
-
crypticorn/metrics/client/models/__init__.py,sha256=
|
180
|
+
crypticorn/metrics/client/models/__init__.py,sha256=hPPLh2kQc3KNHCLeOT7AS2HXu04LEeSp_G4ME7BCmW4,1475
|
181
181
|
crypticorn/metrics/client/models/api_error_identifier.py,sha256=f_GdLo9HUcWPlXw8U8jDpjlKCj2mtuB3Ik9owJl_wJU,4962
|
182
182
|
crypticorn/metrics/client/models/api_error_level.py,sha256=soxtGExzlBja-Jux_jguro-1taLAGcKmGSHlxTKTYR4,772
|
183
183
|
crypticorn/metrics/client/models/api_error_type.py,sha256=Y8pCAtdcS4zfTetTZj9x60BFJwSXD6ro-8NU38aEDyQ,811
|
184
184
|
crypticorn/metrics/client/models/exception_detail.py,sha256=GIIa_LNZrtXlWCMLh1OAgEO6UoBo3m0kiCk788wMbuA,3853
|
185
|
+
crypticorn/metrics/client/models/exchange_availability.py,sha256=d_Ysv-DnSiHT_qXqj1ZxOPg7wxS564SJm21dOD7QnmI,2785
|
185
186
|
crypticorn/metrics/client/models/exchange_mapping.py,sha256=SJkMHO-ZZfnnjWNHAgmLOyJyDIGV8t1T3AF_3PukXBs,4104
|
186
187
|
crypticorn/metrics/client/models/internal_exchange.py,sha256=aWc3gPt1TSQ74y5tivLAVOu-qySo9djgIWwsB8nYass,864
|
187
188
|
crypticorn/metrics/client/models/log_level.py,sha256=u_1h06MyyyfV5PYYh8Xjgq9ySF2CfU_clZbkww6aJk4,769
|
188
189
|
crypticorn/metrics/client/models/market_type.py,sha256=1fLJIuDO5wK5JABFxtnJzHMwJw1mSqf21-QVAP102xk,711
|
189
|
-
crypticorn/metrics/client/models/marketcap_ranking.py,sha256=
|
190
|
+
crypticorn/metrics/client/models/marketcap_ranking.py,sha256=rLNBBnaE1qn1Zgqi64CoZnIbw7vkLHEr3r3xDHMv3vQ,2714
|
191
|
+
crypticorn/metrics/client/models/marketcap_symbol_ranking.py,sha256=5fTbEJAasj5L-zIOX5cK5_h_ZAp1jvMwTKVkjnM9Upc,2616
|
190
192
|
crypticorn/metrics/client/models/ohlcv.py,sha256=xEpqWy1XwC1JwyUM6yvJCgpVTJiCWvxm0HJnnzvKawM,3339
|
191
193
|
crypticorn/metrics/client/models/severity.py,sha256=Bwls2jjCMP2lKc-_67d5WZbGPAebUEPge7a82iUf4Qs,731
|
192
194
|
crypticorn/metrics/client/models/time_interval.py,sha256=8bHhMNt56xVGvJi5xNFMrAkAZFRKfym1UkeGoM2H0j8,772
|
@@ -259,9 +261,9 @@ crypticorn/trade/client/models/strategy_model_input.py,sha256=ala19jARyfA5ysys5D
|
|
259
261
|
crypticorn/trade/client/models/strategy_model_output.py,sha256=2o2lhbgUSTznowpMLEHF1Ex9TG9oRmzlCIb-gXqo7_s,5643
|
260
262
|
crypticorn/trade/client/models/tpsl.py,sha256=C2KgTIZs-a8W4msdaXgBKJcwtA-o5wR4rBauRP-iQxU,4317
|
261
263
|
crypticorn/trade/client/models/trading_action_type.py,sha256=pGq_TFLMPfYFizYP-xKgEC1ZF4U3lGdJYoGa_ZH2x-Q,769
|
262
|
-
crypticorn-2.
|
263
|
-
crypticorn-2.
|
264
|
-
crypticorn-2.
|
265
|
-
crypticorn-2.
|
266
|
-
crypticorn-2.
|
267
|
-
crypticorn-2.
|
264
|
+
crypticorn-2.11.4.dist-info/licenses/LICENSE,sha256=HonAVvzFXkP2C1d7D3ByIKPwjGH8NcHTAQvKH7uvOHQ,1856
|
265
|
+
crypticorn-2.11.4.dist-info/METADATA,sha256=HWeN0esFv-9WixvK9p3DHDzm_PBZyXfKyt1mKxHfH5g,8640
|
266
|
+
crypticorn-2.11.4.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
|
267
|
+
crypticorn-2.11.4.dist-info/entry_points.txt,sha256=d_xHsGvUTebPveVUK0SrpDFQ5ZRSjlI7lNCc11sn2PM,59
|
268
|
+
crypticorn-2.11.4.dist-info/top_level.txt,sha256=EP3NY216qIBYfmvGl0L2Zc9ItP0DjGSkiYqd9xJwGcM,11
|
269
|
+
crypticorn-2.11.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|