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 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
@@ -1,6 +1,7 @@
1
1
  import importlib.metadata
2
2
  import click
3
3
 
4
+
4
5
  @click.command("version")
5
6
  def version():
6
7
  """Print the version of the crypticorn package"""
@@ -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
 
@@ -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, ExcludeEnumMixin
4
+ from crypticorn.common.mixins import ValidateEnumMixin
5
5
 
6
6
 
7
- class Exchange(ValidateEnumMixin, ExcludeEnumMixin, StrEnum):
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, ExcludeEnumMixin, StrEnum):
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, ExcludeEnumMixin, StrEnum):
25
+ class MarketType(ValidateEnumMixin, StrEnum):
26
26
  """
27
27
  Market types
28
28
  """
@@ -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 ExcludeEnumMixin, ApiErrorFallback
5
+ from crypticorn.common.mixins import ApiErrorFallback
6
6
 
7
7
 
8
- class ApiErrorType(ExcludeEnumMixin, StrEnum):
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(ExcludeEnumMixin, StrEnum):
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[self.value]
103
+ return getattr(ApiError, self.name)
105
104
 
106
105
 
107
- class ApiErrorLevel(ExcludeEnumMixin, StrEnum):
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(ExcludeEnumMixin, Enum, metaclass=ApiErrorFallback):
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
 
@@ -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
- warnings.warn(
43
- "The `ExcludeEnumMixin` class is deprecated. Should be removed from enums inheriting this class.",
44
- category=CrypticornDeprecatedSince28,
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"
@@ -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 dependencies to include in the response. If not provided, all installed packages will be returned."
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
- ) -> List[object]:
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 dependencies to include in the response. If not provided, all installed packages will be returned.
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": "List[object]",
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 dependencies to include in the response. If not provided, all installed packages will be returned."
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[List[object]]:
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 dependencies to include in the response. If not provided, all installed packages will be returned.
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": "List[object]",
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 dependencies to include in the response. If not provided, all installed packages will be returned."
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 dependencies to include in the response. If not provided, all installed packages will be returned.
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": "List[object]",
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 Any, Dict, Optional
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
- ) -> Dict[str, object]:
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": "Dict[str, object]",
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[Dict[str, object]]:
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": "Dict[str, object]",
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": "Dict[str, object]",
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": "https://api.crypticorn.dev/v1/metrics",
560
+ "url": "http://127.0.0.1:8000/v1/metrics",
563
561
  "description": "No description provided",
564
562
  }
565
563
  ]
@@ -20,7 +20,7 @@ from typing_extensions import Self
20
20
 
21
21
  class ApiErrorIdentifier(str, Enum):
22
22
  """
23
- API error identifiers
23
+ Unique identifier of the API error.
24
24
  """
25
25
 
26
26
  """
@@ -20,7 +20,7 @@ from typing_extensions import Self
20
20
 
21
21
  class ApiErrorLevel(str, Enum):
22
22
  """
23
- API error levels
23
+ Level of the API error.
24
24
  """
25
25
 
26
26
  """
@@ -20,7 +20,7 @@ from typing_extensions import Self
20
20
 
21
21
  class ApiErrorType(str, Enum):
22
22
  """
23
- Type of API error
23
+ Type of the API error.
24
24
  """
25
25
 
26
26
  """
@@ -28,7 +28,7 @@ from typing_extensions import Self
28
28
 
29
29
  class ExceptionDetail(BaseModel):
30
30
  """
31
- This is the detail of the exception. It is used to enrich the exception with additional information by unwrapping the ApiError into its components.
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 datetime import datetime
21
- from pydantic import BaseModel, ConfigDict, StrictStr
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: datetime
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: datetime
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.0
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="../static/pip-structure.svg" alt="pip package structure" />
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=LD6Sfna5FxfKXxybcXNhmKYce9bJH1GavQKd0F3EPGk,4097
61
- crypticorn/cli/version.py,sha256=8rWMqbMdSBSlQPtaKmI2Htu3VgcULc7nUAycIclGnLM,205
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=0DPnsj5zhnZ-nspzKY-Gcu3LONqbc6ucconY5-888IQ,416
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=pmnGYCIrLv59wZkDbvPyK9NJmgPJWW74LXTdIWSjOkY,1063
72
- crypticorn/common/enums.py,sha256=8iPG1UFtU50HKytOrubYJsFJ_isMY5z69U2mezXA-NE,765
73
- crypticorn/common/errors.py,sha256=E7H8DVUP4E4uu-ze9v7aJBrfV7ODgbFBXJeyVSXbdVo,28041
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=NoZL1kXgSb4oVOGNWPqPwCcVZYjHzlsyL80bz6Xxlzg,2002
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=N4h-FtojufTuc4IBU7TeuSOygFvErpgZDrwl4epGmvw,2503
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=BQNgtkCNhI3uB8qCV54TMf85b3sFzQYvXGMbhar5KSM,19202
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=QAfVE4Ag2QAsu1imyK-ylrQDxQX4-Ue10H7pxAfGPb0,59131
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=hxQf-22CurM-1TQygsYeYiL8CVhFe9cCPbDkX0zLvfg,19714
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=HrL78MgQ0NbWv8CJhl6Zbp3QSIK2xO8lAZy5y6M8NCk,4948
182
- crypticorn/metrics/client/models/api_error_level.py,sha256=fxhEXRsXIAttvVqKvv0r58fEsRl_2X8GOICw0eRGMIg,765
183
- crypticorn/metrics/client/models/api_error_type.py,sha256=AwnguQ4VyyqMj3hGqy-kpxZhzpy-tjQVt0n3ml_wYlg,806
184
- crypticorn/metrics/client/models/exception_detail.py,sha256=3SijhjW8homYVC4p0qgRyOUlObGCP3WpbO4IfGYLzQk,3959
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=tRA7IjesdhQWZJAucRXngMpHIjfOeQefinnJkP71UxQ,2561
190
- crypticorn/metrics/client/models/ohlcv.py,sha256=2CZx2WOAMHn5hpA9MafWQQIgxP6UbXagh1KsPoe0ODU,3368
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.0.dist-info/licenses/LICENSE,sha256=HonAVvzFXkP2C1d7D3ByIKPwjGH8NcHTAQvKH7uvOHQ,1856
263
- crypticorn-2.10.0.dist-info/METADATA,sha256=DPU7F_tB_xHFCSEppS72k7Jrf0VgG780ELnFhsXa11Y,10213
264
- crypticorn-2.10.0.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
265
- crypticorn-2.10.0.dist-info/entry_points.txt,sha256=d_xHsGvUTebPveVUK0SrpDFQ5ZRSjlI7lNCc11sn2PM,59
266
- crypticorn-2.10.0.dist-info/top_level.txt,sha256=EP3NY216qIBYfmvGl0L2Zc9ItP0DjGSkiYqd9xJwGcM,11
267
- crypticorn-2.10.0.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.3.1)
2
+ Generator: setuptools (80.4.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5