crypticorn 2.10.0__py3-none-any.whl → 2.10.2__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/cli/init.py +3 -0
- crypticorn/cli/templates/merge-env.sh +4 -0
- crypticorn/cli/version.py +1 -0
- crypticorn/common/decorators.py +2 -1
- crypticorn/common/enums.py +4 -4
- crypticorn/common/errors.py +6 -7
- crypticorn/common/mixins.py +8 -5
- crypticorn/common/utils.py +17 -0
- crypticorn/metrics/client/api/admin_api.py +14 -14
- crypticorn/metrics/client/api/status_api.py +6 -6
- crypticorn/metrics/client/configuration.py +2 -4
- crypticorn/metrics/client/models/api_error_identifier.py +1 -1
- crypticorn/metrics/client/models/api_error_level.py +1 -1
- crypticorn/metrics/client/models/api_error_type.py +1 -1
- crypticorn/metrics/client/models/exception_detail.py +1 -1
- crypticorn/metrics/client/models/marketcap_ranking.py +4 -5
- crypticorn/metrics/client/models/ohlcv.py +1 -2
- {crypticorn-2.10.0.dist-info → crypticorn-2.10.2.dist-info}/METADATA +2 -4
- {crypticorn-2.10.0.dist-info → crypticorn-2.10.2.dist-info}/RECORD +23 -23
- {crypticorn-2.10.0.dist-info → crypticorn-2.10.2.dist-info}/WHEEL +1 -1
- {crypticorn-2.10.0.dist-info → crypticorn-2.10.2.dist-info}/entry_points.txt +0 -0
- {crypticorn-2.10.0.dist-info → crypticorn-2.10.2.dist-info}/licenses/LICENSE +0 -0
- {crypticorn-2.10.0.dist-info → crypticorn-2.10.2.dist-info}/top_level.txt +0 -0
crypticorn/cli/init.py
CHANGED
@@ -4,6 +4,7 @@ import subprocess
|
|
4
4
|
import importlib.resources
|
5
5
|
import crypticorn.cli.templates as templates
|
6
6
|
|
7
|
+
|
7
8
|
def get_git_root() -> Path:
|
8
9
|
"""Get the root directory of the git repository."""
|
9
10
|
try:
|
@@ -29,6 +30,7 @@ def copy_template(template_name: str, target_path: Path):
|
|
29
30
|
|
30
31
|
click.secho(f"✅ Created: {target_path}", fg="green")
|
31
32
|
|
33
|
+
|
32
34
|
def check_file_exists(path: Path, force: bool):
|
33
35
|
if path.exists() and not force:
|
34
36
|
click.secho(f"File already exists, use --force / -f to overwrite", fg="red")
|
@@ -113,6 +115,7 @@ def init_dependabot(force):
|
|
113
115
|
return
|
114
116
|
copy_template("dependabot.yml", target)
|
115
117
|
|
118
|
+
|
116
119
|
@init_group.command("merge-env")
|
117
120
|
@click.option("-f", "--force", is_flag=True, help="Force overwrite the .env file")
|
118
121
|
def init_merge_env(force):
|
@@ -1,7 +1,11 @@
|
|
1
1
|
#!/usr/bin/env bash
|
2
|
+
|
2
3
|
# this script merges the env variables from the environment and the .env.example file into the .env file
|
3
4
|
# the appended variables take precedence over the .env.example variables (if both are set)
|
4
5
|
|
6
|
+
# Make executable before running in github actions
|
7
|
+
# chmod +x scripts/merge-env.sh
|
8
|
+
|
5
9
|
# Usage in a github action:
|
6
10
|
# - name: Generate .env
|
7
11
|
# run: ./scripts/merge-env.sh
|
crypticorn/cli/version.py
CHANGED
crypticorn/common/decorators.py
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
+
from datetime import datetime
|
1
2
|
from typing import Optional, Type, Any, Tuple
|
2
3
|
from copy import deepcopy
|
3
4
|
|
4
|
-
from pydantic import BaseModel, create_model
|
5
|
+
from pydantic import BaseModel, create_model, field_validator, BeforeValidator
|
5
6
|
from pydantic.fields import FieldInfo
|
6
7
|
|
7
8
|
|
crypticorn/common/enums.py
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
"""Defines common enumerations used throughout the codebase for type safety and consistency."""
|
2
2
|
|
3
3
|
from enum import StrEnum
|
4
|
-
from crypticorn.common.mixins import ValidateEnumMixin
|
4
|
+
from crypticorn.common.mixins import ValidateEnumMixin
|
5
5
|
|
6
6
|
|
7
|
-
class Exchange(ValidateEnumMixin,
|
7
|
+
class Exchange(ValidateEnumMixin, StrEnum):
|
8
8
|
"""Supported exchanges for trading"""
|
9
9
|
|
10
10
|
KUCOIN = "kucoin"
|
11
11
|
BINGX = "bingx"
|
12
12
|
|
13
13
|
|
14
|
-
class InternalExchange(ValidateEnumMixin,
|
14
|
+
class InternalExchange(ValidateEnumMixin, StrEnum):
|
15
15
|
"""All exchanges we are using, including public (Exchange)"""
|
16
16
|
|
17
17
|
KUCOIN = "kucoin"
|
@@ -22,7 +22,7 @@ class InternalExchange(ValidateEnumMixin, ExcludeEnumMixin, StrEnum):
|
|
22
22
|
BITGET = "bitget"
|
23
23
|
|
24
24
|
|
25
|
-
class MarketType(ValidateEnumMixin,
|
25
|
+
class MarketType(ValidateEnumMixin, StrEnum):
|
26
26
|
"""
|
27
27
|
Market types
|
28
28
|
"""
|
crypticorn/common/errors.py
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
from enum import Enum, StrEnum
|
4
4
|
from fastapi import status
|
5
|
-
from crypticorn.common.mixins import
|
5
|
+
from crypticorn.common.mixins import ApiErrorFallback
|
6
6
|
|
7
7
|
|
8
|
-
class ApiErrorType(
|
8
|
+
class ApiErrorType(StrEnum):
|
9
9
|
"""Type of the API error."""
|
10
10
|
|
11
11
|
USER_ERROR = "user error"
|
@@ -18,7 +18,7 @@ class ApiErrorType(ExcludeEnumMixin, StrEnum):
|
|
18
18
|
"""error that does not need to be handled or does not affect the program or is a placeholder."""
|
19
19
|
|
20
20
|
|
21
|
-
class ApiErrorIdentifier(
|
21
|
+
class ApiErrorIdentifier(StrEnum):
|
22
22
|
"""Unique identifier of the API error."""
|
23
23
|
|
24
24
|
ALLOCATION_BELOW_EXPOSURE = "allocation_below_current_exposure"
|
@@ -98,13 +98,12 @@ class ApiErrorIdentifier(ExcludeEnumMixin, StrEnum):
|
|
98
98
|
UNKNOWN_ERROR = "unknown_error_occurred"
|
99
99
|
URL_NOT_FOUND = "requested_resource_not_found"
|
100
100
|
|
101
|
-
@property
|
102
101
|
def get_error(self) -> "ApiError":
|
103
102
|
"""Get the corresponding ApiError."""
|
104
|
-
return ApiError
|
103
|
+
return getattr(ApiError, self.name)
|
105
104
|
|
106
105
|
|
107
|
-
class ApiErrorLevel(
|
106
|
+
class ApiErrorLevel(StrEnum):
|
108
107
|
"""Level of the API error."""
|
109
108
|
|
110
109
|
ERROR = "error"
|
@@ -113,7 +112,7 @@ class ApiErrorLevel(ExcludeEnumMixin, StrEnum):
|
|
113
112
|
WARNING = "warning"
|
114
113
|
|
115
114
|
|
116
|
-
class ApiError(
|
115
|
+
class ApiError(Enum, metaclass=ApiErrorFallback):
|
117
116
|
# Fallback to UNKNOWN_ERROR for error codes not yet published to PyPI.
|
118
117
|
"""Crypticorn API error enumeration."""
|
119
118
|
|
crypticorn/common/mixins.py
CHANGED
@@ -39,10 +39,13 @@ class ValidateEnumMixin:
|
|
39
39
|
class ExcludeEnumMixin:
|
40
40
|
"""(deprecated) Mixin to exclude enum from OpenAPI schema. We use this to avoid duplicating enums when generating client code from the openapi spec."""
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
def __init_subclass__(cls, **kwargs):
|
43
|
+
super().__init_subclass__(**kwargs)
|
44
|
+
if cls.__name__.startswith("ExcludeEnumMixin"):
|
45
|
+
warnings.warn(
|
46
|
+
"The `ExcludeEnumMixin` class is deprecated. Should be removed from enums inheriting this class.",
|
47
|
+
category=CrypticornDeprecatedSince28,
|
48
|
+
)
|
46
49
|
|
47
50
|
@classmethod
|
48
51
|
def __get_pydantic_json_schema__(cls, core_schema, handler):
|
@@ -56,7 +59,7 @@ class ApiErrorFallback(EnumMeta):
|
|
56
59
|
|
57
60
|
def __getattr__(cls, name):
|
58
61
|
# Let Pydantic/internal stuff pass silently ! fragile
|
59
|
-
if name.startswith("__"):
|
62
|
+
if name.startswith("__") or name.startswith("_pytest"):
|
60
63
|
raise AttributeError(name)
|
61
64
|
_logger.warning(
|
62
65
|
f"Unknown enum member '{name}' - update crypticorn package or check for typos"
|
crypticorn/common/utils.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
"""General utility functions and helper methods used across the codebase."""
|
2
2
|
|
3
|
+
from datetime import datetime
|
3
4
|
from typing import Any
|
4
5
|
from decimal import Decimal
|
5
6
|
import string
|
@@ -74,3 +75,19 @@ def optional_import(module_name: str, extra_name: str) -> Any:
|
|
74
75
|
f"Optional dependency '{module_name}' is required for this feature. "
|
75
76
|
f"Install it with: pip install crypticorn[{extra_name}]"
|
76
77
|
) from e
|
78
|
+
|
79
|
+
|
80
|
+
def datetime_to_timestamp(v: Any):
|
81
|
+
"""Converts a datetime to a timestamp.
|
82
|
+
Can be used as a pydantic validator.
|
83
|
+
>>> from pydantic import BeforeValidator, BaseModel
|
84
|
+
>>> class MyModel(BaseModel):
|
85
|
+
... timestamp: Annotated[int, BeforeValidator(datetime_to_timestamp)]
|
86
|
+
"""
|
87
|
+
if isinstance(v, list):
|
88
|
+
return [
|
89
|
+
int(item.timestamp()) if isinstance(item, datetime) else item for item in v
|
90
|
+
]
|
91
|
+
elif isinstance(v, datetime):
|
92
|
+
return int(v.timestamp())
|
93
|
+
return v
|
@@ -271,7 +271,7 @@ class AdminApi:
|
|
271
271
|
include: Annotated[
|
272
272
|
Optional[List[StrictStr]],
|
273
273
|
Field(
|
274
|
-
description="List of
|
274
|
+
description="List of regex patterns to match against package names. If not provided, all installed packages will be returned."
|
275
275
|
),
|
276
276
|
] = None,
|
277
277
|
_request_timeout: Union[
|
@@ -285,12 +285,12 @@ class AdminApi:
|
|
285
285
|
_content_type: Optional[StrictStr] = None,
|
286
286
|
_headers: Optional[Dict[StrictStr, Any]] = None,
|
287
287
|
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
288
|
-
) ->
|
288
|
+
) -> Dict[str, str]:
|
289
289
|
"""List Installed Packages
|
290
290
|
|
291
|
-
Return a list of installed packages and versions.
|
291
|
+
Return a list of installed packages and versions. The include parameter accepts regex patterns to match against package names. For example: - crypticorn.* will match all packages starting with 'crypticorn' - .*tic.* will match all packages containing 'tic' in their name
|
292
292
|
|
293
|
-
:param include: List of
|
293
|
+
:param include: List of regex patterns to match against package names. If not provided, all installed packages will be returned.
|
294
294
|
:type include: List[str]
|
295
295
|
:param _request_timeout: timeout setting for this request. If one
|
296
296
|
number provided, it will be total request
|
@@ -323,7 +323,7 @@ class AdminApi:
|
|
323
323
|
)
|
324
324
|
|
325
325
|
_response_types_map: Dict[str, Optional[str]] = {
|
326
|
-
"200": "
|
326
|
+
"200": "Dict[str, str]",
|
327
327
|
}
|
328
328
|
response_data = await self.api_client.call_api(
|
329
329
|
*_param, _request_timeout=_request_timeout
|
@@ -340,7 +340,7 @@ class AdminApi:
|
|
340
340
|
include: Annotated[
|
341
341
|
Optional[List[StrictStr]],
|
342
342
|
Field(
|
343
|
-
description="List of
|
343
|
+
description="List of regex patterns to match against package names. If not provided, all installed packages will be returned."
|
344
344
|
),
|
345
345
|
] = None,
|
346
346
|
_request_timeout: Union[
|
@@ -354,12 +354,12 @@ class AdminApi:
|
|
354
354
|
_content_type: Optional[StrictStr] = None,
|
355
355
|
_headers: Optional[Dict[StrictStr, Any]] = None,
|
356
356
|
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
357
|
-
) -> ApiResponse[
|
357
|
+
) -> ApiResponse[Dict[str, str]]:
|
358
358
|
"""List Installed Packages
|
359
359
|
|
360
|
-
Return a list of installed packages and versions.
|
360
|
+
Return a list of installed packages and versions. The include parameter accepts regex patterns to match against package names. For example: - crypticorn.* will match all packages starting with 'crypticorn' - .*tic.* will match all packages containing 'tic' in their name
|
361
361
|
|
362
|
-
:param include: List of
|
362
|
+
:param include: List of regex patterns to match against package names. If not provided, all installed packages will be returned.
|
363
363
|
:type include: List[str]
|
364
364
|
:param _request_timeout: timeout setting for this request. If one
|
365
365
|
number provided, it will be total request
|
@@ -392,7 +392,7 @@ class AdminApi:
|
|
392
392
|
)
|
393
393
|
|
394
394
|
_response_types_map: Dict[str, Optional[str]] = {
|
395
|
-
"200": "
|
395
|
+
"200": "Dict[str, str]",
|
396
396
|
}
|
397
397
|
response_data = await self.api_client.call_api(
|
398
398
|
*_param, _request_timeout=_request_timeout
|
@@ -409,7 +409,7 @@ class AdminApi:
|
|
409
409
|
include: Annotated[
|
410
410
|
Optional[List[StrictStr]],
|
411
411
|
Field(
|
412
|
-
description="List of
|
412
|
+
description="List of regex patterns to match against package names. If not provided, all installed packages will be returned."
|
413
413
|
),
|
414
414
|
] = None,
|
415
415
|
_request_timeout: Union[
|
@@ -426,9 +426,9 @@ class AdminApi:
|
|
426
426
|
) -> RESTResponseType:
|
427
427
|
"""List Installed Packages
|
428
428
|
|
429
|
-
Return a list of installed packages and versions.
|
429
|
+
Return a list of installed packages and versions. The include parameter accepts regex patterns to match against package names. For example: - crypticorn.* will match all packages starting with 'crypticorn' - .*tic.* will match all packages containing 'tic' in their name
|
430
430
|
|
431
|
-
:param include: List of
|
431
|
+
:param include: List of regex patterns to match against package names. If not provided, all installed packages will be returned.
|
432
432
|
:type include: List[str]
|
433
433
|
:param _request_timeout: timeout setting for this request. If one
|
434
434
|
number provided, it will be total request
|
@@ -461,7 +461,7 @@ class AdminApi:
|
|
461
461
|
)
|
462
462
|
|
463
463
|
_response_types_map: Dict[str, Optional[str]] = {
|
464
|
-
"200": "
|
464
|
+
"200": "Dict[str, str]",
|
465
465
|
}
|
466
466
|
response_data = await self.api_client.call_api(
|
467
467
|
*_param, _request_timeout=_request_timeout
|
@@ -17,7 +17,7 @@ from typing import Any, Dict, List, Optional, Tuple, Union
|
|
17
17
|
from typing_extensions import Annotated
|
18
18
|
|
19
19
|
from pydantic import StrictStr, field_validator
|
20
|
-
from typing import
|
20
|
+
from typing import Optional
|
21
21
|
|
22
22
|
from crypticorn.metrics.client.api_client import ApiClient, RequestSerialized
|
23
23
|
from crypticorn.metrics.client.api_response import ApiResponse
|
@@ -294,7 +294,7 @@ class StatusApi:
|
|
294
294
|
_content_type: Optional[StrictStr] = None,
|
295
295
|
_headers: Optional[Dict[StrictStr, Any]] = None,
|
296
296
|
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
297
|
-
) ->
|
297
|
+
) -> str:
|
298
298
|
"""Ping
|
299
299
|
|
300
300
|
Returns 'OK' if the API is running.
|
@@ -329,7 +329,7 @@ class StatusApi:
|
|
329
329
|
)
|
330
330
|
|
331
331
|
_response_types_map: Dict[str, Optional[str]] = {
|
332
|
-
"200": "
|
332
|
+
"200": "str",
|
333
333
|
}
|
334
334
|
response_data = await self.api_client.call_api(
|
335
335
|
*_param, _request_timeout=_request_timeout
|
@@ -354,7 +354,7 @@ class StatusApi:
|
|
354
354
|
_content_type: Optional[StrictStr] = None,
|
355
355
|
_headers: Optional[Dict[StrictStr, Any]] = None,
|
356
356
|
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
357
|
-
) -> ApiResponse[
|
357
|
+
) -> ApiResponse[str]:
|
358
358
|
"""Ping
|
359
359
|
|
360
360
|
Returns 'OK' if the API is running.
|
@@ -389,7 +389,7 @@ class StatusApi:
|
|
389
389
|
)
|
390
390
|
|
391
391
|
_response_types_map: Dict[str, Optional[str]] = {
|
392
|
-
"200": "
|
392
|
+
"200": "str",
|
393
393
|
}
|
394
394
|
response_data = await self.api_client.call_api(
|
395
395
|
*_param, _request_timeout=_request_timeout
|
@@ -449,7 +449,7 @@ class StatusApi:
|
|
449
449
|
)
|
450
450
|
|
451
451
|
_response_types_map: Dict[str, Optional[str]] = {
|
452
|
-
"200": "
|
452
|
+
"200": "str",
|
453
453
|
}
|
454
454
|
response_data = await self.api_client.call_api(
|
455
455
|
*_param, _request_timeout=_request_timeout
|
@@ -215,9 +215,7 @@ class Configuration:
|
|
215
215
|
debug: Optional[bool] = None,
|
216
216
|
) -> None:
|
217
217
|
"""Constructor"""
|
218
|
-
self._base_path =
|
219
|
-
"https://api.crypticorn.dev/v1/metrics" if host is None else host
|
220
|
-
)
|
218
|
+
self._base_path = "http://127.0.0.1:8000/v1/metrics" if host is None else host
|
221
219
|
"""Default Base url
|
222
220
|
"""
|
223
221
|
self.server_index = 0 if server_index is None and host is None else server_index
|
@@ -559,7 +557,7 @@ class Configuration:
|
|
559
557
|
"""
|
560
558
|
return [
|
561
559
|
{
|
562
|
-
"url": "
|
560
|
+
"url": "http://127.0.0.1:8000/v1/metrics",
|
563
561
|
"description": "No description provided",
|
564
562
|
}
|
565
563
|
]
|
@@ -28,7 +28,7 @@ from typing_extensions import Self
|
|
28
28
|
|
29
29
|
class ExceptionDetail(BaseModel):
|
30
30
|
"""
|
31
|
-
|
31
|
+
Exception details returned to the client.
|
32
32
|
""" # noqa: E501
|
33
33
|
|
34
34
|
message: Optional[StrictStr] = None
|
@@ -17,9 +17,8 @@ import pprint
|
|
17
17
|
import re # noqa: F401
|
18
18
|
import json
|
19
19
|
|
20
|
-
from
|
21
|
-
from
|
22
|
-
from typing import Any, ClassVar, Dict, List
|
20
|
+
from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr
|
21
|
+
from typing import Any, ClassVar, Dict, List, Optional
|
23
22
|
from typing import Optional, Set
|
24
23
|
from typing_extensions import Self
|
25
24
|
|
@@ -29,8 +28,8 @@ class MarketcapRanking(BaseModel):
|
|
29
28
|
MarketcapRanking
|
30
29
|
""" # noqa: E501
|
31
30
|
|
32
|
-
timestamp:
|
33
|
-
symbols: List[StrictStr]
|
31
|
+
timestamp: StrictInt
|
32
|
+
symbols: List[Optional[StrictStr]]
|
34
33
|
__properties: ClassVar[List[str]] = ["timestamp", "symbols"]
|
35
34
|
|
36
35
|
model_config = ConfigDict(
|
@@ -17,7 +17,6 @@ import pprint
|
|
17
17
|
import re # noqa: F401
|
18
18
|
import json
|
19
19
|
|
20
|
-
from datetime import datetime
|
21
20
|
from pydantic import BaseModel, ConfigDict, StrictFloat, StrictInt
|
22
21
|
from typing import Any, ClassVar, Dict, List, Optional, Union
|
23
22
|
from typing import Optional, Set
|
@@ -29,7 +28,7 @@ class OHLCV(BaseModel):
|
|
29
28
|
OHLCV
|
30
29
|
""" # noqa: E501
|
31
30
|
|
32
|
-
timestamp:
|
31
|
+
timestamp: StrictInt
|
33
32
|
open: Union[StrictFloat, StrictInt]
|
34
33
|
high: Union[StrictFloat, StrictInt]
|
35
34
|
low: Union[StrictFloat, StrictInt]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: crypticorn
|
3
|
-
Version: 2.10.
|
3
|
+
Version: 2.10.2
|
4
4
|
Summary: Maximise Your Crypto Trading Profits with Machine Learning
|
5
5
|
Author-email: Crypticorn <timon@crypticorn.com>
|
6
6
|
License: Copyright © 2025 Crypticorn
|
@@ -50,8 +50,6 @@ Requires-Dist: tqdm<5.0.0,>=4.67.0
|
|
50
50
|
Provides-Extra: dev
|
51
51
|
Requires-Dist: build; extra == "dev"
|
52
52
|
Requires-Dist: twine; extra == "dev"
|
53
|
-
Requires-Dist: streamlit; extra == "dev"
|
54
|
-
Requires-Dist: httpx; extra == "dev"
|
55
53
|
Requires-Dist: black; extra == "dev"
|
56
54
|
Requires-Dist: ruff; extra == "dev"
|
57
55
|
Requires-Dist: isort; extra == "dev"
|
@@ -100,7 +98,7 @@ from crypticorn import ApiClient
|
|
100
98
|
```
|
101
99
|
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:
|
102
100
|
|
103
|
-
<img src="
|
101
|
+
<img src="pip-structure.svg" alt="pip package structure" />
|
104
102
|
|
105
103
|
You can either explore each API by clicking through the library or checkout the [API Documentation](https://docs.crypticorn.com/api).
|
106
104
|
|
@@ -57,29 +57,29 @@ crypticorn/auth/client/models/wallet_verified200_response.py,sha256=IXhtaD0CC6Jp
|
|
57
57
|
crypticorn/auth/client/models/whoami200_response.py,sha256=-Kj3fB4lgNaa8v_LTertjxXahBYtTpTIXkBha9MhA1o,3199
|
58
58
|
crypticorn/cli/__init__.py,sha256=5qIQ_WXKSoJk3tGU6n0XwmSX8a2cDRSM6dncaU1qOZ4,123
|
59
59
|
crypticorn/cli/__main__.py,sha256=q_3MdBGUJPukr_xexup3TICf8kLL7Tp4JxLWB5XCESs,303
|
60
|
-
crypticorn/cli/init.py,sha256
|
61
|
-
crypticorn/cli/version.py,sha256=
|
60
|
+
crypticorn/cli/init.py,sha256=-ZVXbrHb_Yg8a4bKyflgi9Om5GHVYo3vX91X44b90ZA,4100
|
61
|
+
crypticorn/cli/version.py,sha256=OVDxeL80eMgZsFgw2cDSzFfuaRToDfnYAVOQTpkoMWs,206
|
62
62
|
crypticorn/cli/templates/Dockerfile,sha256=89KlphaXJH51L7Vs4B928WmwYcMtpvLmKGyoDAhOcMw,726
|
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=Q6d_RKcp2h6fOifYid8AsCvVGuUdleXkY3AxOVQ5psw,501
|
67
67
|
crypticorn/cli/templates/ruff.yml,sha256=gWicFFTzC4nToSmRkIIGipos8CZ447YG0kebBCJhtJE,319
|
68
68
|
crypticorn/common/__init__.py,sha256=DXEuUU_kaLBSBcvpiFie_ROuK5XEZuTMIfsg-BZE0iE,752
|
69
69
|
crypticorn/common/ansi_colors.py,sha256=ts49UtfTy-c0uvlGwb3wE-jE_GbXvSBSfzwrDlNi0HE,1331
|
70
70
|
crypticorn/common/auth.py,sha256=5wgApDw5x7dI-IWU9tX_gih-gMozi7Y5Tgpen-A9fbo,8713
|
71
|
-
crypticorn/common/decorators.py,sha256=
|
72
|
-
crypticorn/common/enums.py,sha256
|
73
|
-
crypticorn/common/errors.py,sha256=
|
71
|
+
crypticorn/common/decorators.py,sha256=t5Y3vSJ-gt0n2vOYYjYN0dtzNXvZxrJs2SEItpzG8oo,1127
|
72
|
+
crypticorn/common/enums.py,sha256=-KbdOEZ4LXHyPB6lBHzwLraBnIem9UXU3FM90culL1o,693
|
73
|
+
crypticorn/common/errors.py,sha256=UvPIAMuKaCG1Skbog4hJKHsjJyOvO95nF_UDBwfc3MU,27945
|
74
74
|
crypticorn/common/exceptions.py,sha256=iq_VFkZ4jr_7BeEjDwlmHyRYPLIYN98-MJGJrxe2OqM,6036
|
75
75
|
crypticorn/common/logging.py,sha256=bpWT3ip8CM5tf_jKECJjwrVVf5GYcRjfo-CPb47gISU,4346
|
76
76
|
crypticorn/common/middleware.py,sha256=O7XiXPimNYUhF9QTv6yFUTVlb91-SK-3CfTrWMNP6Ck,1011
|
77
|
-
crypticorn/common/mixins.py,sha256=
|
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
80
|
crypticorn/common/scopes.py,sha256=TsSzMFHQAJ45CwhSrU3uRPHyHHjrCgPdJhAyjxY6b2Q,2456
|
81
81
|
crypticorn/common/urls.py,sha256=qJHxdkpwQR1iPLSPMYVoobnLNSsQoKVV5SsRng4dZYs,1161
|
82
|
-
crypticorn/common/utils.py,sha256=
|
82
|
+
crypticorn/common/utils.py,sha256=Qj_89xzhxVH7Pzu7PnRCbNZlBZuXVtUqbXY6X_nesRc,3054
|
83
83
|
crypticorn/common/warnings.py,sha256=bIfMLbKaCntMV88rTnoWgV6SZ9FJvo_adXv3yFW1rqg,2395
|
84
84
|
crypticorn/common/router/admin_router.py,sha256=x81s1gxhH7nLf7txqAIjVxrNgQmXsA1YG7g9v9KJwHA,3740
|
85
85
|
crypticorn/common/router/status_router.py,sha256=it6kfvx_Pn4Rv06fmViwhwr-m6f4WuSgcZwc6VTaMz4,868
|
@@ -163,31 +163,31 @@ crypticorn/metrics/main.py,sha256=I4KZ-46ro6I6-EWf3p1BZV-8Iryorr8pRUZhv3yXzXI,35
|
|
163
163
|
crypticorn/metrics/client/__init__.py,sha256=zp5tyfddEBfFrCqp9YEAwObC60lZ0GnqO3dvsAOt1zE,2530
|
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=2GqHs-vx7bW_3S-bXMz_2RV-Z-HhdC8J_lQW2T8R3T8,19168
|
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
|
-
crypticorn/metrics/client/api/admin_api.py,sha256=
|
171
|
+
crypticorn/metrics/client/api/admin_api.py,sha256=_YobvzUaNfv0CohQdAndUH2HPw5u6FbHwVaUATvsFyU,59843
|
172
172
|
crypticorn/metrics/client/api/exchanges_api.py,sha256=BZiJH8hxxSnI9SXydgErM6gzvIR-t9vNXbh9fFotpQQ,40455
|
173
173
|
crypticorn/metrics/client/api/indicators_api.py,sha256=gltFmv_EorYbeWMnp-N0QkgdVKrkvi1iOZUP_ewkXZ0,26748
|
174
174
|
crypticorn/metrics/client/api/logs_api.py,sha256=lDOixn5hn3DWc6HjExWtKZfy7U4NfcSLsO1bNFrx4GE,13550
|
175
175
|
crypticorn/metrics/client/api/marketcap_api.py,sha256=28lQlBJh5hdW7fULJl55bAJy_HWZWEdouds63YJIwAQ,51106
|
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
|
-
crypticorn/metrics/client/api/status_api.py,sha256=
|
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
180
|
crypticorn/metrics/client/models/__init__.py,sha256=Voa1tj-CTpvzF6UmGJf0h0zFqG-7wFV8TSwH_lst0WY,1285
|
181
|
-
crypticorn/metrics/client/models/api_error_identifier.py,sha256=
|
182
|
-
crypticorn/metrics/client/models/api_error_level.py,sha256=
|
183
|
-
crypticorn/metrics/client/models/api_error_type.py,sha256=
|
184
|
-
crypticorn/metrics/client/models/exception_detail.py,sha256=
|
181
|
+
crypticorn/metrics/client/models/api_error_identifier.py,sha256=f_GdLo9HUcWPlXw8U8jDpjlKCj2mtuB3Ik9owJl_wJU,4962
|
182
|
+
crypticorn/metrics/client/models/api_error_level.py,sha256=soxtGExzlBja-Jux_jguro-1taLAGcKmGSHlxTKTYR4,772
|
183
|
+
crypticorn/metrics/client/models/api_error_type.py,sha256=Y8pCAtdcS4zfTetTZj9x60BFJwSXD6ro-8NU38aEDyQ,811
|
184
|
+
crypticorn/metrics/client/models/exception_detail.py,sha256=GIIa_LNZrtXlWCMLh1OAgEO6UoBo3m0kiCk788wMbuA,3853
|
185
185
|
crypticorn/metrics/client/models/exchange_mapping.py,sha256=SJkMHO-ZZfnnjWNHAgmLOyJyDIGV8t1T3AF_3PukXBs,4104
|
186
186
|
crypticorn/metrics/client/models/internal_exchange.py,sha256=aWc3gPt1TSQ74y5tivLAVOu-qySo9djgIWwsB8nYass,864
|
187
187
|
crypticorn/metrics/client/models/log_level.py,sha256=u_1h06MyyyfV5PYYh8Xjgq9ySF2CfU_clZbkww6aJk4,769
|
188
188
|
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/ohlcv.py,sha256=
|
189
|
+
crypticorn/metrics/client/models/marketcap_ranking.py,sha256=4oF7Ul76yDHxBEmAsgINd9g5UEKQesDT0TVJd6xiXmM,2563
|
190
|
+
crypticorn/metrics/client/models/ohlcv.py,sha256=xEpqWy1XwC1JwyUM6yvJCgpVTJiCWvxm0HJnnzvKawM,3339
|
191
191
|
crypticorn/metrics/client/models/severity.py,sha256=Bwls2jjCMP2lKc-_67d5WZbGPAebUEPge7a82iUf4Qs,731
|
192
192
|
crypticorn/metrics/client/models/time_interval.py,sha256=8bHhMNt56xVGvJi5xNFMrAkAZFRKfym1UkeGoM2H0j8,772
|
193
193
|
crypticorn/metrics/client/models/trading_status.py,sha256=_S-KAyuCJsLLY0UTcNKkhLWoPJS-ywf7y3yTdhIuF0w,746
|
@@ -259,9 +259,9 @@ crypticorn/trade/client/models/strategy_model_input.py,sha256=ala19jARyfA5ysys5D
|
|
259
259
|
crypticorn/trade/client/models/strategy_model_output.py,sha256=2o2lhbgUSTznowpMLEHF1Ex9TG9oRmzlCIb-gXqo7_s,5643
|
260
260
|
crypticorn/trade/client/models/tpsl.py,sha256=C2KgTIZs-a8W4msdaXgBKJcwtA-o5wR4rBauRP-iQxU,4317
|
261
261
|
crypticorn/trade/client/models/trading_action_type.py,sha256=pGq_TFLMPfYFizYP-xKgEC1ZF4U3lGdJYoGa_ZH2x-Q,769
|
262
|
-
crypticorn-2.10.
|
263
|
-
crypticorn-2.10.
|
264
|
-
crypticorn-2.10.
|
265
|
-
crypticorn-2.10.
|
266
|
-
crypticorn-2.10.
|
267
|
-
crypticorn-2.10.
|
262
|
+
crypticorn-2.10.2.dist-info/licenses/LICENSE,sha256=HonAVvzFXkP2C1d7D3ByIKPwjGH8NcHTAQvKH7uvOHQ,1856
|
263
|
+
crypticorn-2.10.2.dist-info/METADATA,sha256=_uozb0TNqOSqB4MNQz0EvY10GaRYWrkdbCCUskx0RnY,10125
|
264
|
+
crypticorn-2.10.2.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
|
265
|
+
crypticorn-2.10.2.dist-info/entry_points.txt,sha256=d_xHsGvUTebPveVUK0SrpDFQ5ZRSjlI7lNCc11sn2PM,59
|
266
|
+
crypticorn-2.10.2.dist-info/top_level.txt,sha256=EP3NY216qIBYfmvGl0L2Zc9ItP0DjGSkiYqd9xJwGcM,11
|
267
|
+
crypticorn-2.10.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|